From f80e5739ca264f82da3904717091a278c820e69f Mon Sep 17 00:00:00 2001 From: jxxghp Date: Thu, 31 Aug 2023 08:15:43 +0800 Subject: [PATCH] =?UTF-8?q?feat=20=E5=AA=92=E4=BD=93=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=99=A8/=E4=B8=8B=E8=BD=BD=E5=99=A8=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E9=87=8D=E8=BF=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/modules/emby/__init__.py | 8 ++++++++ app/modules/emby/emby.py | 14 +++++++------- app/modules/jellyfin/__init__.py | 14 +++++++++++--- app/modules/jellyfin/jellyfin.py | 24 ++++++++++++------------ app/modules/plex/__init__.py | 8 ++++++++ app/modules/qbittorrent/__init__.py | 8 ++++++++ app/modules/transmission/__init__.py | 8 ++++++++ 7 files changed, 62 insertions(+), 22 deletions(-) diff --git a/app/modules/emby/__init__.py b/app/modules/emby/__init__.py index bf957460..f1b1846b 100644 --- a/app/modules/emby/__init__.py +++ b/app/modules/emby/__init__.py @@ -23,6 +23,14 @@ class EmbyModule(_ModuleBase): def init_setting(self) -> Tuple[str, Union[str, bool]]: return "MEDIASERVER", "emby" + def scheduler_job(self) -> None: + """ + 定时任务,每10分钟调用一次 + """ + # 定时重连 + if not self.emby.user: + self.emby = Emby() + def user_authenticate(self, name: str, password: str) -> Optional[str]: """ 使用Emby用户辅助完成用户认证 diff --git a/app/modules/emby/emby.py b/app/modules/emby/emby.py index 2f3b7e90..eed70456 100644 --- a/app/modules/emby/emby.py +++ b/app/modules/emby/emby.py @@ -24,8 +24,8 @@ class Emby(metaclass=Singleton): if not self._host.startswith("http"): self._host = "http://" + self._host self._apikey = settings.EMBY_API_KEY - self._user = self.get_user() - self._folders = self.get_emby_folders() + self.user = self.get_user() + self.folders = self.get_emby_folders() def get_emby_folders(self) -> List[dict]: """ @@ -51,7 +51,7 @@ class Emby(metaclass=Singleton): """ if not self._host or not self._apikey: return [] - req_url = f"{self._host}emby/Users/{self._user}/Views?api_key={self._apikey}" + req_url = f"{self._host}emby/Users/{self.user}/Views?api_key={self._apikey}" try: res = RequestUtils().get_res(req_url) if res: @@ -452,7 +452,7 @@ class Emby(metaclass=Singleton): return None # 查找需要刷新的媒体库ID item_path = Path(item.target_path) - for folder in self._folders: + for folder in self.folders: # 找同级路径最多的媒体库(要求容器内映射路径与实际一致) max_comm_path = "" match_num = 0 @@ -494,7 +494,7 @@ class Emby(metaclass=Singleton): return {} if not self._host or not self._apikey: return {} - 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: res = RequestUtils().get_res(req_url) if res and res.status_code == 200: @@ -511,7 +511,7 @@ class Emby(metaclass=Singleton): yield {} if not self._host or not self._apikey: yield {} - 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: res = RequestUtils().get_res(req_url) if res and res.status_code == 200: @@ -851,7 +851,7 @@ class Emby(metaclass=Singleton): return None url = url.replace("{HOST}", self._host)\ .replace("{APIKEY}", self._apikey)\ - .replace("{USER}", self._user) + .replace("{USER}", self.user) try: return RequestUtils().get_res(url=url) except Exception as e: diff --git a/app/modules/jellyfin/__init__.py b/app/modules/jellyfin/__init__.py index 79f5c731..52127897 100644 --- a/app/modules/jellyfin/__init__.py +++ b/app/modules/jellyfin/__init__.py @@ -17,12 +17,20 @@ class JellyfinModule(_ModuleBase): def init_module(self) -> None: self.jellyfin = Jellyfin() - def stop(self): - pass - def init_setting(self) -> Tuple[str, Union[str, bool]]: return "MEDIASERVER", "jellyfin" + def scheduler_job(self) -> None: + """ + 定时任务,每10分钟调用一次 + """ + # 定时重连 + if not self.jellyfin.user: + self.jellyfin = Jellyfin() + + def stop(self): + pass + def user_authenticate(self, name: str, password: str) -> Optional[str]: """ 使用Emby用户辅助完成用户认证 diff --git a/app/modules/jellyfin/jellyfin.py b/app/modules/jellyfin/jellyfin.py index 2d29f64f..cf85d88a 100644 --- a/app/modules/jellyfin/jellyfin.py +++ b/app/modules/jellyfin/jellyfin.py @@ -22,8 +22,8 @@ class Jellyfin(metaclass=Singleton): if not self._host.startswith("http"): self._host = "http://" + self._host self._apikey = settings.JELLYFIN_API_KEY - self._user = self.get_user() - self._serverid = self.get_server_id() + self.user = self.get_user() + self.serverid = self.get_server_id() def __get_jellyfin_librarys(self) -> List[dict]: """ @@ -31,7 +31,7 @@ class Jellyfin(metaclass=Singleton): """ if not self._host or not self._apikey: return [] - req_url = f"{self._host}Users/{self._user}/Views?api_key={self._apikey}" + req_url = f"{self._host}Users/{self.user}/Views?api_key={self._apikey}" try: res = RequestUtils().get_res(req_url) if res: @@ -222,10 +222,10 @@ class Jellyfin(metaclass=Singleton): """ 根据名称查询Jellyfin中剧集的SeriesId """ - if not self._host or not self._apikey or not self._user: + if not self._host or not self._apikey or not self.user: return None req_url = "%sUsers/%s/Items?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: res = RequestUtils().get_res(req_url) if res: @@ -247,10 +247,10 @@ class Jellyfin(metaclass=Singleton): :param year: 年份,为空则不过滤 :return: 含title、year属性的字典列表 """ - if not self._host or not self._apikey or not self._user: + if not self._host or not self._apikey or not self.user: return None req_url = "%sUsers/%s/Items?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: res = RequestUtils().get_res(req_url) if res: @@ -283,7 +283,7 @@ class Jellyfin(metaclass=Singleton): :param season: 季 :return: 集号的列表 """ - if not self._host or not self._apikey or not self._user: + if not self._host or not self._apikey or not self.user: return None # 查TVID if not item_id: @@ -301,7 +301,7 @@ class Jellyfin(metaclass=Singleton): season = "" try: 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) res_json = RequestUtils().get_res(req_url) if res_json: res_items = res_json.json().get("Items") @@ -400,7 +400,7 @@ class Jellyfin(metaclass=Singleton): if not self._host or not self._apikey: return {} req_url = "%sUsers/%s/Items/%s?api_key=%s" % ( - self._host, self._user, itemid, self._apikey) + self._host, self.user, itemid, self._apikey) try: res = RequestUtils().get_res(req_url) if res and res.status_code == 200: @@ -417,7 +417,7 @@ class Jellyfin(metaclass=Singleton): yield {} if not self._host or not self._apikey: yield {} - 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: res = RequestUtils().get_res(req_url) if res and res.status_code == 200: @@ -454,7 +454,7 @@ class Jellyfin(metaclass=Singleton): return None url = url.replace("{HOST}", self._host)\ .replace("{APIKEY}", self._apikey)\ - .replace("{USER}", self._user) + .replace("{USER}", self.user) try: return RequestUtils().get_res(url=url) except Exception as e: diff --git a/app/modules/plex/__init__.py b/app/modules/plex/__init__.py index f09f7902..403a8c51 100644 --- a/app/modules/plex/__init__.py +++ b/app/modules/plex/__init__.py @@ -23,6 +23,14 @@ class PlexModule(_ModuleBase): def init_setting(self) -> Tuple[str, Union[str, bool]]: return "MEDIASERVER", "plex" + def scheduler_job(self) -> None: + """ + 定时任务,每10分钟调用一次 + """ + # 定时重连 + if not self.plex.get_plex(): + self.plex = Plex() + def webhook_parser(self, body: Any, form: Any, args: Any) -> WebhookEventInfo: """ 解析Webhook报文体 diff --git a/app/modules/qbittorrent/__init__.py b/app/modules/qbittorrent/__init__.py index 2f403b87..f2035e78 100644 --- a/app/modules/qbittorrent/__init__.py +++ b/app/modules/qbittorrent/__init__.py @@ -28,6 +28,14 @@ class QbittorrentModule(_ModuleBase): def init_setting(self) -> Tuple[str, Union[str, bool]]: return "DOWNLOADER", "qbittorrent" + def scheduler_job(self) -> None: + """ + 定时任务,每10分钟调用一次 + """ + # 定时重连 + if not self.qbittorrent.qbc: + self.qbittorrent = Qbittorrent() + def download(self, torrent_path: Path, download_dir: Path, cookie: str, episodes: Set[int] = None) -> Optional[Tuple[Optional[str], str]]: """ diff --git a/app/modules/transmission/__init__.py b/app/modules/transmission/__init__.py index c00ae84a..9a738a2b 100644 --- a/app/modules/transmission/__init__.py +++ b/app/modules/transmission/__init__.py @@ -28,6 +28,14 @@ class TransmissionModule(_ModuleBase): def init_setting(self) -> Tuple[str, Union[str, bool]]: return "DOWNLOADER", "transmission" + def scheduler_job(self) -> None: + """ + 定时任务,每10分钟调用一次 + """ + # 定时重连 + if not self.transmission.trc: + self.transmission = Transmission() + def download(self, torrent_path: Path, download_dir: Path, cookie: str, episodes: Set[int] = None) -> Optional[Tuple[Optional[str], str]]: """