This commit is contained in:
jxxghp 2023-08-12 07:58:08 +08:00
parent 733e85efec
commit 44d428d934
8 changed files with 44 additions and 14 deletions

View File

@ -307,10 +307,11 @@ class ChainBase(metaclass=ABCMeta):
""" """
return self.run_module("stop_torrents", hashs=hashs) return self.run_module("stop_torrents", hashs=hashs)
def media_exists(self, mediainfo: MediaInfo, itemid: Optional[str] = None) -> Optional[ExistMediaInfo]: def media_exists(self, mediainfo: MediaInfo, itemid: str = None) -> Optional[ExistMediaInfo]:
""" """
判断媒体文件是否存在 判断媒体文件是否存在
:param mediainfo: 识别的媒体信息 :param mediainfo: 识别的媒体信息
:param itemid: 媒体服务器ItemID
:return: 如不存在返回None存在时返回信息包括每季已存在所有集{type: movie/tv, seasons: {season: [episodes]}} :return: 如不存在返回None存在时返回信息包括每季已存在所有集{type: movie/tv, seasons: {season: [episodes]}}
""" """
return self.run_module("media_exists", mediainfo=mediainfo, itemid=itemid) return self.run_module("media_exists", mediainfo=mediainfo, itemid=itemid)

View File

@ -10,7 +10,7 @@ from app.db.downloadhistory_oper import DownloadHistoryOper
from app.db.mediaserver_oper import MediaServerOper from app.db.mediaserver_oper import MediaServerOper
from app.helper.torrent import TorrentHelper from app.helper.torrent import TorrentHelper
from app.log import logger from app.log import logger
from app.schemas import ExistMediaInfo, NotExistMediaInfo, DownloadingTorrent, Notification, MediaServerItem from app.schemas import ExistMediaInfo, NotExistMediaInfo, DownloadingTorrent, Notification
from app.schemas.types import MediaType, TorrentStatus, EventType, MessageChannel, NotificationType from app.schemas.types import MediaType, TorrentStatus, EventType, MessageChannel, NotificationType
from app.utils.string import StringUtils from app.utils.string import StringUtils
@ -499,7 +499,9 @@ class DownloadChain(ChainBase):
no_exists = {} no_exists = {}
if mediainfo.type == MediaType.MOVIE: if mediainfo.type == MediaType.MOVIE:
# 电影 # 电影
exists_movies: Optional[ExistMediaInfo] = self.media_exists(mediainfo) itemid = self.mediaserver.get_item_id(mtype=mediainfo.type.value,
tmdbid=mediainfo.tmdb_id)
exists_movies: Optional[ExistMediaInfo] = self.media_exists(mediainfo=mediainfo, itemid=itemid)
if exists_movies: if exists_movies:
logger.info(f"媒体库中已存在电影:{mediainfo.title_year}") logger.info(f"媒体库中已存在电影:{mediainfo.title_year}")
return True, {} return True, {}
@ -516,11 +518,10 @@ class DownloadChain(ChainBase):
logger.error(f"媒体信息中没有季集信息:{mediainfo.title_year}") logger.error(f"媒体信息中没有季集信息:{mediainfo.title_year}")
return False, {} return False, {}
# 电视剧 # 电视剧
mediaserveritem: Optional[MediaServerItem] = self.mediaserver.exists(mtype=mediainfo.type.value, itemid = self.mediaserver.get_item_id(mtype=mediainfo.type.value,
tmdbid=mediainfo.tmdb_id, tmdbid=mediainfo.tmdb_id,
season=mediainfo.season) season=mediainfo.season)
item_id = str(mediaserveritem.item_id) if mediaserveritem and mediaserveritem.item_id else None exists_tvs: Optional[ExistMediaInfo] = self.media_exists(mediainfo=mediainfo, itemid=itemid)
exists_tvs: Optional[ExistMediaInfo] = self.media_exists(mediainfo,item_id)
if not exists_tvs: if not exists_tvs:
# 所有剧集均缺失 # 所有剧集均缺失
for season, episodes in mediainfo.seasons.items(): for season, episodes in mediainfo.seasons.items():

View File

@ -52,3 +52,12 @@ class MediaServerOper(DbOper):
if kwargs.get("season") not in seasoninfo.keys(): if kwargs.get("season") not in seasoninfo.keys():
return None return None
return item return item
def get_item_id(self, **kwargs) -> Optional[str]:
"""
获取媒体服务器数据ID
"""
item = self.exists(**kwargs)
if not item:
return None
return str(item.item_id)

View File

@ -42,13 +42,19 @@ class EmbyModule(_ModuleBase):
""" """
return self.emby.get_webhook_message(form.get("data")) return self.emby.get_webhook_message(form.get("data"))
def media_exists(self, mediainfo: MediaInfo, itemid: Optional[str] = None) -> Optional[ExistMediaInfo]: def media_exists(self, mediainfo: MediaInfo, itemid: str = None) -> Optional[ExistMediaInfo]:
""" """
判断媒体文件是否存在 判断媒体文件是否存在
:param mediainfo: 识别的媒体信息 :param mediainfo: 识别的媒体信息
:param itemid: 媒体服务器ItemID
:return: 如不存在返回None存在时返回信息包括每季已存在所有集{type: movie/tv, seasons: {season: [episodes]}} :return: 如不存在返回None存在时返回信息包括每季已存在所有集{type: movie/tv, seasons: {season: [episodes]}}
""" """
if mediainfo.type == MediaType.MOVIE: if mediainfo.type == MediaType.MOVIE:
if itemid:
movie = self.emby.get_iteminfo(itemid)
if movie:
logger.info(f"媒体库中已存在:{movie}")
return ExistMediaInfo(type=MediaType.MOVIE)
movies = self.emby.get_movies(title=mediainfo.title, year=mediainfo.year) movies = self.emby.get_movies(title=mediainfo.title, year=mediainfo.year)
if not movies: if not movies:
logger.info(f"{mediainfo.title_year} 在媒体库中不存在") logger.info(f"{mediainfo.title_year} 在媒体库中不存在")

