fix 缺失状态识判

This commit is contained in:
jxxghp 2023-11-13 12:00:53 +08:00
parent 3b99fb5c96
commit 612271bf0c
4 changed files with 45 additions and 31 deletions

View File

@ -75,15 +75,16 @@ def exists(media_in: schemas.MediaInfo,
else: else:
mediainfo = MediaChain().recognize_by_meta(metainfo=meta) mediainfo = MediaChain().recognize_by_meta(metainfo=meta)
# 查询缺失信息 # 查询缺失信息
if not mediainfo or not mediainfo.tmdb_id: if not mediainfo:
raise HTTPException(status_code=404, detail="媒体信息不存在") raise HTTPException(status_code=404, detail="媒体信息不存在")
mediakey = mediainfo.tmdb_id or mediainfo.douban_id
exist_flag, no_exists = DownloadChain().get_no_exists_info(meta=meta, mediainfo=mediainfo) exist_flag, no_exists = DownloadChain().get_no_exists_info(meta=meta, mediainfo=mediainfo)
if mediainfo.type == MediaType.MOVIE: if mediainfo.type == MediaType.MOVIE:
# 电影已存在时返回空列表,存在时返回空对像列表 # 电影已存在时返回空列表,存在时返回空对像列表
return [] if exist_flag else [NotExistMediaInfo()] return [] if exist_flag else [NotExistMediaInfo()]
elif no_exists and no_exists.get(mediainfo.tmdb_id): elif no_exists and no_exists.get(mediakey):
# 电视剧返回缺失的剧集 # 电视剧返回缺失的剧集
return list(no_exists.get(mediainfo.tmdb_id).values()) return list(no_exists.get(mediakey).values())
return [] return []

View File

@ -715,7 +715,7 @@ class DownloadChain(ChainBase):
if not episodes: if not episodes:
continue continue
# 全季不存在 # 全季不存在
if meta.season_list \ if meta.sea \
and season not in meta.season_list: and season not in meta.season_list:
continue continue
# 总集数 # 总集数
@ -726,7 +726,7 @@ class DownloadChain(ChainBase):
else: else:
# 存在一些,检查每季缺失的季集 # 存在一些,检查每季缺失的季集
for season, episodes in mediainfo.seasons.items(): for season, episodes in mediainfo.seasons.items():
if meta.begin_season \ if meta.sea \
and season not in meta.season_list: and season not in meta.season_list:
continue continue
if not episodes: if not episodes:

View File

@ -1,4 +1,3 @@
import copy
from typing import Any from typing import Any
from app.chain.download import * from app.chain.download import *
@ -110,9 +109,10 @@ class MessageChain(ChainBase):
# 发送缺失的媒体信息 # 发送缺失的媒体信息
if no_exists: if no_exists:
# 发送消息 # 发送消息
mediakey = mediainfo.tmdb_id or mediainfo.douban_id
messages = [ messages = [
f"{sea} 季缺失 {StringUtils.str_series(no_exist.episodes) if no_exist.episodes else no_exist.total_episode}" f"{sea} 季缺失 {StringUtils.str_series(no_exist.episodes) if no_exist.episodes else no_exist.total_episode}"
for sea, no_exist in no_exists.get(mediainfo.tmdb_id).items()] for sea, no_exist in no_exists.get(mediakey).items()]
self.post_message(Notification(channel=channel, self.post_message(Notification(channel=channel,
title=f"{mediainfo.title_year}\n" + "\n".join(messages), title=f"{mediainfo.title_year}\n" + "\n".join(messages),
userid=userid)) userid=userid))

View File

@ -172,6 +172,7 @@ class SubscribeChain(ChainBase):
subscribes = self.subscribeoper.list(state) subscribes = self.subscribeoper.list(state)
# 遍历订阅 # 遍历订阅
for subscribe in subscribes: for subscribe in subscribes:
mediakey = subscribe.tmdbid or subscribe.doubanid
# 校验当前时间减订阅创建时间是否大于1分钟否则跳过先留出编辑订阅的时间 # 校验当前时间减订阅创建时间是否大于1分钟否则跳过先留出编辑订阅的时间
if subscribe.date: if subscribe.date:
now = datetime.now() now = datetime.now()
@ -198,7 +199,7 @@ class SubscribeChain(ChainBase):
tmdbid=subscribe.tmdbid, tmdbid=subscribe.tmdbid,
doubanid=subscribe.doubanid) doubanid=subscribe.doubanid)
if not mediainfo: if not mediainfo:
logger.warn(f'未识别到媒体信息,标题:{subscribe.name}tmdbid{subscribe.tmdbid}') logger.warn(f'未识别到媒体信息,标题:{subscribe.name}tmdbid{subscribe.tmdbid}doubanid{subscribe.doubanid}')
continue continue
# 非洗版状态 # 非洗版状态
@ -220,7 +221,7 @@ class SubscribeChain(ChainBase):
exist_flag = False exist_flag = False
if meta.type == MediaType.TV: if meta.type == MediaType.TV:
no_exists = { no_exists = {
subscribe.tmdbid: { mediakey: {
subscribe.season: NotExistMediaInfo( subscribe.season: NotExistMediaInfo(
season=subscribe.season, season=subscribe.season,
episodes=[], episodes=[],
@ -242,15 +243,15 @@ class SubscribeChain(ChainBase):
# 使用订阅的总集数和开始集数替换no_exists # 使用订阅的总集数和开始集数替换no_exists
no_exists = self.__get_subscribe_no_exits( no_exists = self.__get_subscribe_no_exits(
no_exists=no_exists, no_exists=no_exists,
tmdb_id=mediainfo.tmdb_id, mediakey=mediakey,
begin_season=meta.begin_season, begin_season=meta.begin_season,
total_episode=subscribe.total_episode, total_episode=subscribe.total_episode,
start_episode=subscribe.start_episode, start_episode=subscribe.start_episode,
) )
# 打印缺失集信息 # 打印缺失集信息
if no_exists and no_exists.get(subscribe.tmdbid): if no_exists and no_exists.get(mediakey):
no_exists_info = no_exists.get(subscribe.tmdbid).get(subscribe.season) no_exists_info = no_exists.get(mediakey).get(subscribe.season)
if no_exists_info: if no_exists_info:
logger.info(f'订阅 {mediainfo.title_year} {meta.season} 缺失集:{no_exists_info.episodes}') logger.info(f'订阅 {mediainfo.title_year} {meta.season} 缺失集:{no_exists_info.episodes}')
@ -486,6 +487,7 @@ class SubscribeChain(ChainBase):
# 遍历订阅 # 遍历订阅
for subscribe in subscribes: for subscribe in subscribes:
logger.info(f'开始匹配订阅,标题:{subscribe.name} ...') logger.info(f'开始匹配订阅,标题:{subscribe.name} ...')
mediakey = subscribe.tmdbid or subscribe.doubanid
# 生成元数据 # 生成元数据
meta = MetaInfo(subscribe.name) meta = MetaInfo(subscribe.name)
meta.year = subscribe.year meta.year = subscribe.year
@ -495,7 +497,7 @@ class SubscribeChain(ChainBase):
mediainfo: MediaInfo = self.recognize_media(meta=meta, mtype=meta.type, mediainfo: MediaInfo = self.recognize_media(meta=meta, mtype=meta.type,
tmdbid=subscribe.tmdbid, doubanid=subscribe.doubanid) tmdbid=subscribe.tmdbid, doubanid=subscribe.doubanid)
if not mediainfo: if not mediainfo:
logger.warn(f'未识别到媒体信息,标题:{subscribe.name}tmdbid{subscribe.tmdbid}') logger.warn(f'未识别到媒体信息,标题:{subscribe.name}tmdbid{subscribe.tmdbid}doubanid{subscribe.doubanid}')
continue continue
# 非洗版 # 非洗版
if not subscribe.best_version: if not subscribe.best_version:
@ -516,7 +518,7 @@ class SubscribeChain(ChainBase):
exist_flag = False exist_flag = False
if meta.type == MediaType.TV: if meta.type == MediaType.TV:
no_exists = { no_exists = {
subscribe.tmdbid: { mediakey: {
subscribe.season: NotExistMediaInfo( subscribe.season: NotExistMediaInfo(
season=subscribe.season, season=subscribe.season,
episodes=[], episodes=[],
@ -538,15 +540,15 @@ class SubscribeChain(ChainBase):
# 使用订阅的总集数和开始集数替换no_exists # 使用订阅的总集数和开始集数替换no_exists
no_exists = self.__get_subscribe_no_exits( no_exists = self.__get_subscribe_no_exits(
no_exists=no_exists, no_exists=no_exists,
tmdb_id=mediainfo.tmdb_id, mediakey=mediakey,
begin_season=meta.begin_season, begin_season=meta.begin_season,
total_episode=subscribe.total_episode, total_episode=subscribe.total_episode,
start_episode=subscribe.start_episode, start_episode=subscribe.start_episode,
) )
# 打印缺失集信息 # 打印缺失集信息
if no_exists and no_exists.get(subscribe.tmdbid): if no_exists and no_exists.get(mediakey):
no_exists_info = no_exists.get(subscribe.tmdbid).get(subscribe.season) no_exists_info = no_exists.get(mediakey).get(subscribe.season)
if no_exists_info: if no_exists_info:
logger.info(f'订阅 {mediainfo.title_year} {meta.season} 缺失集:{no_exists_info.episodes}') logger.info(f'订阅 {mediainfo.title_year} {meta.season} 缺失集:{no_exists_info.episodes}')
@ -601,9 +603,9 @@ class SubscribeChain(ChainBase):
# 非洗版 # 非洗版
if not subscribe.best_version: if not subscribe.best_version:
# 不是缺失的剧集不要 # 不是缺失的剧集不要
if no_exists and no_exists.get(subscribe.tmdbid): if no_exists and no_exists.get(mediakey):
# 缺失集 # 缺失集
no_exists_info = no_exists.get(subscribe.tmdbid).get(subscribe.season) no_exists_info = no_exists.get(mediakey).get(subscribe.season)
if no_exists_info: if no_exists_info:
# 是否有交集 # 是否有交集
if no_exists_info.episodes and \ if no_exists_info.episodes and \
@ -682,7 +684,7 @@ class SubscribeChain(ChainBase):
mediainfo: MediaInfo = self.recognize_media(meta=meta, mtype=meta.type, mediainfo: MediaInfo = self.recognize_media(meta=meta, mtype=meta.type,
tmdbid=subscribe.tmdbid, doubanid=subscribe.doubanid) tmdbid=subscribe.tmdbid, doubanid=subscribe.doubanid)
if not mediainfo: if not mediainfo:
logger.warn(f'未识别到媒体信息,标题:{subscribe.name}tmdbid{subscribe.tmdbid}') logger.warn(f'未识别到媒体信息,标题:{subscribe.name}tmdbid{subscribe.tmdbid}doubanid{subscribe.doubanid}')
continue continue
# 对于电视剧,获取当前季的总集数 # 对于电视剧,获取当前季的总集数
episodes = mediainfo.seasons.get(subscribe.season) or [] episodes = mediainfo.seasons.get(subscribe.season) or []
@ -724,7 +726,11 @@ class SubscribeChain(ChainBase):
mediainfo = context.media_info mediainfo = context.media_info
if mediainfo.type != MediaType.TV: if mediainfo.type != MediaType.TV:
continue continue
if mediainfo.tmdb_id != subscribe.tmdbid: if subscribe.tmdbid and mediainfo.tmdb_id \
and mediainfo.tmdb_id != subscribe.tmdbid:
continue
if subscribe.doubanid and mediainfo.douban_id \
and mediainfo.douban_id != subscribe.doubanid:
continue continue
episodes = meta.episode_list episodes = meta.episode_list
if not episodes: if not episodes:
@ -758,7 +764,8 @@ class SubscribeChain(ChainBase):
""" """
更新订阅剩余集数 更新订阅剩余集数
""" """
left_seasons = lefts.get(mediainfo.tmdb_id) mediakey = subscribe.tmdbid or subscribe.doubanid
left_seasons = lefts.get(mediakey)
if left_seasons: if left_seasons:
for season_info in left_seasons.values(): for season_info in left_seasons.values():
season = season_info.season season = season_info.season
@ -799,11 +806,17 @@ class SubscribeChain(ChainBase):
messages = [] messages = []
for subscribe in subscribes: for subscribe in subscribes:
if subscribe.type == MediaType.MOVIE.value: if subscribe.type == MediaType.MOVIE.value:
tmdb_link = f"https://www.themoviedb.org/movie/{subscribe.tmdbid}" if subscribe.tmdbid:
messages.append(f"{subscribe.id}. [{subscribe.name}{subscribe.year}]({tmdb_link})") link = f"https://www.themoviedb.org/movie/{subscribe.tmdbid}"
else: else:
tmdb_link = f"https://www.themoviedb.org/tv/{subscribe.tmdbid}" link = f"https://movie.douban.com/subject/{subscribe.doubanid}"
messages.append(f"{subscribe.id}. [{subscribe.name}{subscribe.year}]({tmdb_link}) " messages.append(f"{subscribe.id}. [{subscribe.name}{subscribe.year}]({link})")
else:
if subscribe.tmdbid:
link = f"https://www.themoviedb.org/tv/{subscribe.tmdbid}"
else:
link = f"https://movie.douban.com/subject/{subscribe.doubanid}"
messages.append(f"{subscribe.id}. [{subscribe.name}{subscribe.year}]({link}) "
f"{subscribe.season}" f"{subscribe.season}"
f"_{subscribe.total_episode - (subscribe.lack_episode or subscribe.total_episode)}" f"_{subscribe.total_episode - (subscribe.lack_episode or subscribe.total_episode)}"
f"/{subscribe.total_episode}_") f"/{subscribe.total_episode}_")
@ -838,24 +851,24 @@ class SubscribeChain(ChainBase):
@staticmethod @staticmethod
def __get_subscribe_no_exits(no_exists: Dict[int, Dict[int, NotExistMediaInfo]], def __get_subscribe_no_exits(no_exists: Dict[int, Dict[int, NotExistMediaInfo]],
tmdb_id: int, mediakey: Union[str, int],
begin_season: int, begin_season: int,
total_episode: int, total_episode: int,
start_episode: int): start_episode: int):
""" """
根据订阅开始集数和总集数结合TMDB信息计算当前订阅的缺失集数 根据订阅开始集数和总集数结合TMDB信息计算当前订阅的缺失集数
:param no_exists: 缺失季集列表 :param no_exists: 缺失季集列表
:param tmdb_id: TMDB ID :param mediakey: TMDB ID或豆瓣ID
:param begin_season: 开始季 :param begin_season: 开始季
:param total_episode: 订阅设定总集数 :param total_episode: 订阅设定总集数
:param start_episode: 订阅设定开始集数 :param start_episode: 订阅设定开始集数
""" """
# 使用订阅的总集数和开始集数替换no_exists # 使用订阅的总集数和开始集数替换no_exists
if no_exists \ if no_exists \
and no_exists.get(tmdb_id) \ and no_exists.get(mediakey) \
and (total_episode or start_episode): and (total_episode or start_episode):
# 该季原缺失信息 # 该季原缺失信息
no_exist_season = no_exists.get(tmdb_id).get(begin_season) no_exist_season = no_exists.get(mediakey).get(begin_season)
if no_exist_season: if no_exist_season:
# 原集列表 # 原集列表
episode_list = no_exist_season.episodes episode_list = no_exist_season.episodes
@ -887,7 +900,7 @@ class SubscribeChain(ChainBase):
# 与原集列表取交集 # 与原集列表取交集
episodes = list(set(episode_list).intersection(set(new_episodes))) episodes = list(set(episode_list).intersection(set(new_episodes)))
# 更新集合 # 更新集合
no_exists[tmdb_id][begin_season] = NotExistMediaInfo( no_exists[mediakey][begin_season] = NotExistMediaInfo(
season=begin_season, season=begin_season,
episodes=episodes, episodes=episodes,
total_episode=total_episode, total_episode=total_episode,