This commit is contained in:
jxxghp 2023-08-30 22:40:36 +08:00
parent 38eff64c95
commit c372d0451e

View File

@ -88,13 +88,25 @@ class TransferChain(ChainBase):
logger.info("下载器文件转移执行完成")
return True
def do_transfer(self, path: Path, meta: MetaBase,
mediainfo: MediaInfo, download_hash: str = None,
target: Path = None, epformat: EpisodeFormat = None) -> Tuple[bool, str]:
def do_transfer(self, path: Path, meta: MetaBase = None,
mediainfo: MediaInfo = None, download_hash: str = None,
target: Path = None, transfer_type: str = None,
epformat: EpisodeFormat = None, min_filesize: int = None) -> Tuple[bool, str]:
"""
执行一个复杂目录的转移操作
:param path: 待转移目录或文件
:param meta: 元数据
:param mediainfo: 媒体信息
:param download_hash: 下载记录hash
:param target: 目标路径
:param transfer_type: 转移类型
:param epformat: 剧集格式
:param min_filesize: 最小文件大小(MB)
返回成功标识错误信息
"""
if not transfer_type:
transfer_type = settings.TRANSFER_TYPE
# 获取待转移路径清单
trans_paths = self.__get_trans_paths(path)
if not trans_paths:
@ -103,6 +115,23 @@ class TransferChain(ChainBase):
# 汇总错误信息
err_msgs = []
# 汇总媒体信息
medias = {}
# 汇总转移信息
transfers = {}
# 开始进度
self.progress.start(ProgressKey.FileTransfer)
# 总数
transfer_files = SystemUtils.list_files(directory=path,
extensions=settings.RMT_MEDIAEXT,
min_filesize=min_filesize)
total_num = len(transfer_files)
# 已处理数量
processed_num = 0
self.progress.update(value=0,
text=f"开始转移 {path},共 {total_num} 个文件 ...",
key=ProgressKey.FileTransfer)
# 处理所有待转移目录或文件,默认一个转移路径或文件只有一个媒体信息
for trans_path in trans_paths:
@ -110,7 +139,8 @@ class TransferChain(ChainBase):
if trans_path.is_dir():
# 遍历获取下载目录所有文件
file_paths = SystemUtils.list_files(directory=trans_path,
extensions=settings.RMT_MEDIAEXT)
extensions=settings.RMT_MEDIAEXT,
min_filesize=min_filesize)
else:
file_paths = [trans_path]
@ -165,11 +195,16 @@ class TransferChain(ChainBase):
# 更新媒体图片
self.obtain_images(mediainfo=file_mediainfo)
if not download_hash:
# TODO 查找下载记录 download_hash
pass
# 执行转移
transferinfo: TransferInfo = self.transfer(meta=file_meta,
mediainfo=file_mediainfo,
path=file_path,
transfer_type=settings.TRANSFER_TYPE,
transfer_type=transfer_type,
target=target,
epformat=epformat)
if not transferinfo:
@ -195,6 +230,19 @@ class TransferChain(ChainBase):
))
continue
# 汇总信息
if file_mediainfo.tmdb_id not in medias:
# 新增信息
medias[file_mediainfo.tmdb_id] = file_mediainfo
transfers[file_mediainfo.tmdb_id] = transferinfo
else:
# 合并信息
transfers[file_mediainfo.tmdb_id].file_count += transferinfo.file_count
transfers[file_mediainfo.tmdb_id].file_list.extend(transferinfo.file_list)
transfers[file_mediainfo.tmdb_id].file_list_new.extend(transferinfo.file_list_new)
transfers[file_mediainfo.tmdb_id].fail_list.extend(transferinfo.fail_list)
transfers[file_mediainfo.tmdb_id].total_size += transferinfo.total_size
# 新增转移成功历史记录
self.__insert_sucess_history(
src_path=file_path,
@ -204,21 +252,32 @@ class TransferChain(ChainBase):
transferinfo=transferinfo
)
# 刷新媒体库
self.refresh_mediaserver(mediainfo=file_mediainfo, file_path=transferinfo.target_path)
# 广播事件
self.eventmanager.send_event(EventType.TransferComplete, {
'meta': file_meta,
'mediainfo': file_mediainfo,
'transferinfo': transferinfo
})
# 更新进度
processed_num += 1
self.progress.update(value=processed_num / total_num * 100,
text=f"{file_path.name} 转移完成",
key=ProgressKey.FileTransfer)
# 目录或文件转移完成
# FIXME 汇总刮削元数据
self.scrape_metadata(path=trans_path, mediainfo=file_mediainfo)
# FIXME 汇总发送通知
self.send_transfer_message(meta=meta, mediainfo=mediainfo, transferinfo=transferinfo)
for tmdbid, media in medias.items():
# 刷新媒体库
self.refresh_mediaserver(mediainfo=media, file_path=transfers[tmdbid].target_path)
# 刮削
self.scrape_metadata(path=transfers[tmdbid].target_path, mediainfo=media)
# 发送通知
self.send_transfer_message(meta=meta,
mediainfo=mediainfo,
transferinfo=transfers[tmdbid])
# 结束进度
logger.info(f"{path} 转移完成,共 {total_num} 个文件,"
f"成功 {total_num - len(err_msgs)} 个,失败 {len(err_msgs)}")
self.progress.end(ProgressKey.FileTransfer)
return True, "\n".join(err_msgs)
@ -351,7 +410,7 @@ class TransferChain(ChainBase):
epformat: EpisodeFormat = None,
min_filesize: int = 0) -> Tuple[bool, Union[str, list]]:
"""
FIXME 手动转移
手动转移
:param in_path: 源文件路径
:param target: 目标路径
:param tmdbid: TMDB ID
@ -363,10 +422,6 @@ class TransferChain(ChainBase):
"""
logger.info(f"手动转移:{in_path} ...")
# 默认转移类型
if not transfer_type:
transfer_type = settings.TRANSFER_TYPE
if tmdbid:
# 有输入TMDBID时单个识别
meta = MetaInfo(in_path.stem)
@ -385,14 +440,13 @@ class TransferChain(ChainBase):
text=f"开始转移 {in_path} ...",
key=ProgressKey.FileTransfer)
# 开始转移
# FIXME 查找下载记录 download_hash
state, errmsg = self.do_transfer(
path=in_path,
meta=meta,
mediainfo=mediainfo,
target=target,
epformat=epformat,
download_hash=None
min_filesize=min_filesize
)
if not state:
return False, errmsg
@ -401,112 +455,13 @@ class TransferChain(ChainBase):
logger.info(f"{in_path} 转移完成")
return True, ""
else:
# FIXME
# 错误信息
errmsgs = []
# 自动识别所有文件
transfer_files = SystemUtils.list_files(directory=in_path,
extensions=settings.RMT_MEDIAEXT,
min_filesize=min_filesize)
if not transfer_files:
return False, "没有找到可转移的文件"
# 开始进度
self.progress.start(ProgressKey.FileTransfer)
# 总数
total_num = len(transfer_files)
# 已处理数量
processed_num = 0
self.progress.update(value=0,
text=f"开始转移 {in_path},共 {total_num} 个文件 ...",
key=ProgressKey.FileTransfer)
for transfer_file in transfer_files:
# 更新进度
self.progress.update(value=processed_num / total_num * 100,
text=f"正在转移 {transfer_file.name} ...",
key=ProgressKey.FileTransfer)
# 上级目录元数据
meta = MetaInfo(title=transfer_file.parent.name)
# 文件元数据,不包含后缀
file_meta = MetaInfo(title=transfer_file.stem)
# 合并元数据
file_meta.merge(meta)
if not file_meta.name:
logger.error(f"{transfer_file} 无法识别有效信息")
errmsgs.append(f"{transfer_file.name} 无法识别有效信息")
# 更新进度
processed_num += 1
self.progress.update(value=processed_num / total_num * 100,
text=f"{transfer_file.name} 无法识别有效信息",
key=ProgressKey.FileTransfer)
continue
# 整合数据
if mtype:
file_meta.type = mtype
if season:
file_meta.begin_season = season
# 识别媒体信息
mediainfo: MediaInfo = self.mediachain.recognize_media(meta=file_meta)
if not mediainfo:
logger.error(f"{transfer_file} 媒体信息识别失败")
errmsgs.append(f"{transfer_file.name} 媒体信息识别失败")
# 更新进度
processed_num += 1
self.progress.update(value=processed_num / total_num * 100,
text=f"{transfer_file.name} 媒体信息识别失败!",
key=ProgressKey.FileTransfer)
continue
# 开始转移
transferinfo: TransferInfo = self.transfer(
path=in_path,
mediainfo=mediainfo,
transfer_type=transfer_type,
target=target,
meta=file_meta,
epformat=epformat
)
if not transferinfo:
return False, "文件转移模块运行失败"
if not transferinfo.target_path:
logger.error(f"{transfer_file} 转移失败:{transferinfo.message}")
errmsgs.append(f"{transfer_file.name} 转移失败:{transferinfo.message}")
# 更新进度
processed_num += 1
self.progress.update(value=processed_num / total_num * 100,
text=f"{transfer_file.name} 转移失败:{transferinfo.message}",
key=ProgressKey.FileTransfer)
continue
# 新增转移成功历史记录
self.__insert_sucess_history(
src_path=transfer_file,
meta=file_meta,
mediainfo=mediainfo,
transferinfo=transferinfo
)
# 刮削元数据
self.scrape_metadata(path=transferinfo.target_path, mediainfo=mediainfo)
# 刷新媒体库
self.refresh_mediaserver(mediainfo=mediainfo, file_path=transferinfo.target_path)
# 发送通知
self.send_transfer_message(meta=file_meta, mediainfo=mediainfo, transferinfo=transferinfo)
# 广播事件
self.eventmanager.send_event(EventType.TransferComplete, {
'meta': file_meta,
'mediainfo': mediainfo,
'transferinfo': transferinfo
})
# 更新进度
processed_num += 1
self.progress.update(value=processed_num / total_num * 100,
text=f"{transfer_file.name} 转移完成",
key=ProgressKey.FileTransfer)
# 结束进度
logger.info(f"转移完成,共 {total_num} 个文件,成功 {total_num - len(errmsgs)} 个,失败 {len(errmsgs)}")
self.progress.end(ProgressKey.FileTransfer)
if errmsgs:
return False, errmsgs
return True, ""
# 没有输入TMDBID时按文件识别
state, errmsg = self.do_transfer(path=in_path,
target=target,
transfer_type=transfer_type,
epformat=epformat,
min_filesize=min_filesize)
return state, errmsg
def __insert_sucess_history(self, src_path: Path, meta: MetaBase,
mediainfo: MediaInfo, transferinfo: TransferInfo,