This commit is contained in:
jxxghp 2024-05-14 08:30:29 +08:00
parent fabb02a8a0
commit bd6d6b6882
10 changed files with 550 additions and 550 deletions

View File

@ -96,14 +96,14 @@ class SystemChain(ChainBase, metaclass=Singleton):
获取后端最新版本 获取后端最新版本
""" """
try: try:
with RequestUtils(proxies=settings.PROXY, headers=settings.GITHUB_HEADERS).get_res( version_res = RequestUtils(proxies=settings.PROXY, headers=settings.GITHUB_HEADERS).get_res(
"https://api.github.com/repos/jxxghp/MoviePilot/releases/latest") as version_res: "https://api.github.com/repos/jxxghp/MoviePilot/releases/latest")
if version_res: if version_res:
ver_json = version_res.json() ver_json = version_res.json()
version = f"{ver_json['tag_name']}" version = f"{ver_json['tag_name']}"
return version return version
else: else:
return None return None
except Exception as err: except Exception as err:
logger.error(f"获取后端最新版本失败:{str(err)}") logger.error(f"获取后端最新版本失败:{str(err)}")
return None return None
@ -114,14 +114,14 @@ class SystemChain(ChainBase, metaclass=Singleton):
获取前端最新版本 获取前端最新版本
""" """
try: try:
with RequestUtils(proxies=settings.PROXY, headers=settings.GITHUB_HEADERS).get_res( version_res = RequestUtils(proxies=settings.PROXY, headers=settings.GITHUB_HEADERS).get_res(
"https://api.github.com/repos/jxxghp/MoviePilot-Frontend/releases/latest") as version_res: "https://api.github.com/repos/jxxghp/MoviePilot-Frontend/releases/latest")
if version_res: if version_res:
ver_json = version_res.json() ver_json = version_res.json()
version = f"{ver_json['tag_name']}" version = f"{ver_json['tag_name']}"
return version return version
else: else:
return None return None
except Exception as err: except Exception as err:
logger.error(f"获取前端最新版本失败:{str(err)}") logger.error(f"获取前端最新版本失败:{str(err)}")
return None return None

View File

@ -23,11 +23,11 @@ class BangumiModule(_ModuleBase):
""" """
测试模块连接性 测试模块连接性
""" """
with RequestUtils().get_res("https://api.bgm.tv/") as ret: ret = RequestUtils().get_res("https://api.bgm.tv/")
if ret and ret.status_code == 200: if ret and ret.status_code == 200:
return True, "" return True, ""
elif ret: elif ret:
return False, f"无法连接Bangumi错误码{ret.status_code}" return False, f"无法连接Bangumi错误码{ret.status_code}"
return False, "Bangumi网络连接失败" return False, "Bangumi网络连接失败"
def init_setting(self) -> Tuple[str, Union[str, bool]]: def init_setting(self) -> Tuple[str, Union[str, bool]]:

View File

@ -38,11 +38,11 @@ class DoubanModule(_ModuleBase):
""" """
测试模块连接性 测试模块连接性
""" """
with RequestUtils().get_res("https://movie.douban.com/") as ret: ret = RequestUtils().get_res("https://movie.douban.com/")
if ret and ret.status_code == 200: if ret and ret.status_code == 200:
return True, "" return True, ""
elif ret: elif ret:
return False, f"无法连接豆瓣,错误码:{ret.status_code}" return False, f"无法连接豆瓣,错误码:{ret.status_code}"
return False, "豆瓣网络连接失败" return False, "豆瓣网络连接失败"
def init_setting(self) -> Tuple[str, Union[str, bool]]: def init_setting(self) -> Tuple[str, Union[str, bool]]:

View File

@ -195,13 +195,13 @@ class DoubanApi(metaclass=Singleton):
'_ts': ts, '_ts': ts,
'_sig': self.__sign(url=req_url, ts=ts) '_sig': self.__sign(url=req_url, ts=ts)
}) })
with RequestUtils( resp = RequestUtils(
ua=choice(self._user_agents), ua=choice(self._user_agents),
session=self._session session=self._session
).get_res(url=req_url, params=params) as resp: ).get_res(url=req_url, params=params)
if resp is not None and resp.status_code == 400 and "rate_limit" in resp.text: if resp is not None and resp.status_code == 400 and "rate_limit" in resp.text:
return resp.json() return resp.json()
return resp.json() if resp else {} return resp.json() if resp else {}
@lru_cache(maxsize=settings.CACHE_CONF.get('douban')) @lru_cache(maxsize=settings.CACHE_CONF.get('douban'))
def __post(self, url: str, **kwargs) -> dict: def __post(self, url: str, **kwargs) -> dict:

View File

@ -193,15 +193,15 @@ class DoubanScraper:
url = url.replace("/format/webp", "/format/jpg") url = url.replace("/format/webp", "/format/jpg")
file_path.with_suffix(".jpg") file_path.with_suffix(".jpg")
logger.info(f"正在下载{file_path.stem}图片:{url} ...") logger.info(f"正在下载{file_path.stem}图片:{url} ...")
with RequestUtils().get_res(url=url) as r: r = RequestUtils().get_res(url=url)
if r: if r:
if self._transfer_type in ['rclone_move', 'rclone_copy']: if self._transfer_type in ['rclone_move', 'rclone_copy']:
self.__save_remove_file(file_path, r.content) self.__save_remove_file(file_path, r.content)
else:
file_path.write_bytes(r.content)
logger.info(f"图片已保存:{file_path}")
else: else:
logger.info(f"{file_path.stem}图片下载失败,请检查网络连通性") file_path.write_bytes(r.content)
logger.info(f"图片已保存:{file_path}")
else:
logger.info(f"{file_path.stem}图片下载失败,请检查网络连通性")
except Exception as err: except Exception as err:
logger.error(f"{file_path.stem}图片下载失败:{str(err)}") logger.error(f"{file_path.stem}图片下载失败:{str(err)}")

View File

