fix bugs
This commit is contained in:
parent
548317980f
commit
99bd8aade3
@ -16,7 +16,7 @@ router = APIRouter()
|
|||||||
|
|
||||||
|
|
||||||
def start_subscribe_chain(title: str,
|
def start_subscribe_chain(title: str,
|
||||||
mtype: MediaType, tmdbid: str, season: int, username: str):
|
mtype: MediaType, tmdbid: int, season: int, username: str):
|
||||||
"""
|
"""
|
||||||
启动订阅链式任务
|
启动订阅链式任务
|
||||||
"""
|
"""
|
||||||
|
@ -11,7 +11,7 @@ from app.core.context import MediaInfo, TorrentInfo
|
|||||||
from app.core.meta import MetaBase
|
from app.core.meta import MetaBase
|
||||||
from app.log import logger
|
from app.log import logger
|
||||||
from app.utils.singleton import AbstractSingleton, Singleton
|
from app.utils.singleton import AbstractSingleton, Singleton
|
||||||
from app.utils.types import TorrentStatus
|
from app.utils.types import TorrentStatus, MediaType
|
||||||
|
|
||||||
|
|
||||||
class ChainBase(AbstractSingleton, metaclass=Singleton):
|
class ChainBase(AbstractSingleton, metaclass=Singleton):
|
||||||
@ -69,7 +69,8 @@ class ChainBase(AbstractSingleton, metaclass=Singleton):
|
|||||||
return self.run_module("prepare_recognize", title=title, subtitle=subtitle)
|
return self.run_module("prepare_recognize", title=title, subtitle=subtitle)
|
||||||
|
|
||||||
def recognize_media(self, meta: MetaBase,
|
def recognize_media(self, meta: MetaBase,
|
||||||
tmdbid: str = None) -> Optional[MediaInfo]:
|
mtype: MediaType = None,
|
||||||
|
tmdbid: int = None) -> Optional[MediaInfo]:
|
||||||
return self.run_module("recognize_media", meta=meta, tmdbid=tmdbid)
|
return self.run_module("recognize_media", meta=meta, tmdbid=tmdbid)
|
||||||
|
|
||||||
def douban_info(self, doubanid: str) -> Optional[dict]:
|
def douban_info(self, doubanid: str) -> Optional[dict]:
|
||||||
|
@ -133,7 +133,7 @@ class DownloadChain(ChainBase):
|
|||||||
userid=userid)
|
userid=userid)
|
||||||
return _hash
|
return _hash
|
||||||
|
|
||||||
def __update_seasons(tmdbid: str, need: list, current: list) -> list:
|
def __update_seasons(tmdbid: int, need: list, current: list) -> list:
|
||||||
"""
|
"""
|
||||||
更新need_tvs季数,返回剩余季数
|
更新need_tvs季数,返回剩余季数
|
||||||
"""
|
"""
|
||||||
@ -146,7 +146,7 @@ class DownloadChain(ChainBase):
|
|||||||
need_tvs.pop(tmdbid)
|
need_tvs.pop(tmdbid)
|
||||||
return need
|
return need
|
||||||
|
|
||||||
def __update_episodes(tmdbid: str, seq: int, need: list, current: set) -> list:
|
def __update_episodes(tmdbid: int, seq: int, need: list, current: set) -> list:
|
||||||
"""
|
"""
|
||||||
更新need_tvs集数,返回剩余集数
|
更新need_tvs集数,返回剩余集数
|
||||||
"""
|
"""
|
||||||
@ -159,7 +159,7 @@ class DownloadChain(ChainBase):
|
|||||||
need_tvs.pop(tmdbid)
|
need_tvs.pop(tmdbid)
|
||||||
return need
|
return need
|
||||||
|
|
||||||
def __get_season_episodes(tmdbid: str, season: int) -> int:
|
def __get_season_episodes(tmdbid: int, season: int) -> int:
|
||||||
"""
|
"""
|
||||||
获取需要的季的集数
|
获取需要的季的集数
|
||||||
"""
|
"""
|
||||||
@ -181,7 +181,7 @@ class DownloadChain(ChainBase):
|
|||||||
# 电视剧整季匹配
|
# 电视剧整季匹配
|
||||||
if need_tvs:
|
if need_tvs:
|
||||||
# 先把整季缺失的拿出来,看是否刚好有所有季都满足的种子
|
# 先把整季缺失的拿出来,看是否刚好有所有季都满足的种子
|
||||||
need_seasons: Dict[str, list] = {}
|
need_seasons: Dict[int, list] = {}
|
||||||
for need_tmdbid, need_tv in need_tvs.items():
|
for need_tmdbid, need_tv in need_tvs.items():
|
||||||
for tv in need_tv:
|
for tv in need_tv:
|
||||||
if not tv:
|
if not tv:
|
||||||
@ -364,6 +364,7 @@ class DownloadChain(ChainBase):
|
|||||||
if not mediainfo.seasons:
|
if not mediainfo.seasons:
|
||||||
# 补充媒体信息
|
# 补充媒体信息
|
||||||
mediainfo: MediaInfo = self.recognize_media(meta=MetaInfo(title=mediainfo.get_title_string()),
|
mediainfo: MediaInfo = self.recognize_media(meta=MetaInfo(title=mediainfo.get_title_string()),
|
||||||
|
mtype=mediainfo.type,
|
||||||
tmdbid=mediainfo.tmdb_id)
|
tmdbid=mediainfo.tmdb_id)
|
||||||
if not mediainfo:
|
if not mediainfo:
|
||||||
return False, {}
|
return False, {}
|
||||||
@ -390,6 +391,9 @@ class DownloadChain(ChainBase):
|
|||||||
continue
|
continue
|
||||||
# 添加不存在的季集信息
|
# 添加不存在的季集信息
|
||||||
__append_no_exists(season, episodes, len(episodes), min(episodes))
|
__append_no_exists(season, episodes, len(episodes), min(episodes))
|
||||||
|
else:
|
||||||
|
# 全季不存在
|
||||||
|
__append_no_exists(season, [], len(episodes), min(episodes))
|
||||||
# 存在不完整的剧集
|
# 存在不完整的剧集
|
||||||
if no_exists:
|
if no_exists:
|
||||||
logger.info(f"媒体库中已存在部分剧集,缺失:{no_exists}")
|
logger.info(f"媒体库中已存在部分剧集,缺失:{no_exists}")
|
||||||
|
@ -30,7 +30,7 @@ class SubscribeChain(ChainBase):
|
|||||||
|
|
||||||
def process(self, title: str,
|
def process(self, title: str,
|
||||||
mtype: MediaType = None,
|
mtype: MediaType = None,
|
||||||
tmdbid: str = None,
|
tmdbid: int = None,
|
||||||
season: int = None,
|
season: int = None,
|
||||||
userid: str = None,
|
userid: str = None,
|
||||||
username: str = None,
|
username: str = None,
|
||||||
@ -51,7 +51,7 @@ class SubscribeChain(ChainBase):
|
|||||||
metainfo.type = MediaType.TV
|
metainfo.type = MediaType.TV
|
||||||
metainfo.begin_season = season
|
metainfo.begin_season = season
|
||||||
# 识别媒体信息
|
# 识别媒体信息
|
||||||
mediainfo: MediaInfo = self.recognize_media(meta=metainfo, tmdbid=tmdbid)
|
mediainfo: MediaInfo = self.recognize_media(meta=metainfo, mtype=mtype, tmdbid=tmdbid)
|
||||||
if not mediainfo:
|
if not mediainfo:
|
||||||
logger.warn(f'未识别到媒体信息,标题:{title},tmdbid:{tmdbid}')
|
logger.warn(f'未识别到媒体信息,标题:{title},tmdbid:{tmdbid}')
|
||||||
return False
|
return False
|
||||||
@ -99,7 +99,7 @@ class SubscribeChain(ChainBase):
|
|||||||
meta.begin_season = subscribe.season
|
meta.begin_season = subscribe.season
|
||||||
meta.type = MediaType.MOVIE if subscribe.type == MediaType.MOVIE.value else MediaType.TV
|
meta.type = MediaType.MOVIE if subscribe.type == MediaType.MOVIE.value else MediaType.TV
|
||||||
# 识别媒体信息
|
# 识别媒体信息
|
||||||
mediainfo: MediaInfo = self.recognize_media(meta=meta, tmdbid=subscribe.tmdbid)
|
mediainfo: MediaInfo = self.recognize_media(meta=meta, mtype=meta.type, tmdbid=subscribe.tmdbid)
|
||||||
if not mediainfo:
|
if not mediainfo:
|
||||||
logger.warn(f'未识别到媒体信息,标题:{subscribe.name},tmdbid:{subscribe.tmdbid}')
|
logger.warn(f'未识别到媒体信息,标题:{subscribe.name},tmdbid:{subscribe.tmdbid}')
|
||||||
continue
|
continue
|
||||||
@ -183,7 +183,7 @@ class SubscribeChain(ChainBase):
|
|||||||
meta.begin_season = subscribe.season
|
meta.begin_season = subscribe.season
|
||||||
meta.type = MediaType.MOVIE if subscribe.type == MediaType.MOVIE.value else MediaType.TV
|
meta.type = MediaType.MOVIE if subscribe.type == MediaType.MOVIE.value else MediaType.TV
|
||||||
# 识别媒体信息
|
# 识别媒体信息
|
||||||
mediainfo: MediaInfo = self.recognize_media(meta=meta, tmdbid=subscribe.tmdbid)
|
mediainfo: MediaInfo = self.recognize_media(meta=meta, mtype=meta.type, tmdbid=subscribe.tmdbid)
|
||||||
if not mediainfo:
|
if not mediainfo:
|
||||||
logger.warn(f'未识别到媒体信息,标题:{subscribe.name},tmdbid:{subscribe.tmdbid}')
|
logger.warn(f'未识别到媒体信息,标题:{subscribe.name},tmdbid:{subscribe.tmdbid}')
|
||||||
continue
|
continue
|
||||||
|
@ -89,7 +89,7 @@ class UserMessageChain(ChainBase):
|
|||||||
return
|
return
|
||||||
# 发送缺失的媒体信息
|
# 发送缺失的媒体信息
|
||||||
if no_exists:
|
if no_exists:
|
||||||
messages = [f"第 {no_exist.get('season')} 季缺失 {no_exist.get('total_episodes')} 集"
|
messages = [f"第 {no_exist.get('season')} 季缺失 {len(no_exist.get('episodes'))} 集"
|
||||||
for no_exist in no_exists.get(mediainfo.tmdb_id)]
|
for no_exist in no_exists.get(mediainfo.tmdb_id)]
|
||||||
self.post_message(title=f"{mediainfo.get_title_string()}:\n" + "\n".join(messages))
|
self.post_message(title=f"{mediainfo.get_title_string()}:\n" + "\n".join(messages))
|
||||||
logger.info(f"{mediainfo.get_title_string()} 媒体库中不存在,开始搜索 ...")
|
logger.info(f"{mediainfo.get_title_string()} 媒体库中不存在,开始搜索 ...")
|
||||||
@ -109,7 +109,10 @@ class UserMessageChain(ChainBase):
|
|||||||
self._current_page = 0
|
self._current_page = 0
|
||||||
# 发送种子数据
|
# 发送种子数据
|
||||||
logger.info(f"搜索到 {len(contexts)} 条数据,开始发送选择消息 ...")
|
logger.info(f"搜索到 {len(contexts)} 条数据,开始发送选择消息 ...")
|
||||||
self.__post_torrents_message(items=contexts[:self._page_size], userid=userid, total=len(contexts))
|
self.__post_torrents_message(title=mediainfo.title,
|
||||||
|
items=contexts[:self._page_size],
|
||||||
|
userid=userid,
|
||||||
|
total=len(contexts))
|
||||||
|
|
||||||
elif cache_type == "Subscribe":
|
elif cache_type == "Subscribe":
|
||||||
# 订阅媒体
|
# 订阅媒体
|
||||||
@ -204,10 +207,16 @@ class UserMessageChain(ChainBase):
|
|||||||
end = start + self._page_size
|
end = start + self._page_size
|
||||||
if cache_type == "Torrent":
|
if cache_type == "Torrent":
|
||||||
# 发送种子数据
|
# 发送种子数据
|
||||||
self.__post_torrents_message(items=cache_list[start:end], userid=userid, total=len(cache_list))
|
self.__post_torrents_message(title=self._current_media.title,
|
||||||
|
items=cache_list[start:end],
|
||||||
|
userid=userid,
|
||||||
|
total=len(cache_list))
|
||||||
else:
|
else:
|
||||||
# 发送媒体数据
|
# 发送媒体数据
|
||||||
self.__post_medias_message(items=cache_list[start:end], userid=userid, total=len(cache_list))
|
self.__post_medias_message(title=self._current_media.title,
|
||||||
|
items=cache_list[start:end],
|
||||||
|
userid=userid,
|
||||||
|
total=len(cache_list))
|
||||||
|
|
||||||
elif text.lower() == "n":
|
elif text.lower() == "n":
|
||||||
# 下一页
|
# 下一页
|
||||||
@ -229,10 +238,12 @@ class UserMessageChain(ChainBase):
|
|||||||
else:
|
else:
|
||||||
if cache_type == "Torrent":
|
if cache_type == "Torrent":
|
||||||
# 发送种子数据
|
# 发送种子数据
|
||||||
self.__post_torrents_message(items=cache_list, userid=userid, total=total)
|
self.__post_torrents_message(title=self._current_media.title,
|
||||||
|
items=cache_list, userid=userid, total=total)
|
||||||
else:
|
else:
|
||||||
# 发送媒体数据
|
# 发送媒体数据
|
||||||
self.__post_medias_message(items=cache_list, userid=userid, total=total)
|
self.__post_medias_message(title=self._current_media.title,
|
||||||
|
items=cache_list, userid=userid, total=total)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# 搜索或订阅
|
# 搜索或订阅
|
||||||
@ -262,6 +273,7 @@ class UserMessageChain(ChainBase):
|
|||||||
meta.begin_episode = episode_num
|
meta.begin_episode = episode_num
|
||||||
if year:
|
if year:
|
||||||
meta.year = year
|
meta.year = year
|
||||||
|
# 记录当前状态
|
||||||
self._current_meta = meta
|
self._current_meta = meta
|
||||||
# 开始搜索
|
# 开始搜索
|
||||||
logger.info(f"开始搜索:{meta.get_name()}")
|
logger.info(f"开始搜索:{meta.get_name()}")
|
||||||
@ -276,24 +288,26 @@ class UserMessageChain(ChainBase):
|
|||||||
self._current_page = 0
|
self._current_page = 0
|
||||||
self._current_media = None
|
self._current_media = None
|
||||||
# 发送媒体列表
|
# 发送媒体列表
|
||||||
self.__post_medias_message(items=medias[:self._page_size], userid=userid, total=len(medias))
|
self.__post_medias_message(title=meta.get_name(),
|
||||||
|
items=medias[:self._page_size],
|
||||||
|
userid=userid, total=len(medias))
|
||||||
|
|
||||||
def __post_medias_message(self, items: list, userid: str, total: int):
|
def __post_medias_message(self, title: str, items: list, userid: str, total: int):
|
||||||
"""
|
"""
|
||||||
发送媒体列表消息
|
发送媒体列表消息
|
||||||
"""
|
"""
|
||||||
self.post_medias_message(
|
self.post_medias_message(
|
||||||
title=f"共找到{total}条相关信息,请回复数字选择对应媒体(p: 上一页 n: 下一页)",
|
title=f"【{title}】共找到{total}条相关信息,请回复数字选择对应媒体(p: 上一页 n: 下一页)",
|
||||||
items=items,
|
items=items,
|
||||||
userid=userid
|
userid=userid
|
||||||
)
|
)
|
||||||
|
|
||||||
def __post_torrents_message(self, items: list, userid: str, total: int):
|
def __post_torrents_message(self, title: str, items: list, userid: str, total: int):
|
||||||
"""
|
"""
|
||||||
发送种子列表消息
|
发送种子列表消息
|
||||||
"""
|
"""
|
||||||
self.post_torrents_message(
|
self.post_torrents_message(
|
||||||
title=f"共找到{total}条相关信息,请回复数字下载对应资源(0: 自动选择 p: 上一页 n: 下一页)",
|
title=f"【{title}】共找到{total}条相关信息,请回复数字下载对应资源(0: 自动选择 p: 上一页 n: 下一页)",
|
||||||
items=items,
|
items=items,
|
||||||
userid=userid
|
userid=userid
|
||||||
)
|
)
|
||||||
|
@ -6,7 +6,7 @@ from app.core.metainfo import MetaInfo
|
|||||||
from app.utils.types import MediaType
|
from app.utils.types import MediaType
|
||||||
|
|
||||||
|
|
||||||
class TorrentInfo(object):
|
class TorrentInfo:
|
||||||
# 站点ID
|
# 站点ID
|
||||||
site: int = None
|
site: int = None
|
||||||
# 站点名称
|
# 站点名称
|
||||||
@ -89,7 +89,7 @@ class TorrentInfo(object):
|
|||||||
return self.get_free_string(self.uploadvolumefactor, self.downloadvolumefactor)
|
return self.get_free_string(self.uploadvolumefactor, self.downloadvolumefactor)
|
||||||
|
|
||||||
|
|
||||||
class MediaInfo(object):
|
class MediaInfo:
|
||||||
# 类型 电影、电视剧
|
# 类型 电影、电视剧
|
||||||
type: MediaType = None
|
type: MediaType = None
|
||||||
# 媒体标题
|
# 媒体标题
|
||||||
@ -97,7 +97,7 @@ class MediaInfo(object):
|
|||||||
# 年份
|
# 年份
|
||||||
year: Optional[str] = None
|
year: Optional[str] = None
|
||||||
# TMDB ID
|
# TMDB ID
|
||||||
tmdb_id: Optional[str] = None
|
tmdb_id: Optional[int] = None
|
||||||
# IMDB ID
|
# IMDB ID
|
||||||
imdb_id: Optional[str] = None
|
imdb_id: Optional[str] = None
|
||||||
# TVDB ID
|
# TVDB ID
|
||||||
@ -132,6 +132,13 @@ class MediaInfo(object):
|
|||||||
actors: List[dict] = []
|
actors: List[dict] = []
|
||||||
|
|
||||||
def __init__(self, tmdb_info: dict = None, douban_info: dict = None):
|
def __init__(self, tmdb_info: dict = None, douban_info: dict = None):
|
||||||
|
# 初始化
|
||||||
|
self.seasons = {}
|
||||||
|
self.directors = []
|
||||||
|
self.actors = []
|
||||||
|
self.tmdb_info = {}
|
||||||
|
self.douban_info = {}
|
||||||
|
# 设置媒体信息
|
||||||
if tmdb_info:
|
if tmdb_info:
|
||||||
self.set_tmdb_info(tmdb_info)
|
self.set_tmdb_info(tmdb_info)
|
||||||
if douban_info:
|
if douban_info:
|
||||||
@ -221,7 +228,7 @@ class MediaInfo(object):
|
|||||||
# 类型
|
# 类型
|
||||||
self.type = info.get('media_type')
|
self.type = info.get('media_type')
|
||||||
# TMDBID
|
# TMDBID
|
||||||
self.tmdb_id = str(info.get('id'))
|
self.tmdb_id = info.get('id')
|
||||||
if not self.tmdb_id:
|
if not self.tmdb_id:
|
||||||
return
|
return
|
||||||
# 额外ID
|
# 额外ID
|
||||||
@ -395,7 +402,7 @@ class MediaInfo(object):
|
|||||||
return self.seasons.get(sea) or []
|
return self.seasons.get(sea) or []
|
||||||
|
|
||||||
|
|
||||||
class Context(object):
|
class Context:
|
||||||
"""
|
"""
|
||||||
上下文对象
|
上下文对象
|
||||||
"""
|
"""
|
||||||
|
@ -13,7 +13,7 @@ class Subscribe(Base):
|
|||||||
year = Column(String)
|
year = Column(String)
|
||||||
type = Column(String)
|
type = Column(String)
|
||||||
keyword = Column(String)
|
keyword = Column(String)
|
||||||
tmdbid = Column(String, index=True)
|
tmdbid = Column(Integer, index=True)
|
||||||
doubanid = Column(String)
|
doubanid = Column(String)
|
||||||
season = Column(Integer)
|
season = Column(Integer)
|
||||||
image = Column(String)
|
image = Column(String)
|
||||||
@ -28,7 +28,7 @@ class Subscribe(Base):
|
|||||||
state = Column(String, nullable=False, index=True, default='N')
|
state = Column(String, nullable=False, index=True, default='N')
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def exists(db: Session, tmdbid: str, season: int = None):
|
def exists(db: Session, tmdbid: int, season: int = None):
|
||||||
if season:
|
if season:
|
||||||
return db.query(Subscribe).filter(Subscribe.tmdbid == tmdbid,
|
return db.query(Subscribe).filter(Subscribe.tmdbid == tmdbid,
|
||||||
Subscribe.season == season).first()
|
Subscribe.season == season).first()
|
||||||
|
@ -6,7 +6,7 @@ from ruamel.yaml import CommentedMap
|
|||||||
|
|
||||||
from app.core.context import MediaInfo, TorrentInfo, Context
|
from app.core.context import MediaInfo, TorrentInfo, Context
|
||||||
from app.core.meta import MetaBase
|
from app.core.meta import MetaBase
|
||||||
from app.utils.types import TorrentStatus
|
from app.utils.types import TorrentStatus, MediaType
|
||||||
|
|
||||||
|
|
||||||
class _ModuleBase(metaclass=ABCMeta):
|
class _ModuleBase(metaclass=ABCMeta):
|
||||||
@ -41,10 +41,12 @@ class _ModuleBase(metaclass=ABCMeta):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def recognize_media(self, meta: MetaBase,
|
def recognize_media(self, meta: MetaBase,
|
||||||
tmdbid: str = None) -> Optional[MediaInfo]:
|
mtype: MediaType = None,
|
||||||
|
tmdbid: int = None) -> Optional[MediaInfo]:
|
||||||
"""
|
"""
|
||||||
识别媒体信息
|
识别媒体信息
|
||||||
:param meta: 识别的元数据
|
:param meta: 识别的元数据
|
||||||
|
:param mtype: 媒体类型,与tmdbid配套
|
||||||
:param tmdbid: tmdbid
|
:param tmdbid: tmdbid
|
||||||
:return: 识别的媒体信息,包括剧集信息
|
:return: 识别的媒体信息,包括剧集信息
|
||||||
"""
|
"""
|
||||||
|
@ -232,7 +232,7 @@ class Emby(metaclass=Singleton):
|
|||||||
def get_tv_episodes(self,
|
def get_tv_episodes(self,
|
||||||
title: str = None,
|
title: str = None,
|
||||||
year: str = None,
|
year: str = None,
|
||||||
tmdb_id: str = None,
|
tmdb_id: int = None,
|
||||||
season: int = None) -> Optional[Dict[int, list]]:
|
season: int = None) -> Optional[Dict[int, list]]:
|
||||||
"""
|
"""
|
||||||
根据标题和年份和季,返回Emby中的剧集列表
|
根据标题和年份和季,返回Emby中的剧集列表
|
||||||
|
@ -207,7 +207,7 @@ class Jellyfin(metaclass=Singleton):
|
|||||||
def get_tv_episodes(self,
|
def get_tv_episodes(self,
|
||||||
title: str = None,
|
title: str = None,
|
||||||
year: str = None,
|
year: str = None,
|
||||||
tmdb_id: str = None,
|
tmdb_id: int = None,
|
||||||
season: int = None) -> Optional[Dict[str, list]]:
|
season: int = None) -> Optional[Dict[str, list]]:
|
||||||
"""
|
"""
|
||||||
根据标题和年份和季,返回Jellyfin中的剧集列表
|
根据标题和年份和季,返回Jellyfin中的剧集列表
|
||||||
|
@ -133,12 +133,13 @@ class Telegram(metaclass=Singleton):
|
|||||||
index, caption = 1, "*%s*" % title
|
index, caption = 1, "*%s*" % title
|
||||||
for context in torrents:
|
for context in torrents:
|
||||||
torrent = context.torrent_info
|
torrent = context.torrent_info
|
||||||
|
site_name = torrent.site_name
|
||||||
link = torrent.page_url
|
link = torrent.page_url
|
||||||
title = torrent.title
|
title = torrent.title
|
||||||
free = torrent.get_volume_factor_string()
|
free = torrent.get_volume_factor_string()
|
||||||
seeder = f"{torrent.seeders}↑"
|
seeder = f"{torrent.seeders}↑"
|
||||||
description = torrent.description
|
description = torrent.description
|
||||||
caption = f"{caption}\n{index}. [{title}]({link}) {free} {seeder}\n{description}"
|
caption = f"{caption}\n{index}. 【{site_name}】[{title}]({link}) {free} {seeder}\n_{description}_"
|
||||||
index += 1
|
index += 1
|
||||||
|
|
||||||
if userid:
|
if userid:
|
||||||
|
@ -42,21 +42,23 @@ class TheMovieDb(_ModuleBase):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def recognize_media(self, meta: MetaBase,
|
def recognize_media(self, meta: MetaBase,
|
||||||
tmdbid: str = None) -> Optional[MediaInfo]:
|
mtype: MediaType = None,
|
||||||
|
tmdbid: int = None) -> Optional[MediaInfo]:
|
||||||
"""
|
"""
|
||||||
识别媒体信息
|
识别媒体信息
|
||||||
:param meta: 识别的元数据
|
:param meta: 识别的元数据
|
||||||
|
:param mtype: 识别的媒体类型,与tmdbid配套
|
||||||
:param tmdbid: tmdbid
|
:param tmdbid: tmdbid
|
||||||
:return: 识别的媒体信息,包括剧集信息
|
:return: 识别的媒体信息,包括剧集信息
|
||||||
"""
|
"""
|
||||||
if not meta:
|
if not meta:
|
||||||
return None
|
return None
|
||||||
cache_info = self.cache.get(meta)
|
cache_info = self.cache.get(meta)
|
||||||
if not cache_info:
|
if not cache_info or cache_info.get('id') == 0:
|
||||||
# 缓存没有或者强制不使用缓存
|
# 缓存没有或者强制不使用缓存
|
||||||
if tmdbid:
|
if tmdbid:
|
||||||
# 直接查询详情
|
# 直接查询详情
|
||||||
info = self.tmdb.get_info(mtype=meta.type, tmdbid=tmdbid)
|
info = self.tmdb.get_info(mtype=mtype, tmdbid=tmdbid)
|
||||||
else:
|
else:
|
||||||
if meta.type != MediaType.TV and not meta.year:
|
if meta.type != MediaType.TV and not meta.year:
|
||||||
info = self.tmdb.search_multi(meta.get_name())
|
info = self.tmdb.search_multi(meta.get_name())
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import traceback
|
||||||
from functools import lru_cache
|
from functools import lru_cache
|
||||||
from typing import Optional, Tuple, List
|
from typing import Optional, Tuple, List
|
||||||
|
|
||||||
@ -114,7 +115,7 @@ class TmdbHelper:
|
|||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def __get_names(self, mtype: MediaType, tmdb_id: str) -> Tuple[Optional[dict], List[str]]:
|
def __get_names(self, mtype: MediaType, tmdb_id: int) -> Tuple[Optional[dict], List[str]]:
|
||||||
"""
|
"""
|
||||||
搜索tmdb中所有的标题和译名,用于名称匹配
|
搜索tmdb中所有的标题和译名,用于名称匹配
|
||||||
:param mtype: 类型:电影、电视剧、动漫
|
:param mtype: 类型:电影、电视剧、动漫
|
||||||
@ -230,7 +231,8 @@ class TmdbHelper:
|
|||||||
logger.error(f"连接TMDB出错:{err}")
|
logger.error(f"连接TMDB出错:{err}")
|
||||||
return None
|
return None
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"连接TMDB出错:{str(e)}")
|
logger.error(f"连接TMDB出错:{e}")
|
||||||
|
print(traceback.print_exc())
|
||||||
return None
|
return None
|
||||||
logger.debug(f"API返回:{str(self.search.total_results)}")
|
logger.debug(f"API返回:{str(self.search.total_results)}")
|
||||||
if len(movies) == 0:
|
if len(movies) == 0:
|
||||||
@ -289,7 +291,8 @@ class TmdbHelper:
|
|||||||
logger.error(f"连接TMDB出错:{err}")
|
logger.error(f"连接TMDB出错:{err}")
|
||||||
return None
|
return None
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"连接TMDB出错:{str(e)}")
|
logger.error(f"连接TMDB出错:{e}")
|
||||||
|
print(traceback.print_exc())
|
||||||
return None
|
return None
|
||||||
logger.debug(f"API返回:{str(self.search.total_results)}")
|
logger.debug(f"API返回:{str(self.search.total_results)}")
|
||||||
if len(tvs) == 0:
|
if len(tvs) == 0:
|
||||||
@ -346,13 +349,14 @@ class TmdbHelper:
|
|||||||
return False
|
return False
|
||||||
try:
|
try:
|
||||||
seasons = self.__get_tv_seasons(tv_info)
|
seasons = self.__get_tv_seasons(tv_info)
|
||||||
for season, season_info in seasons.values():
|
for season, season_info in seasons.items():
|
||||||
if season_info.get("air_date"):
|
if season_info.get("air_date"):
|
||||||
if season.get("air_date")[0:4] == str(_season_year) \
|
if season.get("air_date")[0:4] == str(_season_year) \
|
||||||
and season == int(season_number):
|
and season == int(season_number):
|
||||||
return True
|
return True
|
||||||
except Exception as e1:
|
except Exception as e1:
|
||||||
logger.error(f"连接TMDB出错:{e1}")
|
logger.error(f"连接TMDB出错:{e1}")
|
||||||
|
print(traceback.print_exc())
|
||||||
return False
|
return False
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@ -363,6 +367,7 @@ class TmdbHelper:
|
|||||||
return None
|
return None
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"连接TMDB出错:{e}")
|
logger.error(f"连接TMDB出错:{e}")
|
||||||
|
print(traceback.print_exc())
|
||||||
return None
|
return None
|
||||||
|
|
||||||
if len(tvs) == 0:
|
if len(tvs) == 0:
|
||||||
@ -433,7 +438,8 @@ class TmdbHelper:
|
|||||||
logger.error(f"连接TMDB出错:{err}")
|
logger.error(f"连接TMDB出错:{err}")
|
||||||
return None
|
return None
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"连接TMDB出错:{str(e)}")
|
logger.error(f"连接TMDB出错:{e}")
|
||||||
|
print(traceback.print_exc())
|
||||||
return None
|
return None
|
||||||
logger.debug(f"API返回:{str(self.search.total_results)}")
|
logger.debug(f"API返回:{str(self.search.total_results)}")
|
||||||
if len(multis) == 0:
|
if len(multis) == 0:
|
||||||
@ -529,7 +535,7 @@ class TmdbHelper:
|
|||||||
|
|
||||||
def get_info(self,
|
def get_info(self,
|
||||||
mtype: MediaType,
|
mtype: MediaType,
|
||||||
tmdbid: str) -> dict:
|
tmdbid: int) -> dict:
|
||||||
"""
|
"""
|
||||||
给定TMDB号,查询一条媒体信息
|
给定TMDB号,查询一条媒体信息
|
||||||
:param mtype: 类型:电影、电视剧、动漫,为空时都查(此时用不上年份)
|
:param mtype: 类型:电影、电视剧、动漫,为空时都查(此时用不上年份)
|
||||||
@ -602,7 +608,7 @@ class TmdbHelper:
|
|||||||
tmdb_info['name'] = cn_title
|
tmdb_info['name'] = cn_title
|
||||||
|
|
||||||
def __get_movie_detail(self,
|
def __get_movie_detail(self,
|
||||||
tmdbid: str,
|
tmdbid: int,
|
||||||
append_to_response: str = "images,"
|
append_to_response: str = "images,"
|
||||||
"credits,"
|
"credits,"
|
||||||
"alternative_titles,"
|
"alternative_titles,"
|
||||||
@ -714,7 +720,7 @@ class TmdbHelper:
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
def __get_tv_detail(self,
|
def __get_tv_detail(self,
|
||||||
tmdbid: str,
|
tmdbid: int,
|
||||||
append_to_response: str = "images,"
|
append_to_response: str = "images,"
|
||||||
"credits,"
|
"credits,"
|
||||||
"alternative_titles,"
|
"alternative_titles,"
|
||||||
@ -896,7 +902,7 @@ class TmdbHelper:
|
|||||||
print(str(e))
|
print(str(e))
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def get_tv_season_detail(self, tmdbid, season: int):
|
def get_tv_season_detail(self, tmdbid: int, season: int):
|
||||||
"""
|
"""
|
||||||
获取电视剧季的详情
|
获取电视剧季的详情
|
||||||
:param tmdbid: TMDB ID
|
:param tmdbid: TMDB ID
|
||||||
@ -970,7 +976,7 @@ class TmdbHelper:
|
|||||||
print(str(e))
|
print(str(e))
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
def get_tv_episode_detail(self, tmdbid: str, season: int, episode: int):
|
def get_tv_episode_detail(self, tmdbid: int, season: int, episode: int):
|
||||||
"""
|
"""
|
||||||
获取电视剧集的详情
|
获取电视剧集的详情
|
||||||
:param tmdbid: TMDB ID
|
:param tmdbid: TMDB ID
|
||||||
|
@ -75,12 +75,12 @@ class TmdbCache(metaclass=Singleton):
|
|||||||
with lock:
|
with lock:
|
||||||
return self._meta_data.pop(key, None)
|
return self._meta_data.pop(key, None)
|
||||||
|
|
||||||
def delete_by_tmdbid(self, tmdbid: str) -> None:
|
def delete_by_tmdbid(self, tmdbid: int) -> None:
|
||||||
"""
|
"""
|
||||||
清空对应TMDBID的所有缓存记录,以强制更新TMDB中最新的数据
|
清空对应TMDBID的所有缓存记录,以强制更新TMDB中最新的数据
|
||||||
"""
|
"""
|
||||||
for key in list(self._meta_data):
|
for key in list(self._meta_data):
|
||||||
if str(self._meta_data.get(key, {}).get("id")) == str(tmdbid):
|
if self._meta_data.get(key, {}).get("id") == tmdbid:
|
||||||
with lock:
|
with lock:
|
||||||
self._meta_data.pop(key)
|
self._meta_data.pop(key)
|
||||||
|
|
||||||
@ -89,7 +89,7 @@ class TmdbCache(metaclass=Singleton):
|
|||||||
清除未识别的缓存记录,以便重新搜索TMDB
|
清除未识别的缓存记录,以便重新搜索TMDB
|
||||||
"""
|
"""
|
||||||
for key in list(self._meta_data):
|
for key in list(self._meta_data):
|
||||||
if str(self._meta_data.get(key, {}).get("id")) == '0':
|
if self._meta_data.get(key, {}).get("id") == 0:
|
||||||
with lock:
|
with lock:
|
||||||
self._meta_data.pop(key)
|
self._meta_data.pop(key)
|
||||||
|
|
||||||
|
@ -54,7 +54,7 @@ class MediaInfo(BaseModel):
|
|||||||
# 年份
|
# 年份
|
||||||
year: Optional[str] = None
|
year: Optional[str] = None
|
||||||
# TMDB ID
|
# TMDB ID
|
||||||
tmdb_id: Optional[str] = None
|
tmdb_id: Optional[int] = None
|
||||||
# IMDB ID
|
# IMDB ID
|
||||||
imdb_id: Optional[str] = None
|
imdb_id: Optional[str] = None
|
||||||
# TVDB ID
|
# TVDB ID
|
||||||
|
@ -9,7 +9,7 @@ class Subscribe(BaseModel):
|
|||||||
year: str
|
year: str
|
||||||
type: str
|
type: str
|
||||||
keyword: Optional[str]
|
keyword: Optional[str]
|
||||||
tmdbid: str
|
tmdbid: int
|
||||||
doubanid: Optional[str]
|
doubanid: Optional[str]
|
||||||
season: Optional[int]
|
season: Optional[int]
|
||||||
image: Optional[str]
|
image: Optional[str]
|
||||||
|
@ -15,6 +15,6 @@ class RecognizeTest(TestCase):
|
|||||||
|
|
||||||
def test_recognize(self):
|
def test_recognize(self):
|
||||||
result = IdentifyChain().process(title="我和我的祖国 2019")
|
result = IdentifyChain().process(title="我和我的祖国 2019")
|
||||||
self.assertEqual(str(result.media_info.tmdb_id), '612845')
|
self.assertEqual(result.media_info.tmdb_id, 612845)
|
||||||
exists = DownloadChain().get_no_exists_info(result.media_info)
|
exists = DownloadChain().get_no_exists_info(result.media_info)
|
||||||
self.assertTrue(exists[0])
|
self.assertTrue(exists[0])
|
||||||
|
Loading…
x
Reference in New Issue
Block a user