mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-03-20 03:57:30 +08:00
refactor: 将重复的媒体识别模式选择逻辑封装进选择器函数
This commit is contained in:
@@ -85,30 +85,45 @@ class MediaChain(ChainBase):
|
|||||||
"""
|
"""
|
||||||
return self.run_module("metadata_nfo", meta=meta, mediainfo=mediainfo, season=season, episode=episode)
|
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]:
|
def recognize_by_meta(self, metainfo: MetaBase, episode_group: Optional[str] = None) -> Optional[MediaInfo]:
|
||||||
"""
|
"""
|
||||||
根据主副标题识别媒体信息
|
根据主副标题识别媒体信息
|
||||||
"""
|
"""
|
||||||
title = metainfo.title
|
title = metainfo.title
|
||||||
mediainfo: MediaInfo = None
|
# 按 config 中设置的识别顺序识别
|
||||||
plugin_available = eventmanager.check(ChainEventType.NameRecognize)
|
mediainfo = self._select_recognize_source(
|
||||||
# 定义识别函数
|
log_name=title,
|
||||||
native_recognize = lambda: self.recognize_media(meta=metainfo, episode_group=episode_group)
|
log_context=title,
|
||||||
plugin_recognize = lambda: self.recognize_help(title=title, org_meta=metainfo)
|
native_fn=lambda: self.recognize_media(meta=metainfo, episode_group=episode_group),
|
||||||
if settings.RECOGNIZE_PLUGIN_FIRST and plugin_available:
|
plugin_fn=lambda: self.recognize_help(title=title, org_meta=metainfo)
|
||||||
# 插件优先
|
)
|
||||||
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()
|
|
||||||
if not mediainfo:
|
if not mediainfo:
|
||||||
logger.warn(f'{title} 未识别到媒体信息')
|
logger.warn(f'{title} 未识别到媒体信息')
|
||||||
return None
|
return None
|
||||||
@@ -175,25 +190,13 @@ class MediaChain(ChainBase):
|
|||||||
file_path = Path(path)
|
file_path = Path(path)
|
||||||
# 元数据
|
# 元数据
|
||||||
file_meta = MetaInfoPath(file_path)
|
file_meta = MetaInfoPath(file_path)
|
||||||
mediainfo: MediaInfo = None
|
# 按 config 中设置的识别顺序识别
|
||||||
plugin_available = eventmanager.check(ChainEventType.NameRecognize)
|
mediainfo = self._select_recognize_source(
|
||||||
# 定义识别函数
|
log_name=file_path.name,
|
||||||
native_recognize = lambda: self.recognize_media(meta=file_meta, episode_group=episode_group)
|
log_context=path,
|
||||||
plugin_recognize = lambda: self.recognize_help(title=path, org_meta=file_meta)
|
native_fn=lambda: self.recognize_media(meta=file_meta, episode_group=episode_group),
|
||||||
if settings.RECOGNIZE_PLUGIN_FIRST and plugin_available:
|
plugin_fn=lambda: self.recognize_help(title=path, org_meta=file_meta)
|
||||||
# 插件优先
|
)
|
||||||
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()
|
|
||||||
if not mediainfo:
|
if not mediainfo:
|
||||||
logger.warn(f'{path} 未识别到媒体信息')
|
logger.warn(f'{path} 未识别到媒体信息')
|
||||||
return Context(meta_info=file_meta)
|
return Context(meta_info=file_meta)
|
||||||
@@ -844,33 +847,51 @@ class MediaChain(ChainBase):
|
|||||||
logger.warn("无法识别元数据,跳过")
|
logger.warn("无法识别元数据,跳过")
|
||||||
logger.info(f"{filepath.name} 刮削完成")
|
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,
|
async def async_recognize_by_meta(self, metainfo: MetaBase,
|
||||||
episode_group: Optional[str] = None) -> Optional[MediaInfo]:
|
episode_group: Optional[str] = None) -> Optional[MediaInfo]:
|
||||||
"""
|
"""
|
||||||
根据主副标题识别媒体信息(异步版本)
|
根据主副标题识别媒体信息(异步版本)
|
||||||
"""
|
"""
|
||||||
title = metainfo.title
|
title = metainfo.title
|
||||||
mediainfo: MediaInfo = None
|
|
||||||
plugin_available = eventmanager.check(ChainEventType.NameRecognize)
|
|
||||||
# 定义识别函数
|
# 定义识别函数
|
||||||
async def native_recognize():
|
async def native_recognize():
|
||||||
return await self.async_recognize_media(meta=metainfo, episode_group=episode_group)
|
return await self.async_recognize_media(meta=metainfo, episode_group=episode_group)
|
||||||
async def plugin_recognize():
|
async def plugin_recognize():
|
||||||
return await self.async_recognize_help(title=title, org_meta=metainfo)
|
return await self.async_recognize_help(title=title, org_meta=metainfo)
|
||||||
if settings.RECOGNIZE_PLUGIN_FIRST and plugin_available:
|
# 按 config 中设置的识别顺序识别
|
||||||
# 插件优先
|
mediainfo = await self._async_select_recognize_source(
|
||||||
logger.info(f"插件优先模式已开启。请求辅助识别,标题:{title} ...")
|
log_name=title,
|
||||||
mediainfo = await plugin_recognize()
|
log_context=title,
|
||||||
if not mediainfo:
|
native_fn=native_recognize,
|
||||||
logger.info(f'辅助识别未识别到 {title} 的媒体信息,尝试使用原生识别')
|
plugin_fn=plugin_recognize
|
||||||
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()
|
|
||||||
if not mediainfo:
|
if not mediainfo:
|
||||||
logger.warn(f'{title} 未识别到媒体信息')
|
logger.warn(f'{title} 未识别到媒体信息')
|
||||||
return None
|
return None
|
||||||
@@ -937,27 +958,18 @@ class MediaChain(ChainBase):
|
|||||||
file_path = Path(path)
|
file_path = Path(path)
|
||||||
# 元数据
|
# 元数据
|
||||||
file_meta = MetaInfoPath(file_path)
|
file_meta = MetaInfoPath(file_path)
|
||||||
mediainfo: MediaInfo = None
|
|
||||||
plugin_available = eventmanager.check(ChainEventType.NameRecognize)
|
|
||||||
# 定义识别函数
|
# 定义识别函数
|
||||||
async def native_recognize():
|
async def native_recognize():
|
||||||
return await self.async_recognize_media(meta=file_meta, episode_group=episode_group)
|
return await self.async_recognize_media(meta=file_meta, episode_group=episode_group)
|
||||||
async def plugin_recognize():
|
async def plugin_recognize():
|
||||||
return await self.async_recognize_help(title=path, org_meta=file_meta)
|
return await self.async_recognize_help(title=path, org_meta=file_meta)
|
||||||
if settings.RECOGNIZE_PLUGIN_FIRST and plugin_available:
|
# 按 config 中设置的识别顺序识别
|
||||||
# 插件优先
|
mediainfo = await self._async_select_recognize_source(
|
||||||
logger.info(f"插件优先模式已开启。请求辅助识别,标题:{file_path.name} ...")
|
log_name=file_path.name,
|
||||||
mediainfo = await plugin_recognize()
|
log_context=path,
|
||||||
if not mediainfo:
|
native_fn=native_recognize,
|
||||||
logger.info(f'辅助识别未识别到 {path} 的媒体信息,尝试使用原生识别')
|
plugin_fn=plugin_recognize
|
||||||
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()
|
|
||||||
if not mediainfo:
|
if not mediainfo:
|
||||||
logger.warn(f'{path} 未识别到媒体信息')
|
logger.warn(f'{path} 未识别到媒体信息')
|
||||||
return Context(meta_info=file_meta)
|
return Context(meta_info=file_meta)
|
||||||
|
|||||||
Reference in New Issue
Block a user