@ -56,12 +56,12 @@ class Emby:
return [] return []
req_url = "%semby/Library/SelectableMediaFolders?api_key=%s" % (self._host, self._apikey) req_url = "%semby/Library/SelectableMediaFolders?api_key=%s" % (self._host, self._apikey)
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res: if res:
return res.json() return res.json()
else: else:
logger.error(f"Library/SelectableMediaFolders 未获取到返回数据") logger.error(f"Library/SelectableMediaFolders 未获取到返回数据")
return [] return []
except Exception as e: except Exception as e:
logger.error(f"连接Library/SelectableMediaFolders 出错:" + str(e)) logger.error(f"连接Library/SelectableMediaFolders 出错:" + str(e))
return [] return []
@ -74,29 +74,29 @@ class Emby:
return [] return []
req_url = "%semby/Library/VirtualFolders/Query?api_key=%s" % (self._host, self._apikey) req_url = "%semby/Library/VirtualFolders/Query?api_key=%s" % (self._host, self._apikey)
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res: if res:
library_items = res.json().get("Items") library_items = res.json().get("Items")
librarys = [] librarys = []
for library_item in library_items: for library_item in library_items:
library_name = library_item.get('Name') library_name = library_item.get('Name')
pathInfos = library_item.get('LibraryOptions', {}).get('PathInfos') pathInfos = library_item.get('LibraryOptions', {}).get('PathInfos')
library_paths = [] library_paths = []
for path in pathInfos: for path in pathInfos:
if path.get('NetworkPath'): if path.get('NetworkPath'):
library_paths.append(path.get('NetworkPath')) library_paths.append(path.get('NetworkPath'))
else: else:
library_paths.append(path.get('Path')) library_paths.append(path.get('Path'))
if library_name and library_paths: if library_name and library_paths:
librarys.append({ librarys.append({
'Name': library_name, 'Name': library_name,
'Path': library_paths 'Path': library_paths
}) })
return librarys return librarys
else: else:
logger.error(f"Library/VirtualFolders/Query 未获取到返回数据") logger.error(f"Library/VirtualFolders/Query 未获取到返回数据")
return [] return []
except Exception as e: except Exception as e:
logger.error(f"连接Library/VirtualFolders/Query 出错:" + str(e)) logger.error(f"连接Library/VirtualFolders/Query 出错:" + str(e))
return [] return []
@ -113,12 +113,12 @@ class Emby:
user = self.user user = self.user
req_url = f"{self._host}emby/Users/{user}/Views?api_key={self._apikey}" req_url = f"{self._host}emby/Users/{user}/Views?api_key={self._apikey}"
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res: if res:
return res.json().get("Items") return res.json().get("Items")
else: else:
logger.error(f"User/Views 未获取到返回数据") logger.error(f"User/Views 未获取到返回数据")
return [] return []
except Exception as e: except Exception as e:
logger.error(f"连接User/Views 出错:" + str(e)) logger.error(f"连接User/Views 出错:" + str(e))
return [] return []
@ -164,20 +164,20 @@ class Emby:
return None return None
req_url = "%sUsers?api_key=%s" % (self._host, self._apikey) req_url = "%sUsers?api_key=%s" % (self._host, self._apikey)
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res: if res:
users = res.json() users = res.json()
# 先查询是否有与当前用户名称匹配的 # 先查询是否有与当前用户名称匹配的
if user_name: if user_name:
for user in users:
if user.get("Name") == user_name:
return user.get("Id")
# 查询管理员
for user in users: for user in users:
if user.get("Policy", {}).get("IsAdministrator"): if user.get("Name") == user_name:
return user.get("Id") return user.get("Id")
else: # 查询管理员
logger.error(f"Users 未获取到返回数据") for user in users:
if user.get("Policy", {}).get("IsAdministrator"):
return user.get("Id")
else:
logger.error(f"Users 未获取到返回数据")
except Exception as e: except Exception as e:
logger.error(f"连接Users出错" + str(e)) logger.error(f"连接Users出错" + str(e))
return None return None
@ -227,11 +227,11 @@ class Emby:
return None return None
req_url = "%sSystem/Info?api_key=%s" % (self._host, self._apikey) req_url = "%sSystem/Info?api_key=%s" % (self._host, self._apikey)
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res: if res:
return res.json().get("Id") return res.json().get("Id")
else: else:
logger.error(f"System/Info 未获取到返回数据") logger.error(f"System/Info 未获取到返回数据")
except Exception as e: except Exception as e:
logger.error(f"连接System/Info出错" + str(e)) logger.error(f"连接System/Info出错" + str(e))
@ -245,12 +245,12 @@ class Emby:
return 0 return 0
req_url = "%semby/Users/Query?api_key=%s" % (self._host, self._apikey) req_url = "%semby/Users/Query?api_key=%s" % (self._host, self._apikey)
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res: if res:
return res.json().get("TotalRecordCount") return res.json().get("TotalRecordCount")
else: else:
logger.error(f"Users/Query 未获取到返回数据") logger.error(f"Users/Query 未获取到返回数据")
return 0 return 0
except Exception as e: except Exception as e:
logger.error(f"连接Users/Query出错" + str(e)) logger.error(f"连接Users/Query出错" + str(e))
return 0 return 0
@ -264,17 +264,17 @@ class Emby:
return schemas.Statistic() return schemas.Statistic()
req_url = "%semby/Items/Counts?api_key=%s" % (self._host, self._apikey) req_url = "%semby/Items/Counts?api_key=%s" % (self._host, self._apikey)
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res: if res:
result = res.json() result = res.json()
return schemas.Statistic( return schemas.Statistic(
movie_count=result.get("MovieCount") or 0, movie_count=result.get("MovieCount") or 0,
tv_count=result.get("SeriesCount") or 0, tv_count=result.get("SeriesCount") or 0,
episode_count=result.get("EpisodeCount") or 0 episode_count=result.get("EpisodeCount") or 0
) )
else: else:
logger.error(f"Items/Counts 未获取到返回数据") logger.error(f"Items/Counts 未获取到返回数据")
return schemas.Statistic() return schemas.Statistic()
except Exception as e: except Exception as e:
logger.error(f"连接Items/Counts出错" + str(e)) logger.error(f"连接Items/Counts出错" + str(e))
return schemas.Statistic() return schemas.Statistic()
@ -299,14 +299,14 @@ class Emby:
"&api_key=%s") % ( "&api_key=%s") % (
self._host, name, self._apikey) self._host, name, self._apikey)
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res: if res:
res_items = res.json().get("Items") res_items = res.json().get("Items")
if res_items: if res_items:
for res_item in res_items: for res_item in res_items:
if res_item.get('Name') == name and ( if res_item.get('Name') == name and (
not year or str(res_item.get('ProductionYear')) == str(year)): not year or str(res_item.get('ProductionYear')) == str(year)):
return res_item.get('Id') return res_item.get('Id')
except Exception as e: except Exception as e:
logger.error(f"连接Items出错" + str(e)) logger.error(f"连接Items出错" + str(e))
return None return None
@ -329,36 +329,36 @@ class Emby:
"&Recursive=true&SearchTerm=%s&Limit=10&IncludeSearchTypes=false&api_key=%s" % ( "&Recursive=true&SearchTerm=%s&Limit=10&IncludeSearchTypes=false&api_key=%s" % (
self._host, title, self._apikey) self._host, title, self._apikey)
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res: if res:
res_items = res.json().get("Items") res_items = res.json().get("Items")
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") item_tmdbid = res_item.get("ProviderIds", {}).get("Tmdb")
mediaserver_item = schemas.MediaServerItem( mediaserver_item = schemas.MediaServerItem(
server="emby", server="emby",
library=res_item.get("ParentId"), library=res_item.get("ParentId"),
item_id=res_item.get("Id"), item_id=res_item.get("Id"),
item_type=res_item.get("Type"), item_type=res_item.get("Type"),
title=res_item.get("Name"), title=res_item.get("Name"),
original_title=res_item.get("OriginalTitle"), original_title=res_item.get("OriginalTitle"),
year=res_item.get("ProductionYear"), year=res_item.get("ProductionYear"),
tmdbid=int(item_tmdbid) if item_tmdbid else None, tmdbid=int(item_tmdbid) if item_tmdbid else None,
imdbid=res_item.get("ProviderIds", {}).get("Imdb"), imdbid=res_item.get("ProviderIds", {}).get("Imdb"),
tvdbid=res_item.get("ProviderIds", {}).get("Tvdb"), tvdbid=res_item.get("ProviderIds", {}).get("Tvdb"),
path=res_item.get("Path") path=res_item.get("Path")
) )
if tmdb_id and item_tmdbid: if tmdb_id and item_tmdbid:
if str(item_tmdbid) != str(tmdb_id): if str(item_tmdbid) != str(tmdb_id):
continue continue
else: else:
ret_movies.append(mediaserver_item)
continue
if (mediaserver_item.title == title
and (not year or str(mediaserver_item.year) == str(year))):
ret_movies.append(mediaserver_item) ret_movies.append(mediaserver_item)
return ret_movies continue
if (mediaserver_item.title == title
and (not year or str(mediaserver_item.year) == str(year))):
ret_movies.append(mediaserver_item)
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
@ -401,25 +401,25 @@ class Emby:
try: try:
req_url = "%semby/Shows/%s/Episodes?Season=%s&IsMissing=false&api_key=%s" % ( req_url = "%semby/Shows/%s/Episodes?Season=%s&IsMissing=false&api_key=%s" % (
self._host, item_id, season, self._apikey) self._host, item_id, season, self._apikey)
with RequestUtils().get_res(req_url) as res_json: res_json = RequestUtils().get_res(req_url)
if res_json: if res_json:
tv_item = res_json.json() tv_item = res_json.json()
res_items = tv_item.get("Items") res_items = tv_item.get("Items")
season_episodes = {} season_episodes = {}
for res_item in res_items: for res_item in res_items:
season_index = res_item.get("ParentIndexNumber") season_index = res_item.get("ParentIndexNumber")
if not season_index: if not season_index:
continue continue
if season and season != season_index: if season and season != season_index:
continue continue
episode_index = res_item.get("IndexNumber") episode_index = res_item.get("IndexNumber")
if not episode_index: if not episode_index:
continue continue
if season_index not in season_episodes: if season_index not in season_episodes:
season_episodes[season_index] = [] season_episodes[season_index] = []
season_episodes[season_index].append(episode_index) season_episodes[season_index].append(episode_index)
# 返回 # 返回
return item_id, season_episodes return item_id, season_episodes
except Exception as e: except Exception as e:
logger.error(f"连接Shows/Id/Episodes出错" + str(e)) logger.error(f"连接Shows/Id/Episodes出错" + str(e))
return None, None return None, None
@ -463,13 +463,13 @@ class Emby:
req_url = "%sItems/%s/Images/%s" % (self._playhost, item_id, image_type) req_url = "%sItems/%s/Images/%s" % (self._playhost, item_id, image_type)
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res and res.status_code != 404: if res and res.status_code != 404:
logger.info(f"影片图片链接:{res.url}") logger.info(f"影片图片链接:{res.url}")
return res.url return res.url
else: else:
logger.error("Items/Id/Images 未获取到返回数据或无该影片{}图片".format(image_type)) logger.error("Items/Id/Images 未获取到返回数据或无该影片{}图片".format(image_type))
return None return None
except Exception as e: except Exception as e:
logger.error(f"连接Items/Id/Images出错" + str(e)) logger.error(f"连接Items/Id/Images出错" + str(e))
return None return None
@ -482,11 +482,11 @@ class Emby:
return False return False
req_url = "%semby/Items/%s/Refresh?Recursive=true&api_key=%s" % (self._host, item_id, self._apikey) req_url = "%semby/Items/%s/Refresh?Recursive=true&api_key=%s" % (self._host, item_id, self._apikey)
try: try:
with RequestUtils().post_res(req_url) as res: res = RequestUtils().post_res(req_url)
if res: if res:
return True return True
else: else:
logger.info(f"刷新媒体库对象 {item_id} 失败无法连接Emby") logger.info(f"刷新媒体库对象 {item_id} 失败无法连接Emby")
except Exception as e: except Exception as e:
logger.error(f"连接Items/Id/Refresh出错" + str(e)) logger.error(f"连接Items/Id/Refresh出错" + str(e))
return False return False
@ -500,11 +500,11 @@ class Emby:
return False return False
req_url = "%semby/Library/Refresh?api_key=%s" % (self._host, self._apikey) req_url = "%semby/Library/Refresh?api_key=%s" % (self._host, self._apikey)
try: try:
with RequestUtils().post_res(req_url) as res: res = RequestUtils().post_res(req_url)
if res: if res:
return True return True
else: else:
logger.info(f"刷新媒体库失败无法连接Emby") logger.info(f"刷新媒体库失败无法连接Emby")
except Exception as e: except Exception as e:
logger.error(f"连接Library/Refresh出错" + str(e)) logger.error(f"连接Library/Refresh出错" + str(e))
return False return False
@ -579,23 +579,23 @@ class Emby:
return None return None
req_url = "%semby/Users/%s/Items/%s?api_key=%s" % (self._host, self.user, itemid, self._apikey) req_url = "%semby/Users/%s/Items/%s?api_key=%s" % (self._host, self.user, itemid, self._apikey)
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res and res.status_code == 200: if res and res.status_code == 200:
item = res.json() item = res.json()
tmdbid = item.get("ProviderIds", {}).get("Tmdb") tmdbid = item.get("ProviderIds", {}).get("Tmdb")
return schemas.MediaServerItem( return schemas.MediaServerItem(
server="emby", server="emby",
library=item.get("ParentId"), library=item.get("ParentId"),
item_id=item.get("Id"), item_id=item.get("Id"),
item_type=item.get("Type"), item_type=item.get("Type"),
title=item.get("Name"), title=item.get("Name"),
original_title=item.get("OriginalTitle"), original_title=item.get("OriginalTitle"),
year=item.get("ProductionYear"), year=item.get("ProductionYear"),
tmdbid=int(tmdbid) if tmdbid else None, tmdbid=int(tmdbid) if tmdbid else None,
imdbid=item.get("ProviderIds", {}).get("Imdb"), imdbid=item.get("ProviderIds", {}).get("Imdb"),
tvdbid=item.get("ProviderIds", {}).get("Tvdb"), tvdbid=item.get("ProviderIds", {}).get("Tvdb"),
path=item.get("Path") path=item.get("Path")
) )
except Exception as e: except Exception as e:
logger.error(f"连接Items/Id出错" + str(e)) logger.error(f"连接Items/Id出错" + str(e))
return None return None
@ -610,17 +610,17 @@ class Emby:
yield None yield None
req_url = "%semby/Users/%s/Items?ParentId=%s&api_key=%s" % (self._host, self.user, parent, self._apikey) req_url = "%semby/Users/%s/Items?ParentId=%s&api_key=%s" % (self._host, self.user, parent, self._apikey)
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res and res.status_code == 200: if res and res.status_code == 200:
results = res.json().get("Items") or [] results = res.json().get("Items") or []
for result in results: for result in results:
if not result: if not result:
continue continue
if result.get("Type") in ["Movie", "Series"]: if result.get("Type") in ["Movie", "Series"]:
yield self.get_iteminfo(result.get("Id")) yield self.get_iteminfo(result.get("Id"))
elif "Folder" in result.get("Type"): elif "Folder" in result.get("Type"):
for item in self.get_items(parent=result.get('Id')): for item in self.get_items(parent=result.get('Id')):
yield item yield item
except Exception as e: except Exception as e:
logger.error(f"连接Users/Items出错" + str(e)) logger.error(f"连接Users/Items出错" + str(e))
yield None yield None
@ -1032,52 +1032,52 @@ class Emby:
req_url = (f"{self._host}Users/{user}/Items/Resume?" req_url = (f"{self._host}Users/{user}/Items/Resume?"
f"Limit=100&MediaTypes=Video&api_key={self._apikey}&Fields=ProductionYear,Path") f"Limit=100&MediaTypes=Video&api_key={self._apikey}&Fields=ProductionYear,Path")
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res: if res:
result = res.json().get("Items") or [] result = res.json().get("Items") or []
ret_resume = [] ret_resume = []
# 用户媒体库文件夹列表(排除黑名单) # 用户媒体库文件夹列表(排除黑名单)
library_folders = self.get_user_library_folders() library_folders = self.get_user_library_folders()
for item in result: for item in result:
if len(ret_resume) == num: if len(ret_resume) == num:
break break
if item.get("Type") not in ["Movie", "Episode"]: if item.get("Type") not in ["Movie", "Episode"]:
continue continue
item_path = item.get("Path") item_path = item.get("Path")
if item_path and library_folders and not any( if item_path and library_folders and not any(
str(item_path).startswith(folder) for folder in library_folders): str(item_path).startswith(folder) for folder in library_folders):
continue continue
item_type = MediaType.MOVIE.value if item.get("Type") == "Movie" else MediaType.TV.value item_type = MediaType.MOVIE.value if item.get("Type") == "Movie" else MediaType.TV.value
link = self.get_play_url(item.get("Id")) link = self.get_play_url(item.get("Id"))
if item_type == MediaType.MOVIE.value: if item_type == MediaType.MOVIE.value:
title = item.get("Name") title = item.get("Name")
subtitle = item.get("ProductionYear") subtitle = item.get("ProductionYear")
else:
title = f'{item.get("SeriesName")}'
subtitle = f'S{item.get("ParentIndexNumber")}:{item.get("IndexNumber")} - {item.get("Name")}'
if item_type == MediaType.MOVIE.value:
if item.get("BackdropImageTags"):
image = self.__get_backdrop_url(item_id=item.get("Id"),
image_tag=item.get("BackdropImageTags")[0])
else: else:
title = f'{item.get("SeriesName")}' image = self.__get_local_image_by_id(item.get("Id"))
subtitle = f'S{item.get("ParentIndexNumber")}:{item.get("IndexNumber")} - {item.get("Name")}' else:
if item_type == MediaType.MOVIE.value: image = self.__get_backdrop_url(item_id=item.get("SeriesId"),
if item.get("BackdropImageTags"): image_tag=item.get("SeriesPrimaryImageTag"))
image = self.__get_backdrop_url(item_id=item.get("Id"), if not image:
image_tag=item.get("BackdropImageTags")[0]) image = self.__get_local_image_by_id(item.get("SeriesId"))
else: ret_resume.append(schemas.MediaServerPlayItem(
image = self.__get_local_image_by_id(item.get("Id")) id=item.get("Id"),
else: title=title,
image = self.__get_backdrop_url(item_id=item.get("SeriesId"), subtitle=subtitle,
image_tag=item.get("SeriesPrimaryImageTag")) type=item_type,
if not image: image=image,
image = self.__get_local_image_by_id(item.get("SeriesId")) link=link,
ret_resume.append(schemas.MediaServerPlayItem( percent=item.get("UserData", {}).get("PlayedPercentage")
id=item.get("Id"), ))
title=title, return ret_resume
subtitle=subtitle, else:
type=item_type, logger.error(f"Users/Items/Resume 未获取到返回数据")
image=image,
link=link,
percent=item.get("UserData", {}).get("PlayedPercentage")
))
return ret_resume
else:
logger.error(f"Users/Items/Resume 未获取到返回数据")
except Exception as e: except Exception as e:
logger.error(f"连接Users/Items/Resume出错" + str(e)) logger.error(f"连接Users/Items/Resume出错" + str(e))
return [] return []
@ -1095,35 +1095,35 @@ class Emby:
req_url = (f"{self._host}Users/{user}/Items/Latest?" req_url = (f"{self._host}Users/{user}/Items/Latest?"
f"Limit=100&MediaTypes=Video&api_key={self._apikey}&Fields=ProductionYear,Path") f"Limit=100&MediaTypes=Video&api_key={self._apikey}&Fields=ProductionYear,Path")
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res: if res:
result = res.json() or [] result = res.json() or []
ret_latest = [] ret_latest = []
# 用户媒体库文件夹列表(排除黑名单) # 用户媒体库文件夹列表(排除黑名单)
library_folders = self.get_user_library_folders() library_folders = self.get_user_library_folders()
for item in result: for item in result:
if len(ret_latest) == num: if len(ret_latest) == num:
break break
if item.get("Type") not in ["Movie", "Series"]: if item.get("Type") not in ["Movie", "Series"]:
continue continue
item_path = item.get("Path") item_path = item.get("Path")
if item_path and library_folders and not any( if item_path and library_folders and not any(
str(item_path).startswith(folder) for folder in library_folders): str(item_path).startswith(folder) for folder in library_folders):
continue continue
item_type = MediaType.MOVIE.value if item.get("Type") == "Movie" else MediaType.TV.value item_type = MediaType.MOVIE.value if item.get("Type") == "Movie" else MediaType.TV.value
link = self.get_play_url(item.get("Id")) link = self.get_play_url(item.get("Id"))
image = self.__get_local_image_by_id(item_id=item.get("Id")) image = self.__get_local_image_by_id(item_id=item.get("Id"))
ret_latest.append(schemas.MediaServerPlayItem( ret_latest.append(schemas.MediaServerPlayItem(
id=item.get("Id"), id=item.get("Id"),
title=item.get("Name"), title=item.get("Name"),
subtitle=item.get("ProductionYear"), subtitle=item.get("ProductionYear"),
type=item_type, type=item_type,
image=image, image=image,
link=link link=link
)) ))
return ret_latest return ret_latest
else: else:
logger.error(f"Users/Items/Latest 未获取到返回数据") logger.error(f"Users/Items/Latest 未获取到返回数据")
except Exception as e: except Exception as e:
logger.error(f"连接Users/Items/Latest出错" + str(e)) logger.error(f"连接Users/Items/Latest出错" + str(e))
return [] return []

