From c044e594810c58267f2652e635dc8b50bfdfec6f Mon Sep 17 00:00:00 2001 From: thsrite Date: Fri, 12 Jan 2024 09:56:55 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix=20emby/jellyfin=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E7=BB=A7=E7=BB=AD=E8=A7=82=E7=9C=8B=E3=80=81=E6=9C=80=E8=BF=91?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/modules/emby/emby.py | 40 +++++++++++++++++++++++++------- app/modules/jellyfin/jellyfin.py | 40 +++++++++++++++++++++++++------- 2 files changed, 64 insertions(+), 16 deletions(-) diff --git a/app/modules/emby/emby.py b/app/modules/emby/emby.py index d47ac440..e4c05ab1 100644 --- a/app/modules/emby/emby.py +++ b/app/modules/emby/emby.py @@ -977,16 +977,16 @@ class Emby(metaclass=Singleton): if res: result = res.json().get("Items") or [] ret_resume = [] - # 用户媒体库列表(排除黑名单) - user_librarys = self.get_librarys(username=user) + # 用户媒体库文件夹列表(排除黑名单) + library_folders = self.get_user_library_folders() for item in result: if len(ret_resume) == num: break if item.get("Type") not in ["Movie", "Episode"]: continue item_path = item.get("Path") - if item_path and user_librarys and not any( - library.name in item_path for library in user_librarys): + if item_path and library_folders and not any( + str(item_path).startswith(folder) for folder in library_folders): continue item_type = MediaType.MOVIE.value if item.get("Type") == "Movie" else MediaType.TV.value link = self.get_play_url(item.get("Id")) @@ -1040,16 +1040,16 @@ class Emby(metaclass=Singleton): if res: result = res.json() or [] ret_latest = [] - # 用户媒体库列表(排除黑名单) - user_librarys = self.get_librarys(username=user) + # 用户媒体库文件夹列表(排除黑名单) + library_folders = self.get_user_library_folders() for item in result: if len(ret_latest) == num: break if item.get("Type") not in ["Movie", "Series"]: continue item_path = item.get("Path") - if item_path and user_librarys and not any( - library.name in item_path for library in user_librarys): + if item_path and library_folders and not any( + str(item_path).startswith(folder) for folder in library_folders): continue item_type = MediaType.MOVIE.value if item.get("Type") == "Movie" else MediaType.TV.value link = self.get_play_url(item.get("Id")) @@ -1068,3 +1068,27 @@ class Emby(metaclass=Singleton): except Exception as e: logger.error(f"连接Users/Items/Latest出错:" + str(e)) return [] + + def get_user_library_folders(self): + """ + 获取Emby媒体库文件夹列表(排除黑名单) + """ + if not self._host or not self._apikey: + return [] + library_folders = [] + req_url = f"{self._host}emby/Library/SelectableMediaFolders?api_key={self._apikey}" + try: + res = RequestUtils().get_res(req_url) + if res: + black_list = (settings.MEDIASERVER_SYNC_BLACKLIST or '').split(",") + for library in res.json() or []: + if library.get("Name") in black_list: + continue + library_folders += [folder.get("Path") for folder in library.get("SubFolders")] + return library_folders + else: + logger.error(f"Library/SelectableMediaFolders 未获取到返回数据") + return [] + except Exception as e: + logger.error(f"连接Library/SelectableMediaFolders 出错:" + str(e)) + return [] diff --git a/app/modules/jellyfin/jellyfin.py b/app/modules/jellyfin/jellyfin.py index b68359f3..c1f8c660 100644 --- a/app/modules/jellyfin/jellyfin.py +++ b/app/modules/jellyfin/jellyfin.py @@ -660,16 +660,16 @@ class Jellyfin(metaclass=Singleton): if res: result = res.json().get("Items") or [] ret_resume = [] - # 用户媒体库列表(排除黑名单) - user_librarys = self.get_librarys(username=user) + # 用户媒体库文件夹列表(排除黑名单) + library_folders = self.get_user_library_folders() for item in result: if len(ret_resume) == num: break if item.get("Type") not in ["Movie", "Episode"]: continue item_path = item.get("Path") - if item_path and user_librarys and not any( - library.name in item_path for library in user_librarys): + if item_path and library_folders and not any( + str(item_path).startswith(folder) for folder in library_folders): continue item_type = MediaType.MOVIE.value if item.get("Type") == "Movie" else MediaType.TV.value link = self.get_play_url(item.get("Id")) @@ -717,16 +717,16 @@ class Jellyfin(metaclass=Singleton): if res: result = res.json() or [] ret_latest = [] - # 用户媒体库列表(排除黑名单) - user_librarys = self.get_librarys(username=user) + # 用户媒体库文件夹列表(排除黑名单) + library_folders = self.get_user_library_folders() for item in result: if len(ret_latest) == num: break if item.get("Type") not in ["Movie", "Series"]: continue item_path = item.get("Path") - if item_path and user_librarys and not any( - library.name in item_path for library in user_librarys): + if item_path and library_folders and not any( + str(item_path).startswith(folder) for folder in library_folders): continue item_type = MediaType.MOVIE.value if item.get("Type") == "Movie" else MediaType.TV.value link = self.get_play_url(item.get("Id")) @@ -745,3 +745,27 @@ class Jellyfin(metaclass=Singleton): except Exception as e: logger.error(f"连接Users/Items/Latest出错:" + str(e)) return [] + + def get_user_library_folders(self): + """ + 获取Emby媒体库文件夹列表(排除黑名单) + """ + if not self._host or not self._apikey: + return [] + library_folders = [] + req_url = f"{self._host}Library/SelectableMediaFolders?api_key={self._apikey}" + try: + res = RequestUtils().get_res(req_url) + if res: + black_list = (settings.MEDIASERVER_SYNC_BLACKLIST or '').split(",") + for library in res.json() or []: + if library.get("Name") in black_list: + continue + library_folders += [folder.get("Path") for folder in library.get("SubFolders")] + return library_folders + else: + logger.error(f"Library/SelectableMediaFolders 未获取到返回数据") + return [] + except Exception as e: + logger.error(f"连接Library/SelectableMediaFolders 出错:" + str(e)) + return [] From 6d7a63ff6119179c659499bf675e17e92b246bc7 Mon Sep 17 00:00:00 2001 From: thsrite Date: Fri, 12 Jan 2024 10:07:39 +0800 Subject: [PATCH 2/2] fix c044e594 --- app/modules/emby/emby.py | 22 +++++------------- app/modules/jellyfin/jellyfin.py | 40 +++++++++++++++++++------------- 2 files changed, 30 insertions(+), 32 deletions(-) diff --git a/app/modules/emby/emby.py b/app/modules/emby/emby.py index e4c05ab1..afb31235 100644 --- a/app/modules/emby/emby.py +++ b/app/modules/emby/emby.py @@ -1076,19 +1076,9 @@ class Emby(metaclass=Singleton): if not self._host or not self._apikey: return [] library_folders = [] - req_url = f"{self._host}emby/Library/SelectableMediaFolders?api_key={self._apikey}" - try: - res = RequestUtils().get_res(req_url) - if res: - black_list = (settings.MEDIASERVER_SYNC_BLACKLIST or '').split(",") - for library in res.json() or []: - if library.get("Name") in black_list: - continue - library_folders += [folder.get("Path") for folder in library.get("SubFolders")] - return library_folders - else: - logger.error(f"Library/SelectableMediaFolders 未获取到返回数据") - return [] - except Exception as e: - logger.error(f"连接Library/SelectableMediaFolders 出错:" + str(e)) - return [] + black_list = (settings.MEDIASERVER_SYNC_BLACKLIST or '').split(",") + for library in self.get_emby_folders() or []: + if library.get("Name") in black_list: + continue + library_folders += [folder.get("Path") for folder in library.get("SubFolders")] + return library_folders diff --git a/app/modules/jellyfin/jellyfin.py b/app/modules/jellyfin/jellyfin.py index c1f8c660..0e31fec1 100644 --- a/app/modules/jellyfin/jellyfin.py +++ b/app/modules/jellyfin/jellyfin.py @@ -45,6 +45,24 @@ class Jellyfin(metaclass=Singleton): self.user = self.get_user() self.serverid = self.get_server_id() + def get_jellyfin_folders(self) -> List[dict]: + """ + 获取Jellyfin媒体库路径列表 + """ + if not self._host or not self._apikey: + return [] + req_url = "%Library/SelectableMediaFolders?api_key=%s" % (self._host, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res: + return res.json() + else: + logger.error(f"Library/SelectableMediaFolders 未获取到返回数据") + return [] + except Exception as e: + logger.error(f"连接Library/SelectableMediaFolders 出错:" + str(e)) + return [] + def __get_jellyfin_librarys(self, username: str = None) -> List[dict]: """ 获取Jellyfin媒体库的信息 @@ -753,19 +771,9 @@ class Jellyfin(metaclass=Singleton): if not self._host or not self._apikey: return [] library_folders = [] - req_url = f"{self._host}Library/SelectableMediaFolders?api_key={self._apikey}" - try: - res = RequestUtils().get_res(req_url) - if res: - black_list = (settings.MEDIASERVER_SYNC_BLACKLIST or '').split(",") - for library in res.json() or []: - if library.get("Name") in black_list: - continue - library_folders += [folder.get("Path") for folder in library.get("SubFolders")] - return library_folders - else: - logger.error(f"Library/SelectableMediaFolders 未获取到返回数据") - return [] - except Exception as e: - logger.error(f"连接Library/SelectableMediaFolders 出错:" + str(e)) - return [] + black_list = (settings.MEDIASERVER_SYNC_BLACKLIST or '').split(",") + for library in self.get_jellyfin_folders() or []: + if library.get("Name") in black_list: + continue + library_folders += [folder.get("Path") for folder in library.get("SubFolders")] + return library_folders