Merge remote-tracking branch 'origin/main'

This commit is contained in:
thsrite 2023-09-13 09:22:29 +08:00
commit 2fa11a4796
6 changed files with 50 additions and 11 deletions

View File

@ -68,7 +68,7 @@ class EmbyModule(_ModuleBase):
if movie: if movie:
logger.info(f"媒体库中已存在:{movie}") logger.info(f"媒体库中已存在:{movie}")
return ExistMediaInfo(type=MediaType.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, tmdb_id=mediainfo.tmdb_id)
if not movies: if not movies:
logger.info(f"{mediainfo.title_year} 在媒体库中不存在") logger.info(f"{mediainfo.title_year} 在媒体库中不存在")
return None return None

View File

@ -272,11 +272,15 @@ class Emby(metaclass=Singleton):
return None return None
return "" return ""
def get_movies(self, title: str, year: str = None) -> Optional[List[dict]]: def get_movies(self,
title: str,
year: str = None,
tmdb_id: int = None) -> Optional[List[dict]]:
""" """
根据标题和年份检查电影是否在Emby中存在存在则返回列表 根据标题和年份检查电影是否在Emby中存在存在则返回列表
:param title: 标题 :param title: 标题
:param year: 年份可以为空为空时不按年份过滤 :param year: 年份可以为空为空时不按年份过滤
:param tmdb_id: TMDB ID
:return: 含titleyear属性的字典列表 :return: 含titleyear属性的字典列表
""" """
if not self._host or not self._apikey: if not self._host or not self._apikey:
@ -291,11 +295,19 @@ class Emby(metaclass=Singleton):
if res_items: if res_items:
ret_movies = [] ret_movies = []
for res_item in res_items: for res_item in res_items:
item_tmdbid = res_item.get("ProviderIds", {}).get("Tmdb")
if tmdb_id and item_tmdbid:
if str(item_tmdbid) != str(tmdb_id):
continue
else:
ret_movies.append(
{'title': res_item.get('Name'), 'year': str(res_item.get('ProductionYear'))})
continue
if res_item.get('Name') == title and ( if res_item.get('Name') == title and (
not year or str(res_item.get('ProductionYear')) == str(year)): not year or str(res_item.get('ProductionYear')) == str(year)):
ret_movies.append( ret_movies.append(
{'title': res_item.get('Name'), 'year': str(res_item.get('ProductionYear'))}) {'title': res_item.get('Name'), 'year': str(res_item.get('ProductionYear'))})
return ret_movies return ret_movies
except Exception as e: except Exception as e:
logger.error(f"连接Items出错" + str(e)) logger.error(f"连接Items出错" + str(e))
return None return None

View File

@ -64,7 +64,7 @@ class JellyfinModule(_ModuleBase):
if movie: if movie:
logger.info(f"媒体库中已存在:{movie}") logger.info(f"媒体库中已存在:{movie}")
return ExistMediaInfo(type=MediaType.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, tmdb_id=mediainfo.tmdb_id)
if not movies: if not movies:
logger.info(f"{mediainfo.title_year} 在媒体库中不存在") logger.info(f"{mediainfo.title_year} 在媒体库中不存在")
return None return None

View File

@ -248,11 +248,15 @@ class Jellyfin(metaclass=Singleton):
return None return None
return "" return ""
def get_movies(self, title: str, year: str = None) -> Optional[List[dict]]: def get_movies(self,
title: str,
year: str = None,
tmdb_id: int = None) -> Optional[List[dict]]:
""" """
根据标题和年份检查电影是否在Jellyfin中存在存在则返回列表 根据标题和年份检查电影是否在Jellyfin中存在存在则返回列表
:param title: 标题 :param title: 标题
:param year: 年份为空则不过滤 :param year: 年份为空则不过滤
:param tmdb_id: TMDB ID
:return: 含titleyear属性的字典列表 :return: 含titleyear属性的字典列表
""" """
if not self._host or not self._apikey or not self.user: if not self._host or not self._apikey or not self.user:
@ -266,11 +270,19 @@ class Jellyfin(metaclass=Singleton):
if res_items: if res_items:
ret_movies = [] ret_movies = []
for res_item in res_items: for res_item in res_items:
item_tmdbid = res_item.get("ProviderIds", {}).get("Tmdb")
if tmdb_id and item_tmdbid:
if str(item_tmdbid) != str(tmdb_id):
continue
else:
ret_movies.append(
{'title': res_item.get('Name'), 'year': str(res_item.get('ProductionYear'))})
continue
if res_item.get('Name') == title and ( if res_item.get('Name') == title and (
not year or str(res_item.get('ProductionYear')) == str(year)): not year or str(res_item.get('ProductionYear')) == str(year)):
ret_movies.append( ret_movies.append(
{'title': res_item.get('Name'), 'year': str(res_item.get('ProductionYear'))}) {'title': res_item.get('Name'), 'year': str(res_item.get('ProductionYear'))})
return ret_movies return ret_movies
except Exception as e: except Exception as e:
logger.error(f"连接Items出错" + str(e)) logger.error(f"连接Items出错" + str(e))
return None return None