View File

@ -321,11 +321,11 @@ class FanartModule(_ModuleBase):
""" """
测试模块连接性 测试模块连接性
""" """
with RequestUtils().get_res("https://webservice.fanart.tv") as ret: ret = RequestUtils().get_res("https://webservice.fanart.tv")
if ret and ret.status_code == 200: if ret and ret.status_code == 200:
return True, "" return True, ""
elif ret: elif ret:
return False, f"无法连接fanart错误码{ret.status_code}" return False, f"无法连接fanart错误码{ret.status_code}"
return False, "fanart网络连接失败" return False, "fanart网络连接失败"
def init_setting(self) -> Tuple[str, Union[str, bool]]: def init_setting(self) -> Tuple[str, Union[str, bool]]:

View File

@ -52,12 +52,12 @@ class Jellyfin:
return [] return []
req_url = "%sLibrary/SelectableMediaFolders?api_key=%s" % (self._host, self._apikey) req_url = "%sLibrary/SelectableMediaFolders?api_key=%s" % (self._host, self._apikey)
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res: if res:
return res.json() return res.json()
else: else:
logger.error(f"Library/SelectableMediaFolders 未获取到返回数据") logger.error(f"Library/SelectableMediaFolders 未获取到返回数据")
return [] return []
except Exception as e: except Exception as e:
logger.error(f"连接Library/SelectableMediaFolders 出错:" + str(e)) logger.error(f"连接Library/SelectableMediaFolders 出错:" + str(e))
return [] return []
@ -70,29 +70,29 @@ class Jellyfin:
return [] return []
req_url = "%sLibrary/VirtualFolders?api_key=%s" % (self._host, self._apikey) req_url = "%sLibrary/VirtualFolders?api_key=%s" % (self._host, self._apikey)
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res: if res:
library_items = res.json() library_items = res.json()
librarys = [] librarys = []
for library_item in library_items: for library_item in library_items:
library_name = library_item.get('Name') library_name = library_item.get('Name')
pathInfos = library_item.get('LibraryOptions', {}).get('PathInfos') pathInfos = library_item.get('LibraryOptions', {}).get('PathInfos')
library_paths = [] library_paths = []
for path in pathInfos: for path in pathInfos:
if path.get('NetworkPath'): if path.get('NetworkPath'):
library_paths.append(path.get('NetworkPath')) library_paths.append(path.get('NetworkPath'))
else: else:
library_paths.append(path.get('Path')) library_paths.append(path.get('Path'))
if library_name and library_paths: if library_name and library_paths:
librarys.append({ librarys.append({
'Name': library_name, 'Name': library_name,
'Path': library_paths 'Path': library_paths
}) })
return librarys return librarys
else: else:
logger.error(f"Library/VirtualFolders 未获取到返回数据") logger.error(f"Library/VirtualFolders 未获取到返回数据")
return [] return []
except Exception as e: except Exception as e:
logger.error(f"连接Library/VirtualFolders 出错:" + str(e)) logger.error(f"连接Library/VirtualFolders 出错:" + str(e))
return [] return []
@ -109,12 +109,12 @@ class Jellyfin:
user = self.user user = self.user
req_url = f"{self._host}Users/{user}/Views?api_key={self._apikey}" req_url = f"{self._host}Users/{user}/Views?api_key={self._apikey}"
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res: if res:
return res.json().get("Items") return res.json().get("Items")
else: else:
logger.error(f"Users/Views 未获取到返回数据") logger.error(f"Users/Views 未获取到返回数据")
return [] return []
except Exception as e: except Exception as e:
logger.error(f"连接Users/Views 出错:" + str(e)) logger.error(f"连接Users/Views 出错:" + str(e))
return [] return []
@ -163,12 +163,12 @@ class Jellyfin:
return 0 return 0
req_url = "%sUsers?api_key=%s" % (self._host, self._apikey) req_url = "%sUsers?api_key=%s" % (self._host, self._apikey)
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res: if res:
return len(res.json()) return len(res.json())
else: else:
logger.error(f"Users 未获取到返回数据") logger.error(f"Users 未获取到返回数据")
return 0 return 0
except Exception as e: except Exception as e:
logger.error(f"连接Users出错" + str(e)) logger.error(f"连接Users出错" + str(e))
return 0 return 0
@ -181,20 +181,20 @@ class Jellyfin:
return None return None
req_url = "%sUsers?api_key=%s" % (self._host, self._apikey) req_url = "%sUsers?api_key=%s" % (self._host, self._apikey)
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res: if res:
users = res.json() users = res.json()
# 先查询是否有与当前用户名称匹配的 # 先查询是否有与当前用户名称匹配的
if user_name: if user_name:
for user in users:
if user.get("Name") == user_name:
return user.get("Id")
# 查询管理员
for user in users: for user in users:
if user.get("Policy", {}).get("IsAdministrator"): if user.get("Name") == user_name:
return user.get("Id") return user.get("Id")
else: # 查询管理员
logger.error(f"Users 未获取到返回数据") for user in users:
if user.get("Policy", {}).get("IsAdministrator"):
return user.get("Id")
else:
logger.error(f"Users 未获取到返回数据")
except Exception as e: except Exception as e:
logger.error(f"连接Users出错" + str(e)) logger.error(f"连接Users出错" + str(e))
return None return None
@ -244,11 +244,11 @@ class Jellyfin:
return None return None
req_url = "%sSystem/Info?api_key=%s" % (self._host, self._apikey) req_url = "%sSystem/Info?api_key=%s" % (self._host, self._apikey)
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res: if res:
return res.json().get("Id") return res.json().get("Id")
else: else:
logger.error(f"System/Info 未获取到返回数据") logger.error(f"System/Info 未获取到返回数据")
except Exception as e: except Exception as e:
logger.error(f"连接System/Info出错" + str(e)) logger.error(f"连接System/Info出错" + str(e))
return None return None
@ -262,17 +262,17 @@ class Jellyfin:
return schemas.Statistic() return schemas.Statistic()
req_url = "%sItems/Counts?api_key=%s" % (self._host, self._apikey) req_url = "%sItems/Counts?api_key=%s" % (self._host, self._apikey)
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res: if res:
result = res.json() result = res.json()
return schemas.Statistic( return schemas.Statistic(
movie_count=result.get("MovieCount") or 0, movie_count=result.get("MovieCount") or 0,
tv_count=result.get("SeriesCount") or 0, tv_count=result.get("SeriesCount") or 0,
episode_count=result.get("EpisodeCount") or 0 episode_count=result.get("EpisodeCount") or 0
) )
else: else:
logger.error(f"Items/Counts 未获取到返回数据") logger.error(f"Items/Counts 未获取到返回数据")
return schemas.Statistic() return schemas.Statistic()
except Exception as e: except Exception as e:
logger.error(f"连接Items/Counts出错" + str(e)) logger.error(f"连接Items/Counts出错" + str(e))
return schemas.Statistic() return schemas.Statistic()
@ -287,14 +287,14 @@ class Jellyfin:
"api_key=%s&searchTerm=%s&IncludeItemTypes=Series&Limit=10&Recursive=true") % ( "api_key=%s&searchTerm=%s&IncludeItemTypes=Series&Limit=10&Recursive=true") % (
self._host, self.user, self._apikey, name) self._host, self.user, self._apikey, name)
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res: if res:
res_items = res.json().get("Items") res_items = res.json().get("Items")
if res_items: if res_items:
for res_item in res_items: for res_item in res_items:
if res_item.get('Name') == name and ( if res_item.get('Name') == name and (
not year or str(res_item.get('ProductionYear')) == str(year)): not year or str(res_item.get('ProductionYear')) == str(year)):
return res_item.get('Id') return res_item.get('Id')
except Exception as e: except Exception as e:
logger.error(f"连接Items出错" + str(e)) logger.error(f"连接Items出错" + str(e))
return None return None
@ -317,36 +317,36 @@ class Jellyfin:
"api_key=%s&searchTerm=%s&IncludeItemTypes=Movie&Limit=10&Recursive=true") % ( "api_key=%s&searchTerm=%s&IncludeItemTypes=Movie&Limit=10&Recursive=true") % (
self._host, self.user, self._apikey, title) self._host, self.user, self._apikey, title)
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res: if res:
res_items = res.json().get("Items") res_items = res.json().get("Items")
if res_items: if res_items:
ret_movies = [] ret_movies = []
for item in res_items: for item in res_items:
item_tmdbid = item.get("ProviderIds", {}).get("Tmdb") item_tmdbid = item.get("ProviderIds", {}).get("Tmdb")
mediaserver_item = schemas.MediaServerItem( mediaserver_item = schemas.MediaServerItem(
server="jellyfin", server="jellyfin",
library=item.get("ParentId"), library=item.get("ParentId"),
item_id=item.get("Id"), item_id=item.get("Id"),
item_type=item.get("Type"), item_type=item.get("Type"),
title=item.get("Name"), title=item.get("Name"),
original_title=item.get("OriginalTitle"), original_title=item.get("OriginalTitle"),
year=item.get("ProductionYear"), year=item.get("ProductionYear"),
tmdbid=int(item_tmdbid) if item_tmdbid else None, tmdbid=int(item_tmdbid) if item_tmdbid else None,
imdbid=item.get("ProviderIds", {}).get("Imdb"), imdbid=item.get("ProviderIds", {}).get("Imdb"),
tvdbid=item.get("ProviderIds", {}).get("Tvdb"), tvdbid=item.get("ProviderIds", {}).get("Tvdb"),
path=item.get("Path") path=item.get("Path")
) )
if tmdb_id and item_tmdbid: if tmdb_id and item_tmdbid:
if str(item_tmdbid) != str(tmdb_id): if str(item_tmdbid) != str(tmdb_id):
continue continue
else: else:
ret_movies.append(mediaserver_item)
continue
if mediaserver_item.title == title and (
not year or str(mediaserver_item.year) == str(year)):
ret_movies.append(mediaserver_item) ret_movies.append(mediaserver_item)
return ret_movies continue
if mediaserver_item.title == title and (
not year or str(mediaserver_item.year) == str(year)):
ret_movies.append(mediaserver_item)
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
@ -387,25 +387,25 @@ class Jellyfin:
try: try:
req_url = "%sShows/%s/Episodes?season=%s&&userId=%s&isMissing=false&api_key=%s" % ( req_url = "%sShows/%s/Episodes?season=%s&&userId=%s&isMissing=false&api_key=%s" % (
self._host, item_id, season, self.user, self._apikey) self._host, item_id, season, self.user, self._apikey)
with RequestUtils().get_res(req_url) as res_json: res_json = RequestUtils().get_res(req_url)
if res_json: if res_json:
tv_info = res_json.json() tv_info = res_json.json()
res_items = tv_info.get("Items") res_items = tv_info.get("Items")
# 返回的季集信息 # 返回的季集信息
season_episodes = {} season_episodes = {}
for res_item in res_items: for res_item in res_items:
season_index = res_item.get("ParentIndexNumber") season_index = res_item.get("ParentIndexNumber")
if not season_index: if not season_index:
continue continue
if season and season != season_index: if season and season != season_index:
continue continue
episode_index = res_item.get("IndexNumber") episode_index = res_item.get("IndexNumber")
if not episode_index: if not episode_index:
continue continue
if not season_episodes.get(season_index): if not season_episodes.get(season_index):
season_episodes[season_index] = [] season_episodes[season_index] = []
season_episodes[season_index].append(episode_index) season_episodes[season_index].append(episode_index)
return item_id, season_episodes return item_id, season_episodes
except Exception as e: except Exception as e:
logger.error(f"连接Shows/Id/Episodes出错" + str(e)) logger.error(f"连接Shows/Id/Episodes出错" + str(e))
return None, None return None, None
@ -458,13 +458,13 @@ class Jellyfin:
_host = self._playhost _host = self._playhost
req_url = "%sItems/%s/Images/%s" % (_host, item_id, image_type) req_url = "%sItems/%s/Images/%s" % (_host, item_id, image_type)
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res and res.status_code != 404: if res and res.status_code != 404:
logger.info(f"影片图片链接:{res.url}") logger.info(f"影片图片链接:{res.url}")
return res.url return res.url
else: else:
logger.error("Items/Id/Images 未获取到返回数据或无该影片{}图片".format(image_type)) logger.error("Items/Id/Images 未获取到返回数据或无该影片{}图片".format(image_type))
return None return None
except Exception as e: except Exception as e:
logger.error(f"连接Items/Id/Images出错" + str(e)) logger.error(f"连接Items/Id/Images出错" + str(e))
return None return None
@ -479,12 +479,12 @@ class Jellyfin:
""" """
req_url = "%sItems/%s/Ancestors?api_key=%s" % (self._host, item_id, self._apikey) req_url = "%sItems/%s/Ancestors?api_key=%s" % (self._host, item_id, self._apikey)
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res: if res:
return res.json()[index].get(key) return res.json()[index].get(key)
else: else:
logger.error(f"Items/Id/Ancestors 未获取到返回数据") logger.error(f"Items/Id/Ancestors 未获取到返回数据")
return None return None
except Exception as e: except Exception as e:
logger.error(f"连接Items/Id/Ancestors出错" + str(e)) logger.error(f"连接Items/Id/Ancestors出错" + str(e))
return None return None
@ -497,11 +497,11 @@ class Jellyfin:
return False return False
req_url = "%sLibrary/Refresh?api_key=%s" % (self._host, self._apikey) req_url = "%sLibrary/Refresh?api_key=%s" % (self._host, self._apikey)
try: try:
with RequestUtils().post_res(req_url) as res: res = RequestUtils().post_res(req_url)
if res: if res:
return True return True
else: else:
logger.info(f"刷新媒体库失败无法连接Jellyfin") logger.info(f"刷新媒体库失败无法连接Jellyfin")
except Exception as e: except Exception as e:
logger.error(f"连接Library/Refresh出错" + str(e)) logger.error(f"连接Library/Refresh出错" + str(e))
return False return False
@ -632,23 +632,23 @@ class Jellyfin:
req_url = "%sUsers/%s/Items/%s?api_key=%s" % ( req_url = "%sUsers/%s/Items/%s?api_key=%s" % (
self._host, self.user, itemid, self._apikey) self._host, self.user, itemid, self._apikey)
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res and res.status_code == 200: if res and res.status_code == 200:
item = res.json() item = res.json()
tmdbid = item.get("ProviderIds", {}).get("Tmdb") tmdbid = item.get("ProviderIds", {}).get("Tmdb")
return schemas.MediaServerItem( return schemas.MediaServerItem(
server="jellyfin", server="jellyfin",
library=item.get("ParentId"), library=item.get("ParentId"),
item_id=item.get("Id"), item_id=item.get("Id"),
item_type=item.get("Type"), item_type=item.get("Type"),
title=item.get("Name"), title=item.get("Name"),
original_title=item.get("OriginalTitle"), original_title=item.get("OriginalTitle"),
year=item.get("ProductionYear"), year=item.get("ProductionYear"),
tmdbid=int(tmdbid) if tmdbid else None, tmdbid=int(tmdbid) if tmdbid else None,
imdbid=item.get("ProviderIds", {}).get("Imdb"), imdbid=item.get("ProviderIds", {}).get("Imdb"),
tvdbid=item.get("ProviderIds", {}).get("Tvdb"), tvdbid=item.get("ProviderIds", {}).get("Tvdb"),
path=item.get("Path") path=item.get("Path")
) )
except Exception as e: except Exception as e:
logger.error(f"连接Users/Items出错" + str(e)) logger.error(f"连接Users/Items出错" + str(e))
return None return None
@ -663,17 +663,17 @@ class Jellyfin:
yield None yield None
req_url = "%sUsers/%s/Items?parentId=%s&api_key=%s" % (self._host, self.user, parent, self._apikey) req_url = "%sUsers/%s/Items?parentId=%s&api_key=%s" % (self._host, self.user, parent, self._apikey)
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res and res.status_code == 200: if res and res.status_code == 200:
results = res.json().get("Items") or [] results = res.json().get("Items") or []
for result in results: for result in results:
if not result: if not result:
continue continue
if result.get("Type") in ["Movie", "Series"]: if result.get("Type") in ["Movie", "Series"]:
yield self.get_iteminfo(result.get("Id")) yield self.get_iteminfo(result.get("Id"))
elif "Folder" in result.get("Type"): elif "Folder" in result.get("Type"):
for item in self.get_items(result.get("Id")): for item in self.get_items(result.get("Id")):
yield item yield item
except Exception as e: except Exception as e:
logger.error(f"连接Users/Items出错" + str(e)) logger.error(f"连接Users/Items出错" + str(e))
yield None yield None
@ -761,50 +761,50 @@ class Jellyfin:
req_url = (f"{self._host}Users/{user}/Items/Resume?" req_url = (f"{self._host}Users/{user}/Items/Resume?"
f"Limit=100&MediaTypes=Video&api_key={self._apikey}&Fields=ProductionYear,Path") f"Limit=100&MediaTypes=Video&api_key={self._apikey}&Fields=ProductionYear,Path")
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res: if res:
result = res.json().get("Items") or [] result = res.json().get("Items") or []
ret_resume = [] ret_resume = []
# 用户媒体库文件夹列表(排除黑名单) # 用户媒体库文件夹列表(排除黑名单)
library_folders = self.get_user_library_folders() library_folders = self.get_user_library_folders()
for item in result: for item in result:
if len(ret_resume) == num: if len(ret_resume) == num:
break break
if item.get("Type") not in ["Movie", "Episode"]: if item.get("Type") not in ["Movie", "Episode"]:
continue continue
item_path = item.get("Path") item_path = item.get("Path")
if item_path and library_folders and not any( if item_path and library_folders and not any(
str(item_path).startswith(folder) for folder in library_folders): str(item_path).startswith(folder) for folder in library_folders):
continue continue
item_type = MediaType.MOVIE.value if item.get("Type") == "Movie" else MediaType.TV.value item_type = MediaType.MOVIE.value if item.get("Type") == "Movie" else MediaType.TV.value
link = self.get_play_url(item.get("Id")) link = self.get_play_url(item.get("Id"))
if item.get("BackdropImageTags"): if item.get("BackdropImageTags"):
image = self.__get_backdrop_url(item_id=item.get("Id"), image = self.__get_backdrop_url(item_id=item.get("Id"),
image_tag=item.get("BackdropImageTags")[0]) image_tag=item.get("BackdropImageTags")[0])
else: else:
image = self.__get_local_image_by_id(item.get("Id")) image = self.__get_local_image_by_id(item.get("Id"))
# 小部分剧集无[xxx-S01E01-thumb.jpg]图片 # 小部分剧集无[xxx-S01E01-thumb.jpg]图片
with RequestUtils().get_res(image) as image_res: image_res = RequestUtils().get_res(image)
if not image_res or image_res.status_code == 404: if not image_res or image_res.status_code == 404:
image = self.generate_image_link(item.get("Id"), "Backdrop", False) image = self.generate_image_link(item.get("Id"), "Backdrop", False)
if item_type == MediaType.MOVIE.value: if item_type == MediaType.MOVIE.value:
title = item.get("Name") title = item.get("Name")
subtitle = item.get("ProductionYear") subtitle = item.get("ProductionYear")
else: else:
title = f'{item.get("SeriesName")}' title = f'{item.get("SeriesName")}'
subtitle = f'S{item.get("ParentIndexNumber")}:{item.get("IndexNumber")} - {item.get("Name")}' subtitle = f'S{item.get("ParentIndexNumber")}:{item.get("IndexNumber")} - {item.get("Name")}'
ret_resume.append(schemas.MediaServerPlayItem( ret_resume.append(schemas.MediaServerPlayItem(
id=item.get("Id"), id=item.get("Id"),
title=title, title=title,
subtitle=subtitle, subtitle=subtitle,
type=item_type, type=item_type,
image=image, image=image,
link=link, link=link,
percent=item.get("UserData", {}).get("PlayedPercentage") percent=item.get("UserData", {}).get("PlayedPercentage")
)) ))
return ret_resume return ret_resume
else: else:
logger.error(f"Users/Items/Resume 未获取到返回数据") logger.error(f"Users/Items/Resume 未获取到返回数据")
except Exception as e: except Exception as e:
logger.error(f"连接Users/Items/Resume出错" + str(e)) logger.error(f"连接Users/Items/Resume出错" + str(e))
return [] return []
@ -822,35 +822,35 @@ class Jellyfin:
req_url = (f"{self._host}Users/{user}/Items/Latest?" req_url = (f"{self._host}Users/{user}/Items/Latest?"
f"Limit=100&MediaTypes=Video&api_key={self._apikey}&Fields=ProductionYear,Path") f"Limit=100&MediaTypes=Video&api_key={self._apikey}&Fields=ProductionYear,Path")
try: try:
with RequestUtils().get_res(req_url) as res: res = RequestUtils().get_res(req_url)
if res: if res:
result = res.json() or [] result = res.json() or []
ret_latest = [] ret_latest = []
# 用户媒体库文件夹列表(排除黑名单) # 用户媒体库文件夹列表(排除黑名单)
library_folders = self.get_user_library_folders() library_folders = self.get_user_library_folders()
for item in result: for item in result:
if len(ret_latest) == num: if len(ret_latest) == num:
break break
if item.get("Type") not in ["Movie", "Series"]: if item.get("Type") not in ["Movie", "Series"]:
continue continue
item_path = item.get("Path") item_path = item.get("Path")
if item_path and library_folders and not any( if item_path and library_folders and not any(
str(item_path).startswith(folder) for folder in library_folders): str(item_path).startswith(folder) for folder in library_folders):
continue continue
item_type = MediaType.MOVIE.value if item.get("Type") == "Movie" else MediaType.TV.value item_type = MediaType.MOVIE.value if item.get("Type") == "Movie" else MediaType.TV.value
link = self.get_play_url(item.get("Id")) link = self.get_play_url(item.get("Id"))
image = self.__get_local_image_by_id(item_id=item.get("Id")) image = self.__get_local_image_by_id(item_id=item.get("Id"))
ret_latest.append(schemas.MediaServerPlayItem( ret_latest.append(schemas.MediaServerPlayItem(
id=item.get("Id"), id=item.get("Id"),
title=item.get("Name"), title=item.get("Name"),
subtitle=item.get("ProductionYear"), subtitle=item.get("ProductionYear"),
type=item_type, type=item_type,
image=image, image=image,
link=link link=link
)) ))
return ret_latest return ret_latest
else: else:
logger.error(f"Users/Items/Latest 未获取到返回数据") logger.error(f"Users/Items/Latest 未获取到返回数据")
except Exception as e: except Exception as e:
logger.error(f"连接Users/Items/Latest出错" + str(e)) logger.error(f"连接Users/Items/Latest出错" + str(e))
return [] return []

