From 85e5338121789f53c2d25c30968aa946a5264118 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Sun, 23 Jun 2024 18:40:44 +0800 Subject: [PATCH] =?UTF-8?q?fix=20#2340=20fix=20=E6=89=8B=E5=8A=A8=E5=88=AE?= =?UTF-8?q?=E5=89=8A=E5=9B=BE=E7=89=87=E4=B8=8D=E5=AE=8C=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/chain/__init__.py | 2 +- app/chain/download.py | 7 ++++ app/chain/transfer.py | 82 +++++++++++++++++++++++-------------------- 3 files changed, 52 insertions(+), 39 deletions(-) diff --git a/app/chain/__init__.py b/app/chain/__init__.py index 43cc812e..6e6ebbe4 100644 --- a/app/chain/__init__.py +++ b/app/chain/__init__.py @@ -142,7 +142,7 @@ class ChainBase(metaclass=ABCMeta): bangumiid: int = None, cache: bool = True) -> Optional[MediaInfo]: """ - 识别媒体信息 + 识别媒体信息,不含Fanart图片 :param meta: 识别的元数据 :param mtype: 识别的媒体类型,与tmdbid配套 :param tmdbid: tmdbid diff --git a/app/chain/download.py b/app/chain/download.py index 38644ecc..037c0c7b 100644 --- a/app/chain/download.py +++ b/app/chain/download.py @@ -216,6 +216,13 @@ class DownloadChain(ChainBase): _media = context.media_info _meta = context.meta_info + # 补充完整的media数据 + if not _media.genre_ids: + new_media = self.recognize_media(mtype=_media.type, tmdbid=_media.tmdb_id, + doubanid=_media.douban_id, bangumiid=_media.bangumi_id) + if new_media: + _media = new_media + # 实际下载的集数 download_episodes = StringUtils.format_ep(list(episodes)) if episodes else None _folder_name = "" diff --git a/app/chain/transfer.py b/app/chain/transfer.py index ef510c75..42232a8e 100644 --- a/app/chain/transfer.py +++ b/app/chain/transfer.py @@ -86,13 +86,16 @@ class TransferChain(ChainBase): mediainfo = self.recognize_media(mtype=mtype, tmdbid=downloadhis.tmdbid, doubanid=downloadhis.doubanid) + if mediainfo: + # 补充图片 + self.obtain_images(mediainfo) else: # 非MoviePilot下载的任务,按文件识别 mediainfo = None # 执行转移 - self.do_transfer(storage="local", path=torrent.path, - mediainfo=mediainfo, download_hash=torrent.hash) + self.__do_transfer(storage="local", path=torrent.path, + mediainfo=mediainfo, download_hash=torrent.hash) # 设置下载任务状态 self.transfer_completed(hashs=torrent.hash, path=torrent.path) @@ -100,13 +103,13 @@ class TransferChain(ChainBase): logger.info("下载器文件转移执行完成") return True - def do_transfer(self, storage: str, path: Path, drive_id: str = None, fileid: str = None, filetype: str = None, - meta: MetaBase = None, mediainfo: MediaInfo = None, - download_hash: str = None, - target: Path = None, transfer_type: str = None, - season: int = None, epformat: EpisodeFormat = None, - min_filesize: int = 0, scrape: bool = None, - force: bool = False) -> Tuple[bool, str]: + def __do_transfer(self, storage: str, path: Path, drive_id: str = None, fileid: str = None, filetype: str = None, + meta: MetaBase = None, mediainfo: MediaInfo = None, + download_hash: str = None, + target: Path = None, transfer_type: str = None, + season: int = None, epformat: EpisodeFormat = None, + min_filesize: int = 0, scrape: bool = None, + force: bool = False) -> Tuple[bool, str]: """ 执行一个复杂目录的转移操作 :param storage: 存储器 @@ -152,7 +155,7 @@ class TransferChain(ChainBase): download_hash=download_hash, force=force) else: # 网盘整理 - result = self.__transfer_remote(storage=storage, + result = self.__transfer_online(storage=storage, fileitem=schemas.FileItem( path=str(path) + ("/" if filetype == "dir" else ""), type=filetype, @@ -467,7 +470,7 @@ class TransferChain(ChainBase): key=ProgressKey.FileTransfer) return True, "\n".join(err_msgs) - def __transfer_remote(self, storage: str, fileitem: schemas.FileItem, + def __transfer_online(self, storage: str, fileitem: schemas.FileItem, meta: MetaBase, mediainfo: MediaInfo) -> Tuple[bool, str]: """ 整理一个远程目录 @@ -535,7 +538,7 @@ class TransferChain(ChainBase): # 文件元数据 meta = MetaInfoPath(Path(fileitem.path)) if not mediainfo: - mediainfo = self.recognize_media(meta=meta) + mediainfo = self.mediachain.recognize_by_meta(meta) if not mediainfo: logger.warn(f"{fileitem.name} 未识别到媒体信息") return False, f"{fileitem.name} 未识别到媒体信息" @@ -589,12 +592,12 @@ class TransferChain(ChainBase): if not file_meta.name: # 过滤掉无效文件 continue - file_media = self.recognize_media(meta=file_meta) + file_media = self.mediachain.recognize_by_meta(file_meta) if not file_media: logger.warn(f"{file.name} 未识别到媒体信息") continue # 整理这个文件或目录 - self.__transfer_remote(storage=storage, fileitem=file, meta=file_meta, mediainfo=file_media) + self.__transfer_online(storage=storage, fileitem=file, meta=file_meta, mediainfo=file_media) else: # 电视剧目录 # 判断当前目录类型 @@ -661,12 +664,12 @@ class TransferChain(ChainBase): continue # 重新识别文件或目录 file_meta = MetaInfoPath(Path(file.path)) - file_media = self.recognize_media(meta=file_meta) + file_media = self.mediachain.recognize_by_meta(file_meta) if not file_media: logger.warn(f"{file.name} 未识别到媒体信息") continue # 整理这个文件或目录 - self.__transfer_remote(storage=storage, fileitem=file, meta=file_meta, mediainfo=file_media) + self.__transfer_online(storage=storage, fileitem=file, meta=file_meta, mediainfo=file_media) logger.info(f"{fileitem.path} 整理完成") self.progress.update(value=0, @@ -747,16 +750,16 @@ class TransferChain(ChainBase): if not type_str or type_str not in [MediaType.MOVIE.value, MediaType.TV.value]: args_error() return - state, errmsg = self.re_transfer(logid=int(logid), - mtype=MediaType(type_str), - mediaid=media_id) + state, errmsg = self.__re_transfer(logid=int(logid), + mtype=MediaType(type_str), + mediaid=media_id) if not state: self.post_message(Notification(channel=channel, title="手动整理失败", text=errmsg, userid=userid, link=settings.MP_DOMAIN('#/history'))) return - def re_transfer(self, logid: int, mtype: MediaType = None, - mediaid: str = None) -> Tuple[bool, str]: + def __re_transfer(self, logid: int, mtype: MediaType = None, + mediaid: str = None) -> Tuple[bool, str]: """ 根据历史记录,重新识别转移,只支持简单条件 :param logid: 历史记录ID @@ -791,11 +794,11 @@ class TransferChain(ChainBase): self.delete_files(Path(history.dest)) # 强制转移 - state, errmsg = self.do_transfer(storage="local", - path=src_path, - mediainfo=mediainfo, - download_hash=history.download_hash, - force=True) + state, errmsg = self.__do_transfer(storage="local", + path=src_path, + mediainfo=mediainfo, + download_hash=history.download_hash, + force=True) if not state: return False, errmsg @@ -843,13 +846,16 @@ class TransferChain(ChainBase): mediainfo: MediaInfo = self.mediachain.recognize_media(tmdbid=tmdbid, doubanid=doubanid, mtype=mtype) if not mediainfo: return False, f"媒体信息识别失败,tmdbid:{tmdbid},doubanid:{doubanid},type: {mtype.value}" + else: + # 更新媒体图片 + self.obtain_images(mediainfo=mediainfo) # 开始进度 self.progress.start(ProgressKey.FileTransfer) self.progress.update(value=0, text=f"开始转移 {in_path} ...", key=ProgressKey.FileTransfer) # 开始转移 - state, errmsg = self.do_transfer( + state, errmsg = self.__do_transfer( storage=storage, path=in_path, drive_id=drive_id, @@ -872,17 +878,17 @@ class TransferChain(ChainBase): return True, "" else: # 没有输入TMDBID时,按文件识别 - state, errmsg = self.do_transfer(storage=storage, - path=in_path, - drive_id=drive_id, - fileid=fileid, - filetype=filetype, - target=target, - transfer_type=transfer_type, - season=season, - epformat=epformat, - min_filesize=min_filesize, - force=force) + state, errmsg = self.__do_transfer(storage=storage, + path=in_path, + drive_id=drive_id, + fileid=fileid, + filetype=filetype, + target=target, + transfer_type=transfer_type, + season=season, + epformat=epformat, + min_filesize=min_filesize, + force=force) return state, errmsg def send_transfer_message(self, meta: MetaBase, mediainfo: MediaInfo,