Merge pull request #928 from cikezhu/main

This commit is contained in:
jxxghp
2025-12-03 14:40:56 +08:00
committed by GitHub
2 changed files with 126 additions and 15 deletions

View File

@@ -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 版本下载任务分类与标签插件"
}
},

View File

@@ -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,22 @@ 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 = {}
def init_plugin(self, config: dict = None):
# 初始化默认的tracker映射
self._tracker_mappings = self._parse_tracker_mappings(self._tracker_mappings_default)
# 读取配置
if config:
self._enabled = config.get("enabled")
@@ -76,6 +90,17 @@ 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 not ("tracker_mappings_str" in config):
config["tracker_mappings_str"] = self._tracker_mappings_default
self.update_config(config)
# 如果用户有配置,解析并合并到默认映射中
elif 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 +228,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 +283,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 +355,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 +598,7 @@ class DownloadSiteTag(_PluginBase):
"""
拼装插件配置页面需要返回两块数据1、页面配置2、数据结构
"""
return [
{
'component': 'VForm',
@@ -735,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': [
@@ -749,7 +832,8 @@ class DownloadSiteTag(_PluginBase):
'props': {
'model': 'category_movie',
'label': '电影分类名称(默认: 电影)',
'placeholder': '电影'
'placeholder': '电影',
'hint': '请填写下载器里已创建的电影分类名称'
}
}
]
@@ -770,7 +854,8 @@ class DownloadSiteTag(_PluginBase):
'props': {
'model': 'category_tv',
'label': '电视分类名称(默认: 电视)',
'placeholder': '电视'
'placeholder': '电视',
'hint': '请填写下载器里已创建的电视分类名称'
}
}
]
@@ -791,7 +876,8 @@ class DownloadSiteTag(_PluginBase):
'props': {
'model': 'category_anime',
'label': '动漫分类名称(默认: 动漫)',
'placeholder': '动漫'
'placeholder': '动漫',
'hint': '请填写下载器里已创建的动漫分类名称'
}
}
]
@@ -804,7 +890,7 @@ class DownloadSiteTag(_PluginBase):
{
'component': 'VCol',
'props': {
'cols': 12,
'cols': 12
},
'content': [
{
@@ -812,7 +898,30 @@ class DownloadSiteTag(_PluginBase):
'props': {
'type': 'info',
'variant': 'tonal',
'text': '定时任务:支持两种定时方式,主要针对辅种刷流等种子补全站点信息。如没有对应的需求建议切换为禁用'
'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': '支持的分隔符:->, →, :, :,空格'
}
}
]
@@ -833,7 +942,8 @@ class DownloadSiteTag(_PluginBase):
"interval": "计划任务",
"interval_cron": "5 4 * * *",
"interval_time": "6",
"interval_unit": "小时"
"interval_unit": "小时",
"tracker_mappings_str": self._tracker_mappings_default # 添加默认的映射规则字符串
}
def get_page(self) -> List[dict]:
@@ -852,4 +962,4 @@ class DownloadSiteTag(_PluginBase):
self._event.clear()
self._scheduler = None
except Exception as e:
print(str(e))
print(str(e))