View File

@ -71,18 +71,18 @@ class WeChat:
return None return None
try: try:
token_url = self._token_url % (self._corpid, self._appsecret) token_url = self._token_url % (self._corpid, self._appsecret)
with RequestUtils().get_res(token_url) as res: res = RequestUtils().get_res(token_url)
if res: if res:
ret_json = res.json() ret_json = res.json()
if ret_json.get('errcode') == 0: if ret_json.get('errcode') == 0:
self._access_token = ret_json.get('access_token') self._access_token = ret_json.get('access_token')
self._expires_in = ret_json.get('expires_in') self._expires_in = ret_json.get('expires_in')
self._access_token_time = datetime.now() self._access_token_time = datetime.now()
elif res is not None: elif res is not None:
logger.error(f"获取微信access_token失败错误码{res.status_code},错误原因:{res.reason}") logger.error(f"获取微信access_token失败错误码{res.status_code},错误原因:{res.reason}")
else: else:
logger.error(f"获取微信access_token失败未获取到返回信息") logger.error(f"获取微信access_token失败未获取到返回信息")
raise Exception("获取微信access_token失败网络连接失败") raise Exception("获取微信access_token失败网络连接失败")
except Exception as e: except Exception as e:
logger.error(f"获取微信access_token失败错误信息{str(e)}") logger.error(f"获取微信access_token失败错误信息{str(e)}")
return None return None

View File

@ -40,9 +40,9 @@ class WebUtils:
} }
""" """
try: try:
with RequestUtils().get_res(f"https://api.mir6.com/api/ip?ip={ip}&type=json") as r: r = RequestUtils().get_res(f"https://api.mir6.com/api/ip?ip={ip}&type=json")
if r: if r:
return r.json().get("data", {}).get("location") or '' return r.json().get("data", {}).get("location") or ''
except Exception as err: except Exception as err:
print(str(err)) print(str(err))
return "" return ""
@ -65,9 +65,9 @@ class WebUtils:
} }
""" """
try: try:
with RequestUtils().get_res(f"https://whois.pconline.com.cn/ipJson.jsp?json=true&ip={ip}") as r: r = RequestUtils().get_res(f"https://whois.pconline.com.cn/ipJson.jsp?json=true&ip={ip}")
if r: if r:
return r.json().get("addr") or '' return r.json().get("addr") or ''
except Exception as err: except Exception as err:
print(str(err)) print(str(err))
return "" return ""