From b2bd0f370178f6a40e33abea1342f792ab909d92 Mon Sep 17 00:00:00 2001 From: cikezhu <604054726@qq.com> Date: Wed, 3 Dec 2025 09:26:01 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E5=A2=9E=E5=8A=A0tracker=E6=98=A0=E5=B0=84?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.v2.json | 3 +- plugins.v2/downloadsitetag/__init__.py | 125 +++++++++++++++++++++++-- 2 files changed, 118 insertions(+), 10 deletions(-) diff --git a/package.v2.json b/package.v2.json index df103b9..1bb36cf 100644 --- a/package.v2.json +++ b/package.v2.json @@ -62,11 +62,12 @@ "name": "下载任务分类与标签", "description": "自动给下载任务分类与打站点标签、剧集名称标签", "labels": "下载管理", - "version": "2.2", + "version": "2.3", "icon": "Youtube-dl_B.png", "author": "叮叮当", "level": 1, "history": { + "v2.3": "增加tracker映射配置", "v2.2": "MoviePilot V2 版本下载任务分类与标签插件" } }, diff --git a/plugins.v2/downloadsitetag/__init__.py b/plugins.v2/downloadsitetag/__init__.py index c9e2603..e5162ee 100644 --- a/plugins.v2/downloadsitetag/__init__.py +++ b/plugins.v2/downloadsitetag/__init__.py @@ -28,7 +28,7 @@ class DownloadSiteTag(_PluginBase): # 插件图标 plugin_icon = "Youtube-dl_B.png" # 插件版本 - plugin_version = "2.2" + plugin_version = "2.3" # 插件作者 plugin_author = "叮叮当" # 作者主页 @@ -59,8 +59,16 @@ class DownloadSiteTag(_PluginBase): _category_tv = None _category_anime = None _downloaders = None + _tracker_mappings_str = "" + _tracker_mappings = {} def init_plugin(self, config: dict = None): + # 初始化默认的tracker映射 + self._tracker_mappings = { + "chdbits.xyz": "ptchdbits.co", + "agsvpt.trackers.work": "agsvpt.com", + "tracker.cinefiles.info": "audiences.me", + } # 读取配置 if config: self._enabled = config.get("enabled") @@ -76,6 +84,13 @@ class DownloadSiteTag(_PluginBase): self._category_tv = config.get("category_tv") or "电视" self._category_anime = config.get("category_anime") or "动漫" self._downloaders = config.get("downloaders") + self._tracker_mappings_str = config.get("tracker_mappings_str", "") + + # 如果用户有配置,解析并合并到默认映射中 + if self._tracker_mappings_str: + user_mappings = self._parse_tracker_mappings(self._tracker_mappings_str) + # 将用户映射合并到默认映射中,用户映射会覆盖默认映射中相同的key + self._tracker_mappings.update(user_mappings) # 停止现有任务 self.stop_service() @@ -203,11 +218,6 @@ class DownloadSiteTag(_PluginBase): # JackettIndexers索引器支持多个站点, 如果不存在历史记录, 则通过tracker会再次附加其他站点名称 indexers.append("JackettIndexers") indexers = set(indexers) - tracker_mappings = { - "chdbits.xyz": "ptchdbits.co", - "agsvpt.trackers.work": "agsvpt.com", - "tracker.cinefiles.info": "audiences.me", - } for service in self.service_infos.values(): downloader = service.name downloader_obj = service.instance @@ -263,7 +273,7 @@ class DownloadSiteTag(_PluginBase): trackers = self._get_trackers(torrent=torrent, dl_type=service.type) for tracker in trackers: # 检查tracker是否包含特定的关键字,并进行相应的映射 - for key, mapped_domain in tracker_mappings.items(): + for key, mapped_domain in self._tracker_mappings.items(): if key in tracker: domain = mapped_domain break @@ -335,6 +345,47 @@ class DownloadSiteTag(_PluginBase): _cat = self._category_tv return _cat + @staticmethod + def _parse_tracker_mappings(mapping_str: str) -> dict: + """ + 解析tracker映射规则字符串为字典 + 格式:tracker域名 -> 映射域名 + 例如:chdbits.xyz -> ptchdbits.co + 使用"->"作为分隔符 + """ + tracker_mappings = {} + if not mapping_str: + return tracker_mappings + + lines = mapping_str.strip().split('\n') + for line in lines: + line = line.strip() + if not line or line.startswith('#'): + continue # 跳过空行和注释行 + + # 支持多种分隔符 + separators = ['->', '→', ':', ':'] + separator = None + for sep in separators: + if sep in line: + separator = sep + break + + if separator: + parts = line.split(separator, 1) + if len(parts) == 2: + key = parts[0].strip() + value = parts[1].strip() + if key and value: + tracker_mappings[key] = value + else: + # 如果没有找到分隔符,尝试按空格分割 + parts = line.split() + if len(parts) >= 2: + tracker_mappings[parts[0].strip()] = parts[1].strip() + + return tracker_mappings + @staticmethod def _torrent_key(torrent: Any, dl_type: str) -> Optional[Tuple[int, str]]: """ @@ -537,6 +588,17 @@ class DownloadSiteTag(_PluginBase): """ 拼装插件配置页面,需要返回两块数据:1、页面配置;2、数据结构 """ + # 默认的tracker映射字符串(用于显示在界面上) + default_mappings = [ + "chdbits.xyz -> ptchdbits.co", + "agsvpt.trackers.work -> agsvpt.com", + "tracker.cinefiles.info -> audiences.me", + "# 格式说明:tracker域名 -> 映射域名", + "# 使用 -> 作为分隔符", + "# 每行一个映射规则,空行和以#开头的行会被忽略" + ] + default_mappings_str = "\n".join(default_mappings) + return [ { 'component': 'VForm', @@ -798,6 +860,50 @@ class DownloadSiteTag(_PluginBase): } ] }, + { + 'component': 'VRow', + 'content': [ + { + 'component': 'VCol', + 'props': { + 'cols': 12 + }, + 'content': [ + { + 'component': 'VAlert', + 'props': { + 'type': 'info', + 'variant': 'tonal', + 'text': '以下为默认的tracker映射规则,您可以根据需要修改或添加新的规则。' + } + } + ] + } + ] + }, + { + 'component': 'VRow', + 'content': [ + { + 'component': 'VCol', + 'props': { + 'cols': 12 + }, + 'content': [ + { + 'component': 'VTextarea', + 'props': { + 'model': 'tracker_mappings_str', + 'label': 'Tracker域名映射规则', + 'rows': 8, + 'placeholder': '每行一个映射,格式:tracker域名 -> 映射域名\n例如:chdbits.xyz -> ptchdbits.co', + 'hint': '支持的分隔符:->, →, :, :,空格' + } + } + ] + } + ] + }, { 'component': 'VRow', 'content': [ @@ -833,7 +939,8 @@ class DownloadSiteTag(_PluginBase): "interval": "计划任务", "interval_cron": "5 4 * * *", "interval_time": "6", - "interval_unit": "小时" + "interval_unit": "小时", + "tracker_mappings_str": default_mappings_str # 添加默认的映射规则字符串 } def get_page(self) -> List[dict]: @@ -852,4 +959,4 @@ class DownloadSiteTag(_PluginBase): self._event.clear() self._scheduler = None except Exception as e: - print(str(e)) + print(str(e)) \ No newline at end of file From 9fa02d62e274d4bdbf623c45b46e6b326448d7ff Mon Sep 17 00:00:00 2001 From: cikezhu <604054726@qq.com> Date: Wed, 3 Dec 2025 09:34:18 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=95=8C=E9=9D=A2?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins.v2/downloadsitetag/__init__.py | 50 +++++++++++++------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/plugins.v2/downloadsitetag/__init__.py b/plugins.v2/downloadsitetag/__init__.py index e5162ee..032789c 100644 --- a/plugins.v2/downloadsitetag/__init__.py +++ b/plugins.v2/downloadsitetag/__init__.py @@ -797,6 +797,27 @@ class DownloadSiteTag(_PluginBase): } ] }, + { + 'component': 'VRow', + 'content': [ + { + 'component': 'VCol', + 'props': { + 'cols': 12, + }, + 'content': [ + { + 'component': 'VAlert', + 'props': { + 'type': 'info', + 'variant': 'tonal', + 'text': '定时任务:支持两种定时方式,主要针对辅种刷流等种子补全站点信息。如没有对应的需求建议切换为禁用。' + } + } + ] + } + ] + }, { 'component': 'VRow', 'content': [ @@ -810,7 +831,7 @@ class DownloadSiteTag(_PluginBase): 'component': 'VTextField', 'props': { 'model': 'category_movie', - 'label': '电影分类名称(默认: 电影)', + 'label': '下载器里的电影分类名称(默认: 电影)', 'placeholder': '电影' } } @@ -831,7 +852,7 @@ class DownloadSiteTag(_PluginBase): 'component': 'VTextField', 'props': { 'model': 'category_tv', - 'label': '电视分类名称(默认: 电视)', + 'label': '下载器里的电视分类名称(默认: 电视)', 'placeholder': '电视' } } @@ -852,7 +873,7 @@ class DownloadSiteTag(_PluginBase): 'component': 'VTextField', 'props': { 'model': 'category_anime', - 'label': '动漫分类名称(默认: 动漫)', + 'label': '下载器里的动漫分类名称(默认: 动漫)', 'placeholder': '动漫' } } @@ -874,7 +895,7 @@ class DownloadSiteTag(_PluginBase): 'props': { 'type': 'info', 'variant': 'tonal', - 'text': '以下为默认的tracker映射规则,您可以根据需要修改或添加新的规则。' + 'text': '以下为tracker映射规则,您可以根据需要修改或添加新的规则。' } } ] @@ -903,27 +924,6 @@ class DownloadSiteTag(_PluginBase): ] } ] - }, - { - 'component': 'VRow', - 'content': [ - { - 'component': 'VCol', - 'props': { - 'cols': 12, - }, - 'content': [ - { - 'component': 'VAlert', - 'props': { - 'type': 'info', - 'variant': 'tonal', - 'text': '定时任务:支持两种定时方式,主要针对辅种刷流等种子补全站点信息。如没有对应的需求建议切换为禁用。' - } - } - ] - } - ] } ] } From 2965743cfeade582d7452172612864cc3bc14699 Mon Sep 17 00:00:00 2001 From: cikezhu <604054726@qq.com> Date: Wed, 3 Dec 2025 09:55:16 +0800 Subject: [PATCH 3/4] =?UTF-8?q?fix=20=E9=A6=96=E6=AC=A1=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=97=B6=E9=A1=B5=E9=9D=A2=E9=85=8D=E7=BD=AE=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins.v2/downloadsitetag/__init__.py | 43 +++++++++++++++----------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/plugins.v2/downloadsitetag/__init__.py b/plugins.v2/downloadsitetag/__init__.py index 032789c..aad478e 100644 --- a/plugins.v2/downloadsitetag/__init__.py +++ b/plugins.v2/downloadsitetag/__init__.py @@ -59,6 +59,16 @@ class DownloadSiteTag(_PluginBase): _category_tv = None _category_anime = None _downloaders = None + # 默认的tracker映射字符串(用于显示在界面上) + _tracker_mappings_default = "\n".join([ + "chdbits.xyz -> ptchdbits.co", + "agsvpt.trackers.work -> agsvpt.com", + "tracker.cinefiles.info -> audiences.me", + "# 格式说明:tracker域名 -> 映射域名", + "# 使用 -> 作为分隔符", + "# 每行一个映射规则,空行和以#开头的行会被忽略", + "# 站点管理中必须存在对应的域名才能生效" + ]) _tracker_mappings_str = "" _tracker_mappings = {} @@ -86,8 +96,12 @@ class DownloadSiteTag(_PluginBase): self._downloaders = config.get("downloaders") self._tracker_mappings_str = config.get("tracker_mappings_str", "") + # 此设置对于老用户来说缺乏具体说明,因此如果为空,表示用户首次更新,则使用默认配置起到提示作用 + if not ("tracker_mappings_str" in config): + config["tracker_mappings_str"] = self._tracker_mappings_default + self.update_config(config) # 如果用户有配置,解析并合并到默认映射中 - if self._tracker_mappings_str: + elif self._tracker_mappings_str: user_mappings = self._parse_tracker_mappings(self._tracker_mappings_str) # 将用户映射合并到默认映射中,用户映射会覆盖默认映射中相同的key self._tracker_mappings.update(user_mappings) @@ -588,16 +602,6 @@ class DownloadSiteTag(_PluginBase): """ 拼装插件配置页面,需要返回两块数据:1、页面配置;2、数据结构 """ - # 默认的tracker映射字符串(用于显示在界面上) - default_mappings = [ - "chdbits.xyz -> ptchdbits.co", - "agsvpt.trackers.work -> agsvpt.com", - "tracker.cinefiles.info -> audiences.me", - "# 格式说明:tracker域名 -> 映射域名", - "# 使用 -> 作为分隔符", - "# 每行一个映射规则,空行和以#开头的行会被忽略" - ] - default_mappings_str = "\n".join(default_mappings) return [ { @@ -831,8 +835,9 @@ class DownloadSiteTag(_PluginBase): 'component': 'VTextField', 'props': { 'model': 'category_movie', - 'label': '下载器里的电影分类名称(默认: 电影)', - 'placeholder': '电影' + 'label': '电影分类名称(默认: 电影)', + 'placeholder': '电影', + 'hint': '请填写下载器里已创建的电影分类名称' } } ] @@ -852,8 +857,9 @@ class DownloadSiteTag(_PluginBase): 'component': 'VTextField', 'props': { 'model': 'category_tv', - 'label': '下载器里的电视分类名称(默认: 电视)', - 'placeholder': '电视' + 'label': '电视分类名称(默认: 电视)', + 'placeholder': '电视', + 'hint': '请填写下载器里已创建的电视分类名称' } } ] @@ -873,8 +879,9 @@ class DownloadSiteTag(_PluginBase): 'component': 'VTextField', 'props': { 'model': 'category_anime', - 'label': '下载器里的动漫分类名称(默认: 动漫)', - 'placeholder': '动漫' + 'label': '动漫分类名称(默认: 动漫)', + 'placeholder': '动漫', + 'hint': '请填写下载器里已创建的动漫分类名称' } } ] @@ -940,7 +947,7 @@ class DownloadSiteTag(_PluginBase): "interval_cron": "5 4 * * *", "interval_time": "6", "interval_unit": "小时", - "tracker_mappings_str": default_mappings_str # 添加默认的映射规则字符串 + "tracker_mappings_str": self._tracker_mappings_default # 添加默认的映射规则字符串 } def get_page(self) -> List[dict]: From 0ceb633d96c91e920c101bfdd9bde1d659856708 Mon Sep 17 00:00:00 2001 From: cikezhu <604054726@qq.com> Date: Wed, 3 Dec 2025 10:54:12 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E9=80=9A=E8=BF=87=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E8=80=8C=E4=B8=8D=E6=98=AF=E7=A1=AC=E7=BC=96?= =?UTF-8?q?=E7=A0=81=E8=A7=A3=E5=86=B3=E4=BB=A3=E7=A0=81=E5=86=97=E4=BD=99?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins.v2/downloadsitetag/__init__.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/plugins.v2/downloadsitetag/__init__.py b/plugins.v2/downloadsitetag/__init__.py index aad478e..00de1f1 100644 --- a/plugins.v2/downloadsitetag/__init__.py +++ b/plugins.v2/downloadsitetag/__init__.py @@ -74,11 +74,7 @@ class DownloadSiteTag(_PluginBase): def init_plugin(self, config: dict = None): # 初始化默认的tracker映射 - self._tracker_mappings = { - "chdbits.xyz": "ptchdbits.co", - "agsvpt.trackers.work": "agsvpt.com", - "tracker.cinefiles.info": "audiences.me", - } + self._tracker_mappings = self._parse_tracker_mappings(self._tracker_mappings_default) # 读取配置 if config: self._enabled = config.get("enabled")