diff --git a/app/chain/__init__.py b/app/chain/__init__.py index 2f796593..cd6b3c3c 100644 --- a/app/chain/__init__.py +++ b/app/chain/__init__.py @@ -307,10 +307,11 @@ class ChainBase(metaclass=ABCMeta): """ 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 itemid: 媒体服务器ItemID :return: 如不存在返回None,存在时返回信息,包括每季已存在所有集{type: movie/tv, seasons: {season: [episodes]}} """ return self.run_module("media_exists", mediainfo=mediainfo, itemid=itemid) diff --git a/app/chain/download.py b/app/chain/download.py index 45b9f81e..417998c1 100644 --- a/app/chain/download.py +++ b/app/chain/download.py @@ -10,7 +10,7 @@ from app.db.downloadhistory_oper import DownloadHistoryOper from app.db.mediaserver_oper import MediaServerOper from app.helper.torrent import TorrentHelper 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.utils.string import StringUtils @@ -499,7 +499,9 @@ class DownloadChain(ChainBase): no_exists = {} 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: logger.info(f"媒体库中已存在电影:{mediainfo.title_year}") return True, {} @@ -516,11 +518,10 @@ class DownloadChain(ChainBase): logger.error(f"媒体信息中没有季集信息:{mediainfo.title_year}") return False, {} # 电视剧 - mediaserveritem: Optional[MediaServerItem] = self.mediaserver.exists(mtype=mediainfo.type.value, - tmdbid=mediainfo.tmdb_id, - 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,item_id) + itemid = self.mediaserver.get_item_id(mtype=mediainfo.type.value, + tmdbid=mediainfo.tmdb_id, + season=mediainfo.season) + exists_tvs: Optional[ExistMediaInfo] = self.media_exists(mediainfo=mediainfo, itemid=itemid) if not exists_tvs: # 所有剧集均缺失 for season, episodes in mediainfo.seasons.items(): diff --git a/app/db/mediaserver_oper.py b/app/db/mediaserver_oper.py index f610f034..b6b5e305 100644 --- a/app/db/mediaserver_oper.py +++ b/app/db/mediaserver_oper.py @@ -52,3 +52,12 @@ class MediaServerOper(DbOper): if kwargs.get("season") not in seasoninfo.keys(): return None 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) diff --git a/app/modules/emby/__init__.py b/app/modules/emby/__init__.py index 775d49ec..4e8e66cc 100644 --- a/app/modules/emby/__init__.py +++ b/app/modules/emby/__init__.py @@ -42,13 +42,19 @@ class EmbyModule(_ModuleBase): """ 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 itemid: 媒体服务器ItemID :return: 如不存在返回None,存在时返回信息,包括每季已存在所有集{type: movie/tv, seasons: {season: [episodes]}} """ 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) if not movies: logger.info(f"{mediainfo.title_year} 在媒体库中不存在") diff --git a/app/modules/emby/emby.py b/app/modules/emby/emby.py index 35ef3aad..d43edb2b 100644 --- a/app/modules/emby/emby.py +++ b/app/modules/emby/emby.py @@ -317,7 +317,7 @@ class Emby(metaclass=Singleton): return None if not item_id: return {} - # 验证tmdbid是否相同 + # 验证tmdbid是否相同 item_tmdbid = self.get_iteminfo(item_id).get("ProviderIds", {}).get("Tmdb") if tmdb_id and item_tmdbid: if str(tmdb_id) != str(item_tmdbid): diff --git a/app/modules/jellyfin/__init__.py b/app/modules/jellyfin/__init__.py index 8ace4457..79f5c731 100644 --- a/app/modules/jellyfin/__init__.py +++ b/app/modules/jellyfin/__init__.py @@ -43,13 +43,19 @@ class JellyfinModule(_ModuleBase): """ 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 itemid: 媒体服务器ItemID :return: 如不存在返回None,存在时返回信息,包括每季已存在所有集{type: movie/tv, seasons: {season: [episodes]}} """ 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) if not movies: logger.info(f"{mediainfo.title_year} 在媒体库中不存在") diff --git a/app/modules/jellyfin/jellyfin.py b/app/modules/jellyfin/jellyfin.py index d78ab21f..6d226c38 100644 --- a/app/modules/jellyfin/jellyfin.py +++ b/app/modules/jellyfin/jellyfin.py @@ -292,7 +292,7 @@ class Jellyfin(metaclass=Singleton): return None if not item_id: return {} - # 验证tmdbid是否相同 + # 验证tmdbid是否相同 item_tmdbid = self.get_iteminfo(item_id).get("ProviderIds", {}).get("Tmdb") if tmdb_id and item_tmdbid: if str(tmdb_id) != str(item_tmdbid): diff --git a/app/modules/plex/__init__.py b/app/modules/plex/__init__.py index 343c6bc3..f09f7902 100644 --- a/app/modules/plex/__init__.py +++ b/app/modules/plex/__init__.py @@ -33,13 +33,19 @@ class PlexModule(_ModuleBase): """ 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 itemid: 媒体服务器ItemID :return: 如不存在返回None,存在时返回信息,包括每季已存在所有集{type: movie/tv, seasons: {season: [episodes]}} """ 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) if not movies: logger.info(f"{mediainfo.title_year} 在媒体库中不存在") @@ -49,7 +55,8 @@ class PlexModule(_ModuleBase): return ExistMediaInfo(type=MediaType.MOVIE) else: tvs = self.plex.get_tv_episodes(title=mediainfo.title, - year=mediainfo.year) + year=mediainfo.year, + item_id=itemid) if not tvs: logger.info(f"{mediainfo.title_year} 在媒体库中不存在") return None