View File

@ -54,7 +54,7 @@ class PlexModule(_ModuleBase):
if movie: if movie:
logger.info(f"媒体库中已存在:{movie}") logger.info(f"媒体库中已存在:{movie}")
return ExistMediaInfo(type=MediaType.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, tmdb_id=mediainfo.tmdb_id)
if not movies: if not movies:
logger.info(f"{mediainfo.title_year} 在媒体库中不存在") logger.info(f"{mediainfo.title_year} 在媒体库中不存在")
return None return None
@ -64,6 +64,7 @@ class PlexModule(_ModuleBase):
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,
tmdb_id=mediainfo.tmdb_id,
item_id=itemid) item_id=itemid)
if not tvs: if not tvs:
logger.info(f"{mediainfo.title_year} 在媒体库中不存在") logger.info(f"{mediainfo.title_year} 在媒体库中不存在")

View File

@ -128,11 +128,15 @@ class Plex(metaclass=Singleton):
"EpisodeCount": EpisodeCount "EpisodeCount": EpisodeCount
} }
def get_movies(self, title: str, year: str = None) -> Optional[List[dict]]: def get_movies(self,
title: str,
year: str = None,
tmdb_id: int = None) -> Optional[List[dict]]:
""" """
根据标题和年份检查电影是否在Plex中存在存在则返回列表 根据标题和年份检查电影是否在Plex中存在存在则返回列表
:param title: 标题 :param title: 标题
:param year: 年份为空则不过滤 :param year: 年份为空则不过滤
:param tmdb_id: TMDB ID
:return: 含titleyear属性的字典列表 :return: 含titleyear属性的字典列表
""" """
if not self._plex: if not self._plex:
@ -143,6 +147,10 @@ class Plex(metaclass=Singleton):
else: else:
movies = self._plex.library.search(title=title, libtype="movie") movies = self._plex.library.search(title=title, libtype="movie")
for movie in movies: for movie in movies:
movie_tmdbid = self.__get_ids(movie.guids).get("tmdb_id")
if tmdb_id and movie_tmdbid:
if str(movie_tmdbid) != str(tmdb_id):
continue
ret_movies.append({'title': movie.title, 'year': movie.year}) ret_movies.append({'title': movie.title, 'year': movie.year})
return ret_movies return ret_movies
@ -150,12 +158,14 @@ class Plex(metaclass=Singleton):
item_id: str = None, item_id: str = None,
title: str = None, title: str = None,
year: str = None, year: str = None,
tmdb_id: int = None,
season: int = None) -> Optional[Dict[int, list]]: season: int = None) -> Optional[Dict[int, list]]:
""" """
根据标题年份季查询电视剧所有集信息 根据标题年份季查询电视剧所有集信息
:param item_id: 媒体ID :param item_id: 媒体ID
:param title: 标题 :param title: 标题
:param year: 年份可以为空为空时不按年份过滤 :param year: 年份可以为空为空时不按年份过滤
:param tmdb_id: TMDB ID
:param season: 季号数字 :param season: 季号数字
:return: 所有集的列表 :return: 所有集的列表
""" """
@ -164,13 +174,17 @@ class Plex(metaclass=Singleton):
if item_id: if item_id:
videos = self._plex.fetchItem(item_id) videos = self._plex.fetchItem(item_id)
else: else:
# 根据标题和年份模糊搜索,该结果不够准确
videos = self._plex.library.search(title=title, year=year, libtype="show") videos = self._plex.library.search(title=title, year=year, libtype="show")
if not videos: if not videos:
return {} return {}
if isinstance(videos, list): if isinstance(videos, list):
episodes = videos[0].episodes() videos = videos[0]
else: video_tmdbid = self.__get_ids(videos.guids).get('tmdb_id')
episodes = videos.episodes() if tmdb_id and video_tmdbid:
if str(video_tmdbid) != str(tmdb_id):
return {}
episodes = videos.episodes()
season_episodes = {} season_episodes = {}
for episode in episodes: for episode in episodes:
if season and episode.seasonNumber != int(season): if season and episode.seasonNumber != int(season):