mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-06-11 10:40:18 +08:00
fix: update shared recognize cache flow
This commit is contained in:
@@ -415,6 +415,48 @@ class ChainBase(metaclass=ABCMeta):
|
||||
and not any([tmdbid, doubanid, bangumiid])
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def _snapshot_recognize_cache_meta(meta: Optional[MetaBase]) -> Optional[MetaBase]:
|
||||
"""
|
||||
保存共享识别前的本地缓存关键元数据,用于共享成功后回填正缓存覆盖负缓存。
|
||||
"""
|
||||
if not meta:
|
||||
return None
|
||||
return copy.deepcopy(meta)
|
||||
|
||||
@staticmethod
|
||||
def _update_local_recognize_cache(
|
||||
self,
|
||||
meta: Optional[MetaBase],
|
||||
mediainfo: Optional[MediaInfo],
|
||||
) -> None:
|
||||
"""
|
||||
共享识别成功后回填本地识别缓存,避免名称负缓存导致后续重复回查共享。
|
||||
"""
|
||||
if not meta or not mediainfo:
|
||||
return
|
||||
self.run_module(
|
||||
"update_recognize_cache",
|
||||
meta=meta,
|
||||
mediainfo=mediainfo,
|
||||
)
|
||||
|
||||
async def _async_update_local_recognize_cache(
|
||||
self,
|
||||
meta: Optional[MetaBase],
|
||||
mediainfo: Optional[MediaInfo],
|
||||
) -> None:
|
||||
"""
|
||||
异步回填本地识别缓存。
|
||||
"""
|
||||
if not meta or not mediainfo:
|
||||
return
|
||||
await self.async_run_module(
|
||||
"async_update_recognize_cache",
|
||||
meta=meta,
|
||||
mediainfo=mediainfo,
|
||||
)
|
||||
|
||||
def recognize_media(
|
||||
self,
|
||||
meta: MetaBase = None,
|
||||
@@ -460,10 +502,12 @@ class ChainBase(metaclass=ABCMeta):
|
||||
cache=cache,
|
||||
)
|
||||
if mediainfo:
|
||||
share_helper.report(meta=meta, mediainfo=mediainfo)
|
||||
if not mediainfo.recognize_cache_hit:
|
||||
share_helper.report(meta=meta, mediainfo=mediainfo)
|
||||
return mediainfo
|
||||
|
||||
if self._can_use_media_recognize_share(meta, tmdbid, doubanid, bangumiid):
|
||||
shared_cache_meta = self._snapshot_recognize_cache_meta(meta)
|
||||
shared_item = share_helper.query(meta=meta, mtype=mtype)
|
||||
shared_params = share_helper.to_recognize_params(shared_item)
|
||||
if shared_params:
|
||||
@@ -479,7 +523,9 @@ class ChainBase(metaclass=ABCMeta):
|
||||
cache=cache,
|
||||
)
|
||||
if mediainfo:
|
||||
share_helper.report(meta=meta, mediainfo=mediainfo)
|
||||
self._update_local_recognize_cache(shared_cache_meta, mediainfo)
|
||||
if not mediainfo.recognize_cache_hit:
|
||||
share_helper.report(meta=meta, mediainfo=mediainfo)
|
||||
return mediainfo
|
||||
return None
|
||||
|
||||
@@ -528,10 +574,12 @@ class ChainBase(metaclass=ABCMeta):
|
||||
cache=cache,
|
||||
)
|
||||
if mediainfo:
|
||||
await share_helper.async_report(meta=meta, mediainfo=mediainfo)
|
||||
if not mediainfo.recognize_cache_hit:
|
||||
await share_helper.async_report(meta=meta, mediainfo=mediainfo)
|
||||
return mediainfo
|
||||
|
||||
if self._can_use_media_recognize_share(meta, tmdbid, doubanid, bangumiid):
|
||||
shared_cache_meta = self._snapshot_recognize_cache_meta(meta)
|
||||
shared_item = await share_helper.async_query(meta=meta, mtype=mtype)
|
||||
shared_params = share_helper.to_recognize_params(shared_item)
|
||||
if shared_params:
|
||||
@@ -547,7 +595,9 @@ class ChainBase(metaclass=ABCMeta):
|
||||
cache=cache,
|
||||
)
|
||||
if mediainfo:
|
||||
await share_helper.async_report(meta=meta, mediainfo=mediainfo)
|
||||
await self._async_update_local_recognize_cache(shared_cache_meta, mediainfo)
|
||||
if not mediainfo.recognize_cache_hit:
|
||||
await share_helper.async_report(meta=meta, mediainfo=mediainfo)
|
||||
return mediainfo
|
||||
return None
|
||||
|
||||
|
||||
@@ -152,6 +152,8 @@ class TorrentInfo:
|
||||
|
||||
@dataclass
|
||||
class MediaInfo:
|
||||
# 内部标记:是否命中本地识别缓存,不参与序列化
|
||||
recognize_cache_hit = False
|
||||
# 来源:themoviedb、douban、bangumi
|
||||
source: str = None
|
||||
# 类型 电影、电视剧
|
||||
|
||||
@@ -39,7 +39,7 @@ class MediaRecognizeShareHelper(metaclass=WeakSingleton):
|
||||
"""
|
||||
if not meta:
|
||||
return None
|
||||
keyword = getattr(meta, "original_name", None) or getattr(meta, "name", None)
|
||||
keyword = meta.original_name or meta.name
|
||||
if keyword:
|
||||
keyword = str(keyword).strip()
|
||||
return keyword or None
|
||||
@@ -77,7 +77,7 @@ class MediaRecognizeShareHelper(metaclass=WeakSingleton):
|
||||
"""
|
||||
if media_type != "tv":
|
||||
return None
|
||||
season = getattr(meta, "begin_season", None)
|
||||
season = meta.begin_season if meta else None
|
||||
if season is None and mediainfo:
|
||||
season = mediainfo.season
|
||||
try:
|
||||
@@ -93,7 +93,7 @@ class MediaRecognizeShareHelper(metaclass=WeakSingleton):
|
||||
"""
|
||||
提取年份
|
||||
"""
|
||||
year = getattr(meta, "year", None) or (mediainfo.year if mediainfo else None)
|
||||
year = (meta.year if meta else None) or (mediainfo.year if mediainfo else None)
|
||||
if year is None:
|
||||
return None
|
||||
year_text = str(year).strip()
|
||||
|
||||
@@ -108,6 +108,7 @@ class DoubanModule(_ModuleBase):
|
||||
if doubanid:
|
||||
meta.doubanid = doubanid
|
||||
cache_info = self.cache.get(meta)
|
||||
cache_hit = False
|
||||
|
||||
# 识别豆瓣信息
|
||||
if not cache_info or not cache:
|
||||
@@ -148,6 +149,7 @@ class DoubanModule(_ModuleBase):
|
||||
self.cache.update(meta, info)
|
||||
else:
|
||||
# 使用缓存信息
|
||||
cache_hit = True
|
||||
if cache_info.get("title"):
|
||||
logger.info(f"{meta.name} 使用豆瓣识别缓存:{cache_info.get('title')}")
|
||||
info = douban_info_func(mtype=cache_info.get("type"),
|
||||
@@ -159,6 +161,7 @@ class DoubanModule(_ModuleBase):
|
||||
if info:
|
||||
# 赋值TMDB信息并返回
|
||||
mediainfo = MediaInfo(douban_info=info)
|
||||
mediainfo.recognize_cache_hit = cache_hit
|
||||
if meta:
|
||||
logger.info(f"{meta.name} 豆瓣识别结果:{mediainfo.type.value} "
|
||||
f"{mediainfo.title_year} "
|
||||
@@ -209,6 +212,7 @@ class DoubanModule(_ModuleBase):
|
||||
if doubanid:
|
||||
meta.doubanid = doubanid
|
||||
cache_info = self.cache.get(meta)
|
||||
cache_hit = False
|
||||
|
||||
# 识别豆瓣信息
|
||||
if not cache_info or not cache:
|
||||
@@ -249,6 +253,7 @@ class DoubanModule(_ModuleBase):
|
||||
self.cache.update(meta, info)
|
||||
else:
|
||||
# 使用缓存信息
|
||||
cache_hit = True
|
||||
if cache_info.get("title"):
|
||||
logger.info(f"{meta.name} 使用豆瓣识别缓存:{cache_info.get('title')}")
|
||||
info = await async_douban_info_func(mtype=cache_info.get("type"),
|
||||
@@ -260,6 +265,7 @@ class DoubanModule(_ModuleBase):
|
||||
if info:
|
||||
# 赋值TMDB信息并返回
|
||||
mediainfo = MediaInfo(douban_info=info)
|
||||
mediainfo.recognize_cache_hit = cache_hit
|
||||
if meta:
|
||||
logger.info(f"{meta.name} 豆瓣识别结果:{mediainfo.type.value} "
|
||||
f"{mediainfo.title_year} "
|
||||
@@ -319,6 +325,31 @@ class DoubanModule(_ModuleBase):
|
||||
**kwargs
|
||||
)
|
||||
|
||||
def update_recognize_cache(
|
||||
self,
|
||||
meta: MetaBase,
|
||||
mediainfo: MediaInfo,
|
||||
) -> Optional[bool]:
|
||||
"""
|
||||
回填豆瓣本地识别缓存,覆盖名称负缓存,避免共享识别后重复回查。
|
||||
"""
|
||||
if not meta or not mediainfo:
|
||||
return None
|
||||
if mediainfo.source != "douban" or not mediainfo.douban_info:
|
||||
return None
|
||||
self.cache.update(meta, mediainfo.douban_info)
|
||||
return True
|
||||
|
||||
async def async_update_recognize_cache(
|
||||
self,
|
||||
meta: MetaBase,
|
||||
mediainfo: MediaInfo,
|
||||
) -> Optional[bool]:
|
||||
"""
|
||||
异步回填豆瓣本地识别缓存。
|
||||
"""
|
||||
return self.update_recognize_cache(meta=meta, mediainfo=mediainfo)
|
||||
|
||||
@rate_limit_exponential(source="douban_info")
|
||||
def douban_info(self, doubanid: str, mtype: MediaType = None, raise_exception: bool = True) -> Optional[dict]:
|
||||
"""
|
||||
|
||||
@@ -490,6 +490,7 @@ class TheMovieDbModule(_ModuleBase):
|
||||
group_seasons = []
|
||||
if episode_group:
|
||||
group_seasons = self.tmdb.get_tv_group_seasons(episode_group)
|
||||
cache_hit = False
|
||||
|
||||
# 识别匹配
|
||||
if not cache_info or not cache:
|
||||
@@ -525,6 +526,7 @@ class TheMovieDbModule(_ModuleBase):
|
||||
self.cache.update(meta, info)
|
||||
else:
|
||||
# 使用缓存信息
|
||||
cache_hit = True
|
||||
if cache_info.get("title"):
|
||||
logger.info(f"{meta.name} 使用TMDB识别缓存:{cache_info.get('title')}")
|
||||
info = self.tmdb.get_info(mtype=cache_info.get("type"),
|
||||
@@ -534,7 +536,10 @@ class TheMovieDbModule(_ModuleBase):
|
||||
info = None
|
||||
|
||||
if info:
|
||||
return self._build_media_info_result(info, meta, tmdbid, episode_group, group_seasons)
|
||||
mediainfo = self._build_media_info_result(info, meta, tmdbid, episode_group, group_seasons)
|
||||
if mediainfo:
|
||||
mediainfo.recognize_cache_hit = cache_hit
|
||||
return mediainfo
|
||||
else:
|
||||
logger.info(f"{meta.name if meta else tmdbid} 未匹配到TMDB媒体信息")
|
||||
|
||||
@@ -574,6 +579,7 @@ class TheMovieDbModule(_ModuleBase):
|
||||
group_seasons = []
|
||||
if episode_group:
|
||||
group_seasons = await self.tmdb.async_get_tv_group_seasons(episode_group)
|
||||
cache_hit = False
|
||||
|
||||
# 识别匹配
|
||||
if not cache_info or not cache:
|
||||
@@ -609,6 +615,7 @@ class TheMovieDbModule(_ModuleBase):
|
||||
self.cache.update(meta, info)
|
||||
else:
|
||||
# 使用缓存信息
|
||||
cache_hit = True
|
||||
if cache_info.get("title"):
|
||||
logger.info(f"{meta.name} 使用TMDB识别缓存:{cache_info.get('title')}")
|
||||
info = await self.tmdb.async_get_info(mtype=cache_info.get("type"),
|
||||
@@ -618,7 +625,10 @@ class TheMovieDbModule(_ModuleBase):
|
||||
info = None
|
||||
|
||||
if info:
|
||||
return await self._async_build_media_info_result(info, meta, tmdbid, episode_group, group_seasons)
|
||||
mediainfo = await self._async_build_media_info_result(info, meta, tmdbid, episode_group, group_seasons)
|
||||
if mediainfo:
|
||||
mediainfo.recognize_cache_hit = cache_hit
|
||||
return mediainfo
|
||||
else:
|
||||
logger.info(f"{meta.name if meta else tmdbid} 未匹配到TMDB媒体信息")
|
||||
|
||||
@@ -692,6 +702,31 @@ class TheMovieDbModule(_ModuleBase):
|
||||
else:
|
||||
return await self.tmdb.async_get_tv_season_detail(tmdbid=tmdbid, season=season)
|
||||
|
||||
def update_recognize_cache(
|
||||
self,
|
||||
meta: MetaBase,
|
||||
mediainfo: MediaInfo,
|
||||
) -> Optional[bool]:
|
||||
"""
|
||||
回填TMDB本地识别缓存,覆盖名称负缓存,避免共享识别后重复回查。
|
||||
"""
|
||||
if not meta or not mediainfo:
|
||||
return None
|
||||
if mediainfo.source != "themoviedb" or not mediainfo.tmdb_info:
|
||||
return None
|
||||
self.cache.update(meta, mediainfo.tmdb_info)
|
||||
return True
|
||||
|
||||
async def async_update_recognize_cache(
|
||||
self,
|
||||
meta: MetaBase,
|
||||
mediainfo: MediaInfo,
|
||||
) -> Optional[bool]:
|
||||
"""
|
||||
异步回填TMDB本地识别缓存。
|
||||
"""
|
||||
return self.update_recognize_cache(meta=meta, mediainfo=mediainfo)
|
||||
|
||||
def media_category(self) -> Optional[Dict[str, list]]:
|
||||
"""
|
||||
获取媒体分类
|
||||
|
||||
Reference in New Issue
Block a user