From 38eff64c955e26496deb38f04339c714e289a466 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Wed, 30 Aug 2023 22:01:07 +0800 Subject: [PATCH] need fix --- app/chain/__init__.py | 21 +- app/chain/transfer.py | 319 ++++++++++++++------------- app/modules/filetransfer/__init__.py | 232 +++++++------------ app/modules/qbittorrent/__init__.py | 14 +- app/modules/transmission/__init__.py | 14 +- app/plugins/dirmonitor/__init__.py | 2 +- 6 files changed, 269 insertions(+), 333 deletions(-) diff --git a/app/chain/__init__.py b/app/chain/__init__.py index cd350739..d492a5f6 100644 --- a/app/chain/__init__.py +++ b/app/chain/__init__.py @@ -271,34 +271,31 @@ class ChainBase(metaclass=ABCMeta): """ return self.run_module("list_torrents", status=status, hashs=hashs) - def transfer(self, path: Path, mediainfo: MediaInfo, + def transfer(self, path: Path, meta: MetaBase, mediainfo: MediaInfo, transfer_type: str, target: Path = None, - meta: MetaBase = None, - epformat: EpisodeFormat = None, - min_filesize: int = 0) -> Optional[TransferInfo]: + epformat: EpisodeFormat = None) -> Optional[TransferInfo]: """ 文件转移 :param path: 文件路径 + :param meta: 预识别的元数据 :param mediainfo: 识别的媒体信息 :param transfer_type: 转移模式 :param target: 转移目标路径 - :param meta: 预识别的元数据,仅单文件转移时传递 :param epformat: 自定义剧集识别格式 - :param min_filesize: 最小文件大小 :return: {path, target_path, message} """ - return self.run_module("transfer", path=path, mediainfo=mediainfo, - transfer_type=transfer_type, target=target, meta=meta, - epformat=epformat, min_filesize=min_filesize) + return self.run_module("transfer", path=path, meta=meta, mediainfo=mediainfo, + transfer_type=transfer_type, target=target, + epformat=epformat) - def transfer_completed(self, hashs: Union[str, list], transinfo: TransferInfo = None) -> None: + def transfer_completed(self, hashs: Union[str, list], path: Path = None) -> None: """ 转移完成后的处理 :param hashs: 种子Hash - :param transinfo: 转移信息 + :param path: 源目录 """ - return self.run_module("transfer_completed", hashs=hashs, transinfo=transinfo) + return self.run_module("transfer_completed", hashs=hashs, path=path) def remove_torrents(self, hashs: Union[str, list]) -> bool: """ diff --git a/app/chain/transfer.py b/app/chain/transfer.py index 6a02aa4d..9dc901ff 100644 --- a/app/chain/transfer.py +++ b/app/chain/transfer.py @@ -55,15 +55,14 @@ class TransferChain(ChainBase): logger.info(f"获取到 {len(torrents)} 个已完成的下载任务") for torrent in torrents: - # 识别元数据 - meta: MetaBase = MetaInfo(title=torrent.title) - if not meta.name: - logger.error(f'未识别到元数据,标题:{torrent.title}') - continue - # 查询下载记录识别情况 downloadhis: DownloadHistory = self.downloadhis.get_by_hash(torrent.hash) if downloadhis: + # MoviePilot下载的任务,识别元数据 + meta: MetaBase = MetaInfo(title=torrent.title) + if not meta.name: + logger.error(f'未识别到元数据,标题:{torrent.title}') + continue # 类型 mtype = MediaType(downloadhis.type) # 补充剧集信息 @@ -75,90 +74,154 @@ class TransferChain(ChainBase): mediainfo = self.recognize_media(mtype=mtype, tmdbid=downloadhis.tmdbid) else: - mediainfo = self.recognize_media(meta=meta) + # 非MoviePilot下载的任务,按文件识别 + meta = None + mediainfo = None - if not mediainfo: - logger.warn(f'未识别到媒体信息,标题:{torrent.title}') - # 新增转移失败历史记录 - his = self.__insert_fail_history( - src_path=torrent.path, - download_hash=torrent.hash, - meta=meta - ) - self.post_message(Notification( - mtype=NotificationType.Manual, - title=f"{torrent.title} 未识别到媒体信息,无法入库!\n" - f"回复:```\n/redo {his.id} [tmdbid]|[类型]\n``` 手动识别转移。" - )) - # 设置种子状态,避免一直报错 - self.transfer_completed(hashs=torrent.hash) - continue + # 执行转移 + self.do_transfer(path=torrent.path, meta=meta, mediainfo=mediainfo, + download_hash=torrent.hash) - logger.info(f"{torrent.title} 识别为:{mediainfo.type.value} {mediainfo.title_year}") - - # 更新媒体图片 - self.obtain_images(mediainfo=mediainfo) - - # 获取待转移路径清单 - trans_paths = self.__get_trans_paths(torrent.path) - if not trans_paths: - logger.warn(f"{torrent.title} 对应目录没有找到媒体文件") - continue - - # 转移所有文件 - for trans_path in trans_paths: - transferinfo: TransferInfo = self.transfer(mediainfo=mediainfo, - path=trans_path, - transfer_type=settings.TRANSFER_TYPE) - if not transferinfo: - logger.error("文件转移模块运行失败") - continue - if not transferinfo.target_path: - # 转移失败 - logger.warn(f"{torrent.title} 入库失败:{transferinfo.message}") - # 新增转移失败历史记录 - self.__insert_fail_history( - src_path=trans_path, - download_hash=torrent.hash, - meta=meta, - mediainfo=mediainfo, - transferinfo=transferinfo - ) - # 发送消息 - self.post_message(Notification( - title=f"{mediainfo.title_year} {meta.season_episode} 入库失败!", - text=f"原因:{transferinfo.message or '未知'}", - image=mediainfo.get_message_image() - )) - continue - - # 新增转移成功历史记录 - self.__insert_sucess_history( - src_path=trans_path, - download_hash=torrent.hash, - meta=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=meta, mediainfo=mediainfo, transferinfo=transferinfo) - # 广播事件 - self.eventmanager.send_event(EventType.TransferComplete, { - 'meta': meta, - 'mediainfo': mediainfo, - 'transferinfo': transferinfo - }) - - # 转移完成 - self.transfer_completed(hashs=torrent.hash, transinfo=transferinfo) + # 设置下载任务状态 + self.transfer_completed(hashs=torrent.hash, path=torrent.path) # 结束 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]: + """ + 执行一个复杂目录的转移操作 + 返回:成功标识,错误信息 + """ + # 获取待转移路径清单 + trans_paths = self.__get_trans_paths(path) + if not trans_paths: + logger.warn(f"{path.name} 没有找到可转移的媒体文件") + return False, f"{path.name} 没有找到可转移的媒体文件" + + # 汇总错误信息 + err_msgs = [] + + # 处理所有待转移目录或文件,默认一个转移路径或文件只有一个媒体信息 + for trans_path in trans_paths: + # 如果是目录,获取所有文件并转移 + if trans_path.is_dir(): + # 遍历获取下载目录所有文件 + file_paths = SystemUtils.list_files(directory=trans_path, + extensions=settings.RMT_MEDIAEXT) + else: + file_paths = [trans_path] + + # 转移所有文件 + for file_path in file_paths: + # 回收站及隐藏的文件不处理 + file_path_str = str(file_path) + if file_path_str.find('/@Recycle/') != -1 \ + or file_path_str.find('/#recycle/') != -1 \ + or file_path_str.find('/.') != -1 \ + or file_path_str.find('/@eaDir') != -1: + logger.debug(f"{file_path_str} 是回收站或隐藏的文件") + continue + + if not meta: + # 上级目录元数据 + dir_meta = MetaInfo(title=file_path.parent.name) + # 文件元数据,不包含后缀 + file_meta = MetaInfo(title=file_path.stem) + # 合并元数据 + file_meta.merge(dir_meta) + else: + file_meta = meta + + if not file_meta: + logger.error(f"{file_path} 无法识别有效信息") + err_msgs.append(f"{file_path} 无法识别有效信息") + continue + + if not mediainfo: + # 识别媒体信息 + file_mediainfo = self.recognize_media(meta=file_meta) + else: + file_mediainfo = mediainfo + + if not file_mediainfo: + logger.warn(f'{file_path} 未识别到媒体信息') + # 新增转移失败历史记录 + his = self.__insert_fail_history( + src_path=file_path, + download_hash=download_hash, + meta=file_meta + ) + self.post_message(Notification( + mtype=NotificationType.Manual, + title=f"{file_path.name} 未识别到媒体信息,无法入库!\n" + f"回复:```\n/redo {his.id} [tmdbid]|[类型]\n``` 手动识别转移。" + )) + continue + + logger.info(f"{file_path.name} 识别为:{file_mediainfo.type.value} {file_mediainfo.title_year}") + + # 更新媒体图片 + self.obtain_images(mediainfo=file_mediainfo) + # 执行转移 + transferinfo: TransferInfo = self.transfer(meta=file_meta, + mediainfo=file_mediainfo, + path=file_path, + transfer_type=settings.TRANSFER_TYPE, + target=target, + epformat=epformat) + if not transferinfo: + logger.error("文件转移模块运行失败") + return False, "文件转移模块运行失败" + if not transferinfo.target_path: + # 转移失败 + logger.warn(f"{file_path.name} 入库失败:{transferinfo.message}") + err_msgs.append(f"{file_path.name} {transferinfo.message}") + # 新增转移失败历史记录 + self.__insert_fail_history( + src_path=file_path, + download_hash=download_hash, + meta=file_meta, + mediainfo=file_mediainfo, + transferinfo=transferinfo + ) + # 发送消息 + self.post_message(Notification( + title=f"{file_mediainfo.title_year} {file_meta.season_episode} 入库失败!", + text=f"原因:{transferinfo.message or '未知'}", + image=file_mediainfo.get_message_image() + )) + continue + + # 新增转移成功历史记录 + self.__insert_sucess_history( + src_path=file_path, + download_hash=download_hash, + meta=file_meta, + mediainfo=file_mediainfo, + 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 + }) + + # 目录或文件转移完成 + # FIXME 汇总刮削元数据 + self.scrape_metadata(path=trans_path, mediainfo=file_mediainfo) + # FIXME 汇总发送通知 + self.send_transfer_message(meta=meta, mediainfo=mediainfo, transferinfo=transferinfo) + + return True, "\n".join(err_msgs) + @staticmethod def __get_trans_paths(directory: Path): """ @@ -267,50 +330,16 @@ class TransferChain(ChainBase): self.obtain_images(mediainfo=mediainfo) # 转移 - transferinfo: TransferInfo = self.transfer(mediainfo=mediainfo, - path=src_path, - transfer_type=settings.TRANSFER_TYPE) - if not transferinfo: - logger.error("文件转移模块运行失败") - return False, "文件转移模块运行失败" + state, errmsg = self.do_transfer(path=src_path, + meta=meta, + mediainfo=mediainfo, + download_hash=history.download_hash) + if not state: + return False, errmsg # 删除旧历史记录 self.transferhis.delete(logid) - if not transferinfo.target_path: - # 转移失败 - logger.warn(f"{src_path} 入库失败:{transferinfo.message}") - # 新增转移失败历史记录 - self.__insert_fail_history( - src_path=src_path, - download_hash=history.download_hash, - meta=meta, - mediainfo=mediainfo, - transferinfo=transferinfo - ) - return False, transferinfo.message - - # 新增转移成功历史记录 - self.__insert_sucess_history( - src_path=src_path, - download_hash=history.download_hash, - meta=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=meta, mediainfo=mediainfo, transferinfo=transferinfo) - # 广播事件 - self.eventmanager.send_event(EventType.TransferComplete, { - 'meta': meta, - 'mediainfo': mediainfo, - 'transferinfo': transferinfo - }) - return True, "" def manual_transfer(self, in_path: Path, @@ -322,7 +351,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 @@ -356,42 +385,23 @@ class TransferChain(ChainBase): text=f"开始转移 {in_path} ...", key=ProgressKey.FileTransfer) # 开始转移 - transferinfo: TransferInfo = self.transfer( + # FIXME 查找下载记录 download_hash + state, errmsg = self.do_transfer( path=in_path, - mediainfo=mediainfo, - transfer_type=transfer_type, - target=target, - epformat=epformat, - min_filesize=min_filesize - ) - if not transferinfo: - return False, "文件转移模块运行失败" - if not transferinfo.target_path: - return False, transferinfo.message - - # 新增转移成功历史记录 - self.__insert_sucess_history( - src_path=in_path, meta=meta, mediainfo=mediainfo, - transferinfo=transferinfo + target=target, + epformat=epformat, + download_hash=None ) - # 刮削元数据 - self.scrape_metadata(path=transferinfo.target_path, mediainfo=mediainfo) - # 刷新媒体库 - self.refresh_mediaserver(mediainfo=mediainfo, file_path=transferinfo.target_path) - # 发送通知 - self.send_transfer_message(meta=meta, mediainfo=mediainfo, transferinfo=transferinfo) - # 广播事件 - self.eventmanager.send_event(EventType.TransferComplete, { - 'meta': meta, - 'mediainfo': mediainfo, - 'transferinfo': transferinfo - }) + if not state: + return False, errmsg + self.progress.end(ProgressKey.FileTransfer) logger.info(f"{in_path} 转移完成") return True, "" else: + # FIXME # 错误信息 errmsgs = [] # 自动识别所有文件 @@ -453,8 +463,7 @@ class TransferChain(ChainBase): transfer_type=transfer_type, target=target, meta=file_meta, - epformat=epformat, - min_filesize=min_filesize + epformat=epformat ) if not transferinfo: return False, "文件转移模块运行失败" diff --git a/app/modules/filetransfer/__init__.py b/app/modules/filetransfer/__init__.py index 8d5db792..b80444ed 100644 --- a/app/modules/filetransfer/__init__.py +++ b/app/modules/filetransfer/__init__.py @@ -30,20 +30,17 @@ class FileTransferModule(_ModuleBase): def init_setting(self) -> Tuple[str, Union[str, bool]]: pass - def transfer(self, path: Path, mediainfo: MediaInfo, + def transfer(self, path: Path, meta: MetaBase, mediainfo: MediaInfo, transfer_type: str, target: Path = None, - meta: MetaBase = None, - epformat: EpisodeFormat = None, - min_filesize: int = 0) -> TransferInfo: + epformat: EpisodeFormat = None) -> TransferInfo: """ 文件转移 :param path: 文件路径 + :param meta: 预识别的元数据,仅单文件转移时传递 :param mediainfo: 识别的媒体信息 :param transfer_type: 转移方式 :param target: 目标路径 - :param meta: 预识别的元数据,仅单文件转移时传递 :param epformat: 集识别格式 - :param min_filesize: 最小文件大小(MB) :return: {path, target_path, message} """ # 获取目标路径 @@ -54,12 +51,11 @@ class FileTransferModule(_ModuleBase): return TransferInfo(message="未找到媒体库目录,无法转移文件") # 转移 return self.transfer_media(in_path=path, + in_meta=meta, mediainfo=mediainfo, transfer_type=transfer_type, target_dir=target, - in_meta=meta, - epformat=epformat, - min_filesize=min_filesize) + epformat=epformat) @staticmethod def __transfer_command(file_item: Path, target_file: Path, transfer_type: str) -> int: @@ -244,9 +240,9 @@ class FileTransferModule(_ModuleBase): logger.error(f"音轨文件 {file_name} {transfer_type}失败:{reason}") return 0 - def __transfer_bluray_dir(self, file_path: Path, new_path: Path, transfer_type: str) -> int: + def __transfer_dir(self, file_path: Path, new_path: Path, transfer_type: str) -> int: """ - 转移蓝光文件夹 + 转移整个文件夹 :param file_path: 原路径 :param new_path: 新路径 :param transfer_type: RmtMode转移方式 @@ -265,7 +261,7 @@ class FileTransferModule(_ModuleBase): def __transfer_dir_files(self, src_dir: Path, target_dir: Path, transfer_type: str) -> int: """ - 按目录结构转移所有文件 + 按目录结构转移目录下所有文件 :param src_dir: 原路径 :param target_dir: 新路径 :param transfer_type: RmtMode转移方式 @@ -321,22 +317,20 @@ class FileTransferModule(_ModuleBase): def transfer_media(self, in_path: Path, + in_meta: MetaBase, mediainfo: MediaInfo, transfer_type: str, - target_dir: Path = None, - in_meta: MetaBase = None, + target_dir: Path, epformat: EpisodeFormat = None, - min_filesize: int = 0 ) -> TransferInfo: """ - 识别并转移一个文件、多个文件或者目录 + 识别并转移一个文件或者一个目录下的所有文件 :param in_path: 转移的路径,可能是一个文件也可以是一个目录 + :param in_meta:预识别元数据 :param mediainfo: 媒体信息 :param target_dir: 目的文件夹,非空的转移到该文件夹,为空时则按类型转移到配置文件中的媒体库文件夹 :param transfer_type: 文件转移方式 - :param in_meta:预识别元数,为空则重新识别 :param epformat: 识别的剧集格式 - :param min_filesize: 最小文件大小(MB),小于该值的文件不转移 :return: TransferInfo、错误信息 """ # 检查目录路径 @@ -372,160 +366,96 @@ class FileTransferModule(_ModuleBase): rename_format = settings.TV_RENAME_FORMAT \ if mediainfo.type == MediaType.TV else settings.MOVIE_RENAME_FORMAT - # 总大小 - total_filesize = 0 - - # 处理文件清单 - file_list = [] - - # 目标文件清单 - file_list_new = [] - - # 失败文件清单 - fail_list = [] - - # 错误信息 - err_msgs = [] - - # 判断是否为蓝光原盘 - bluray_flag = SystemUtils.is_bluray_dir(in_path) - if bluray_flag: - # 识别目录名称,不包括后缀 - meta = MetaInfo(in_path.stem) + # 判断是否为文件夹 + if in_path.is_dir(): + # 转移整个目录 + # 是否蓝光原盘 + bluray_flag = SystemUtils.is_bluray_dir(in_path) # 目的路径 new_path = self.get_rename_path( path=target_dir, template_string=rename_format, - rename_dict=self.__get_naming_dict(meta=meta, + rename_dict=self.__get_naming_dict(meta=in_meta, mediainfo=mediainfo) ).parent # 转移蓝光原盘 - retcode = self.__transfer_bluray_dir(file_path=in_path, - new_path=new_path, - transfer_type=transfer_type) + retcode = self.__transfer_dir(file_path=in_path, + new_path=new_path, + transfer_type=transfer_type) if retcode != 0: - return TransferInfo(message=f"{retcode},蓝光原盘转移失败") - else: - # 计算大小 - total_filesize += in_path.stat().st_size - # 返回转移后的路径 - return TransferInfo(path=in_path, - target_path=new_path, - total_size=total_filesize, - is_bluray=bluray_flag, - file_list=[], - file_list_new=[]) + logger.error(f"文件夹 {in_path} 转移失败,错误码:{retcode}") + return TransferInfo(message=f"文件夹 {in_path} 转移失败,错误码:{retcode}") + + logger.info(f"文件夹 {in_path} 转移成功") + # 返回转移后的路径 + return TransferInfo(path=in_path, + target_path=new_path, + total_size=in_path.stat().st_size, + is_bluray=bluray_flag) else: - # 获取文件清单 - transfer_files: List[Path] = SystemUtils.list_files( - directory=in_path, - extensions=settings.RMT_MEDIAEXT, - min_filesize=min_filesize - ) - if len(transfer_files) == 0: - return TransferInfo(message=f"{in_path} 目录下没有找到可转移的文件") + # 转移单个文件 + # 文件结束季为空 + in_meta.end_season = None + # 文件总季数为1 + if in_meta.total_season: + in_meta.total_season = 1 + # 文件不可能有多集 + if in_meta.total_episode > 2: + in_meta.total_episode = 1 + in_meta.end_episode = None + # 有集自定义格式 formaterHandler = FormatParser(eformat=epformat.format, details=epformat.detail, part=epformat.part, offset=epformat.offset) if epformat else None - # 过滤出符合自定义剧集格式的文件 + + # 自定义识别集数、PART if formaterHandler: - transfer_files = [x for x in transfer_files if formaterHandler.match(x.name)] - if len(transfer_files) == 0: - return TransferInfo(message=f"{in_path} 目录下没有找到符合自定义剧集格式的文件") + # 开始集、结束集、PART + begin_ep, end_ep, part = formaterHandler.split_episode(in_path.stem) + if begin_ep is not None: + in_meta.begin_episode = begin_ep + in_meta.part = part + if end_ep is not None: + in_meta.end_episode = end_ep - if not in_meta: - # 识别目录名称,不包括后缀 - meta = MetaInfo(in_path.stem) - else: - meta = in_meta - # 目的路径 - new_path = target_dir / (self.get_rename_path( + # 目的文件名 + new_file = self.get_rename_path( + path=target_dir, template_string=rename_format, - rename_dict=self.__get_naming_dict(meta=meta, - mediainfo=mediainfo)).parents[-2].name) - # 转移所有文件 - for transfer_file in transfer_files: - try: - if not in_meta: - # 识别文件元数据,不包含后缀 - file_meta = MetaInfo(transfer_file.stem) - # 合并元数据 - file_meta.merge(meta) - else: - file_meta = in_meta + rename_dict=self.__get_naming_dict( + meta=in_meta, + mediainfo=mediainfo, + file_ext=in_path.suffix + ) + ) - # 文件结束季为空 - file_meta.end_season = None - # 文件总季数为1 - if file_meta.total_season: - file_meta.total_season = 1 - # 文件不可能有多集 - if file_meta.total_episode > 2: - file_meta.total_episode = 1 - file_meta.end_episode = None + # 判断是否要覆盖 + overflag = False + if new_file.exists(): + if new_file.stat().st_size < in_path.stat().st_size: + logger.info(f"目标文件已存在,但文件大小更小,将覆盖:{new_file}") + overflag = True - # 自定义识别 - if formaterHandler: - # 开始集、结束集、PART - begin_ep, end_ep, part = formaterHandler.split_episode(transfer_file.stem) - if begin_ep is not None: - file_meta.begin_episode = begin_ep - file_meta.part = part - if end_ep is not None: - file_meta.end_episode = end_ep - - # 目的文件名 - new_file = self.get_rename_path( - path=target_dir, - template_string=rename_format, - rename_dict=self.__get_naming_dict(meta=file_meta, - mediainfo=mediainfo, - file_ext=transfer_file.suffix) - ) - - # 判断是否要覆盖 - overflag = False - if new_file.exists(): - if new_file.stat().st_size < transfer_file.stat().st_size: - logger.info(f"目标文件已存在,但文件大小更小,将覆盖:{new_file}") - overflag = True - - # 转移文件 - retcode = self.__transfer_file(file_item=transfer_file, - new_file=new_file, - transfer_type=transfer_type, - over_flag=overflag) - if retcode != 0: - logger.error(f"{transfer_file} 转移文件失败,错误码:{retcode}") - err_msgs.append(f"{transfer_file.name}:错误码 {retcode}") - fail_list.append(transfer_file) - continue - # 源文件清单 - file_list.append(str(transfer_file)) - # 目的文件清单 - file_list_new.append(str(new_file)) - # 计算总大小 - total_filesize += new_file.stat().st_size - except Exception as err: - err_msgs.append(f"{transfer_file.name}:{err}") - logger.error(f"{transfer_file}转移失败:{err}") - fail_list.append(transfer_file) - - if not file_list: - # 没有成功的 - return TransferInfo(message="\n".join(err_msgs)) + # 转移文件 + retcode = self.__transfer_file(file_item=in_path, + new_file=new_file, + transfer_type=transfer_type, + over_flag=overflag) + if retcode != 0: + logger.error(f"文件 {in_path} 转移失败,错误码:{retcode}") + return TransferInfo(message=f"文件 {in_path.name} 转移失败,错误码:{retcode}", + fail_list=[in_path]) + logger.info(f"文件 {in_path} 转移成功") return TransferInfo(path=in_path, - target_path=new_path, - message="\n".join(err_msgs), - file_count=len(file_list), - total_size=total_filesize, - fail_list=fail_list, - is_bluray=bluray_flag, - file_list=file_list, - file_list_new=file_list_new) + target_path=new_file, + file_count=1, + total_size=in_path.stat().st_size, + is_bluray=False, + file_list=[in_path], + file_list_new=[new_file]) @staticmethod def __get_naming_dict(meta: MetaBase, mediainfo: MediaInfo, file_ext: str = None) -> dict: diff --git a/app/modules/qbittorrent/__init__.py b/app/modules/qbittorrent/__init__.py index fb288fd4..2f403b87 100644 --- a/app/modules/qbittorrent/__init__.py +++ b/app/modules/qbittorrent/__init__.py @@ -10,7 +10,7 @@ from app.core.metainfo import MetaInfo from app.log import logger from app.modules import _ModuleBase from app.modules.qbittorrent.qbittorrent import Qbittorrent -from app.schemas import TransferInfo, TransferTorrent, DownloadingTorrent +from app.schemas import TransferTorrent, DownloadingTorrent from app.schemas.types import TorrentStatus from app.utils.string import StringUtils from app.utils.system import SystemUtils @@ -156,11 +156,11 @@ class QbittorrentModule(_ModuleBase): return ret_torrents def transfer_completed(self, hashs: Union[str, list], - transinfo: TransferInfo = None) -> None: + path: Path = None) -> None: """ 转移完成后的处理 :param hashs: 种子Hash - :param transinfo: 转移信息 + :param path: 源目录 """ self.qbittorrent.set_torrents_tag(ids=hashs, tags=['已整理']) # 移动模式删除种子 @@ -168,11 +168,11 @@ class QbittorrentModule(_ModuleBase): if self.remove_torrents(hashs): logger.info(f"移动模式删除种子成功:{hashs} ") # 删除残留文件 - if transinfo and transinfo.path and transinfo.path.exists(): - files = SystemUtils.list_files(transinfo.path, settings.RMT_MEDIAEXT) + if path and path.exists(): + files = SystemUtils.list_files(path, settings.RMT_MEDIAEXT) if not files: - logger.warn(f"删除残留文件夹:{transinfo.path}") - shutil.rmtree(transinfo.path, ignore_errors=True) + logger.warn(f"删除残留文件夹:{path}") + shutil.rmtree(path, ignore_errors=True) def remove_torrents(self, hashs: Union[str, list]) -> bool: """ diff --git a/app/modules/transmission/__init__.py b/app/modules/transmission/__init__.py index 013efd79..c00ae84a 100644 --- a/app/modules/transmission/__init__.py +++ b/app/modules/transmission/__init__.py @@ -10,7 +10,7 @@ from app.core.metainfo import MetaInfo from app.log import logger from app.modules import _ModuleBase from app.modules.transmission.transmission import Transmission -from app.schemas import TransferInfo, TransferTorrent, DownloadingTorrent +from app.schemas import TransferTorrent, DownloadingTorrent from app.schemas.types import TorrentStatus from app.utils.string import StringUtils from app.utils.system import SystemUtils @@ -141,11 +141,11 @@ class TransmissionModule(_ModuleBase): return ret_torrents def transfer_completed(self, hashs: Union[str, list], - transinfo: TransferInfo = None) -> None: + path: Path = None) -> None: """ 转移完成后的处理 :param hashs: 种子Hash - :param transinfo: 转移信息 + :param path: 源目录 :return: None """ self.transmission.set_torrent_tag(ids=hashs, tags=['已整理']) @@ -154,11 +154,11 @@ class TransmissionModule(_ModuleBase): if self.remove_torrents(hashs): logger.info(f"移动模式删除种子成功:{hashs} ") # 删除残留文件 - if transinfo and transinfo.path and transinfo.path.exists(): - files = SystemUtils.list_files(transinfo.path, settings.RMT_MEDIAEXT) + if path and path.exists(): + files = SystemUtils.list_files(path, settings.RMT_MEDIAEXT) if not files: - logger.warn(f"删除残留文件夹:{transinfo.path}") - shutil.rmtree(transinfo.path, ignore_errors=True) + logger.warn(f"删除残留文件夹:{path}") + shutil.rmtree(path, ignore_errors=True) def remove_torrents(self, hashs: Union[str, list]) -> bool: """ diff --git a/app/plugins/dirmonitor/__init__.py b/app/plugins/dirmonitor/__init__.py index 6f486a7b..ba7dc5cc 100644 --- a/app/plugins/dirmonitor/__init__.py +++ b/app/plugins/dirmonitor/__init__.py @@ -383,7 +383,7 @@ class DirMonitor(_PluginBase): } self._medias[mediainfo.title_year + " " + meta.season] = media_list - # 刷新媒体库 + # 汇总刷新媒体库 self.chain.refresh_mediaserver(mediainfo=mediainfo, file_path=target_path) # 广播事件 self.eventmanager.send_event(EventType.TransferComplete, {