View File

@ -317,7 +317,7 @@ class Emby(metaclass=Singleton):
return None return None
if not item_id: if not item_id:
return {} return {}
# 验证tmdbid是否相同 # 验证tmdbid是否相同
item_tmdbid = self.get_iteminfo(item_id).get("ProviderIds", {}).get("Tmdb") item_tmdbid = self.get_iteminfo(item_id).get("ProviderIds", {}).get("Tmdb")
if tmdb_id and item_tmdbid: if tmdb_id and item_tmdbid:
if str(tmdb_id) != str(item_tmdbid): if str(tmdb_id) != str(item_tmdbid):

View File

@ -43,13 +43,19 @@ class JellyfinModule(_ModuleBase):
""" """
return self.jellyfin.get_webhook_message(json.loads(body)) return self.jellyfin.get_webhook_message(json.loads(body))
def media_exists(self, mediainfo: MediaInfo, itemid: Optional[str] = None) -> Optional[ExistMediaInfo]: def media_exists(self, mediainfo: MediaInfo, itemid: str = None) -> Optional[ExistMediaInfo]:
""" """
判断媒体文件是否存在 判断媒体文件是否存在
:param mediainfo: 识别的媒体信息 :param mediainfo: 识别的媒体信息
:param itemid: 媒体服务器ItemID
:return: 如不存在返回None存在时返回信息包括每季已存在所有集{type: movie/tv, seasons: {season: [episodes]}} :return: 如不存在返回None存在时返回信息包括每季已存在所有集{type: movie/tv, seasons: {season: [episodes]}}
""" """
if mediainfo.type == MediaType.MOVIE: if mediainfo.type == MediaType.MOVIE:
if itemid:
movie = self.jellyfin.get_iteminfo(itemid)
if movie:
logger.info(f"媒体库中已存在:{movie}")
return ExistMediaInfo(type=MediaType.MOVIE)
movies = self.jellyfin.get_movies(title=mediainfo.title, year=mediainfo.year) movies = self.jellyfin.get_movies(title=mediainfo.title, year=mediainfo.year)
if not movies: if not movies:
logger.info(f"{mediainfo.title_year} 在媒体库中不存在") logger.info(f"{mediainfo.title_year} 在媒体库中不存在")

View File

@ -292,7 +292,7 @@ class Jellyfin(metaclass=Singleton):
return None return None
if not item_id: if not item_id:
return {} return {}
# 验证tmdbid是否相同 # 验证tmdbid是否相同
item_tmdbid = self.get_iteminfo(item_id).get("ProviderIds", {}).get("Tmdb") item_tmdbid = self.get_iteminfo(item_id).get("ProviderIds", {}).get("Tmdb")
if tmdb_id and item_tmdbid: if tmdb_id and item_tmdbid:
if str(tmdb_id) != str(item_tmdbid): if str(tmdb_id) != str(item_tmdbid):

View File

@ -33,13 +33,19 @@ class PlexModule(_ModuleBase):
""" """
return self.plex.get_webhook_message(form.get("payload")) return self.plex.get_webhook_message(form.get("payload"))
def media_exists(self, mediainfo: MediaInfo, itemid: Optional[str] = None) -> Optional[ExistMediaInfo]: def media_exists(self, mediainfo: MediaInfo, itemid: str = None) -> Optional[ExistMediaInfo]:
""" """
判断媒体文件是否存在 判断媒体文件是否存在
:param mediainfo: 识别的媒体信息 :param mediainfo: 识别的媒体信息
:param itemid: 媒体服务器ItemID
:return: 如不存在返回None存在时返回信息包括每季已存在所有集{type: movie/tv, seasons: {season: [episodes]}} :return: 如不存在返回None存在时返回信息包括每季已存在所有集{type: movie/tv, seasons: {season: [episodes]}}
""" """
if mediainfo.type == MediaType.MOVIE: if mediainfo.type == MediaType.MOVIE:
if itemid:
movie = self.plex.get_iteminfo(itemid)
if movie:
logger.info(f"媒体库中已存在:{movie}")
return ExistMediaInfo(type=MediaType.MOVIE)
movies = self.plex.get_movies(title=mediainfo.title, year=mediainfo.year) movies = self.plex.get_movies(title=mediainfo.title, year=mediainfo.year)
if not movies: if not movies:
logger.info(f"{mediainfo.title_year} 在媒体库中不存在") logger.info(f"{mediainfo.title_year} 在媒体库中不存在")
@ -49,7 +55,8 @@ class PlexModule(_ModuleBase):
return ExistMediaInfo(type=MediaType.MOVIE) return ExistMediaInfo(type=MediaType.MOVIE)
else: else:
tvs = self.plex.get_tv_episodes(title=mediainfo.title, tvs = self.plex.get_tv_episodes(title=mediainfo.title,
year=mediainfo.year) year=mediainfo.year,
item_id=itemid)
if not tvs: if not tvs:
logger.info(f"{mediainfo.title_year} 在媒体库中不存在") logger.info(f"{mediainfo.title_year} 在媒体库中不存在")
return None return None