From f0666986f0a292fb7be2f73a3315e93bdf8bd404 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Wed, 30 Aug 2023 23:59:27 +0800 Subject: [PATCH] fix --- app/chain/__init__.py | 9 +++--- app/chain/transfer.py | 26 ++++++++++++++-- .../format_parser.py => helper/format.py} | 0 app/modules/filetransfer/__init__.py | 30 ++++++++----------- 4 files changed, 41 insertions(+), 24 deletions(-) rename app/{modules/filetransfer/format_parser.py => helper/format.py} (100%) diff --git a/app/chain/__init__.py b/app/chain/__init__.py index d492a5f6..280c922d 100644 --- a/app/chain/__init__.py +++ b/app/chain/__init__.py @@ -16,9 +16,10 @@ from app.core.context import MediaInfo, TorrentInfo from app.core.event import EventManager from app.core.meta import MetaBase from app.core.module import ModuleManager +from app.helper.format import FormatParser from app.log import logger from app.schemas import TransferInfo, TransferTorrent, ExistMediaInfo, DownloadingTorrent, CommingMessage, Notification, \ - WebhookEventInfo, EpisodeFormat + WebhookEventInfo from app.schemas.types import TorrentStatus, MediaType, MediaImageType, EventType from app.utils.object import ObjectUtils @@ -274,7 +275,7 @@ class ChainBase(metaclass=ABCMeta): def transfer(self, path: Path, meta: MetaBase, mediainfo: MediaInfo, transfer_type: str, target: Path = None, - epformat: EpisodeFormat = None) -> Optional[TransferInfo]: + formater: FormatParser = None) -> Optional[TransferInfo]: """ 文件转移 :param path: 文件路径 @@ -282,12 +283,12 @@ class ChainBase(metaclass=ABCMeta): :param mediainfo: 识别的媒体信息 :param transfer_type: 转移模式 :param target: 转移目标路径 - :param epformat: 自定义剧集识别格式 + :param formater: 自定义剧集识别格式 :return: {path, target_path, message} """ return self.run_module("transfer", path=path, meta=meta, mediainfo=mediainfo, transfer_type=transfer_type, target=target, - epformat=epformat) + formater=formater) def transfer_completed(self, hashs: Union[str, list], path: Path = None) -> None: """ diff --git a/app/chain/transfer.py b/app/chain/transfer.py index dfb44018..d8dd3632 100644 --- a/app/chain/transfer.py +++ b/app/chain/transfer.py @@ -16,6 +16,7 @@ from app.db.downloadhistory_oper import DownloadHistoryOper from app.db.models.downloadhistory import DownloadHistory from app.db.models.transferhistory import TransferHistory from app.db.transferhistory_oper import TransferHistoryOper +from app.helper.format import FormatParser from app.helper.progress import ProgressHelper from app.log import logger from app.schemas import TransferInfo, TransferTorrent, Notification, EpisodeFormat @@ -122,12 +123,22 @@ class TransferChain(ChainBase): # 汇总转移信息 transfers = {} + # 有集自定义格式 + formaterHandler = FormatParser(eformat=epformat.format, + details=epformat.detail, + part=epformat.part, + offset=epformat.offset) if epformat else None + # 开始进度 self.progress.start(ProgressKey.FileTransfer) # 总数 transfer_files = SystemUtils.list_files(directory=path, extensions=settings.RMT_MEDIAEXT, min_filesize=min_filesize) + if formaterHandler: + # 有集自定义格式,过滤文件 + transfer_files = [f for f in transfer_files if formaterHandler.match(f.name)] + # 总数 total_num = len(transfer_files) # 已处理数量 processed_num = 0 @@ -147,6 +158,10 @@ class TransferChain(ChainBase): else: file_paths = [trans_path] + if formaterHandler: + # 有集自定义格式,过滤文件 + file_paths = [f for f in file_paths if formaterHandler.match(f.name)] + # 转移所有文件 for file_path in file_paths: # 回收站及隐藏的文件不处理 @@ -209,7 +224,7 @@ class TransferChain(ChainBase): path=file_path, transfer_type=transfer_type, target=target, - epformat=epformat) + formater=formaterHandler) if not transferinfo: logger.error("文件转移模块运行失败") return False, "文件转移模块运行失败" @@ -245,6 +260,13 @@ class TransferChain(ChainBase): metas[file_mediainfo.tmdb_id].begin_episode = file_meta.begin_episode if (metas[file_mediainfo.tmdb_id].end_episode or 0) < (file_meta.end_episode or 0): metas[file_mediainfo.tmdb_id].end_episode = file_meta.end_episode + metas[file_mediainfo.tmdb_id].total_episode += file_meta.total_episode + # 合并元数据季度 + if (metas[file_mediainfo.tmdb_id].begin_season or 0) > (file_meta.begin_season or 0): + metas[file_mediainfo.tmdb_id].begin_season = file_meta.begin_season + if (metas[file_mediainfo.tmdb_id].end_season or 0) < (file_meta.end_season or 0): + metas[file_mediainfo.tmdb_id].end_season = file_meta.end_season + metas[file_mediainfo.tmdb_id].total_season += file_meta.total_season # 合并转移 transfers[file_mediainfo.tmdb_id].file_count += transferinfo.file_count transfers[file_mediainfo.tmdb_id].file_list.extend(transferinfo.file_list) @@ -281,7 +303,7 @@ class TransferChain(ChainBase): self.scrape_metadata(path=transfers[tmdbid].target_path, mediainfo=media) # 发送通知 self.send_transfer_message(meta=metas[tmdbid], - mediainfo=mediainfo, + mediainfo=media, transferinfo=transfers[tmdbid]) # 结束进度 logger.info(f"{path} 转移完成,共 {total_num} 个文件," diff --git a/app/modules/filetransfer/format_parser.py b/app/helper/format.py similarity index 100% rename from app/modules/filetransfer/format_parser.py rename to app/helper/format.py diff --git a/app/modules/filetransfer/__init__.py b/app/modules/filetransfer/__init__.py index b80444ed..89955aaf 100644 --- a/app/modules/filetransfer/__init__.py +++ b/app/modules/filetransfer/__init__.py @@ -5,16 +5,16 @@ from typing import Optional, List, Tuple, Union from jinja2 import Template -from app.core.context import MediaInfo -from app.core.metainfo import MetaInfo from app.core.config import settings +from app.core.context import MediaInfo from app.core.meta import MetaBase +from app.core.metainfo import MetaInfo +from app.helper.format import FormatParser from app.log import logger from app.modules import _ModuleBase -from app.modules.filetransfer.format_parser import FormatParser -from app.schemas import TransferInfo, EpisodeFormat -from app.utils.system import SystemUtils +from app.schemas import TransferInfo from app.schemas.types import MediaType +from app.utils.system import SystemUtils lock = Lock() @@ -32,7 +32,7 @@ class FileTransferModule(_ModuleBase): def transfer(self, path: Path, meta: MetaBase, mediainfo: MediaInfo, transfer_type: str, target: Path = None, - epformat: EpisodeFormat = None) -> TransferInfo: + formater: FormatParser = None) -> TransferInfo: """ 文件转移 :param path: 文件路径 @@ -40,7 +40,7 @@ class FileTransferModule(_ModuleBase): :param mediainfo: 识别的媒体信息 :param transfer_type: 转移方式 :param target: 目标路径 - :param epformat: 集识别格式 + :param formater: 集识别格式 :return: {path, target_path, message} """ # 获取目标路径 @@ -55,7 +55,7 @@ class FileTransferModule(_ModuleBase): mediainfo=mediainfo, transfer_type=transfer_type, target_dir=target, - epformat=epformat) + formater=formater) @staticmethod def __transfer_command(file_item: Path, target_file: Path, transfer_type: str) -> int: @@ -321,7 +321,7 @@ class FileTransferModule(_ModuleBase): mediainfo: MediaInfo, transfer_type: str, target_dir: Path, - epformat: EpisodeFormat = None, + formater: FormatParser = None, ) -> TransferInfo: """ 识别并转移一个文件或者一个目录下的所有文件 @@ -330,7 +330,7 @@ class FileTransferModule(_ModuleBase): :param mediainfo: 媒体信息 :param target_dir: 目的文件夹,非空的转移到该文件夹,为空时则按类型转移到配置文件中的媒体库文件夹 :param transfer_type: 文件转移方式 - :param epformat: 识别的剧集格式 + :param formater: 识别的剧集格式 :return: TransferInfo、错误信息 """ # 检查目录路径 @@ -404,16 +404,10 @@ class FileTransferModule(_ModuleBase): 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: + if formater: # 开始集、结束集、PART - begin_ep, end_ep, part = formaterHandler.split_episode(in_path.stem) + begin_ep, end_ep, part = formater.split_episode(in_path.stem) if begin_ep is not None: in_meta.begin_episode = begin_ep in_meta.part = part