2023-06-06 07:15:17 +08:00

150 lines
5.9 KiB
Python

from typing import Optional, List, Tuple, Union
from app.core import settings, MediaInfo
from app.core.meta import MetaBase
from app.modules import _ModuleBase
from app.modules.themoviedb.category import CategoryHelper
from app.modules.themoviedb.tmdb import TmdbHelper
from app.modules.themoviedb.tmdb_cache import TmdbCache
from app.utils.types import MediaType
class TheMovieDb(_ModuleBase):
"""
TMDB媒体信息匹配
"""
# 元数据缓存
cache: TmdbCache = None
# TMDB
tmdb: TmdbHelper = None
# 二级分类
category: CategoryHelper = None
def init_module(self) -> None:
self.cache = TmdbCache()
self.tmdb = TmdbHelper()
self.category = CategoryHelper()
def init_setting(self) -> Tuple[str, Union[str, bool]]:
pass
def recognize_media(self, meta: MetaBase,
tmdbid: str = None) -> Optional[MediaInfo]:
"""
识别媒体信息
:param meta: 识别的元数据
:param tmdbid: tmdbid
:return: 识别的媒体信息,包括剧集信息
"""
if not meta:
return None
cache_info = self.cache.get(meta)
if not cache_info:
# 缓存没有或者强制不使用缓存
if tmdbid:
# 直接查询详情
info = self.tmdb.get_tmdb_info(mtype=meta.type, tmdbid=tmdbid)
else:
if meta.type != MediaType.TV and not meta.year:
info = self.tmdb.search_multi_tmdb(meta.get_name())
else:
if meta.type == MediaType.TV:
# 确定是电视
info = self.tmdb.search_tmdb(name=meta.get_name(),
year=meta.year,
mtype=meta.type,
season_year=meta.year,
season_number=meta.begin_season
)
if meta.year:
# 非严格模式下去掉年份再查一次
info = self.tmdb.search_tmdb(name=meta.get_name(),
mtype=meta.type)
else:
# 有年份先按电影查
info = self.tmdb.search_tmdb(name=meta.get_name(),
year=meta.year,
mtype=MediaType.MOVIE)
# 没有再按电视剧查
if not info:
info = self.tmdb.search_tmdb(name=meta.get_name(),
year=meta.year,
mtype=MediaType.TV
)
if not info:
# 非严格模式下去掉年份和类型再查一次
info = self.tmdb.search_multi_tmdb(name=meta.get_name())
if not info:
# 从网站查询
info = self.tmdb.search_tmdb_web(name=meta.get_name(),
mtype=meta.type)
# 补充全量信息
if info and not info.get("genres"):
info = self.tmdb.get_tmdb_info(mtype=info.get("media_type"),
tmdbid=info.get("id"))
# 保存到缓存
self.cache.update(meta, info)
else:
# 使用缓存信息
if cache_info.get("title"):
info = self.tmdb.get_tmdb_info(mtype=cache_info.get("type"),
tmdbid=cache_info.get("id"))
else:
info = None
# 赋值TMDB信息并返回
mediainfo = MediaInfo(tmdb_info=info)
# 确定二级分类
if info:
if info.get('media_type') == MediaType.MOVIE:
cat = self.category.get_movie_category(info)
else:
cat = self.category.get_tv_category(info)
mediainfo.set_category(cat)
return mediainfo
def search_medias(self, meta: MetaBase) -> Optional[List[MediaInfo]]:
"""
搜索媒体信息
:param meta: 识别的元数据
:reutrn: 媒体信息
"""
# 未启用时返回None
if settings.SEARCH_SOURCE != "themoviedb":
return None
if not meta.get_name():
return []
if not meta.type and not meta.year:
results = self.tmdb.search_multi_tmdbinfos(meta.get_name())
else:
if not meta.type:
results = list(
set(self.tmdb.search_movie_tmdbinfos(meta.get_name(), meta.year))
.union(set(self.tmdb.search_tv_tmdbinfos(meta.get_name(), meta.year)))
)
# 组合结果的情况下要排序
results = sorted(
results,
key=lambda x: x.get("release_date") or x.get("first_air_date") or "0000-00-00",
reverse=True
)
elif meta.type == MediaType.MOVIE:
results = self.tmdb.search_movie_tmdbinfos(meta.get_name(), meta.year)
else:
results = self.tmdb.search_tv_tmdbinfos(meta.get_name(), meta.year)
return [MediaInfo(tmdb_info=info) for info in results]
def scrape_metadata(self, path: str, mediainfo: MediaInfo) -> None:
"""
TODO 刮削元数据
:param path: 媒体文件路径
:param mediainfo: 识别的媒体信息
:return: 成功或失败
"""
if settings.SCRAP_SOURCE != "themoviedb":
return None