From 4e0fd27afb4748742a645f921ad187fabf7234ae Mon Sep 17 00:00:00 2001 From: thsrite Date: Fri, 1 Nov 2024 22:21:46 +0800 Subject: [PATCH 01/13] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E7=94=B5=E5=BD=B1=E5=90=8D=E7=A7=B0=E6=AD=A3=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.v2.json | 3 ++- plugins.v2/embydanmu/__init__.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/package.v2.json b/package.v2.json index 8664ba4..ea7a969 100644 --- a/package.v2.json +++ b/package.v2.json @@ -95,11 +95,12 @@ "name": "Emby弹幕下载", "description": "通知Emby Danmu插件下载弹幕。", "labels": "Emby,媒体库", - "version": "1.5.1", + "version": "1.5.2", "icon": "https://raw.githubusercontent.com/thsrite/MoviePilot-Plugins/main/icons/danmu.png", "author": "thsrite", "level": 1, "history": { + "v1.5.2": "修复获取电影名称正则", "v1.5.1": "Emby4.8.8 Items API修改", "v1.5": "修复获取弹幕源", "v1.4": "修复自定义参数", diff --git a/plugins.v2/embydanmu/__init__.py b/plugins.v2/embydanmu/__init__.py index 4daf253..3261a48 100644 --- a/plugins.v2/embydanmu/__init__.py +++ b/plugins.v2/embydanmu/__init__.py @@ -20,7 +20,7 @@ class EmbyDanmu(_PluginBase): # 插件图标 plugin_icon = "https://raw.githubusercontent.com/thsrite/MoviePilot-Plugins/main/icons/danmu.png" # 插件版本 - plugin_version = "1.5.1" + plugin_version = "1.5.2" # 插件作者 plugin_author = "thsrite" # 作者主页 @@ -341,7 +341,7 @@ class EmbyDanmu(_PluginBase): userid=event.event_data.get("user")) else: # 电影弹幕 - matches = re.findall(r'^(.+?)\s\(\d{4}\)', item.get("Name"), re.MULTILINE) + matches = re.findall(r'^(.*?)(?= ?\(\d{4}\)?|$)', item.get("Name"), re.MULTILINE) if matches and str(matches[0]) == library_item_name: found_item = True movie_id = item.get("Id") From 4b53b9a61f7000d223e89c66840e6638db87516f Mon Sep 17 00:00:00 2001 From: thsrite Date: Sat, 2 Nov 2024 10:59:53 +0800 Subject: [PATCH 02/13] Update __init__.py --- plugins.v2/embydanmu/__init__.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plugins.v2/embydanmu/__init__.py b/plugins.v2/embydanmu/__init__.py index 3261a48..1fc79e9 100644 --- a/plugins.v2/embydanmu/__init__.py +++ b/plugins.v2/embydanmu/__init__.py @@ -20,7 +20,7 @@ class EmbyDanmu(_PluginBase): # 插件图标 plugin_icon = "https://raw.githubusercontent.com/thsrite/MoviePilot-Plugins/main/icons/danmu.png" # 插件版本 - plugin_version = "1.5.2" + plugin_version = "1.5.3" # 插件作者 plugin_author = "thsrite" # 作者主页 @@ -497,8 +497,7 @@ class EmbyDanmu(_PluginBase): else: return res.json().get("Items") else: - logger.info(f"获取媒体库媒体列表失败,无法连接Emby!") - return [] + return self.__get_items_488(parent_id) except Exception as e: logger.error(f"连接媒体库媒体列表Items出错:" + str(e)) return [] From eccf44a3917ccd6029cd47619b94f050abc57e73 Mon Sep 17 00:00:00 2001 From: thsrite Date: Sat, 2 Nov 2024 11:00:47 +0800 Subject: [PATCH 03/13] Update package.v2.json --- package.v2.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.v2.json b/package.v2.json index ea7a969..4f7ab6c 100644 --- a/package.v2.json +++ b/package.v2.json @@ -95,12 +95,12 @@ "name": "Emby弹幕下载", "description": "通知Emby Danmu插件下载弹幕。", "labels": "Emby,媒体库", - "version": "1.5.2", + "version": "1.5.3", "icon": "https://raw.githubusercontent.com/thsrite/MoviePilot-Plugins/main/icons/danmu.png", "author": "thsrite", "level": 1, "history": { - "v1.5.2": "修复获取电影名称正则", + "v1.5.3": "修复获取电影名称正则", "v1.5.1": "Emby4.8.8 Items API修改", "v1.5": "修复获取弹幕源", "v1.4": "修复自定义参数", From 996567300599db6f9c36ab1d7c5d5d13f2ac6f4c Mon Sep 17 00:00:00 2001 From: thsrite Date: Sat, 2 Nov 2024 18:49:41 +0800 Subject: [PATCH 04/13] =?UTF-8?q?fix=20Emby=E5=BC=B9=E5=B9=95=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.v2.json | 4 ++-- plugins.v2/embydanmu/__init__.py | 29 +++++++++++++++++++++-------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/package.v2.json b/package.v2.json index 4f7ab6c..bd6cc5b 100644 --- a/package.v2.json +++ b/package.v2.json @@ -95,12 +95,12 @@ "name": "Emby弹幕下载", "description": "通知Emby Danmu插件下载弹幕。", "labels": "Emby,媒体库", - "version": "1.5.3", + "version": "1.5.4", "icon": "https://raw.githubusercontent.com/thsrite/MoviePilot-Plugins/main/icons/danmu.png", "author": "thsrite", "level": 1, "history": { - "v1.5.3": "修复获取电影名称正则", + "v1.5.4": "修复获取电影名称正则", "v1.5.1": "Emby4.8.8 Items API修改", "v1.5": "修复获取弹幕源", "v1.4": "修复自定义参数", diff --git a/plugins.v2/embydanmu/__init__.py b/plugins.v2/embydanmu/__init__.py index 1fc79e9..8a8bfe1 100644 --- a/plugins.v2/embydanmu/__init__.py +++ b/plugins.v2/embydanmu/__init__.py @@ -20,7 +20,7 @@ class EmbyDanmu(_PluginBase): # 插件图标 plugin_icon = "https://raw.githubusercontent.com/thsrite/MoviePilot-Plugins/main/icons/danmu.png" # 插件版本 - plugin_version = "1.5.3" + plugin_version = "1.5.4" # 插件作者 plugin_author = "thsrite" # 作者主页 @@ -161,7 +161,7 @@ class EmbyDanmu(_PluginBase): try: # 获取媒体库媒体列表 - library_items = self.__get_items(library_id) + library_items = self.__get_items(library_id, NameStartsWith=library_item_name) if not library_items: logger.error(f"{emby_name} 获取媒体库:{library_name}的媒体列表失败") self.post_message(channel=event.event_data.get("channel"), @@ -171,6 +171,8 @@ class EmbyDanmu(_PluginBase): found_item = False # 遍历媒体列表,获取媒体的ID和名称 for item in library_items: + logger.info( + f"服务器:{emby_name} 媒体库:{library_name} 媒体库类型:{library_type} 媒体:{item}") if library_type == "tvshows": if item.get("Name") == library_item_name: found_item = True @@ -343,6 +345,7 @@ class EmbyDanmu(_PluginBase): # 电影弹幕 matches = re.findall(r'^(.*?)(?= ?\(\d{4}\)?|$)', item.get("Name"), re.MULTILINE) if matches and str(matches[0]) == library_item_name: + logger.info(f"{emby_name} 开始检查电影:{library_name} {library_item_name}") found_item = True movie_id = item.get("Id") movie_items = self.__get_items(movie_id) @@ -480,14 +483,19 @@ class EmbyDanmu(_PluginBase): return True return False - def __get_items(self, parent_id) -> list: + def __get_items(self, parent_id, NameStartsWith=None) -> list: """ 获取媒体库媒体列表 """ if not self._EMBY_HOST or not self._EMBY_APIKEY: return [] - req_url = f"%semby/Users/%s/Items?ParentId=%s&api_key=%s" % ( - self._EMBY_HOST, self._EMBY_USER, parent_id, self._EMBY_APIKEY) + if NameStartsWith: + req_url = f"%semby/Users/%s/Items?ParentId=%s&api_key=%s&NameStartsWith=%s" % ( + self._EMBY_HOST, self._EMBY_USER, parent_id, self._EMBY_APIKEY, NameStartsWith) + else: + req_url = f"%semby/Users/%s/Items?ParentId=%s&api_key=%s" % ( + self._EMBY_HOST, self._EMBY_USER, parent_id, self._EMBY_APIKEY) + logger.info(f"开始获取媒体列表:{req_url}") try: with RequestUtils().get_res(req_url) as res: if res: @@ -502,15 +510,20 @@ class EmbyDanmu(_PluginBase): logger.error(f"连接媒体库媒体列表Items出错:" + str(e)) return [] - def __get_items_488(self, parent_id) -> list: + def __get_items_488(self, parent_id, NameStartsWith=None) -> list: """ 获取媒体库媒体列表 emby 4.8.8版本 """ if not self._EMBY_HOST or not self._EMBY_APIKEY: return [] - req_url = f"%semby/Items?ParentId=%s&api_key=%s" % ( - self._EMBY_HOST, parent_id, self._EMBY_APIKEY) + if NameStartsWith: + req_url = f"%semby/Items?ParentId=%s&api_key=%s&NameStartsWith=%s" % ( + self._EMBY_HOST, parent_id, self._EMBY_APIKEY, NameStartsWith) + else: + req_url = f"%semby/Items?ParentId=%s&api_key=%s" % ( + self._EMBY_HOST, parent_id, self._EMBY_APIKEY) + logger.info(f"开始获取媒体列表488:{req_url}") try: with RequestUtils().get_res(req_url) as res: if res: From e541ee8f444cbe38af8cabed89f5c96c242361b0 Mon Sep 17 00:00:00 2001 From: thsrite Date: Sat, 2 Nov 2024 18:58:27 +0800 Subject: [PATCH 05/13] =?UTF-8?q?fix=20Emby=E5=BC=B9=E5=B9=95=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins.v2/embydanmu/__init__.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/plugins.v2/embydanmu/__init__.py b/plugins.v2/embydanmu/__init__.py index 8a8bfe1..aaa24e6 100644 --- a/plugins.v2/embydanmu/__init__.py +++ b/plugins.v2/embydanmu/__init__.py @@ -161,7 +161,7 @@ class EmbyDanmu(_PluginBase): try: # 获取媒体库媒体列表 - library_items = self.__get_items(library_id, NameStartsWith=library_item_name) + library_items = self.__get_items(library_id, nameStartsWith=library_item_name) if not library_items: logger.error(f"{emby_name} 获取媒体库:{library_name}的媒体列表失败") self.post_message(channel=event.event_data.get("channel"), @@ -483,15 +483,15 @@ class EmbyDanmu(_PluginBase): return True return False - def __get_items(self, parent_id, NameStartsWith=None) -> list: + def __get_items(self, parent_id, nameStartsWith=None) -> list: """ 获取媒体库媒体列表 """ if not self._EMBY_HOST or not self._EMBY_APIKEY: return [] - if NameStartsWith: + if nameStartsWith: req_url = f"%semby/Users/%s/Items?ParentId=%s&api_key=%s&NameStartsWith=%s" % ( - self._EMBY_HOST, self._EMBY_USER, parent_id, self._EMBY_APIKEY, NameStartsWith) + self._EMBY_HOST, self._EMBY_USER, parent_id, self._EMBY_APIKEY, nameStartsWith) else: req_url = f"%semby/Users/%s/Items?ParentId=%s&api_key=%s" % ( self._EMBY_HOST, self._EMBY_USER, parent_id, self._EMBY_APIKEY) @@ -501,25 +501,25 @@ class EmbyDanmu(_PluginBase): if res: if res.json().get("Items") and res.json().get("Items")[0].get("Type") == "Folder": # emby 4.8.8版本api - return self.__get_items_488(parent_id) + return self.__get_items_488(parent_id, nameStartsWith) else: return res.json().get("Items") else: - return self.__get_items_488(parent_id) + return self.__get_items_488(parent_id, nameStartsWith) except Exception as e: logger.error(f"连接媒体库媒体列表Items出错:" + str(e)) return [] - def __get_items_488(self, parent_id, NameStartsWith=None) -> list: + def __get_items_488(self, parent_id, nameStartsWith=None) -> list: """ 获取媒体库媒体列表 emby 4.8.8版本 """ if not self._EMBY_HOST or not self._EMBY_APIKEY: return [] - if NameStartsWith: + if nameStartsWith: req_url = f"%semby/Items?ParentId=%s&api_key=%s&NameStartsWith=%s" % ( - self._EMBY_HOST, parent_id, self._EMBY_APIKEY, NameStartsWith) + self._EMBY_HOST, parent_id, self._EMBY_APIKEY, nameStartsWith) else: req_url = f"%semby/Items?ParentId=%s&api_key=%s" % ( self._EMBY_HOST, parent_id, self._EMBY_APIKEY) From 0cbb13408a9455ff511ecd35f43da04daa867587 Mon Sep 17 00:00:00 2001 From: thsrite Date: Sat, 2 Nov 2024 19:34:41 +0800 Subject: [PATCH 06/13] =?UTF-8?q?fix=20=E5=A2=9E=E5=8A=A0Emby=E3=80=81Movi?= =?UTF-8?q?ePilot=E7=9B=AE=E5=BD=95=E6=98=A0=E5=B0=84=EF=BC=88=E7=9B=B8?= =?UTF-8?q?=E5=90=8C=E5=8F=AF=E4=B8=8D=E5=A1=AB=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.v2.json | 4 +- plugins.v2/embydanmu/__init__.py | 158 +++++++++++++++++++------------ 2 files changed, 97 insertions(+), 65 deletions(-) diff --git a/package.v2.json b/package.v2.json index bd6cc5b..4e07b7c 100644 --- a/package.v2.json +++ b/package.v2.json @@ -95,12 +95,12 @@ "name": "Emby弹幕下载", "description": "通知Emby Danmu插件下载弹幕。", "labels": "Emby,媒体库", - "version": "1.5.4", + "version": "1.6", "icon": "https://raw.githubusercontent.com/thsrite/MoviePilot-Plugins/main/icons/danmu.png", "author": "thsrite", "level": 1, "history": { - "v1.5.4": "修复获取电影名称正则", + "v1.6": "增加Emby、MoviePilot目录映射(相同可不填)", "v1.5.1": "Emby4.8.8 Items API修改", "v1.5": "修复获取弹幕源", "v1.4": "修复自定义参数", diff --git a/plugins.v2/embydanmu/__init__.py b/plugins.v2/embydanmu/__init__.py index aaa24e6..8bae4be 100644 --- a/plugins.v2/embydanmu/__init__.py +++ b/plugins.v2/embydanmu/__init__.py @@ -20,7 +20,7 @@ class EmbyDanmu(_PluginBase): # 插件图标 plugin_icon = "https://raw.githubusercontent.com/thsrite/MoviePilot-Plugins/main/icons/danmu.png" # 插件版本 - plugin_version = "1.5.4" + plugin_version = "1.6" # 插件作者 plugin_author = "thsrite" # 作者主页 @@ -37,11 +37,13 @@ class EmbyDanmu(_PluginBase): _library_task = {} _danmu_source = [] _mediaservers = None + _dirs = None mediaserver_helper = None _EMBY_HOST = None _EMBY_USER = None _EMBY_APIKEY = None + _paths = {} def init_plugin(self, config: dict = None): self._library_task = {} @@ -50,8 +52,13 @@ class EmbyDanmu(_PluginBase): # 读取配置 if config: self._enabled = config.get("enabled") + self._dirs = config.get("dirs") self._mediaservers = config.get("mediaservers") or [] + if self._dirs: + for path in str(self._dirs).split("\n"): + self._paths[path.split(":")[0]] = path.split(":")[1] + @eventmanager.register(EventType.PluginAction) def danmu(self, event: Event = None): if not self._enabled: @@ -171,7 +178,7 @@ class EmbyDanmu(_PluginBase): found_item = False # 遍历媒体列表,获取媒体的ID和名称 for item in library_items: - logger.info( + logger.debug( f"服务器:{emby_name} 媒体库:{library_name} 媒体库类型:{library_type} 媒体:{item}") if library_type == "tvshows": if item.get("Name") == library_item_name: @@ -348,73 +355,64 @@ class EmbyDanmu(_PluginBase): logger.info(f"{emby_name} 开始检查电影:{library_name} {library_item_name}") found_item = True movie_id = item.get("Id") - movie_items = self.__get_items(movie_id) - if not movie_items: - logger.error( - f"{emby_name} 获取 {library_name} {item.get('Name')}的媒体列表失败") + # 获取媒体详情 + item_info = self.__get_item_info(movie_id) + item_path = item_info.get("Path") + parent_path = Path(self.__get_path(str(Path(item_path).parent))) + logger.info(f"{emby_name} 开始检查MoviePilot路径 {parent_path} 下是是否有弹幕文件") + # 检查是否有弹幕文件 + danmu_path_pattern = Path(item_path).stem + "*.xml" + + if len(list(parent_path.glob(danmu_path_pattern))) >= 1: + logger.info( + f"{emby_name} {parent_path} 下已存在弹幕文件:{danmu_path_pattern}") self.post_message(channel=event.event_data.get("channel"), - title=f"{emby_name} 获取电影:{library_name} {item.get('Name')}的媒体列表失败", + title=f"{emby_name} {library_name} {item.get('Name')} 弹幕已存在", userid=event.event_data.get("user")) else: - movie_id = movie_items[0].get("Id") - # 获取媒体详情 - item_info = self.__get_item_info(movie_id) - item_path = item_info.get("Path") - parent_path = Path(item_path).parent - logger.info(f"{emby_name} 开始检查路径 {parent_path} 下是是否有弹幕文件") - # 检查是否有弹幕文件 - danmu_path_pattern = Path(item_path).stem + "*.xml" - - if len(list(parent_path.glob(danmu_path_pattern))) >= 1: + # 通知Danmu插件获取弹幕 + danmu_flag = self.__download_danmu(movie_id) + if danmu_flag: logger.info( - f"{emby_name} {parent_path} 下已存在弹幕文件:{danmu_path_pattern}") + f"{emby_name} 已通知弹幕插件获取 {library_name} {item.get('Name')} {movie_id} 的弹幕") self.post_message(channel=event.event_data.get("channel"), - title=f"{emby_name} {library_name} {item.get('Name')} 弹幕已存在", + title=f"{emby_name} 开始通知Emby下载 {library_name} {item.get('Name')} 弹幕,异步执行,请耐心等候执行完成消息", userid=event.event_data.get("user")) - else: - # 通知Danmu插件获取弹幕 - danmu_flag = self.__download_danmu(movie_id) - if danmu_flag: - logger.info( - f"{emby_name} 已通知弹幕插件获取 {library_name} {item.get('Name')} {movie_id} 的弹幕") - self.post_message(channel=event.event_data.get("channel"), - title=f"{emby_name} 开始通知Emby下载 {library_name} {item.get('Name')} 弹幕,异步执行,请耐心等候执行完成消息", - userid=event.event_data.get("user")) - retry_cnt = 3 - while len( - list(parent_path.glob( - danmu_path_pattern))) == 0 and retry_cnt > 0: - # 解析日志判断是否全部失败 - if self.__check_all_failed_by_log(item_name=item_info.get("Name"), - item_year=item_info.get( - "ProductionYear")): - logger.error( - f"{emby_name} 解析日志判断已配置弹幕源全部匹配弹幕失败") - retry_cnt = -1 - else: - retry_cnt -= 1 - logger.warn( - f"{emby_name} {parent_path} 下未找到弹幕文件:{danmu_path_pattern},等待60秒后重试 ({retry_cnt}次)") - time.sleep(60) - - if len(list(parent_path.glob(danmu_path_pattern))) >= 1: - logger.info( - f"{emby_name} {parent_path} 下已找到弹幕文件:{danmu_path_pattern}") - self.post_message(channel=event.event_data.get("channel"), - title=f"{emby_name} {library_name} {item.get('Name')} 下载弹幕文件成功", - userid=event.event_data.get("user")) - else: + retry_cnt = 3 + while len( + list(parent_path.glob( + danmu_path_pattern))) == 0 and retry_cnt > 0: + # 解析日志判断是否全部失败 + if self.__check_all_failed_by_log(item_name=item_info.get("Name"), + item_year=item_info.get( + "ProductionYear")): logger.error( - f"{emby_name} {parent_path} 下未找到弹幕文件:{danmu_path_pattern}") - self.post_message(channel=event.event_data.get("channel"), - title=f"{emby_name} {library_name} {item.get('Name')} 已配置弹幕源全部匹配弹幕失败", - userid=event.event_data.get("user")) + f"{emby_name} 解析日志判断已配置弹幕源全部匹配弹幕失败") + retry_cnt = -1 + else: + retry_cnt -= 1 + logger.warn( + f"{emby_name} {parent_path} 下未找到弹幕文件:{danmu_path_pattern},等待60秒后重试 ({retry_cnt}次)") + time.sleep(60) + + if len(list(parent_path.glob(danmu_path_pattern))) >= 1: + logger.info( + f"{emby_name} {parent_path} 下已找到弹幕文件:{danmu_path_pattern}") + self.post_message(channel=event.event_data.get("channel"), + title=f"{emby_name} {library_name} {item.get('Name')} 下载弹幕文件成功", + userid=event.event_data.get("user")) else: logger.error( - f"{emby_name} 通知弹幕插件获取 {library_name} {item.get('Name')} {movie_id} 的弹幕失败") + f"{emby_name} {parent_path} 下未找到弹幕文件:{danmu_path_pattern}") self.post_message(channel=event.event_data.get("channel"), - title=f"{emby_name} 通知弹幕插件获取 {library_name} 电影 {item.get('Name')} {movie_id} 的弹幕失败", + title=f"{emby_name} {library_name} {item.get('Name')} 已配置弹幕源全部匹配弹幕失败", userid=event.event_data.get("user")) + else: + logger.error( + f"{emby_name} 通知弹幕插件获取 {library_name} {item.get('Name')} {movie_id} 的弹幕失败") + self.post_message(channel=event.event_data.get("channel"), + title=f"{emby_name} 通知弹幕插件获取 {library_name} 电影 {item.get('Name')} {movie_id} 的弹幕失败", + userid=event.event_data.get("user")) if not found_item: logger.error( f"{emby_name} 未找到媒体:{library_name} {library_item_name} {f'第{library_item_season}季 ' if library_item_season else ''}") @@ -465,6 +463,17 @@ class EmbyDanmu(_PluginBase): logger.error(f"连接媒体库emby/Library/VirtualFolders/Query出错:" + str(e)) return [] + def __get_path(self, file_path: str): + """ + 路径转换 + """ + if self._paths and self._paths.keys(): + for library_path in self._paths.keys(): + if str(file_path).startswith(str(library_path)): + return str(file_path).replace(str(library_path), str(self._paths.get(str(library_path)))) + # 未匹配到路径,返回原路径 + return file_path + def __update_library(self, library_id, library_options) -> bool: """ 获取媒体库信息 @@ -495,17 +504,17 @@ class EmbyDanmu(_PluginBase): else: req_url = f"%semby/Users/%s/Items?ParentId=%s&api_key=%s" % ( self._EMBY_HOST, self._EMBY_USER, parent_id, self._EMBY_APIKEY) - logger.info(f"开始获取媒体列表:{req_url}") + logger.debug(f"开始获取媒体列表:{req_url}") try: with RequestUtils().get_res(req_url) as res: if res: if res.json().get("Items") and res.json().get("Items")[0].get("Type") == "Folder": # emby 4.8.8版本api - return self.__get_items_488(parent_id, nameStartsWith) + return self.__get_items_488(parent_id) else: return res.json().get("Items") else: - return self.__get_items_488(parent_id, nameStartsWith) + return self.__get_items_488(parent_id) except Exception as e: logger.error(f"连接媒体库媒体列表Items出错:" + str(e)) return [] @@ -523,7 +532,7 @@ class EmbyDanmu(_PluginBase): else: req_url = f"%semby/Items?ParentId=%s&api_key=%s" % ( self._EMBY_HOST, parent_id, self._EMBY_APIKEY) - logger.info(f"开始获取媒体列表488:{req_url}") + logger.debug(f"开始获取媒体列表488:{req_url}") try: with RequestUtils().get_res(req_url) as res: if res: @@ -576,7 +585,7 @@ class EmbyDanmu(_PluginBase): season_items = self.__get_items(season_id) item_info = self.__get_item_info(season_items[0].get("Id")) item_path = item_info.get("Path") - parent_path = Path(item_path).parent + parent_path = Path(self.__get_path(str(Path(item_path).parent))) logger.info(f"开始检查路径 {parent_path} 下是是否有弹幕文件") # 检查是否有弹幕文件 danmu_path_pattern = "*.xml" @@ -781,6 +790,28 @@ class EmbyDanmu(_PluginBase): } ] }, + { + 'component': 'VRow', + 'content': [ + { + 'component': 'VCol', + 'props': { + 'cols': 12 + }, + 'content': [ + { + 'component': 'VTextarea', + 'props': { + 'model': 'dirs', + 'label': '目录映射关系', + 'rows': 2, + 'placeholder': 'emby目录:mp目录(一行一个)' + } + } + ] + } + ] + }, { 'component': 'VRow', 'content': [ @@ -827,6 +858,7 @@ class EmbyDanmu(_PluginBase): } ], { "enabled": False, + "dirs": "", "mediaservers": [], } From 16fe1f85bfced0600cc5cf8168286b3447c47469 Mon Sep 17 00:00:00 2001 From: DDSRem <73049927+DDSRem@users.noreply.github.com> Date: Sun, 3 Nov 2024 11:13:24 +0800 Subject: [PATCH 07/13] fix(autobackup): cookies folder backup failed --- package.v2.json | 3 ++- plugins.v2/autobackup/__init__.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/package.v2.json b/package.v2.json index 4e07b7c..827e5bc 100644 --- a/package.v2.json +++ b/package.v2.json @@ -366,11 +366,12 @@ "name": "自动备份", "description": "自动备份数据和配置文件。", "labels": "系统设置", - "version": "2.0", + "version": "2.0.1", "icon": "Time_machine_B.png", "author": "thsrite", "level": 1, "history": { + "v2.0.1": "修复cookies文件夹备份失败", "v2.0": "支持备份app.env及cookies,支持自定义保存路径", "v1.3": "去除已废弃的环境变量引用", "v1.2": "增强API安全性" diff --git a/plugins.v2/autobackup/__init__.py b/plugins.v2/autobackup/__init__.py index 6162547..55a6267 100644 --- a/plugins.v2/autobackup/__init__.py +++ b/plugins.v2/autobackup/__init__.py @@ -25,7 +25,7 @@ class AutoBackup(_PluginBase): # 插件图标 plugin_icon = "Time_machine_B.png" # 插件版本 - plugin_version = "2.0" + plugin_version = "2.0.1" # 插件作者 plugin_author = "thsrite" # 作者主页 @@ -169,7 +169,7 @@ class AutoBackup(_PluginBase): shutil.copy(app_file, backup_path) cookies_path = config_path / "cookies" if cookies_path.exists(): - shutil.copytree(cookies_path, backup_path) + shutil.copytree(cookies_path, f'{backup_path}/cookies') zip_file = str(backup_path) + '.zip' if os.path.exists(zip_file): From 78c7ff1ab1182bad76a9f47e08eb556856b3954e Mon Sep 17 00:00:00 2001 From: thsrite Date: Sun, 3 Nov 2024 19:00:23 +0800 Subject: [PATCH 08/13] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=E7=A7=8D?= =?UTF-8?q?=E5=AD=90=E4=B8=8B=E8=BD=BD=E8=87=AA=E5=AE=9A=E4=B9=89=E5=A1=AB?= =?UTF-8?q?=E5=85=85=E7=AB=99=E7=82=B9=E5=90=8E=E8=AE=A2=E9=98=85=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E6=89=93=E5=BC=80=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.v2.json | 3 ++- plugins.v2/subscribegroup/__init__.py | 5 ++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.v2.json b/package.v2.json index 827e5bc..8a7a4d7 100644 --- a/package.v2.json +++ b/package.v2.json @@ -309,11 +309,12 @@ "name": "订阅规则自动填充", "description": "电视剧下载后自动添加官组等信息到订阅;添加订阅后根据二级分类名称自定义订阅规则。", "labels": "订阅", - "version": "2.8", + "version": "2.8.1", "icon": "teamwork.png", "author": "thsrite", "level": 2, "history": { + "v2.8.1": "修复种子下载自定义填充站点后订阅无法打开问题", "v2.8": "兼容v2", "v2.7": "下载填充判断当前站点是否在已选订阅站点范围内", "v2.6": "兼容属性值包含:号", diff --git a/plugins.v2/subscribegroup/__init__.py b/plugins.v2/subscribegroup/__init__.py index 19d6906..24b74df 100644 --- a/plugins.v2/subscribegroup/__init__.py +++ b/plugins.v2/subscribegroup/__init__.py @@ -20,7 +20,7 @@ class SubscribeGroup(_PluginBase): # 插件图标 plugin_icon = "teamwork.png" # 插件版本 - plugin_version = "2.8" + plugin_version = "2.8.1" # 插件作者 plugin_author = "thsrite" # 作者主页 @@ -316,8 +316,7 @@ class SubscribeGroup(_PluginBase): # 站点 判断是否在订阅站点范围内 rss_sites = self.systemconfig.get(SystemConfigKey.RssSites) or [] if _torrent and _torrent.site and int(_torrent.site) in rss_sites: - sites = json.dumps([_torrent.site]) - update_dict['sites'] = sites + update_dict['sites'] = [_torrent.site] if len(update_dict.keys()) == 0: logger.info(f"订阅记录:{subscribe.name} 无需填充") From f9ba8b2d6030701aeffd2801e4606060f8c8c04c Mon Sep 17 00:00:00 2001 From: thsrite Date: Sun, 3 Nov 2024 19:39:30 +0800 Subject: [PATCH 09/13] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=E6=9A=82?= =?UTF-8?q?=E5=81=9C=E7=A7=8D=E5=AD=90=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.v2.json | 3 ++- plugins.v2/mediasyncdel/__init__.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/package.v2.json b/package.v2.json index 8a7a4d7..d6ce825 100644 --- a/package.v2.json +++ b/package.v2.json @@ -196,11 +196,12 @@ "name": "媒体文件同步删除", "description": "同步删除历史记录、源文件和下载任务。", "labels": "媒体库,文件整理", - "version": "1.8.3", + "version": "1.8.4", "icon": "mediasyncdel.png", "author": "thsrite", "level": 1, "history": { + "v1.8.4": "修复暂停种子失败", "v1.8.3": "修复源文件删除", "v1.8.1": "适配v2多媒体服务器,移除日志方式", "v1.7": "修复重新整理被一并删除问题", diff --git a/plugins.v2/mediasyncdel/__init__.py b/plugins.v2/mediasyncdel/__init__.py index 020b265..aec45e2 100644 --- a/plugins.v2/mediasyncdel/__init__.py +++ b/plugins.v2/mediasyncdel/__init__.py @@ -26,7 +26,7 @@ class MediaSyncDel(_PluginBase): # 插件图标 plugin_icon = "mediasyncdel.png" # 插件版本 - plugin_version = "1.8.3" + plugin_version = "1.8.4" # 插件作者 plugin_author = "thsrite" # 作者主页 @@ -1103,7 +1103,7 @@ class MediaSyncDel(_PluginBase): downloader=downloader) # 暂停辅种 else: - self.chain.stop_torrents(hashs=torrent, download=downloader) + self.chain.stop_torrents(hashs=torrent, downloader=downloader) logger.info(f"辅种:{downloader} - {torrent} 暂停") # 处理辅种的辅种 From f87121b0716c491a4603ab74d88f4b0a003a5dcb Mon Sep 17 00:00:00 2001 From: thsrite Date: Sun, 3 Nov 2024 19:53:44 +0800 Subject: [PATCH 10/13] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=E5=AA=92?= =?UTF-8?q?=E4=BD=93=E5=BA=93=E9=BB=91=E5=90=8D=E5=8D=95=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 ++- package.v2.json | 3 ++- plugins.v2/embyreporter/__init__.py | 7 ++++--- plugins/embyreporter/__init__.py | 7 ++++--- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 11abc83..421e018 100644 --- a/package.json +++ b/package.json @@ -218,11 +218,12 @@ "name": "Emby观影报告", "description": "推送Emby观影报告,需Emby安装Playback Report 插件。", "labels": "Emby", - "version": "1.9", + "version": "1.9.1", "icon": "Pydiocells_A.png", "author": "thsrite", "level": 1, "history": { + "v1.9.1": "修复媒体库黑名单设置", "v1.9": "支持媒体库黑名单设置", "v1.8": "推送微信增加时间戳,防止使用缓存", "v1.7": "分块发送,兼容微信推送", diff --git a/package.v2.json b/package.v2.json index d6ce825..cbac410 100644 --- a/package.v2.json +++ b/package.v2.json @@ -44,11 +44,12 @@ "name": "Emby观影报告", "description": "推送Emby观影报告,需Emby安装Playback Report 插件。", "labels": "Emby", - "version": "2.1", + "version": "2.1.1", "icon": "Pydiocells_A.png", "author": "thsrite", "level": 1, "history": { + "v2.1.1": "修复媒体库黑名单设置", "v2.1": "支持媒体库黑名单设置", "v2.0": "修复获取媒体服务器配置", "v1.9": "适配v2多媒体服务器", diff --git a/plugins.v2/embyreporter/__init__.py b/plugins.v2/embyreporter/__init__.py index 8b6a6cb..08226cd 100644 --- a/plugins.v2/embyreporter/__init__.py +++ b/plugins.v2/embyreporter/__init__.py @@ -34,7 +34,7 @@ class EmbyReporter(_PluginBase): # 插件图标 plugin_icon = "Pydiocells_A.png" # 插件版本 - plugin_version = "2.1" + plugin_version = "2.1.1" # 插件作者 plugin_author = "thsrite" # 作者主页 @@ -644,7 +644,8 @@ class EmbyReporter(_PluginBase): success, info = self.items(user_id, item_id) if success and info: success, parent_info = self.items(user_id, info["ParentId"]) - if success and parent_info and parent_info["ParentId"] in self._black_library: + if (success and parent_info + and str(parent_info["ParentId"]) in str(self._black_library).split(",")): logger.info(f"电影 {name} 已在媒体库黑名单 {self._black_library} 中,已过滤") continue exists_movies.append(i) @@ -675,7 +676,7 @@ class EmbyReporter(_PluginBase): # 过滤电视剧 if self._black_library: success, parent_info = self.items(user_id, item_id) - if success and parent_info and parent_info["ParentId"] in self._black_library: + if success and parent_info and str(parent_info["ParentId"]) in str(self._black_library).split(","): logger.info(f"电视剧 {name} 已在媒体库黑名单 {self._black_library} 中,已过滤") continue # 封面图像获取 diff --git a/plugins/embyreporter/__init__.py b/plugins/embyreporter/__init__.py index 8af5c3a..2c5d753 100644 --- a/plugins/embyreporter/__init__.py +++ b/plugins/embyreporter/__init__.py @@ -33,7 +33,7 @@ class EmbyReporter(_PluginBase): # 插件图标 plugin_icon = "Pydiocells_A.png" # 插件版本 - plugin_version = "1.9" + plugin_version = "1.9.1" # 插件作者 plugin_author = "thsrite" # 作者主页 @@ -600,7 +600,8 @@ class EmbyReporter(_PluginBase): success, info = self.items(user_id, item_id) if success and info: success, parent_info = self.items(user_id, info["ParentId"]) - if success and parent_info and parent_info["ParentId"] in self._black_library: + if (success and parent_info + and str(parent_info["ParentId"]) in str(self._black_library).split(",")): logger.info(f"电影 {name} 已在媒体库黑名单 {self._black_library} 中,已过滤") continue exists_movies.append(i) @@ -630,7 +631,7 @@ class EmbyReporter(_PluginBase): # 过滤电视剧 if self._black_library: success, parent_info = self.items(user_id, item_id) - if success and parent_info and parent_info["ParentId"] in self._black_library: + if success and parent_info and str(parent_info["ParentId"]) in str(self._black_library).split(","): logger.info(f"电视剧 {name} 已在媒体库黑名单 {self._black_library} 中,已过滤") continue # 封面图像获取 From ab9acf7f2c7e56dc014e86317079629b9c7f5d45 Mon Sep 17 00:00:00 2001 From: thsrite Date: Sun, 3 Nov 2024 20:03:09 +0800 Subject: [PATCH 11/13] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E6=98=BE=E7=A4=BA=E7=89=88=E6=9C=AC=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 6 ++-- plugins/pluginautoupdate/__init__.py | 46 +++------------------------- plugins/pluginreinstall/__init__.py | 11 +++---- 3 files changed, 14 insertions(+), 49 deletions(-) diff --git a/package.json b/package.json index 421e018..773ecb0 100644 --- a/package.json +++ b/package.json @@ -116,12 +116,13 @@ "name": "插件更新管理", "description": "监测已安装插件,推送更新提醒,可配置自动更新。", "labels": "自动更新,插件管理", - "version": "1.9.2", + "version": "2.0", "icon": "https://raw.githubusercontent.com/thsrite/MoviePilot-Plugins/main/icons/pluginupdate.png", "author": "thsrite", "level": 1, "v2": true, "history": { + "v2.0": "修复插件显示版本问题", "v1.9.2": "修复获取本地插件版本None,重新更新问题", "v1.9.1": "修复bug", "v1.9": "过滤相同ID插件,保留最新版本检查更新", @@ -140,12 +141,13 @@ "name": "插件强制重装", "description": "卸载当前插件,强制重装。", "labels": "插件管理", - "version": "1.7", + "version": "1.8", "icon": "refresh.png", "author": "thsrite", "level": 1, "v2": true, "history": { + "v1.8": "修复插件显示版本问题", "v1.7": "使用主程序GITHUB_PROXY代理", "v1.6": "插件API立即生效", "v1.5": "支持插件热重载", diff --git a/plugins/pluginautoupdate/__init__.py b/plugins/pluginautoupdate/__init__.py index 51729d7..0413256 100644 --- a/plugins/pluginautoupdate/__init__.py +++ b/plugins/pluginautoupdate/__init__.py @@ -30,7 +30,7 @@ class PluginAutoUpdate(_PluginBase): # 插件图标 plugin_icon = "https://raw.githubusercontent.com/thsrite/MoviePilot-Plugins/main/icons/pluginupdate.png" # 插件版本 - plugin_version = "1.9.2" + plugin_version = "2.0" # 插件作者 plugin_author = "thsrite" # 作者主页 @@ -291,41 +291,6 @@ class PluginAutoUpdate(_PluginBase): break router.add_api_route(**api) - @staticmethod - def get_local_plugins(): - """ - 获取本地插件 - """ - # 已安装插件 - install_plugins = SystemConfigOper().get(SystemConfigKey.UserInstalledPlugins) or [] - - local_plugins = {} - # 线上插件列表 - markets = settings.PLUGIN_MARKET.split(",") - for market in markets: - online_plugins = PluginHelper().get_plugins(market) or {} - for pid, plugin in online_plugins.items(): - if pid in install_plugins: - local_plugin = local_plugins.get(pid) - if local_plugin: - if StringUtils.compare_version(local_plugin.get("plugin_version"), - plugin.get("version")) < 0: - local_plugins[pid] = { - "id": pid, - "plugin_name": plugin.get("name"), - "repo_url": market, - "plugin_version": plugin.get("version") - } - else: - local_plugins[pid] = { - "id": pid, - "plugin_name": plugin.get("name"), - "repo_url": market, - "plugin_version": plugin.get("version") - } - - return local_plugins - def get_form(self) -> Tuple[List[dict], Dict[str, Any]]: """ 拼装插件配置页面,需要返回两块数据:1、页面配置;2、数据结构 @@ -339,15 +304,14 @@ class PluginAutoUpdate(_PluginBase): }) # 已安装插件 - local_plugins = self.get_local_plugins() + local_plugins = PluginManager().get_local_plugins() # 编历 local_plugins,生成插件类型选项 pluginOptions = [] - for plugin_id in list(local_plugins.keys()): - local_plugin = local_plugins.get(plugin_id) + for plugin in local_plugins: pluginOptions.append({ - "title": f"{local_plugin.get('plugin_name')} v{local_plugin.get('plugin_version')}", - "value": local_plugin.get("id") + "title": f"{plugin.plugin_name} v{plugin.plugin_version}", + "value": plugin.id }) return [ { diff --git a/plugins/pluginreinstall/__init__.py b/plugins/pluginreinstall/__init__.py index a6103d8..388553e 100644 --- a/plugins/pluginreinstall/__init__.py +++ b/plugins/pluginreinstall/__init__.py @@ -24,7 +24,7 @@ class PluginReInstall(_PluginBase): # 插件图标 plugin_icon = "refresh.png" # 插件版本 - plugin_version = "1.7" + plugin_version = "1.8" # 插件作者 plugin_author = "thsrite" # 作者主页 @@ -139,15 +139,14 @@ class PluginReInstall(_PluginBase): 拼装插件配置页面,需要返回两块数据:1、页面配置;2、数据结构 """ # 已安装插件 - local_plugins = self.get_local_plugins() + local_plugins = PluginManager().get_local_plugins() # 编历 local_plugins,生成插件类型选项 pluginOptions = [] - for plugin_id in list(local_plugins.keys()): - local_plugin = local_plugins.get(plugin_id) + for plugin in local_plugins: pluginOptions.append({ - "title": f"{local_plugin.get('plugin_name')} v{local_plugin.get('plugin_version')}", - "value": local_plugin.get("id") + "title": f"{plugin.plugin_name} v{plugin.plugin_version}", + "value": plugin.id }) return [ { From 211481fa505f598be91e4ddd04a0b6c5e8b9e91d Mon Sep 17 00:00:00 2001 From: thsrite Date: Sun, 3 Nov 2024 20:05:15 +0800 Subject: [PATCH 12/13] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E6=98=BE=E7=A4=BA=E7=89=88=E6=9C=AC=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/pluginreinstall/__init__.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/plugins/pluginreinstall/__init__.py b/plugins/pluginreinstall/__init__.py index 388553e..7f31f68 100644 --- a/plugins/pluginreinstall/__init__.py +++ b/plugins/pluginreinstall/__init__.py @@ -72,28 +72,27 @@ class PluginReInstall(_PluginBase): self.__update_conifg() # 本地插件 - local_plugins = self.get_local_plugins() + local_plugins = PluginManager().get_local_plugins() # 开始重载插件 - for plugin_id in list(local_plugins.keys()): - local_plugin = local_plugins.get(plugin_id) - if plugin_id in self._plugin_ids: + for plugin in local_plugins: + if plugin.id in self._plugin_ids: logger.info( - f"开始重载插件 {local_plugin.get('plugin_name')} v{local_plugin.get('plugin_version')}") + f"开始重载插件 {plugin.plugin_name} v{plugin.plugin_version}") # 开始安装线上插件 - state, msg = PluginHelper().install(pid=plugin_id, - repo_url=plugin_url or local_plugin.get("repo_url")) + state, msg = PluginHelper().install(pid=plugin.id, + repo_url=plugin_url or plugin.repo_url) # 安装失败 if not state: logger.error( - f"插件 {local_plugin.get('plugin_name')} 重装失败,当前版本 v{local_plugin.get('plugin_version')}") + f"插件 {plugin.plugin_name} 重装失败,当前版本 v{plugin.plugin_version}") continue logger.info( - f"插件 {local_plugin.get('plugin_name')} 重装成功,当前版本 v{local_plugin.get('plugin_version')}") + f"插件 {plugin.plugin_name} 重装成功,当前版本 v{plugin.plugin_version}") - self.__reload_plugin(plugin_id) + self.__reload_plugin(plugin.id) def __update_conifg(self): self.update_config({ From 57df3559b4e67ea3af7a4ea3ea94d312e4683b99 Mon Sep 17 00:00:00 2001 From: thsrite Date: Wed, 6 Nov 2024 19:27:40 +0800 Subject: [PATCH 13/13] =?UTF-8?q?fix=20Emby=E5=85=83=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=88=B7=E6=96=B0=E5=A2=9E=E5=8A=A0=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E5=BB=B6=E8=BF=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.v2.json | 3 ++- plugins.v2/embymetarefresh/__init__.py | 35 ++++++++++++++++++++++---- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/package.v2.json b/package.v2.json index cbac410..6c6f661 100644 --- a/package.v2.json +++ b/package.v2.json @@ -3,11 +3,12 @@ "name": "Emby元数据刷新", "description": "定时刷新Emby媒体库元数据,演职人员中文。", "labels": "Emby", - "version": "2.1.1", + "version": "2.1.2", "icon": "https://raw.githubusercontent.com/thsrite/MoviePilot-Plugins/main/icons/emby-icon.png", "author": "thsrite", "level": 1, "history": { + "v2.1.2": "增加自定义延迟", "v2.1.1": "优化刷新逻辑,过滤掉信息全的媒体", "v2.0.1": "获取tmdb图片时使用PROXY_HOST代理", "v2.0": "适配v2", diff --git a/plugins.v2/embymetarefresh/__init__.py b/plugins.v2/embymetarefresh/__init__.py index 666d52c..332bad1 100644 --- a/plugins.v2/embymetarefresh/__init__.py +++ b/plugins.v2/embymetarefresh/__init__.py @@ -36,7 +36,7 @@ class EmbyMetaRefresh(_PluginBase): # 插件图标 plugin_icon = "https://raw.githubusercontent.com/thsrite/MoviePilot-Plugins/main/icons/emby-icon.png" # 插件版本 - plugin_version = "2.1.1" + plugin_version = "2.1.2" # 插件作者 plugin_author = "thsrite" # 作者主页 @@ -62,6 +62,7 @@ class EmbyMetaRefresh(_PluginBase): _ReplaceAllImages = "true" _actor_path = None _mediaservers = None + _interval = None mediaserver_helper = None _EMBY_HOST = None _EMBY_USER = None @@ -85,6 +86,7 @@ class EmbyMetaRefresh(_PluginBase): self._ReplaceAllMetadata = config.get("ReplaceAllMetadata") or "true" self._ReplaceAllImages = config.get("ReplaceAllImages") or "true" self._mediaservers = config.get("mediaservers") or [] + self._interval = config.get("interval") or 0 # 加载模块 if self._enabled or self._onlyonce: @@ -174,6 +176,9 @@ class EmbyMetaRefresh(_PluginBase): # 刷新媒体库 for transferinfo in transferhistorys: self.__refresh_emby(transferinfo, emby) + if self._interval: + logger.info(f"等待 {self._interval} 秒后继续刷新") + time.sleep(self._interval) else: latest = self.__get_latest_media() if not latest: @@ -194,6 +199,9 @@ class EmbyMetaRefresh(_PluginBase): logger.info( f"开始刷新媒体库元数据,最新媒体:{'电视剧' if str(item.get('Type')) == 'Episode' else '电影'} {'%s S%02dE%02d %s' % (item.get('SeriesName'), item.get('ParentIndexNumber'), item.get('IndexNumber'), item.get('Name')) if str(item.get('Type')) == 'Episode' else item.get('Name')} {item.get('Id')}") self.__refresh_emby_library_by_id(item.get("Id")) + if self._interval: + logger.info(f"等待 {self._interval} 秒后继续刷新") + time.sleep(self._interval) else: logger.info( f"最新媒体:{'电视剧' if str(item.get('Type')) == 'Episode' else '电影'} {'%s S%02dE%02d %s' % (item.get('SeriesName'), item.get('ParentIndexNumber'), item.get('IndexNumber'), item.get('Name')) if str(item.get('Type')) == 'Episode' else item.get('Name')} {item.get('Id')} 元数据完整,跳过处理") @@ -225,8 +233,6 @@ class EmbyMetaRefresh(_PluginBase): 'actors': peoples or item_actors } - time.sleep(5) - # 处理剧集 for key, value in handle_items.items(): if value: @@ -1031,7 +1037,25 @@ class EmbyMetaRefresh(_PluginBase): { 'component': 'VCol', 'props': { - 'cols': 12 + 'cols': 12, + 'md': 4 + }, + 'content': [ + { + 'component': 'VTextField', + 'props': { + 'model': 'interval', + 'label': '刷新间隔(秒)', + 'placeholder': '留空默认0秒' + } + } + ] + }, + { + 'component': 'VCol', + 'props': { + 'cols': 12, + 'md': 4 }, 'content': [ { @@ -1084,7 +1108,8 @@ class EmbyMetaRefresh(_PluginBase): "refresh_type": "历史记录", "actor_path": "", "mediaservers": [], - "num": 5 + "num": 5, + "interval": 0, } def get_page(self) -> List[dict]: