From 894756000cde2acc7238ffc92dffedd6a7964ec9 Mon Sep 17 00:00:00 2001 From: Castell Date: Mon, 2 Mar 2026 17:03:29 +0800 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E4=BC=98?= =?UTF-8?q?=E5=85=88=E4=BD=BF=E7=94=A8=E6=8F=92=E4=BB=B6=E8=AF=86=E5=88=AB?= =?UTF-8?q?=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/endpoints/download.py | 24 +++++-- app/chain/media.py | 124 ++++++++++++++++++++++++---------- app/core/config.py | 2 + 3 files changed, 108 insertions(+), 42 deletions(-) diff --git a/app/api/endpoints/download.py b/app/api/endpoints/download.py index 243e2d3c..d933f69d 100644 --- a/app/api/endpoints/download.py +++ b/app/api/endpoints/download.py @@ -5,6 +5,7 @@ from fastapi import APIRouter, Depends, Body from app import schemas from app.chain.download import DownloadChain from app.chain.media import MediaChain +from app.core.config import settings from app.core.context import MediaInfo, Context, TorrentInfo from app.core.event import eventmanager from app.core.metainfo import MetaInfo @@ -77,13 +78,24 @@ def add( # 元数据 metainfo = MetaInfo(title=torrent_in.title, subtitle=torrent_in.description) # 媒体信息 - mediainfo = MediaChain().recognize_media(meta=metainfo, tmdbid=tmdbid, doubanid=doubanid) - if not mediainfo: - # 尝试使用辅助识别,如果有注册响应事件的话 - if eventmanager.check(ChainEventType.NameRecognize): - mediainfo = MediaChain().recognize_help(title=torrent_in.title, org_meta=metainfo) + mediainfo: MediaInfo = None + if settings.RECOGNIZE_PLUGIN_FIRST and eventmanager.check(ChainEventType.NameRecognize): + # 插件优先模式:优先使用辅助识别 + mediainfo = MediaChain().recognize_help(title=torrent_in.title, org_meta=metainfo) if not mediainfo: - return schemas.Response(success=False, message="无法识别媒体信息") + # 尝试使用原生识别 + mediainfo = MediaChain().recognize_media(meta=metainfo, tmdbid=tmdbid, doubanid=doubanid) + if not mediainfo: + return schemas.Response(success=False, message="无法识别媒体信息") + else: + # 标准模式:优先使用原生识别 + mediainfo = MediaChain().recognize_media(meta=metainfo, tmdbid=tmdbid, doubanid=doubanid) + if not mediainfo: + # 尝试使用辅助识别,如果有注册响应事件的话 + if eventmanager.check(ChainEventType.NameRecognize): + mediainfo = MediaChain().recognize_help(title=torrent_in.title, org_meta=metainfo) + if not mediainfo: + return schemas.Response(success=False, message="无法识别媒体信息") # 种子信息 torrentinfo = TorrentInfo() torrentinfo.from_dict(torrent_in.model_dump()) diff --git a/app/chain/media.py b/app/chain/media.py index ea8ec608..d9421019 100644 --- a/app/chain/media.py +++ b/app/chain/media.py @@ -90,16 +90,29 @@ class MediaChain(ChainBase): 根据主副标题识别媒体信息 """ title = metainfo.title - # 识别媒体信息 - mediainfo: MediaInfo = self.recognize_media(meta=metainfo, episode_group=episode_group) - if not mediainfo: - # 尝试使用辅助识别,如果有注册响应事件的话 - if eventmanager.check(ChainEventType.NameRecognize): - logger.info(f'请求辅助识别,标题:{title} ...') - mediainfo = self.recognize_help(title=title, org_meta=metainfo) + mediainfo: MediaInfo = None + if settings.RECOGNIZE_PLUGIN_FIRST and eventmanager.check(ChainEventType.NameRecognize): + # 插件优先模式:优先使用辅助识别 + logger.info(f"插件优先模式已开启。请求辅助识别,标题:{title} ...") + mediainfo = self.recognize_help(title=title, org_meta=metainfo) if not mediainfo: - logger.warn(f'{title} 未识别到媒体信息') - return None + # 尝试使用原生识别 + logger.info(f'辅助识别未识别到 {title} 的媒体信息,尝试使用原生识别') + mediainfo = self.recognize_media(meta=metainfo, episode_group=episode_group) + if not mediainfo: + logger.warn(f'{title} 未识别到媒体信息') + return None + else: + # 标准模式:优先使用原生识别 + mediainfo = self.recognize_media(meta=metainfo, episode_group=episode_group) + if not mediainfo: + # 尝试使用辅助识别,如果有注册响应事件的话 + if eventmanager.check(ChainEventType.NameRecognize): + logger.info(f'请求辅助识别,标题:{title} ...') + mediainfo = self.recognize_help(title=title, org_meta=metainfo) + if not mediainfo: + logger.warn(f'{title} 未识别到媒体信息') + return None # 识别成功 logger.info(f'{title} 识别到媒体信息:{mediainfo.type.value} {mediainfo.title_year}') # 更新媒体图片 @@ -163,16 +176,29 @@ class MediaChain(ChainBase): file_path = Path(path) # 元数据 file_meta = MetaInfoPath(file_path) - # 识别媒体信息 - mediainfo = self.recognize_media(meta=file_meta, episode_group=episode_group) - if not mediainfo: - # 尝试使用辅助识别,如果有注册响应事件的话 - if eventmanager.check(ChainEventType.NameRecognize): - logger.info(f'请求辅助识别,标题:{file_path.name} ...') - mediainfo = self.recognize_help(title=path, org_meta=file_meta) + mediainfo: MediaInfo = None + if settings.RECOGNIZE_PLUGIN_FIRST and eventmanager.check(ChainEventType.NameRecognize): + # 插件优先模式:优先使用辅助识别 + logger.info(f"插件优先模式已开启。请求辅助识别,标题:{file_path.name} ...") + mediainfo = self.recognize_help(title=path, org_meta=file_meta) if not mediainfo: - logger.warn(f'{path} 未识别到媒体信息') - return Context(meta_info=file_meta) + # 尝试使用原生识别 + logger.info(f'辅助识别未识别到 {path} 的媒体信息,尝试使用原生识别') + mediainfo = self.recognize_media(meta=file_meta, episode_group=episode_group) + if not mediainfo: + logger.warn(f'{path} 未识别到媒体信息') + return Context(meta_info=file_meta) + else: + # 标准模式:优先使用原生识别 + mediainfo = self.recognize_media(meta=file_meta, episode_group=episode_group) + if not mediainfo: + # 尝试使用辅助识别,如果有注册响应事件的话 + if eventmanager.check(ChainEventType.NameRecognize): + logger.info(f'请求辅助识别,标题:{file_path.name} ...') + mediainfo = self.recognize_help(title=path, org_meta=file_meta) + if not mediainfo: + logger.warn(f'{path} 未识别到媒体信息') + return Context(meta_info=file_meta) logger.info(f'{path} 识别到媒体信息:{mediainfo.type.value} {mediainfo.title_year}') # 更新媒体图片 self.obtain_images(mediainfo=mediainfo) @@ -826,16 +852,29 @@ class MediaChain(ChainBase): 根据主副标题识别媒体信息(异步版本) """ title = metainfo.title - # 识别媒体信息 - mediainfo: MediaInfo = await self.async_recognize_media(meta=metainfo, episode_group=episode_group) - if not mediainfo: - # 尝试使用辅助识别,如果有注册响应事件的话 - if eventmanager.check(ChainEventType.NameRecognize): - logger.info(f'请求辅助识别,标题:{title} ...') - mediainfo = await self.async_recognize_help(title=title, org_meta=metainfo) + mediainfo: MediaInfo = None + if settings.RECOGNIZE_PLUGIN_FIRST and eventmanager.check(ChainEventType.NameRecognize): + # 插件优先模式:优先使用辅助识别 + logger.info(f"插件优先模式已开启。请求辅助识别,标题:{title} ...") + mediainfo = await self.async_recognize_help(title=title, org_meta=metainfo) if not mediainfo: - logger.warn(f'{title} 未识别到媒体信息') - return None + # 尝试使用原生识别 + logger.info(f'辅助识别未识别到 {title} 的媒体信息,尝试使用原生识别') + mediainfo = await self.async_recognize_media(meta=metainfo, episode_group=episode_group) + if not mediainfo: + logger.warn(f'{title} 未识别到媒体信息') + return None + else: + # 标准模式:优先使用原生识别 + mediainfo = await self.async_recognize_media(meta=metainfo, episode_group=episode_group) + if not mediainfo: + # 尝试使用辅助识别,如果有注册响应事件的话 + if eventmanager.check(ChainEventType.NameRecognize): + logger.info(f'请求辅助识别,标题:{title} ...') + mediainfo = await self.async_recognize_help(title=title, org_meta=metainfo) + if not mediainfo: + logger.warn(f'{title} 未识别到媒体信息') + return None # 识别成功 logger.info(f'{title} 识别到媒体信息:{mediainfo.type.value} {mediainfo.title_year}') # 更新媒体图片 @@ -899,16 +938,29 @@ class MediaChain(ChainBase): file_path = Path(path) # 元数据 file_meta = MetaInfoPath(file_path) - # 识别媒体信息 - mediainfo = await self.async_recognize_media(meta=file_meta, episode_group=episode_group) - if not mediainfo: - # 尝试使用辅助识别,如果有注册响应事件的话 - if eventmanager.check(ChainEventType.NameRecognize): - logger.info(f'请求辅助识别,标题:{file_path.name} ...') - mediainfo = await self.async_recognize_help(title=path, org_meta=file_meta) + mediainfo: MediaInfo = None + if settings.RECOGNIZE_PLUGIN_FIRST and eventmanager.check(ChainEventType.NameRecognize): + # 插件优先模式:优先使用辅助识别 + logger.info(f"插件优先模式已开启。请求辅助识别,标题:{file_path.name} ...") + mediainfo = await self.async_recognize_help(title=path, org_meta=file_meta) if not mediainfo: - logger.warn(f'{path} 未识别到媒体信息') - return Context(meta_info=file_meta) + # 尝试使用原生识别 + logger.info(f'辅助识别未识别到 {path} 的媒体信息,尝试使用原生识别') + mediainfo = await self.async_recognize_media(meta=file_meta, episode_group=episode_group) + if not mediainfo: + logger.warn(f'{path} 未识别到媒体信息') + return Context(meta_info=file_meta) + else: + # 标准模式:优先使用原生识别 + mediainfo = await self.async_recognize_media(meta=file_meta, episode_group=episode_group) + if not mediainfo: + # 尝试使用辅助识别,如果有注册响应事件的话 + if eventmanager.check(ChainEventType.NameRecognize): + logger.info(f'请求辅助识别,标题:{file_path.name} ...') + mediainfo = await self.async_recognize_help(title=path, org_meta=file_meta) + if not mediainfo: + logger.warn(f'{path} 未识别到媒体信息') + return Context(meta_info=file_meta) logger.info(f'{path} 识别到媒体信息:{mediainfo.type.value} {mediainfo.title_year}') # 更新媒体图片 await self.async_obtain_images(mediainfo=mediainfo) diff --git a/app/core/config.py b/app/core/config.py index 3aa24626..88bc4609 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -322,6 +322,8 @@ class ConfigModel(BaseModel): DEFAULT_SUB: Optional[str] = "zh-cn" # 新增已入库媒体是否跟随TMDB信息变化 SCRAP_FOLLOW_TMDB: bool = True + # 优先使用辅助识别 + RECOGNIZE_PLUGIN_FIRST: bool = False # ==================== 服务地址配置 ==================== # 服务器地址,对应 https://github.com/jxxghp/MoviePilot-Server 项目 From 002ebeaade66fb097424ec7477921b3831a7f24d Mon Sep 17 00:00:00 2001 From: Castell Date: Tue, 3 Mar 2026 00:18:04 +0800 Subject: [PATCH 2/5] =?UTF-8?q?refactor:=20=E7=AE=80=E5=8C=96=E5=AA=92?= =?UTF-8?q?=E4=BD=93=E8=AF=86=E5=88=AB=E6=A8=A1=E5=BC=8F=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E4=B8=AD=E7=9A=84=20if/else=20=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/endpoints/download.py | 29 ++++--- app/chain/media.py | 144 +++++++++++++++++----------------- 2 files changed, 86 insertions(+), 87 deletions(-) diff --git a/app/api/endpoints/download.py b/app/api/endpoints/download.py index d933f69d..88657afe 100644 --- a/app/api/endpoints/download.py +++ b/app/api/endpoints/download.py @@ -79,23 +79,22 @@ def add( metainfo = MetaInfo(title=torrent_in.title, subtitle=torrent_in.description) # 媒体信息 mediainfo: MediaInfo = None - if settings.RECOGNIZE_PLUGIN_FIRST and eventmanager.check(ChainEventType.NameRecognize): - # 插件优先模式:优先使用辅助识别 - mediainfo = MediaChain().recognize_help(title=torrent_in.title, org_meta=metainfo) + plugin_available = eventmanager.check(ChainEventType.NameRecognize) + # 定义识别函数 + native_recognize = lambda: MediaChain().recognize_media(meta=metainfo, tmdbid=tmdbid, doubanid=doubanid) + plugin_recognize = lambda: MediaChain().recognize_help(title=torrent_in.title, org_meta=metainfo) + if settings.RECOGNIZE_PLUGIN_FIRST and plugin_available: + # 插件优先 + mediainfo = plugin_recognize() if not mediainfo: - # 尝试使用原生识别 - mediainfo = MediaChain().recognize_media(meta=metainfo, tmdbid=tmdbid, doubanid=doubanid) - if not mediainfo: - return schemas.Response(success=False, message="无法识别媒体信息") + mediainfo = native_recognize() else: - # 标准模式:优先使用原生识别 - mediainfo = MediaChain().recognize_media(meta=metainfo, tmdbid=tmdbid, doubanid=doubanid) - if not mediainfo: - # 尝试使用辅助识别,如果有注册响应事件的话 - if eventmanager.check(ChainEventType.NameRecognize): - mediainfo = MediaChain().recognize_help(title=torrent_in.title, org_meta=metainfo) - if not mediainfo: - return schemas.Response(success=False, message="无法识别媒体信息") + # 原生优先 + mediainfo = native_recognize() + if not mediainfo and plugin_available: + mediainfo = plugin_recognize() + if not mediainfo: + return schemas.Response(success=False, message="无法识别媒体信息") # 种子信息 torrentinfo = TorrentInfo() torrentinfo.from_dict(torrent_in.model_dump()) diff --git a/app/chain/media.py b/app/chain/media.py index d9421019..d5a1c9bb 100644 --- a/app/chain/media.py +++ b/app/chain/media.py @@ -91,28 +91,27 @@ class MediaChain(ChainBase): """ title = metainfo.title mediainfo: MediaInfo = None - if settings.RECOGNIZE_PLUGIN_FIRST and eventmanager.check(ChainEventType.NameRecognize): - # 插件优先模式:优先使用辅助识别 + plugin_available = eventmanager.check(ChainEventType.NameRecognize) + # 定义识别函数 + native_recognize = lambda: self.recognize_media(meta=metainfo, episode_group=episode_group) + plugin_recognize = lambda: self.recognize_help(title=title, org_meta=metainfo) + if settings.RECOGNIZE_PLUGIN_FIRST and plugin_available: + # 插件优先 logger.info(f"插件优先模式已开启。请求辅助识别,标题:{title} ...") - mediainfo = self.recognize_help(title=title, org_meta=metainfo) + mediainfo = plugin_recognize() if not mediainfo: - # 尝试使用原生识别 logger.info(f'辅助识别未识别到 {title} 的媒体信息,尝试使用原生识别') - mediainfo = self.recognize_media(meta=metainfo, episode_group=episode_group) - if not mediainfo: - logger.warn(f'{title} 未识别到媒体信息') - return None + mediainfo = native_recognize() else: - # 标准模式:优先使用原生识别 - mediainfo = self.recognize_media(meta=metainfo, episode_group=episode_group) - if not mediainfo: - # 尝试使用辅助识别,如果有注册响应事件的话 - if eventmanager.check(ChainEventType.NameRecognize): - logger.info(f'请求辅助识别,标题:{title} ...') - mediainfo = self.recognize_help(title=title, org_meta=metainfo) - if not mediainfo: - logger.warn(f'{title} 未识别到媒体信息') - return None + # 原生优先 + logger.info(f"插件优先模式未开启。尝试原生识别,标题:{title} ...") + mediainfo = native_recognize() + if not mediainfo and plugin_available: + logger.info(f'原生识别未识别到 {title} 的媒体信息,尝试使用辅助识别') + mediainfo = plugin_recognize() + if not mediainfo: + logger.warn(f'{title} 未识别到媒体信息') + return None # 识别成功 logger.info(f'{title} 识别到媒体信息:{mediainfo.type.value} {mediainfo.title_year}') # 更新媒体图片 @@ -177,28 +176,27 @@ class MediaChain(ChainBase): # 元数据 file_meta = MetaInfoPath(file_path) mediainfo: MediaInfo = None - if settings.RECOGNIZE_PLUGIN_FIRST and eventmanager.check(ChainEventType.NameRecognize): - # 插件优先模式:优先使用辅助识别 + plugin_available = eventmanager.check(ChainEventType.NameRecognize) + # 定义识别函数 + native_recognize = lambda: self.recognize_media(meta=file_meta, episode_group=episode_group) + plugin_recognize = lambda: self.recognize_help(title=path, org_meta=file_meta) + if settings.RECOGNIZE_PLUGIN_FIRST and plugin_available: + # 插件优先 logger.info(f"插件优先模式已开启。请求辅助识别,标题:{file_path.name} ...") - mediainfo = self.recognize_help(title=path, org_meta=file_meta) + mediainfo = plugin_recognize() if not mediainfo: - # 尝试使用原生识别 logger.info(f'辅助识别未识别到 {path} 的媒体信息,尝试使用原生识别') - mediainfo = self.recognize_media(meta=file_meta, episode_group=episode_group) - if not mediainfo: - logger.warn(f'{path} 未识别到媒体信息') - return Context(meta_info=file_meta) + mediainfo = native_recognize() else: - # 标准模式:优先使用原生识别 - mediainfo = self.recognize_media(meta=file_meta, episode_group=episode_group) - if not mediainfo: - # 尝试使用辅助识别,如果有注册响应事件的话 - if eventmanager.check(ChainEventType.NameRecognize): - logger.info(f'请求辅助识别,标题:{file_path.name} ...') - mediainfo = self.recognize_help(title=path, org_meta=file_meta) - if not mediainfo: - logger.warn(f'{path} 未识别到媒体信息') - return Context(meta_info=file_meta) + # 原生优先 + logger.info(f"插件优先模式未开启。尝试原生识别,标题:{file_path.name} ...") + mediainfo = native_recognize() + if not mediainfo and plugin_available: + logger.info(f'原生识别未识别到 {path} 的媒体信息,尝试使用辅助识别') + mediainfo = plugin_recognize() + if not mediainfo: + logger.warn(f'{path} 未识别到媒体信息') + return Context(meta_info=file_meta) logger.info(f'{path} 识别到媒体信息:{mediainfo.type.value} {mediainfo.title_year}') # 更新媒体图片 self.obtain_images(mediainfo=mediainfo) @@ -853,28 +851,29 @@ class MediaChain(ChainBase): """ title = metainfo.title mediainfo: MediaInfo = None - if settings.RECOGNIZE_PLUGIN_FIRST and eventmanager.check(ChainEventType.NameRecognize): - # 插件优先模式:优先使用辅助识别 + plugin_available = eventmanager.check(ChainEventType.NameRecognize) + # 定义识别函数 + async def native_recognize(): + return await self.async_recognize_media(meta=metainfo, episode_group=episode_group) + async def plugin_recognize(): + return await self.async_recognize_help(title=title, org_meta=metainfo) + if settings.RECOGNIZE_PLUGIN_FIRST and plugin_available: + # 插件优先 logger.info(f"插件优先模式已开启。请求辅助识别,标题:{title} ...") - mediainfo = await self.async_recognize_help(title=title, org_meta=metainfo) + mediainfo = plugin_recognize() if not mediainfo: - # 尝试使用原生识别 logger.info(f'辅助识别未识别到 {title} 的媒体信息,尝试使用原生识别') - mediainfo = await self.async_recognize_media(meta=metainfo, episode_group=episode_group) - if not mediainfo: - logger.warn(f'{title} 未识别到媒体信息') - return None + mediainfo = native_recognize() else: - # 标准模式:优先使用原生识别 - mediainfo = await self.async_recognize_media(meta=metainfo, episode_group=episode_group) - if not mediainfo: - # 尝试使用辅助识别,如果有注册响应事件的话 - if eventmanager.check(ChainEventType.NameRecognize): - logger.info(f'请求辅助识别,标题:{title} ...') - mediainfo = await self.async_recognize_help(title=title, org_meta=metainfo) - if not mediainfo: - logger.warn(f'{title} 未识别到媒体信息') - return None + # 原生优先 + logger.info(f"插件优先模式未开启。尝试原生识别,标题:{title} ...") + mediainfo = native_recognize() + if not mediainfo and plugin_available: + logger.info(f'原生识别未识别到 {title} 的媒体信息,尝试使用辅助识别') + mediainfo = plugin_recognize() + if not mediainfo: + logger.warn(f'{title} 未识别到媒体信息') + return None # 识别成功 logger.info(f'{title} 识别到媒体信息:{mediainfo.type.value} {mediainfo.title_year}') # 更新媒体图片 @@ -939,28 +938,29 @@ class MediaChain(ChainBase): # 元数据 file_meta = MetaInfoPath(file_path) mediainfo: MediaInfo = None - if settings.RECOGNIZE_PLUGIN_FIRST and eventmanager.check(ChainEventType.NameRecognize): - # 插件优先模式:优先使用辅助识别 + plugin_available = eventmanager.check(ChainEventType.NameRecognize) + # 定义识别函数 + async def native_recognize(): + return await self.async_recognize_media(meta=file_meta, episode_group=episode_group) + async def plugin_recognize(): + return await self.async_recognize_help(title=path, org_meta=file_meta) + if settings.RECOGNIZE_PLUGIN_FIRST and plugin_available: + # 插件优先 logger.info(f"插件优先模式已开启。请求辅助识别,标题:{file_path.name} ...") - mediainfo = await self.async_recognize_help(title=path, org_meta=file_meta) + mediainfo = plugin_recognize() if not mediainfo: - # 尝试使用原生识别 logger.info(f'辅助识别未识别到 {path} 的媒体信息,尝试使用原生识别') - mediainfo = await self.async_recognize_media(meta=file_meta, episode_group=episode_group) - if not mediainfo: - logger.warn(f'{path} 未识别到媒体信息') - return Context(meta_info=file_meta) + mediainfo = native_recognize() else: - # 标准模式:优先使用原生识别 - mediainfo = await self.async_recognize_media(meta=file_meta, episode_group=episode_group) - if not mediainfo: - # 尝试使用辅助识别,如果有注册响应事件的话 - if eventmanager.check(ChainEventType.NameRecognize): - logger.info(f'请求辅助识别,标题:{file_path.name} ...') - mediainfo = await self.async_recognize_help(title=path, org_meta=file_meta) - if not mediainfo: - logger.warn(f'{path} 未识别到媒体信息') - return Context(meta_info=file_meta) + # 原生优先 + logger.info(f"插件优先模式未开启。尝试原生识别,标题:{file_path.name} ...") + mediainfo = native_recognize() + if not mediainfo and plugin_available: + logger.info(f'原生识别未识别到 {path} 的媒体信息,尝试使用辅助识别') + mediainfo = plugin_recognize() + if not mediainfo: + logger.warn(f'{path} 未识别到媒体信息') + return Context(meta_info=file_meta) logger.info(f'{path} 识别到媒体信息:{mediainfo.type.value} {mediainfo.title_year}') # 更新媒体图片 await self.async_obtain_images(mediainfo=mediainfo) From ba5de1ab31c80c9b0f4a7be6247358d8755f4ebb Mon Sep 17 00:00:00 2001 From: Castell Date: Tue, 3 Mar 2026 00:37:55 +0800 Subject: [PATCH 3/5] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BC=82=E6=AD=A5?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E8=B0=83=E7=94=A8=E5=B0=91=E5=86=99=20await?= =?UTF-8?q?=20=E5=85=B3=E9=94=AE=E5=AD=97=E7=9A=84=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/chain/media.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/chain/media.py b/app/chain/media.py index d5a1c9bb..ad8c10c8 100644 --- a/app/chain/media.py +++ b/app/chain/media.py @@ -860,17 +860,17 @@ class MediaChain(ChainBase): if settings.RECOGNIZE_PLUGIN_FIRST and plugin_available: # 插件优先 logger.info(f"插件优先模式已开启。请求辅助识别,标题:{title} ...") - mediainfo = plugin_recognize() + mediainfo = await plugin_recognize() if not mediainfo: logger.info(f'辅助识别未识别到 {title} 的媒体信息,尝试使用原生识别') - mediainfo = native_recognize() + mediainfo = await native_recognize() else: # 原生优先 logger.info(f"插件优先模式未开启。尝试原生识别,标题:{title} ...") - mediainfo = native_recognize() + mediainfo = await native_recognize() if not mediainfo and plugin_available: logger.info(f'原生识别未识别到 {title} 的媒体信息,尝试使用辅助识别') - mediainfo = plugin_recognize() + mediainfo = await plugin_recognize() if not mediainfo: logger.warn(f'{title} 未识别到媒体信息') return None @@ -947,17 +947,17 @@ class MediaChain(ChainBase): if settings.RECOGNIZE_PLUGIN_FIRST and plugin_available: # 插件优先 logger.info(f"插件优先模式已开启。请求辅助识别,标题:{file_path.name} ...") - mediainfo = plugin_recognize() + mediainfo = await plugin_recognize() if not mediainfo: logger.info(f'辅助识别未识别到 {path} 的媒体信息,尝试使用原生识别') - mediainfo = native_recognize() + mediainfo = await native_recognize() else: # 原生优先 logger.info(f"插件优先模式未开启。尝试原生识别,标题:{file_path.name} ...") - mediainfo = native_recognize() + mediainfo = await native_recognize() if not mediainfo and plugin_available: logger.info(f'原生识别未识别到 {path} 的媒体信息,尝试使用辅助识别') - mediainfo = plugin_recognize() + mediainfo = await plugin_recognize() if not mediainfo: logger.warn(f'{path} 未识别到媒体信息') return Context(meta_info=file_meta) From b6b5d9f9c49e10cfac752dec2b3d3e7c1c4f84ac Mon Sep 17 00:00:00 2001 From: Castell Date: Tue, 3 Mar 2026 01:33:44 +0800 Subject: [PATCH 4/5] =?UTF-8?q?refactor:=20=E5=B0=86=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=9A=84=E5=AA=92=E4=BD=93=E8=AF=86=E5=88=AB=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E9=80=BB=E8=BE=91=E5=B0=81=E8=A3=85=E8=BF=9B?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E5=99=A8=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/chain/media.py | 152 ++++++++++++++++++++++++--------------------- 1 file changed, 82 insertions(+), 70 deletions(-) diff --git a/app/chain/media.py b/app/chain/media.py index ad8c10c8..3d2e3995 100644 --- a/app/chain/media.py +++ b/app/chain/media.py @@ -85,30 +85,45 @@ class MediaChain(ChainBase): """ return self.run_module("metadata_nfo", meta=meta, mediainfo=mediainfo, season=season, episode=episode) + def _select_recognize_source(self, log_name: str, log_context: str, + native_fn, plugin_fn) -> Optional[MediaInfo]: + """ + 选择识别模式,插件优先或原生优先 + :param log_name: 用于日志“标题:...”处的名称(如 file_path.name 或 title) + :param log_context: 用于日志“未识别到...的媒体信息”处的上下文(如 path 或 title) + :param native_fn: 原生识别函数 + :param plugin_fn: 插件识别函数 + """ + mediainfo = None + plugin_available = eventmanager.check(ChainEventType.NameRecognize) + if settings.RECOGNIZE_PLUGIN_FIRST and plugin_available: + # 插件优先 + logger.info(f"插件优先模式已开启。请求辅助识别,标题:{log_name} ...") + mediainfo = plugin_fn() + if not mediainfo: + logger.info(f'辅助识别未识别到 {log_context} 的媒体信息,尝试使用原生识别') + mediainfo = native_fn() + else: + # 原生优先 + logger.info(f"插件优先模式未开启。尝试原生识别,标题:{log_name} ...") + mediainfo = native_fn() + if not mediainfo and plugin_available: + logger.info(f'原生识别未识别到 {log_context} 的媒体信息,尝试使用辅助识别') + mediainfo = plugin_fn() + return mediainfo + def recognize_by_meta(self, metainfo: MetaBase, episode_group: Optional[str] = None) -> Optional[MediaInfo]: """ 根据主副标题识别媒体信息 """ title = metainfo.title - mediainfo: MediaInfo = None - plugin_available = eventmanager.check(ChainEventType.NameRecognize) - # 定义识别函数 - native_recognize = lambda: self.recognize_media(meta=metainfo, episode_group=episode_group) - plugin_recognize = lambda: self.recognize_help(title=title, org_meta=metainfo) - if settings.RECOGNIZE_PLUGIN_FIRST and plugin_available: - # 插件优先 - logger.info(f"插件优先模式已开启。请求辅助识别,标题:{title} ...") - mediainfo = plugin_recognize() - if not mediainfo: - logger.info(f'辅助识别未识别到 {title} 的媒体信息,尝试使用原生识别') - mediainfo = native_recognize() - else: - # 原生优先 - logger.info(f"插件优先模式未开启。尝试原生识别,标题:{title} ...") - mediainfo = native_recognize() - if not mediainfo and plugin_available: - logger.info(f'原生识别未识别到 {title} 的媒体信息,尝试使用辅助识别') - mediainfo = plugin_recognize() + # 按 config 中设置的识别顺序识别 + mediainfo = self._select_recognize_source( + log_name=title, + log_context=title, + native_fn=lambda: self.recognize_media(meta=metainfo, episode_group=episode_group), + plugin_fn=lambda: self.recognize_help(title=title, org_meta=metainfo) + ) if not mediainfo: logger.warn(f'{title} 未识别到媒体信息') return None @@ -175,25 +190,13 @@ class MediaChain(ChainBase): file_path = Path(path) # 元数据 file_meta = MetaInfoPath(file_path) - mediainfo: MediaInfo = None - plugin_available = eventmanager.check(ChainEventType.NameRecognize) - # 定义识别函数 - native_recognize = lambda: self.recognize_media(meta=file_meta, episode_group=episode_group) - plugin_recognize = lambda: self.recognize_help(title=path, org_meta=file_meta) - if settings.RECOGNIZE_PLUGIN_FIRST and plugin_available: - # 插件优先 - logger.info(f"插件优先模式已开启。请求辅助识别,标题:{file_path.name} ...") - mediainfo = plugin_recognize() - if not mediainfo: - logger.info(f'辅助识别未识别到 {path} 的媒体信息,尝试使用原生识别') - mediainfo = native_recognize() - else: - # 原生优先 - logger.info(f"插件优先模式未开启。尝试原生识别,标题:{file_path.name} ...") - mediainfo = native_recognize() - if not mediainfo and plugin_available: - logger.info(f'原生识别未识别到 {path} 的媒体信息,尝试使用辅助识别') - mediainfo = plugin_recognize() + # 按 config 中设置的识别顺序识别 + mediainfo = self._select_recognize_source( + log_name=file_path.name, + log_context=path, + native_fn=lambda: self.recognize_media(meta=file_meta, episode_group=episode_group), + plugin_fn=lambda: self.recognize_help(title=path, org_meta=file_meta) + ) if not mediainfo: logger.warn(f'{path} 未识别到媒体信息') return Context(meta_info=file_meta) @@ -844,33 +847,51 @@ class MediaChain(ChainBase): logger.warn("无法识别元数据,跳过") logger.info(f"{filepath.name} 刮削完成") + async def _async_select_recognize_source(self, log_name: str, log_context: str, + native_fn, plugin_fn) -> Optional[MediaInfo]: + """ + 选择识别模式,插件优先或原生优先(异步版本) + :param log_name: 用于日志“标题:...”处的名称(如 file_path.name 或 title) + :param log_context: 用于日志“未识别到...的媒体信息”处的上下文(如 path 或 title) + :param native_fn: 原生识别函数 + :param plugin_fn: 插件识别函数 + """ + mediainfo = None + plugin_available = eventmanager.check(ChainEventType.NameRecognize) + if settings.RECOGNIZE_PLUGIN_FIRST and plugin_available: + # 插件优先 + logger.info(f"插件优先模式已开启。请求辅助识别,标题:{log_name} ...") + mediainfo = await plugin_fn() + if not mediainfo: + logger.info(f'辅助识别未识别到 {log_context} 的媒体信息,尝试使用原生识别') + mediainfo = await native_fn() + else: + # 原生优先 + logger.info(f"插件优先模式未开启。尝试原生识别,标题:{log_name} ...") + mediainfo = await native_fn() + if not mediainfo and plugin_available: + logger.info(f'原生识别未识别到 {log_context} 的媒体信息,尝试使用辅助识别') + mediainfo = await plugin_fn() + return mediainfo + async def async_recognize_by_meta(self, metainfo: MetaBase, episode_group: Optional[str] = None) -> Optional[MediaInfo]: """ 根据主副标题识别媒体信息(异步版本) """ title = metainfo.title - mediainfo: MediaInfo = None - plugin_available = eventmanager.check(ChainEventType.NameRecognize) # 定义识别函数 async def native_recognize(): return await self.async_recognize_media(meta=metainfo, episode_group=episode_group) async def plugin_recognize(): return await self.async_recognize_help(title=title, org_meta=metainfo) - if settings.RECOGNIZE_PLUGIN_FIRST and plugin_available: - # 插件优先 - logger.info(f"插件优先模式已开启。请求辅助识别,标题:{title} ...") - mediainfo = await plugin_recognize() - if not mediainfo: - logger.info(f'辅助识别未识别到 {title} 的媒体信息,尝试使用原生识别') - mediainfo = await native_recognize() - else: - # 原生优先 - logger.info(f"插件优先模式未开启。尝试原生识别,标题:{title} ...") - mediainfo = await native_recognize() - if not mediainfo and plugin_available: - logger.info(f'原生识别未识别到 {title} 的媒体信息,尝试使用辅助识别') - mediainfo = await plugin_recognize() + # 按 config 中设置的识别顺序识别 + mediainfo = await self._async_select_recognize_source( + log_name=title, + log_context=title, + native_fn=native_recognize, + plugin_fn=plugin_recognize + ) if not mediainfo: logger.warn(f'{title} 未识别到媒体信息') return None @@ -937,27 +958,18 @@ class MediaChain(ChainBase): file_path = Path(path) # 元数据 file_meta = MetaInfoPath(file_path) - mediainfo: MediaInfo = None - plugin_available = eventmanager.check(ChainEventType.NameRecognize) # 定义识别函数 async def native_recognize(): return await self.async_recognize_media(meta=file_meta, episode_group=episode_group) async def plugin_recognize(): return await self.async_recognize_help(title=path, org_meta=file_meta) - if settings.RECOGNIZE_PLUGIN_FIRST and plugin_available: - # 插件优先 - logger.info(f"插件优先模式已开启。请求辅助识别,标题:{file_path.name} ...") - mediainfo = await plugin_recognize() - if not mediainfo: - logger.info(f'辅助识别未识别到 {path} 的媒体信息,尝试使用原生识别') - mediainfo = await native_recognize() - else: - # 原生优先 - logger.info(f"插件优先模式未开启。尝试原生识别,标题:{file_path.name} ...") - mediainfo = await native_recognize() - if not mediainfo and plugin_available: - logger.info(f'原生识别未识别到 {path} 的媒体信息,尝试使用辅助识别') - mediainfo = await plugin_recognize() + # 按 config 中设置的识别顺序识别 + mediainfo = await self._async_select_recognize_source( + log_name=file_path.name, + log_context=path, + native_fn=native_recognize, + plugin_fn=plugin_recognize + ) if not mediainfo: logger.warn(f'{path} 未识别到媒体信息') return Context(meta_info=file_meta) From 28945ef153c593643da28a790f68d809219f5e80 Mon Sep 17 00:00:00 2001 From: Castell Date: Tue, 3 Mar 2026 01:58:49 +0800 Subject: [PATCH 5/5] =?UTF-8?q?refactor:=20=E5=B0=86=20download.py=20?= =?UTF-8?q?=E4=B8=AD=E9=87=8D=E5=A4=8D=E7=9A=84=E5=AA=92=E4=BD=93=E8=AF=86?= =?UTF-8?q?=E5=88=AB=E6=A8=A1=E5=BC=8F=E9=80=89=E6=8B=A9=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=B0=81=E8=A3=85=E8=BF=9B=E9=80=89=E6=8B=A9=E5=99=A8=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/endpoints/download.py | 21 ++++++--------------- app/chain/media.py | 12 ++++++------ 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/app/api/endpoints/download.py b/app/api/endpoints/download.py index 88657afe..ca1ed633 100644 --- a/app/api/endpoints/download.py +++ b/app/api/endpoints/download.py @@ -78,21 +78,12 @@ def add( # 元数据 metainfo = MetaInfo(title=torrent_in.title, subtitle=torrent_in.description) # 媒体信息 - mediainfo: MediaInfo = None - plugin_available = eventmanager.check(ChainEventType.NameRecognize) - # 定义识别函数 - native_recognize = lambda: MediaChain().recognize_media(meta=metainfo, tmdbid=tmdbid, doubanid=doubanid) - plugin_recognize = lambda: MediaChain().recognize_help(title=torrent_in.title, org_meta=metainfo) - if settings.RECOGNIZE_PLUGIN_FIRST and plugin_available: - # 插件优先 - mediainfo = plugin_recognize() - if not mediainfo: - mediainfo = native_recognize() - else: - # 原生优先 - mediainfo = native_recognize() - if not mediainfo and plugin_available: - mediainfo = plugin_recognize() + mediainfo = MediaChain().select_recognize_source( + log_name=torrent_in.title, + log_context=torrent_in.title, + native_fn=lambda: MediaChain().recognize_media(meta=metainfo, tmdbid=tmdbid, doubanid=doubanid), + plugin_fn=lambda: MediaChain().recognize_help(title=torrent_in.title, org_meta=metainfo) + ) if not mediainfo: return schemas.Response(success=False, message="无法识别媒体信息") # 种子信息 diff --git a/app/chain/media.py b/app/chain/media.py index 3d2e3995..f1446362 100644 --- a/app/chain/media.py +++ b/app/chain/media.py @@ -85,7 +85,7 @@ class MediaChain(ChainBase): """ return self.run_module("metadata_nfo", meta=meta, mediainfo=mediainfo, season=season, episode=episode) - def _select_recognize_source(self, log_name: str, log_context: str, + def select_recognize_source(self, log_name: str, log_context: str, native_fn, plugin_fn) -> Optional[MediaInfo]: """ 选择识别模式,插件优先或原生优先 @@ -118,7 +118,7 @@ class MediaChain(ChainBase): """ title = metainfo.title # 按 config 中设置的识别顺序识别 - mediainfo = self._select_recognize_source( + mediainfo = self.select_recognize_source( log_name=title, log_context=title, native_fn=lambda: self.recognize_media(meta=metainfo, episode_group=episode_group), @@ -191,7 +191,7 @@ class MediaChain(ChainBase): # 元数据 file_meta = MetaInfoPath(file_path) # 按 config 中设置的识别顺序识别 - mediainfo = self._select_recognize_source( + mediainfo = self.select_recognize_source( log_name=file_path.name, log_context=path, native_fn=lambda: self.recognize_media(meta=file_meta, episode_group=episode_group), @@ -847,7 +847,7 @@ class MediaChain(ChainBase): logger.warn("无法识别元数据,跳过") logger.info(f"{filepath.name} 刮削完成") - async def _async_select_recognize_source(self, log_name: str, log_context: str, + async def async_select_recognize_source(self, log_name: str, log_context: str, native_fn, plugin_fn) -> Optional[MediaInfo]: """ 选择识别模式,插件优先或原生优先(异步版本) @@ -886,7 +886,7 @@ class MediaChain(ChainBase): async def plugin_recognize(): return await self.async_recognize_help(title=title, org_meta=metainfo) # 按 config 中设置的识别顺序识别 - mediainfo = await self._async_select_recognize_source( + mediainfo = await self.async_select_recognize_source( log_name=title, log_context=title, native_fn=native_recognize, @@ -964,7 +964,7 @@ class MediaChain(ChainBase): async def plugin_recognize(): return await self.async_recognize_help(title=path, org_meta=file_meta) # 按 config 中设置的识别顺序识别 - mediainfo = await self._async_select_recognize_source( + mediainfo = await self.async_select_recognize_source( log_name=file_path.name, log_context=path, native_fn=native_recognize,