From 7c9fb487fe4460ebd9ba7fb118a92914b1256e66 Mon Sep 17 00:00:00 2001
From: DDSRem <73049927+DDSRem@users.noreply.github.com>
Date: Sat, 10 Aug 2024 13:07:50 +0800
Subject: [PATCH 01/27] =?UTF-8?q?fix(sites):=20PT=E6=97=B6=E9=97=B4?=
=?UTF-8?q?=E7=AD=BE=E5=88=B0=E5=A4=B1=E8=B4=A5=20&=20PT=E6=97=B6=E9=97=B4?=
=?UTF-8?q?=E9=AD=94=E5=8A=9B=E5=80=BC=E7=BB=9F=E8=AE=A1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
package.json | 6 +-
plugins/autosignin/__init__.py | 2 +-
plugins/autosignin/sites/pttime.py | 64 +++++++++++++++++++
plugins/sitestatistic/__init__.py | 2 +-
.../sitestatistic/siteuserinfo/nexus_php.py | 2 +-
5 files changed, 71 insertions(+), 5 deletions(-)
create mode 100644 plugins/autosignin/sites/pttime.py
diff --git a/package.json b/package.json
index f3ecb75..9bdf16a 100644
--- a/package.json
+++ b/package.json
@@ -3,11 +3,12 @@
"name": "站点自动签到",
"description": "自动模拟登录、签到站点。",
"labels": "站点",
- "version": "2.4.1",
+ "version": "2.4.2",
"icon": "signin.png",
"author": "thsrite",
"level": 2,
"history": {
+ "v2.4.2": "修复PT时间签到失败问题",
"v2.4.1": "修复海胆签到失败问题",
"v2.4": "适配m-team Api地址变化",
"v2.3.2": "修复YemaPT登录失败,支持YemaPT自动签到",
@@ -32,11 +33,12 @@
"name": "站点数据统计",
"description": "自动统计和展示站点数据。",
"labels": "站点,仪表板",
- "version": "4.0",
+ "version": "4.0.1",
"icon": "statistic.png",
"author": "lightolly",
"level": 2,
"history": {
+ "v4.0.1": "修复PTT的魔力值统计",
"v4.0": "修复插件数据页异常",
"v3.9.3": "修复PTT的用户等级统计",
"v3.9.2": "修复YemaPT的上传下载统计错误",
diff --git a/plugins/autosignin/__init__.py b/plugins/autosignin/__init__.py
index a3d21d0..d81ee4d 100644
--- a/plugins/autosignin/__init__.py
+++ b/plugins/autosignin/__init__.py
@@ -38,7 +38,7 @@ class AutoSignIn(_PluginBase):
# 插件图标
plugin_icon = "signin.png"
# 插件版本
- plugin_version = "2.4.1"
+ plugin_version = "2.4.2"
# 插件作者
plugin_author = "thsrite"
# 作者主页
diff --git a/plugins/autosignin/sites/pttime.py b/plugins/autosignin/sites/pttime.py
new file mode 100644
index 0000000..6c766d2
--- /dev/null
+++ b/plugins/autosignin/sites/pttime.py
@@ -0,0 +1,64 @@
+from typing import Tuple
+
+from ruamel.yaml import CommentedMap
+
+from app.log import logger
+from app.plugins.autosignin.sites import _ISiteSigninHandler
+from app.utils.string import StringUtils
+
+
+class PTTime(_ISiteSigninHandler):
+ """
+ PT时间签到
+ """
+ # 匹配的站点Url,每一个实现类都需要设置为自己的站点Url
+ site_url = "pttime.org"
+
+ # 签到成功
+ _succeed_regex = ['签到成功']
+
+ @classmethod
+ def match(cls, url: str) -> bool:
+ """
+ 根据站点Url判断是否匹配当前站点签到类,大部分情况使用默认实现即可
+ :param url: 站点Url
+ :return: 是否匹配,如匹配则会调用该类的signin方法
+ """
+ return True if StringUtils.url_equal(url, cls.site_url) else False
+
+ def signin(self, site_info: CommentedMap) -> Tuple[bool, str]:
+ """
+ 执行签到操作
+ :param site_info: 站点信息,含有站点Url、站点Cookie、UA等信息
+ :return: 签到结果信息
+ """
+ site = site_info.get("name")
+ site_cookie = site_info.get("cookie")
+ ua = site_info.get("ua")
+ proxy = site_info.get("proxy")
+ render = site_info.get("render")
+
+ # 签到
+ # 签到返回:
签到成功
+ html_text = self.get_page_source(url='https://www.pttime.org/attendance.php',
+ cookie=site_cookie,
+ ua=ua,
+ proxy=proxy,
+ render=render)
+
+ if not html_text:
+ logger.error(f"{site} 签到失败,请检查站点连通性")
+ return False, '签到失败,请检查站点连通性'
+
+ if "login.php" in html_text:
+ logger.error(f"{site} 签到失败,Cookie已失效")
+ return False, '签到失败,Cookie已失效'
+
+ sign_status = self.sign_in_result(html_res=html_text,
+ regexs=self._succeed_regex)
+ if sign_status:
+ logger.info(f"{site} 签到成功")
+ return True, '签到成功'
+
+ logger.error(f"{site} 签到失败,签到接口返回 {html_text}")
+ return False, '签到失败'
diff --git a/plugins/sitestatistic/__init__.py b/plugins/sitestatistic/__init__.py
index 2469e00..9760734 100644
--- a/plugins/sitestatistic/__init__.py
+++ b/plugins/sitestatistic/__init__.py
@@ -42,7 +42,7 @@ class SiteStatistic(_PluginBase):
# 插件图标
plugin_icon = "statistic.png"
# 插件版本
- plugin_version = "4.0"
+ plugin_version = "4.0.1"
# 插件作者
plugin_author = "lightolly"
# 作者主页
diff --git a/plugins/sitestatistic/siteuserinfo/nexus_php.py b/plugins/sitestatistic/siteuserinfo/nexus_php.py
index c1deced..13b357b 100644
--- a/plugins/sitestatistic/siteuserinfo/nexus_php.py
+++ b/plugins/sitestatistic/siteuserinfo/nexus_php.py
@@ -118,7 +118,7 @@ class NexusPhpSiteUserInfo(ISiteUserInfo):
if bonus_match and bonus_match.group(1).strip():
self.bonus = StringUtils.str_float(bonus_match.group(1))
return
- bonus_match = re.search(r"mybonus.[\[\]::<>/a-zA-Z_\-=\"'\s#;.(使用魔力值豆]+\s*([\d,.]+)[<()&\s]", html_text)
+ bonus_match = re.search(r"mybonus.[\[\]::<>/a-zA-Z_\-=\"'\s#;.(使用&说明魔力值豆]+\s*([\d,.]+)[\[<()&\s]", html_text)
try:
if bonus_match and bonus_match.group(1).strip():
self.bonus = StringUtils.str_float(bonus_match.group(1))
From c49e2106971ca839260bcd96b4f4c6cdd9c10be6 Mon Sep 17 00:00:00 2001
From: InfinityPacer <160988576+InfinityPacer@users.noreply.github.com>
Date: Tue, 13 Aug 2024 19:02:58 +0800
Subject: [PATCH 02/27] =?UTF-8?q?feat(CustomHosts):=20=E6=94=AF=E6=8C=81?=
=?UTF-8?q?=E5=86=99=E5=85=A5Hosts=E6=B3=A8=E9=87=8A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
plugins/customhosts/__init__.py | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/plugins/customhosts/__init__.py b/plugins/customhosts/__init__.py
index 849159f..d776995 100644
--- a/plugins/customhosts/__init__.py
+++ b/plugins/customhosts/__init__.py
@@ -235,6 +235,12 @@ class CustomHosts(_PluginBase):
for host in hosts:
if not host:
continue
+ host = host.strip()
+ if host.startswith('#'): # 检查是否为注释行
+ host_entry = HostsEntry(entry_type='comment', comment=host)
+ new_entrys.append(host_entry)
+ continue
+
host_arr = str(host).split()
try:
host_entry = HostsEntry(entry_type='ipv4' if IpUtils.is_ipv4(str(host_arr[0])) else 'ipv6',
From bf2a1ea6f0bf7439298c3dd850d3fc223beea197 Mon Sep 17 00:00:00 2001
From: InfinityPacer <160988576+InfinityPacer@users.noreply.github.com>
Date: Tue, 13 Aug 2024 19:04:24 +0800
Subject: [PATCH 03/27] feat: CustomHosts v1.2
---
package.json | 3 ++-
plugins/customhosts/__init__.py | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/package.json b/package.json
index f3ecb75..9c8ba5c 100644
--- a/package.json
+++ b/package.json
@@ -161,11 +161,12 @@
"name": "自定义Hosts",
"description": "修改系统hosts文件,加速网络访问。",
"labels": "网络",
- "version": "1.1",
+ "version": "1.2",
"icon": "hosts.png",
"author": "thsrite",
"level": 1,
"history": {
+ "v1.2": "支持写入注释",
"v1.1": "关闭插件时自动恢复系统hosts"
}
},
diff --git a/plugins/customhosts/__init__.py b/plugins/customhosts/__init__.py
index d776995..ae0fe6a 100644
--- a/plugins/customhosts/__init__.py
+++ b/plugins/customhosts/__init__.py
@@ -18,7 +18,7 @@ class CustomHosts(_PluginBase):
# 插件图标
plugin_icon = "hosts.png"
# 插件版本
- plugin_version = "1.1"
+ plugin_version = "1.2"
# 插件作者
plugin_author = "thsrite"
# 作者主页
From b7d084148d9e0b1436f660ef4fc4cf6e1598d67b Mon Sep 17 00:00:00 2001
From: InfinityPacer <160988576+InfinityPacer@users.noreply.github.com>
Date: Thu, 15 Aug 2024 17:49:00 +0800
Subject: [PATCH 04/27] =?UTF-8?q?fix(BrushFlow):=20=E8=8E=B7=E5=8F=96?=
=?UTF-8?q?=E4=B8=8B=E8=BD=BD=E6=95=B0=E9=87=8F=E8=B0=83=E6=95=B4=E4=B8=BA?=
=?UTF-8?q?=E4=BB=85=E8=8E=B7=E5=8F=96=E5=88=B7=E6=B5=81=E6=A0=87=E7=AD=BE?=
=?UTF-8?q?=E7=A7=8D=E5=AD=90=EF=BC=8C=E5=B9=B6=E5=AE=B9=E9=94=99=E5=A4=84?=
=?UTF-8?q?=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
plugins/brushflow/__init__.py | 19 ++++++++++++++-----
1 file changed, 14 insertions(+), 5 deletions(-)
diff --git a/plugins/brushflow/__init__.py b/plugins/brushflow/__init__.py
index 656a013..74151ab 100644
--- a/plugins/brushflow/__init__.py
+++ b/plugins/brushflow/__init__.py
@@ -3641,12 +3641,21 @@ class BrushFlow(_PluginBase):
"""
获取正在下载的任务数量
"""
- brush_config = self.__get_brush_config()
- downloader = self.__get_downloader(brush_config.downloader)
- if not downloader:
+ try:
+ brush_config = self.__get_brush_config()
+ downloader = self.__get_downloader(brush_config.downloader)
+ if not downloader:
+ return 0
+
+ torrents = downloader.get_downloading_torrents(tags=brush_config.brush_tag)
+ if torrents is None:
+ logger.warn("获取下载数量失败,可能是下载器连接发生异常")
+ return 0
+
+ return len(torrents)
+ except Exception as e:
+ logger.error(f"获取下载数量发生异常: {e}")
return 0
- torrents = downloader.get_downloading_torrents()
- return len(torrents) or 0
@staticmethod
def __get_pubminutes(pubdate: str) -> float:
From f67b0ae460bcfbf0d781f0452d8ea62b18db2054 Mon Sep 17 00:00:00 2001
From: InfinityPacer <160988576+InfinityPacer@users.noreply.github.com>
Date: Thu, 15 Aug 2024 17:50:45 +0800
Subject: [PATCH 05/27] fix BrushFlow v3.7
---
package.json | 3 ++-
plugins/brushflow/__init__.py | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/package.json b/package.json
index 9c8ba5c..7830905 100644
--- a/package.json
+++ b/package.json
@@ -363,11 +363,12 @@
"name": "站点刷流",
"description": "自动托管刷流,将会提高对应站点的访问频率。",
"labels": "刷流,仪表板",
- "version": "3.6",
+ "version": "3.7",
"icon": "brush.jpg",
"author": "jxxghp,InfinityPacer",
"level": 2,
"history": {
+ "v3.7": "下载数量调整为仅获取刷流标签种子并修复了一些细节问题",
"v3.6": "优化检查服务中的时间管控",
"v3.5": "移除「删种排除MoviePilot任务」配置项(请使用「删除排除标签」替代),完善刷流任务触发插件事件相关逻辑(联动H&R助手)",
"v3.4": "移除「记录更多日志」配置项并调整为DEBUG日志,支持「删除排除标签」配置项,增加刷流任务时支持触发插件事件(联动H&R助手)",
diff --git a/plugins/brushflow/__init__.py b/plugins/brushflow/__init__.py
index 74151ab..e3d45b6 100644
--- a/plugins/brushflow/__init__.py
+++ b/plugins/brushflow/__init__.py
@@ -257,7 +257,7 @@ class BrushFlow(_PluginBase):
# 插件图标
plugin_icon = "brush.jpg"
# 插件版本
- plugin_version = "3.6"
+ plugin_version = "3.7"
# 插件作者
plugin_author = "jxxghp,InfinityPacer"
# 作者主页
From 50e70edd6e91076e5be2785adea0b3b9e719df54 Mon Sep 17 00:00:00 2001
From: Lunatic
Date: Sat, 17 Aug 2024 09:11:52 +0800
Subject: [PATCH 06/27] =?UTF-8?q?fix(torrenttransfer):=20=E8=BD=AC?=
=?UTF-8?q?=E7=A7=BB=E6=97=B6=E7=9A=84=E4=BF=9D=E7=95=99=E5=85=A8=E9=83=A8?=
=?UTF-8?q?tracker=E4=BB=A5=E6=8F=90=E9=AB=98=E5=8F=AF=E8=BE=BE=E6=80=A7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
修复了在转移torrent时仅保留第一个tracker的问题,此更新确保所有tracker都被保留,从而提高在不同网络条件下的可达性。
---
package.json | 1 +
plugins/torrenttransfer/__init__.py | 5 ++++-
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 38ba44a..d381d18 100644
--- a/package.json
+++ b/package.json
@@ -335,6 +335,7 @@
"author": "jxxghp",
"level": 2,
"history": {
+ "v1.5":"修复在转移时只保留了第一个tracker,导致红种问题。此修复确保保留所有的tracker,以提高在不同网络条件下的可达性。",
"v1.4": "支持自动删除源下载器在目的下载器中存在的种子"
}
},
diff --git a/plugins/torrenttransfer/__init__.py b/plugins/torrenttransfer/__init__.py
index c304a59..fa22714 100644
--- a/plugins/torrenttransfer/__init__.py
+++ b/plugins/torrenttransfer/__init__.py
@@ -27,7 +27,7 @@ class TorrentTransfer(_PluginBase):
# 插件图标
plugin_icon = "seed.png"
# 插件版本
- plugin_version = "1.4"
+ plugin_version = "1.5"
# 插件作者
plugin_author = "jxxghp"
# 作者主页
@@ -724,6 +724,9 @@ class TorrentTransfer(_PluginBase):
and fastresume_trackers[0]:
# 重新赋值
torrent_main['announce'] = fastresume_trackers[0][0]
+ # 保留其他tracker,避免单一tracker无法连接
+ if len(fastresume_trackers) > 1 or len(fastresume_trackers[0]) > 1:
+ torrent_main['announce-list'] = fastresume_trackers
# 替换种子文件路径
torrent_file = settings.TEMP_PATH / f"{torrent_item.get('hash')}.torrent"
# 编码并保存到临时文件
From 1af48f8203b11adc4b7b50c4d1e08780e063caa4 Mon Sep 17 00:00:00 2001
From: jxxghp
Date: Sat, 17 Aug 2024 10:00:30 +0800
Subject: [PATCH 07/27] fix #449
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index d381d18..aef43ad 100644
--- a/package.json
+++ b/package.json
@@ -330,7 +330,7 @@
"name": "自动转移做种",
"description": "定期转移下载器中的做种任务到另一个下载器。",
"labels": "做种",
- "version": "1.4",
+ "version": "1.5",
"icon": "seed.png",
"author": "jxxghp",
"level": 2,
From 31d0f4c3b67336b871c4a4596ebfc6bf84a89478 Mon Sep 17 00:00:00 2001
From: HankunYu
Date: Thu, 22 Aug 2024 13:20:18 +0100
Subject: [PATCH 08/27] =?UTF-8?q?Fix=20iyuu=E6=B7=BB=E5=8A=A0=E5=90=8E?=
=?UTF-8?q?=E4=B8=8D=E4=BC=9A=E8=87=AA=E5=8A=A8=E5=81=9A=E7=A7=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
package.json | 3 ++-
plugins/iyuuautoseed/__init__.py | 5 ++++-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/package.json b/package.json
index aef43ad..63eabcd 100644
--- a/package.json
+++ b/package.json
@@ -283,11 +283,12 @@
"name": "IYUU自动辅种",
"description": "基于IYUU官方Api实现自动辅种。",
"labels": "做种,IYUU",
- "version": "1.9.3",
+ "version": "1.9.4",
"icon": "IYUU.png",
"author": "jxxghp",
"level": 2,
"history": {
+ "v1.9.4": "修复qBittorrent辅种后不会自动开始做种",
"v1.9.3": "修复Monika因缺少rsskey,种子下载失败的问题",
"v1.9.2": "适配馒头使用API下载种子",
"v1.9.1": "支持自定义辅种的种子分类",
diff --git a/plugins/iyuuautoseed/__init__.py b/plugins/iyuuautoseed/__init__.py
index 187a8c2..43682cf 100644
--- a/plugins/iyuuautoseed/__init__.py
+++ b/plugins/iyuuautoseed/__init__.py
@@ -34,7 +34,7 @@ class IYUUAutoSeed(_PluginBase):
# 插件图标
plugin_icon = "IYUU.png"
# 插件版本
- plugin_version = "1.9.3"
+ plugin_version = "1.9.4"
# 插件作者
plugin_author = "jxxghp"
# 作者主页
@@ -967,6 +967,9 @@ class IYUUAutoSeed(_PluginBase):
if downloader == "qbittorrent":
# 开始校验种子
downloader_obj.recheck_torrents(ids=[download_id])
+ # qbittorrent 添加种子后会标记为完成不会自动做种,需要手动开始
+ if downloader == "qbittorrent":
+ downloader_obj.start_torrents(ids=[download_id])
# 下载成功
logger.info(f"成功添加辅种下载,站点:{site_info.get('name')},种子链接:{torrent_url}")
# 成功也加入缓存,有一些改了路径校验不通过的,手动删除后,下一次又会辅上
From 7fef1f007a65ecf3cd84a8773d3e12f60f07d0e1 Mon Sep 17 00:00:00 2001
From: HankunYu
Date: Thu, 22 Aug 2024 15:45:19 +0100
Subject: [PATCH 09/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9D=A1=E4=BB=B6?=
=?UTF-8?q?=E9=99=90=E5=88=B6=E4=B8=BA=E8=B7=B3=E8=BF=87=E6=A3=80=E9=AA=8C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
plugins/iyuuautoseed/__init__.py | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/plugins/iyuuautoseed/__init__.py b/plugins/iyuuautoseed/__init__.py
index 43682cf..e0551a0 100644
--- a/plugins/iyuuautoseed/__init__.py
+++ b/plugins/iyuuautoseed/__init__.py
@@ -957,6 +957,9 @@ class IYUUAutoSeed(_PluginBase):
if self._skipverify:
# 跳过校验
logger.info(f"{download_id} 跳过校验,请自行检查...")
+ # qbittorrent 添加种子并跳过检验后会标记为完成不会自动做种,需要手动开始
+ if downloader == "qbittorrent":
+ downloader_obj.start_torrents(ids=[download_id])
else:
# 追加校验任务
logger.info(f"添加校验检查任务:{download_id} ...")
@@ -967,9 +970,7 @@ class IYUUAutoSeed(_PluginBase):
if downloader == "qbittorrent":
# 开始校验种子
downloader_obj.recheck_torrents(ids=[download_id])
- # qbittorrent 添加种子后会标记为完成不会自动做种,需要手动开始
- if downloader == "qbittorrent":
- downloader_obj.start_torrents(ids=[download_id])
+
# 下载成功
logger.info(f"成功添加辅种下载,站点:{site_info.get('name')},种子链接:{torrent_url}")
# 成功也加入缓存,有一些改了路径校验不通过的,手动删除后,下一次又会辅上
From bfae36dce8889c0ad0be26ef33a94f8a79e87b13 Mon Sep 17 00:00:00 2001
From: HankunYu
Date: Thu, 22 Aug 2024 16:06:10 +0100
Subject: [PATCH 10/27] Update Correct words
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 63eabcd..ad8993f 100644
--- a/package.json
+++ b/package.json
@@ -288,7 +288,7 @@
"author": "jxxghp",
"level": 2,
"history": {
- "v1.9.4": "修复qBittorrent辅种后不会自动开始做种",
+ "v1.9.4": "修复qbittorrent 添加种子并跳过检验后会标记为完成不会自动做种",
"v1.9.3": "修复Monika因缺少rsskey,种子下载失败的问题",
"v1.9.2": "适配馒头使用API下载种子",
"v1.9.1": "支持自定义辅种的种子分类",
From 7b6937a8b6fdb650cc7f83f2d7011a22e0efebd0 Mon Sep 17 00:00:00 2001
From: Doubly <1286398734@qq.com>
Date: Fri, 23 Aug 2024 01:41:40 +0800
Subject: [PATCH 11/27] =?UTF-8?q?fix=EF=BC=9A=E4=BF=AE=E5=A4=8D=E6=97=B6?=
=?UTF-8?q?=E5=8C=BA=E9=97=AE=E9=A2=98=E5=AF=BC=E8=87=B4=E7=9A=84=E4=B8=8A?=
=?UTF-8?q?=E6=AC=A1=E5=90=8C=E6=AD=A5=E5=90=8E8h=E5=86=85=E7=9A=84?=
=?UTF-8?q?=E7=A7=8D=E5=AD=90=E4=B8=8D=E5=90=8C=E6=AD=A5=E7=9A=84=E9=97=AE?=
=?UTF-8?q?=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
package.json | 7 +++++--
plugins/syncdownloadfiles/__init__.py | 4 ++--
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/package.json b/package.json
index aef43ad..ab7eb9e 100644
--- a/package.json
+++ b/package.json
@@ -357,10 +357,13 @@
"name": "下载器文件同步",
"description": "同步下载器的文件信息到数据库,删除文件时联动删除下载任务。",
"labels": "下载管理",
- "version": "1.1",
+ "version": "1.1.1",
"icon": "Youtube-dl_A.png",
"author": "thsrite",
- "level": 1
+ "level": 1,
+ "history": {
+ "v1.1.1": "修复时区问题导致的上次同步后8h内的种子不同步的问题"
+ }
},
"BrushFlow": {
"name": "站点刷流",
diff --git a/plugins/syncdownloadfiles/__init__.py b/plugins/syncdownloadfiles/__init__.py
index 32be61e..15c8a42 100644
--- a/plugins/syncdownloadfiles/__init__.py
+++ b/plugins/syncdownloadfiles/__init__.py
@@ -22,7 +22,7 @@ class SyncDownloadFiles(_PluginBase):
# 插件图标
plugin_icon = "Youtube-dl_A.png"
# 插件版本
- plugin_version = "1.1"
+ plugin_version = "1.1.1"
# 插件作者
plugin_author = "thsrite"
# 作者主页
@@ -265,7 +265,7 @@ class SyncDownloadFiles(_PluginBase):
if last_sync_time:
# 获取种子时间
if dl_tpe == "qbittorrent":
- torrent_date = time.gmtime(torrent.get("added_on")) # 将时间戳转换为时间元组
+ torrent_date = time.localtime(torrent.get("added_on")) # 将时间戳转换为时间元组
torrent_date = time.strftime("%Y-%m-%d %H:%M:%S", torrent_date) # 格式化时间
else:
torrent_date = torrent.added_date
From a90b49a6a1d7a668328d5d80b13e182f92595995 Mon Sep 17 00:00:00 2001
From: HankunYu
Date: Sat, 24 Aug 2024 20:52:25 +0100
Subject: [PATCH 12/27] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20=E8=87=AA=E5=8A=A8?=
=?UTF-8?q?=E8=BE=85=E7=A7=8D=E4=B8=AD=E8=B7=B3=E8=BF=87=E6=A3=80=E9=AA=8C?=
=?UTF-8?q?=E5=90=8E=E4=B8=8D=E4=BC=9A=E6=A3=80=E6=9F=A5=E7=A7=8D=E5=AD=90?=
=?UTF-8?q?=E5=AE=8C=E6=95=B4=E5=BA=A6=E7=9B=B4=E6=8E=A5=E5=81=9A=E7=A7=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
package.json | 1 +
plugins/iyuuautoseed/__init__.py | 7 +++++--
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/package.json b/package.json
index 7048cc3..18a2837 100644
--- a/package.json
+++ b/package.json
@@ -288,6 +288,7 @@
"author": "jxxghp",
"level": 2,
"history": {
+ "v1.9.5": "修复跳过检验后不会检查种子完整度直接做种",
"v1.9.4": "修复qbittorrent 添加种子并跳过检验后会标记为完成不会自动做种",
"v1.9.3": "修复Monika因缺少rsskey,种子下载失败的问题",
"v1.9.2": "适配馒头使用API下载种子",
diff --git a/plugins/iyuuautoseed/__init__.py b/plugins/iyuuautoseed/__init__.py
index e0551a0..128fad6 100644
--- a/plugins/iyuuautoseed/__init__.py
+++ b/plugins/iyuuautoseed/__init__.py
@@ -957,9 +957,12 @@ class IYUUAutoSeed(_PluginBase):
if self._skipverify:
# 跳过校验
logger.info(f"{download_id} 跳过校验,请自行检查...")
- # qbittorrent 添加种子并跳过检验后会标记为完成不会自动做种,需要手动开始
+ # qbittorrent 添加种子并跳过检验后会标记为完成不会自动做种
+ # 加入校验种子列表,但是跳过校验
if downloader == "qbittorrent":
- downloader_obj.start_torrents(ids=[download_id])
+ if not self._recheck_torrents.get(downloader):
+ self._recheck_torrents[downloader] = []
+ self._recheck_torrents[downloader].append(download_id)
else:
# 追加校验任务
logger.info(f"添加校验检查任务:{download_id} ...")
From d1ac940e4d6d6c2b0d31e5753dd6ad7d4fc13668 Mon Sep 17 00:00:00 2001
From: nelson
Date: Mon, 26 Aug 2024 14:37:22 +0800
Subject: [PATCH 13/27] =?UTF-8?q?=E7=94=B1=E4=BA=8Epushplus=E8=A7=84?=
=?UTF-8?q?=E5=88=99=E6=9B=B4=E6=96=B0=EF=BC=8C=E6=89=80=E4=BB=A5=E5=9C=A8?=
=?UTF-8?q?=E6=8F=92=E4=BB=B6=E9=A1=B5=E9=9D=A2=E6=B7=BB=E5=8A=A0=E7=9B=B8?=
=?UTF-8?q?=E5=85=B3=E8=AF=B4=E6=98=8E=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
plugins/pushplusmsg/__init__.py | 25 +++++++++++++++++++++++--
1 file changed, 23 insertions(+), 2 deletions(-)
diff --git a/plugins/pushplusmsg/__init__.py b/plugins/pushplusmsg/__init__.py
index 3d4485e..b5e287b 100644
--- a/plugins/pushplusmsg/__init__.py
+++ b/plugins/pushplusmsg/__init__.py
@@ -11,11 +11,11 @@ class PushPlusMsg(_PluginBase):
# 插件名称
plugin_name = "PushPlus消息推送"
# 插件描述
- plugin_desc = "支持使用PushPlus发送消息通知。"
+ plugin_desc = "支持使用PushPlus发送消息通知(需实名认证)。"
# 插件图标
plugin_icon = "Pushplus_A.png"
# 插件版本
- plugin_version = "1.0"
+ plugin_version = "1.1"
# 插件作者
plugin_author = "cheng"
# 作者主页
@@ -128,6 +128,27 @@ class PushPlusMsg(_PluginBase):
}
]
},
+ {
+ 'component': 'VRow',
+ 'content': [
+ {
+ 'component': 'VCol',
+ 'props': {
+ 'cols': 12,
+ },
+ 'content': [
+ {
+ 'component': 'VAlert',
+ 'props': {
+ 'type': 'info',
+ 'variant': 'tonal',
+ 'text': '由于pushplus规则更新,没有实名认证的用户无法发送消息,所以需要用户自己去官网进行认证。官网地址:https://www.pushplus.plus'
+ }
+ }
+ ]
+ }
+ ]
+ }
]
}
], {
From b8085690da320730f47b5ecfb67f30c6f8e7ee9c Mon Sep 17 00:00:00 2001
From: jxxghp
Date: Mon, 26 Aug 2024 14:44:29 +0800
Subject: [PATCH 14/27] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20package.json?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 18a2837..82cbc86 100644
--- a/package.json
+++ b/package.json
@@ -536,7 +536,7 @@
"name": "PushPlus消息推送",
"description": "支持使用PushPlus发送消息通知。",
"labels": "消息通知",
- "version": "1.0",
+ "version": "1.1",
"icon": "Pushplus_A.png",
"author": "cheng",
"level": 1
From ed74a5be7745ba20ea3d33a9f06e13387b8fe04b Mon Sep 17 00:00:00 2001
From: Alex Liu
Date: Tue, 27 Aug 2024 10:57:58 +0800
Subject: [PATCH 15/27] =?UTF-8?q?Revert=20"=E4=BF=AE=E5=A4=8D=20=E8=87=AA?=
=?UTF-8?q?=E5=8A=A8=E8=BE=85=E7=A7=8D=E4=B8=AD=E8=B7=B3=E8=BF=87=E6=A3=80?=
=?UTF-8?q?=E9=AA=8C=E5=90=8E=E4=B8=8D=E4=BC=9A=E6=A3=80=E6=9F=A5=E7=A7=8D?=
=?UTF-8?q?=E5=AD=90=E5=AE=8C=E6=95=B4=E5=BA=A6=E7=9B=B4=E6=8E=A5=E5=81=9A?=
=?UTF-8?q?=E7=A7=8D"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This reverts commit a90b49a6a1d7a668328d5d80b13e182f92595995.
---
package.json | 1 -
plugins/iyuuautoseed/__init__.py | 7 ++-----
2 files changed, 2 insertions(+), 6 deletions(-)
diff --git a/package.json b/package.json
index 82cbc86..d0c051a 100644
--- a/package.json
+++ b/package.json
@@ -288,7 +288,6 @@
"author": "jxxghp",
"level": 2,
"history": {
- "v1.9.5": "修复跳过检验后不会检查种子完整度直接做种",
"v1.9.4": "修复qbittorrent 添加种子并跳过检验后会标记为完成不会自动做种",
"v1.9.3": "修复Monika因缺少rsskey,种子下载失败的问题",
"v1.9.2": "适配馒头使用API下载种子",
diff --git a/plugins/iyuuautoseed/__init__.py b/plugins/iyuuautoseed/__init__.py
index 128fad6..e0551a0 100644
--- a/plugins/iyuuautoseed/__init__.py
+++ b/plugins/iyuuautoseed/__init__.py
@@ -957,12 +957,9 @@ class IYUUAutoSeed(_PluginBase):
if self._skipverify:
# 跳过校验
logger.info(f"{download_id} 跳过校验,请自行检查...")
- # qbittorrent 添加种子并跳过检验后会标记为完成不会自动做种
- # 加入校验种子列表,但是跳过校验
+ # qbittorrent 添加种子并跳过检验后会标记为完成不会自动做种,需要手动开始
if downloader == "qbittorrent":
- if not self._recheck_torrents.get(downloader):
- self._recheck_torrents[downloader] = []
- self._recheck_torrents[downloader].append(download_id)
+ downloader_obj.start_torrents(ids=[download_id])
else:
# 追加校验任务
logger.info(f"添加校验检查任务:{download_id} ...")
From fbd2844f9bbf6eabb29df3662c75beb808e87a28 Mon Sep 17 00:00:00 2001
From: Alex Liu
Date: Tue, 27 Aug 2024 10:58:05 +0800
Subject: [PATCH 16/27] Revert "Update Correct words"
This reverts commit bfae36dce8889c0ad0be26ef33a94f8a79e87b13.
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index d0c051a..a32c29b 100644
--- a/package.json
+++ b/package.json
@@ -288,7 +288,7 @@
"author": "jxxghp",
"level": 2,
"history": {
- "v1.9.4": "修复qbittorrent 添加种子并跳过检验后会标记为完成不会自动做种",
+ "v1.9.4": "修复qBittorrent辅种后不会自动开始做种",
"v1.9.3": "修复Monika因缺少rsskey,种子下载失败的问题",
"v1.9.2": "适配馒头使用API下载种子",
"v1.9.1": "支持自定义辅种的种子分类",
From 9b2eec8ca909626f7a9fdf2d27889ed9a5300bc2 Mon Sep 17 00:00:00 2001
From: Alex Liu
Date: Tue, 27 Aug 2024 10:58:09 +0800
Subject: [PATCH 17/27] =?UTF-8?q?Revert=20"=E5=A2=9E=E5=8A=A0=E6=9D=A1?=
=?UTF-8?q?=E4=BB=B6=E9=99=90=E5=88=B6=E4=B8=BA=E8=B7=B3=E8=BF=87=E6=A3=80?=
=?UTF-8?q?=E9=AA=8C"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This reverts commit 7fef1f007a65ecf3cd84a8773d3e12f60f07d0e1.
---
plugins/iyuuautoseed/__init__.py | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/plugins/iyuuautoseed/__init__.py b/plugins/iyuuautoseed/__init__.py
index e0551a0..43682cf 100644
--- a/plugins/iyuuautoseed/__init__.py
+++ b/plugins/iyuuautoseed/__init__.py
@@ -957,9 +957,6 @@ class IYUUAutoSeed(_PluginBase):
if self._skipverify:
# 跳过校验
logger.info(f"{download_id} 跳过校验,请自行检查...")
- # qbittorrent 添加种子并跳过检验后会标记为完成不会自动做种,需要手动开始
- if downloader == "qbittorrent":
- downloader_obj.start_torrents(ids=[download_id])
else:
# 追加校验任务
logger.info(f"添加校验检查任务:{download_id} ...")
@@ -970,7 +967,9 @@ class IYUUAutoSeed(_PluginBase):
if downloader == "qbittorrent":
# 开始校验种子
downloader_obj.recheck_torrents(ids=[download_id])
-
+ # qbittorrent 添加种子后会标记为完成不会自动做种,需要手动开始
+ if downloader == "qbittorrent":
+ downloader_obj.start_torrents(ids=[download_id])
# 下载成功
logger.info(f"成功添加辅种下载,站点:{site_info.get('name')},种子链接:{torrent_url}")
# 成功也加入缓存,有一些改了路径校验不通过的,手动删除后,下一次又会辅上
From 5dbafa0fe842a0f23ba29f45af227cc89ae81831 Mon Sep 17 00:00:00 2001
From: Alex Liu
Date: Tue, 27 Aug 2024 10:58:13 +0800
Subject: [PATCH 18/27] =?UTF-8?q?Revert=20"Fix=20iyuu=E6=B7=BB=E5=8A=A0?=
=?UTF-8?q?=E5=90=8E=E4=B8=8D=E4=BC=9A=E8=87=AA=E5=8A=A8=E5=81=9A=E7=A7=8D?=
=?UTF-8?q?"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This reverts commit 31d0f4c3b67336b871c4a4596ebfc6bf84a89478.
---
package.json | 3 +--
plugins/iyuuautoseed/__init__.py | 5 +----
2 files changed, 2 insertions(+), 6 deletions(-)
diff --git a/package.json b/package.json
index a32c29b..8f3cc0f 100644
--- a/package.json
+++ b/package.json
@@ -283,12 +283,11 @@
"name": "IYUU自动辅种",
"description": "基于IYUU官方Api实现自动辅种。",
"labels": "做种,IYUU",
- "version": "1.9.4",
+ "version": "1.9.3",
"icon": "IYUU.png",
"author": "jxxghp",
"level": 2,
"history": {
- "v1.9.4": "修复qBittorrent辅种后不会自动开始做种",
"v1.9.3": "修复Monika因缺少rsskey,种子下载失败的问题",
"v1.9.2": "适配馒头使用API下载种子",
"v1.9.1": "支持自定义辅种的种子分类",
diff --git a/plugins/iyuuautoseed/__init__.py b/plugins/iyuuautoseed/__init__.py
index 43682cf..187a8c2 100644
--- a/plugins/iyuuautoseed/__init__.py
+++ b/plugins/iyuuautoseed/__init__.py
@@ -34,7 +34,7 @@ class IYUUAutoSeed(_PluginBase):
# 插件图标
plugin_icon = "IYUU.png"
# 插件版本
- plugin_version = "1.9.4"
+ plugin_version = "1.9.3"
# 插件作者
plugin_author = "jxxghp"
# 作者主页
@@ -967,9 +967,6 @@ class IYUUAutoSeed(_PluginBase):
if downloader == "qbittorrent":
# 开始校验种子
downloader_obj.recheck_torrents(ids=[download_id])
- # qbittorrent 添加种子后会标记为完成不会自动做种,需要手动开始
- if downloader == "qbittorrent":
- downloader_obj.start_torrents(ids=[download_id])
# 下载成功
logger.info(f"成功添加辅种下载,站点:{site_info.get('name')},种子链接:{torrent_url}")
# 成功也加入缓存,有一些改了路径校验不通过的,手动删除后,下一次又会辅上
From 66b0fd3823ab73030dd8aaead23610a78d3ec77d Mon Sep 17 00:00:00 2001
From: Alex Liu
Date: Tue, 27 Aug 2024 11:03:02 +0800
Subject: [PATCH 19/27] =?UTF-8?q?fix(iyuuautoseed):=20Revert=20qBittorrent?=
=?UTF-8?q?=20=E8=B7=B3=E6=A3=80=E4=B9=8B=E5=90=8E=E8=87=AA=E5=8A=A8?=
=?UTF-8?q?=E5=BC=80=E5=A7=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
package.json | 4 +++-
plugins/iyuuautoseed/__init__.py | 6 +++++-
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/package.json b/package.json
index 8f3cc0f..e719740 100644
--- a/package.json
+++ b/package.json
@@ -283,11 +283,13 @@
"name": "IYUU自动辅种",
"description": "基于IYUU官方Api实现自动辅种。",
"labels": "做种,IYUU",
- "version": "1.9.3",
+ "version": "1.9.5",
"icon": "IYUU.png",
"author": "jxxghp",
"level": 2,
"history": {
+ "v1.9.5": "Revert qBittorrent跳检之后自动开始",
+ "v1.9.4": "修复qBittorrent辅种后不会自动开始做种",
"v1.9.3": "修复Monika因缺少rsskey,种子下载失败的问题",
"v1.9.2": "适配馒头使用API下载种子",
"v1.9.1": "支持自定义辅种的种子分类",
diff --git a/plugins/iyuuautoseed/__init__.py b/plugins/iyuuautoseed/__init__.py
index 187a8c2..64e4f2f 100644
--- a/plugins/iyuuautoseed/__init__.py
+++ b/plugins/iyuuautoseed/__init__.py
@@ -34,7 +34,7 @@ class IYUUAutoSeed(_PluginBase):
# 插件图标
plugin_icon = "IYUU.png"
# 插件版本
- plugin_version = "1.9.3"
+ plugin_version = "1.9.5"
# 插件作者
plugin_author = "jxxghp"
# 作者主页
@@ -957,6 +957,10 @@ class IYUUAutoSeed(_PluginBase):
if self._skipverify:
# 跳过校验
logger.info(f"{download_id} 跳过校验,请自行检查...")
+ # 请注意这里是故意不自动开始的
+ # 跳过校验存在直接失败、种子目录相同文件不同等异常情况
+ # 必须要用户自行二次确认之后才能开始做种
+ # 否则会出现反复下载刷掉分享率、做假种的情况
else:
# 追加校验任务
logger.info(f"添加校验检查任务:{download_id} ...")
From fa142615993ce019b52accef3089172ac68602b7 Mon Sep 17 00:00:00 2001
From: Dean <36684698+BrettDean@users.noreply.github.com>
Date: Fri, 30 Aug 2024 17:55:17 +0800
Subject: [PATCH 20/27] =?UTF-8?q?=E5=B0=86=E6=96=87=E4=BB=B6=E5=90=8E?=
=?UTF-8?q?=E7=BC=80=E5=90=8D=E6=A3=80=E6=9F=A5=E6=94=B9=E4=B8=BA=E4=B8=8D?=
=?UTF-8?q?=E5=8C=BA=E5=88=86=E5=A4=A7=E5=B0=8F=E5=86=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
plugins/dirmonitor/__init__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/plugins/dirmonitor/__init__.py b/plugins/dirmonitor/__init__.py
index 2159523..0f0c957 100644
--- a/plugins/dirmonitor/__init__.py
+++ b/plugins/dirmonitor/__init__.py
@@ -330,7 +330,7 @@ class DirMonitor(_PluginBase):
return
# 不是媒体文件不处理
- if file_path.suffix not in settings.RMT_MEDIAEXT:
+ if file_path.suffix.casefold() not in map(str.casefold, settings.RMT_MEDIAEXT):
logger.debug(f"{event_path} 不是媒体文件")
return
From f72f92ab37d9ee893efdbdab8932ff2534b099c4 Mon Sep 17 00:00:00 2001
From: Pixel-LH <2569646547@qq.com>
Date: Sun, 1 Sep 2024 06:04:09 +0800
Subject: [PATCH 21/27] =?UTF-8?q?Update:VCB=E8=BE=85=E5=8A=A9=E6=95=B4?=
=?UTF-8?q?=E7=90=86=E6=8F=92=E4=BB=B6=E5=8A=9F=E8=83=BD=E9=87=8D=E6=9E=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
package.json | 1 +
plugins/vcbanimemonitor/__init__.py | 54 ++--
plugins/vcbanimemonitor/remeta.py | 413 ++++++++++++++++------------
3 files changed, 278 insertions(+), 190 deletions(-)
diff --git a/package.json b/package.json
index e719740..f2db2d8 100644
--- a/package.json
+++ b/package.json
@@ -324,6 +324,7 @@
"author": "pixel@qingwa",
"level": 2,
"history": {
+ "v1.8.1": "重构插件,测试版",
"v1.8": "增加了元数据刮削开关,升级后需要手动打开,否则默认不刮削",
"v1.7.1": "修复偶尔安装失败问题"
}
diff --git a/plugins/vcbanimemonitor/__init__.py b/plugins/vcbanimemonitor/__init__.py
index de3edd1..84c5f86 100644
--- a/plugins/vcbanimemonitor/__init__.py
+++ b/plugins/vcbanimemonitor/__init__.py
@@ -5,7 +5,6 @@ import threading
import time
import traceback
from pathlib import Path
-from time import sleep
from typing import List, Tuple, Dict, Any, Optional
import pytz
import qbittorrentapi
@@ -19,8 +18,6 @@ from app.chain.tmdb import TmdbChain
from app.chain.transfer import TransferChain
from app.core.config import settings
from app.core.context import MediaInfo
-from app.core.event import eventmanager, Event
-from app.core.metainfo import MetaInfoPath
from app.db.downloadhistory_oper import DownloadHistoryOper
from app.db.transferhistory_oper import TransferHistoryOper
from app.log import logger
@@ -77,7 +74,7 @@ class VCBAnimeMonitor(_PluginBase):
# 插件图标
plugin_icon = "vcbmonitor.png"
# 插件版本
- plugin_version = "1.8"
+ plugin_version = "1.8.1"
# 插件作者
plugin_author = "pixel@qingwa"
# 作者主页
@@ -224,7 +221,8 @@ class VCBAnimeMonitor(_PluginBase):
try:
if target_path and target_path.is_relative_to(Path(mon_path)):
logger.warn(f"{target_path} 是监控目录 {mon_path} 的子目录,无法监控")
- self.systemmessage.put(f"{target_path} 是下载目录 {mon_path} 的子目录,无法监控", title="整理VCB动漫压制组作品")
+ self.systemmessage.put(f"{target_path} 是下载目录 {mon_path} 的子目录,无法监控",
+ title="整理VCB动漫压制组作品")
continue
except Exception as e:
logger.debug(str(e))
@@ -382,27 +380,49 @@ class VCBAnimeMonitor(_PluginBase):
return
# 元数据
- if file_path.parent.name == "SPs":
- logger.warn("位于SPs目录下,跳过处理")
+ if file_path.parent.name in ["SPs", "Scans", "CDs"]:
+ logger.warn("位于特典等其他特殊目录下,跳过处理")
return
- remeta = ReMeta(ova_switch=self._switch_ova, high_performance=self._high_mode)
+
+ if 'VCB-Studio' not in file_path.stem.strip():
+ logger.warn("不属于VCB的作品,不处理!")
+ return
+
+ remeta = ReMeta(ova_switch=self._switch_ova, )
file_meta = remeta.handel_file(file_path=file_path)
if file_meta:
if not file_meta.name:
logger.error(f"{file_path.name} 无法识别有效信息")
return
- if remeta.is_special and not self._switch_ova:
+ if remeta.is_ova and not self._switch_ova:
logger.warn(f"{file_path.name} 为OVA资源,未开启OVA开关,不处理")
return
- if remeta.is_special and self._switch_ova:
- logger.info(f"{file_path.name} 为OVA资源,开始处理")
- if self.get_data(key=f"OVA_{file_meta.title}") is not None:
- ova_history_ep = int(self.get_data(key=f"OVA_{file_meta.title}")) + 1
- file_meta.begin_episode = ova_history_ep
- self.save_data(key=f"OVA_{file_meta.title}", value=ova_history_ep)
+ # if remeta.is_ova and self._switch_ova:
+ # logger.info(f"{file_path.name} 为OVA资源,开始处理")
+ # if self.get_data(key=f"OVA_{file_meta.title}") is not None:
+ # ova_history_ep = int(self.get_data(key=f"OVA_{file_meta.title}")) + 1
+ # file_meta.begin_episode = ova_history_ep
+ # self.save_data(key=f"OVA_{file_meta.title}", value=ova_history_ep)
+ # else:
+ # file_meta.begin_episode = 1
+ # self.save_data(key=f"OVA_{file_meta.title}", value=1)
+ if remeta.is_ova and self._switch_ova:
+ logger.info(f"{file_path.name} 为OVA资源,开始历史记录处理")
+ ova_history_ep_list = self.plugindata.get(file_meta.title, [])
+ if ova_history_ep_list:
+ ep = file_meta.begin_episode
+ if ep in ova_history_ep_list:
+ for i in range(1, 100):
+ if ep + i not in ova_history_ep_list:
+ ova_history_ep_list.append(ep + i)
+ file_meta.begin_episode = ep + i
+ break
+ else:
+ ova_history_ep_list.append(ep)
+ self.plugindata.put(file_meta.title, ova_history_ep_list)
else:
- file_meta.begin_episode = 1
- self.save_data(key=f"OVA_{file_meta.title}", value=1)
+ self.plugindata.put(file_meta.title, [file_meta.begin_episode])
+
else:
return
diff --git a/plugins/vcbanimemonitor/remeta.py b/plugins/vcbanimemonitor/remeta.py
index 4624cc7..5b8a659 100644
--- a/plugins/vcbanimemonitor/remeta.py
+++ b/plugins/vcbanimemonitor/remeta.py
@@ -1,203 +1,270 @@
import concurrent
import re
+from dataclasses import dataclass
from pathlib import Path
from typing import List
from app.chain.media import MediaChain
-from app.chain.tmdb import TmdbChain
from app.core.metainfo import MetaInfoPath
from app.log import logger
from app.schemas import MediaType
+season_patterns = [
+ {"pattern": re.compile(r"S(\d+)$", re.IGNORECASE), "group": 1},
+ {"pattern": re.compile(r"(\d+)$", re.IGNORECASE), "group": 1},
+ {"pattern": re.compile(r"(\d+)(st|nd|rd|th)?\s*season", re.IGNORECASE), "group": 1},
+ {"pattern": re.compile(r"(.*) ?\s*season (\d+)", re.IGNORECASE), "group": 2},
+ {"pattern": re.compile(r"\s(II|III|IV|V|VI|VII|VIII|IX|X)$", re.IGNORECASE), "group": "1"}
+]
+episode_patterns = [
+ {"pattern": re.compile(r"(\d+)\((\d+)\)", re.IGNORECASE), "group": 2},
+ {"pattern": re.compile(r"(\d+)", re.IGNORECASE), "group": 1},
+ {"pattern": re.compile(r'(\d+)v\d+', re.IGNORECASE), "group": 1},
+]
-def roman_to_int(s) -> int:
- """
- :param s: 罗马数字字符串
- 罗马数字转整数
- """
- roman_dict = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
- total = 0
- prev_value = 0
+ova_patterns = [
+ re.compile(r".*?(OVA|OAD).*?", re.IGNORECASE),
+ re.compile(r"\d+\.5"),
+ re.compile(r"00")
+]
- for char in reversed(s): # 反向遍历罗马数字字符串
- current_value = roman_dict[char]
- if current_value >= prev_value:
- total += current_value # 如果当前值大于等于前一个值,加上当前值
- else:
- total -= current_value # 如果当前值小于前一个值,减去当前值
- prev_value = current_value
+final_season_patterns = [
+ re.compile('final season', re.IGNORECASE),
+ re.compile('The Final', re.IGNORECASE),
+ re.compile(r'\sFinal')
+]
- return total
+
+@dataclass
+class VCBMetaBase:
+ # 转化为小写后的原始文件名称 (不含后缀)
+ original_title: str = ""
+ # 解析后不包含季度和集数的标题
+ title: str = ""
+ # 类型:TV / Movie (默认TV)
+ type: str = "TV"
+ # 可能含有季度的标题,一级解析后的标题
+ season_title: str = ""
+ # 可能含有集数的字符串列表
+ ep_title: List[str] = None
+ # 识别出来的季度
+ season: int = None
+ # 识别出来的集数
+ ep: int = None
+ # 是否是OVA/OAD
+ is_ova: bool = False
+
+
+blocked_words = ["vcb-studio", "360p", "480p", "720p", "1080p", "2160p", "hdr", "x265", "x264", "aac", "flac"]
class ReMeta:
- # 解析之后的标题:
- title: str = None
- # 识别出来的集数
- ep: int = None
- # 识别出来的季度
- season: int = None
- # 特殊季识别开关
- is_special = False
- # OVA/OAD识别开关
- ova_switch: bool = False
- # 高性能处理开关
- high_performance = False
- season_patterns = [
- {"pattern": re.compile(r"S(\d+)$"), "group": 1},
- {"pattern": re.compile(r"(\d+)$"), "group": 1},
- {"pattern": re.compile(r"(\d+)(st|nd|rd|th)?\s*[Ss][Ee][Aa][Ss][Oo][Nn]"), "group": 1},
- {"pattern": re.compile(r"(.*) ?\s*[Ss][Ee][Aa][Ss][Oo][Nn] (\d+)"), "group": 2},
- {"pattern": re.compile(r"\s(II|III|IV|V|VI|VII|VIII|IX|X)$"), "group": "1"}
- ]
- episode_patterns = [
- {"pattern": re.compile(r"\[(\d+)\((\d+)\)]"), "group": 2},
- {"pattern": re.compile(r"\[(\d+)]"), "group": 1},
- {"pattern": re.compile(r'\[(\d+)v\d+]'), "group": 1},
-
- ]
- _ova_patterns = [re.compile(r"\[.*?(OVA|OAD).*?]"),
- re.compile(r"\[\d+\.5]"),
- re.compile(r"\[00\]")]
-
- final_season_patterns = [re.compile('final season', re.IGNORECASE),
- re.compile('The Final', re.IGNORECASE),
- re.compile(r'\sFinal')
- ]
- # 自定义添加的季度正则表达式
- _custom_season_patterns = []
-
- def __init__(self, ova_switch: bool = False, high_performance: bool = False):
+ def __init__(self, ova_switch: bool = False, custom_season_patterns: list[dict] = None):
+ self.meta = None
+ # TODO:自定义季度匹配规则
+ self.custom_season_patterns = custom_season_patterns
+ self.season_patterns = season_patterns
self.ova_switch = ova_switch
- self.high_performance = high_performance
+ self.vcb_meta = VCBMetaBase()
+ self.is_ova = False
+
+ def is_tv(self, title: str) -> bool:
+ """
+ 判断是否是TV
+ """
+ if title.count("[") != 4 and title.count("]") != 4:
+ self.vcb_meta.type = "Movie"
+ self.vcb_meta.title = re.sub(r'\[.*?\]', '', title).strip()
+ return False
+ return True
def handel_file(self, file_path: Path):
+ file_name = file_path.stem.strip().lower()
+ self.vcb_meta.original_title = file_name
+ if not self.is_tv(file_name):
+ logger.warn(
+ "不符合VCB-Studio的剧集命名规范,归类为电影,跳过剧集模块处理。注意:年份较为久远的作品可能会判断错误")
+ else:
+ self.tv_mode()
+ self.is_ova = self.vcb_meta.is_ova
meta = MetaInfoPath(file_path)
- self.title = meta.title
- self.title = Path(self.title).stem.strip()
- if 'VCB-Studio' not in meta.title:
- logger.warn("不属于VCB的作品,不处理!")
- return None
- if meta.title.count("[") != 4 and meta.title.count("]") != 4:
- # 可能是电影,电影只有三组[],因此去除所有[]后只剩下电影名
- logger.warn("不符合VCB-Studio的剧集命名规范,跳过剧集模块处理!交给默认处理逻辑")
- meta.title = re.sub(r'\[.*?\]', '', meta.title).strip()
- meta.en_name = meta.title
- return meta
- split_title: List[str] | None = self.split_season_ep(self.title)
- if split_title:
- self.handle_season_ep(split_title)
- if self.season is not None:
- meta.begin_season = self.season
- else:
- logger.warn("未识别出季度,默认处理逻辑返回第一季")
- if self.ep is not None:
- meta.begin_episode = self.ep
- else:
- logger.warn("未识别出集数,默认处理逻辑返回第一集")
- meta.title = self.title
- meta.en_name = self.title
- logger.info(f"识别出季度为{self.season},集数为{self.ep},标题为:{self.title}")
-
+ meta.title = self.vcb_meta.title
+ meta.en_name = self.vcb_meta.title
+ meta.begin_season = self.vcb_meta.season
+ if self.vcb_meta.ep:
+ meta.begin_episode = self.vcb_meta.ep
+ if self.vcb_meta.type == "Movie":
+ meta.type = MediaType.MOVIE
return meta
- # 分离季度部分和集数部分
- def split_season_ep(self, pre_title: str):
- split_ep = re.findall(r"(\[.*?])", pre_title)[1]
- if not split_ep:
- logger.warn("未识别出集数位置信息,结束识别!")
- return None
- split_title = re.sub(r"\[.*?\]", "", pre_title).strip()
- logger.info(f"分离出包含季度的部分:{split_title} \n 分离出包含集数的部分: {split_ep}")
- return [split_title, split_ep]
+ def split_season_ep(self):
+ # 把所有的[] 里面的内容获取出来,不需要[]本身
+ self.vcb_meta.ep_title = re.findall(r'\[(.*?)\]', self.vcb_meta.original_title)
+ # 去除所有[]后只剩下剧名
+ self.vcb_meta.season_title = re.sub(r"\[.*?\]", "", self.vcb_meta.original_title).strip()
+ if self.vcb_meta.ep_title:
+ self.culling_blocked_words()
+ logger.info(
+ f"分离出包含可能季度的内容部分:{self.vcb_meta.season_title} | 可能包含集数的内容部分: {self.vcb_meta.ep_title}")
+ self.vcb_meta.title = self.vcb_meta.season_title
+ if not self.vcb_meta.ep_title:
+ self.vcb_meta.title = self.vcb_meta.season_title
+ logger.warn("未识别出可能存在集数位置的信息,跳过剩余识别步骤!")
- def handle_season_ep(self, title: List[str]):
- if self.high_performance:
- with concurrent.futures.ProcessPoolExecutor(max_workers=2) as executor:
- title_season_result = executor.submit(self.handle_season, title[0])
- ep_result = executor.submit(self.re_ep, title[1], )
- try:
- title_season_result = title_season_result.result() # Blocks until the task is complete.
- ep_result = ep_result.result() # Blocks until the task is complete.
- except Exception as exc:
- print('Generated an exception: %s' % exc)
- else:
- title_season_result = self.handle_season(title[0])
- ep_result = self.re_ep(title[1])
- self.title = title_season_result["title"]
- is_ova = ep_result["is_ova"]
- if ep_result["ep"] is not None:
- self.ep = ep_result["ep"]
- if title_season_result["season"]:
- self.season = title_season_result["season"]
- if is_ova:
- self.season = 0
- self.is_special = True
+ def tv_mode(self):
+ logger.info("开始分离季度和集数部分")
+ self.split_season_ep()
+ if not self.vcb_meta.ep_title:
+ return
+ self.parse_season()
+ self.parse_episode()
- # 处理季度
- def handle_season(self, pre_title: str) -> dict:
- title_season = {"title": pre_title, "season": 1}
- for season_pattern in self.season_patterns:
- pattern = season_pattern["pattern"]
- group = season_pattern["group"]
- match = pattern.search(pre_title)
+ def parse_season(self):
+ """
+ 从标题中解析季度
+ """
+ flag = False
+ for pattern in season_patterns:
+ match = pattern["pattern"].search(self.vcb_meta.season_title)
if match:
- if type(group) == str:
- title_season["season"] = roman_to_int(match.group(int(group)))
- title_season["title"] = re.sub(pattern, "", pre_title).strip()
+ if isinstance(pattern["group"], int):
+ self.vcb_meta.season = int(match.group(pattern["group"]))
else:
- title_season["season"] = int(match.group(group))
- title_season["title"] = re.sub(pattern, "", pre_title).strip()
- return title_season
- for final_season_pattern in self.final_season_patterns:
- match = final_season_pattern.search(pre_title)
- if match:
- logger.info("识别出最终季度,开始处理!")
- title_season["title"] = re.sub(final_season_pattern, "", pre_title).strip()
- title_season["season"] = self.handle_final_season(title=pre_title)
- break
- return title_season
+ self.vcb_meta.season = self.roman_to_int(match.group(pattern["group"]))
+ # 匹配成功后,标题中去除季度信息
+ self.vcb_meta.title = pattern["pattern"].sub("", self.vcb_meta.season_title).strip
+ logger.info(f"识别出季度为{self.vcb_meta.season}")
+ return
+ logger.info(f"正常匹配季度失败,开始匹配ova/oad/最终季度")
+ if not flag:
+ # 匹配是否为最终季
+ for pattern in final_season_patterns:
+ if pattern.search(self.vcb_meta.season_title):
+ logger.info("命中到最终季匹配规则")
+ self.vcb_meta.title = pattern.sub("", self.vcb_meta.season_title).strip()
+ self.handle_final_season()
+ return
+ logger.info("未识别出最终季度,开始匹配OVA/OAD")
+ # 匹配是否为OVA/OAD
+ if "ova" in self.vcb_meta.season_title or "oad" in self.vcb_meta.season_title:
+ logger.info("季度部分命中到OVA/OAD匹配规则")
+ if self.ova_switch:
+ logger.info("开启OVA/OAD处理逻辑")
+ self.vcb_meta.is_ova = True
+ for pattern in ova_patterns:
+ if pattern.search(self.vcb_meta.season_title):
+ self.vcb_meta.title = pattern.sub("", self.vcb_meta.season_title).strip()
+ self.vcb_meta.title = re.sub("ova|oad", "", self.vcb_meta.season_title).strip()
+ self.vcb_meta.season = 0
+ return
+ logger.warn("未识别出季度,默认处理逻辑返回第一季")
+ self.vcb_meta.title = self.vcb_meta.season_title
+ self.vcb_meta.season = 1
- # 处理存在“Final”字样命名的季度
- def handle_final_season(self, title: str) -> int | None:
- medias = MediaChain().search(title=title)[1]
- if not medias:
- logger.warn("没有找到对应的媒体信息!")
- return
- # 根据类型进行过滤,只取类型是电视剧和动漫的media
- medias = [media for media in medias if media.type == MediaType.TV]
- if not medias:
- logger.warn("没有找到动漫或电视剧的媒体信息!")
- return
- media = sorted(medias, key=lambda x: x.popularity, reverse=True)[0]
- media_tmdb_id = media.tmdb_id
- seasons_info = TmdbChain().tmdb_seasons(tmdbid=media_tmdb_id)
- if seasons_info is None:
- logger.warn("无法获取最终季")
- else:
- logger.info(f"获取到最终季,季度为{len(seasons_info)}")
- return len(seasons_info)
+ def parse_episode(self):
+ """
+ 从标题中解析集数
+ """
+ # 从ep_title中剔除不相关的内容之后只剩下存在集数的字符串
+ ep = self.vcb_meta.ep_title[0]
+ for pattern in episode_patterns:
+ match = pattern["pattern"].search(ep)
+ if match:
+ self.vcb_meta.ep = int(match.group(pattern["group"]))
+ logger.info(f"识别出集数为{self.vcb_meta.ep}")
+ return
+ # 直接进入判断是否为OVA/OAD
+ for pattern in ova_patterns:
+ if pattern.search(ep):
+ self.vcb_meta.is_ova = True
+ # 直接获取数字
+ self.vcb_meta.ep = int(re.search(r"\d+", ep).group()) or 1
+ logger.info(f"识别出集数为{self.vcb_meta.ep}")
+ return
- def re_ep(self, ep_title: str, ) -> dict:
+ def culling_blocked_words(self):
"""
- # 集数匹配处理模块
- :param ep_title: 从title解析出的集数,ep_title固定格式[集数]
- 1.先判断是否存在OVA/OAD,形如:[OVA],[12(OVA)],[12.5]这种形式都是属于OVA/OAD,交给处理OVA模块处理
- 2.集数通常有两种情况一种:[12]直接性,另一种:[12(24)],这一种应该去括号内的为集数
- :return: 集数(int)
+ 从ep_title中剔除不相关的内容
"""
- ep_ova = {"ep": None, "is_ova": False}
- for ova_pattern in self._ova_patterns:
- match = ova_pattern.search(ep_title)
- if match:
- ep_ova["is_ova"] = True
- ep_ova["ep"] = 1
- return ep_ova
- for ep_pattern in self.episode_patterns:
- pattern = ep_pattern["pattern"]
- group = ep_pattern["group"]
- match = pattern.search(ep_title)
- if match:
- ep_ova["ep"] = int(match.group(group))
- return ep_ova
- return ep_ova
+ blocked_set = set(blocked_words) # 将阻止词列表转换为集合
+ result = [ep for ep in self.vcb_meta.ep_title if not any(word in ep for word in blocked_set)]
+ self.vcb_meta.ep_title = result
+
+ def handle_final_season(self):
+
+ meta, medias = MediaChain().search(title=self.vcb_meta.title)
+ if not medias:
+ logger.warning("匹配到最终季时无法找到对应的媒体信息!季度返回默认值:1")
+ self.vcb_meta.season = 1
+ return
+
+ max_season_number = 1
+ # 当没有季度参考时用评分来决定
+ vote_average = 0
+ season_info = False
+ for media in medias:
+ if media.type != MediaType.TV:
+ logger.info(f"搜索到的: {media.title}, 媒体类型为 {media.type},跳过")
+ continue
+ if media.season_info:
+ season_info = True
+ last_season_number = int(media.season_info[-1].get("season_number", 1))
+ if last_season_number > max_season_number:
+ max_season_number = last_season_number
+ else:
+ logger.info(f"媒体: {media.title} 没有季信息,跳过")
+ if not season_info:
+ # 备用方案
+ for media in medias:
+ if media.seasons:
+ seasons: dict
+ # 获取最大的键,即最大季度
+ last_season_number = max(media.seasons.keys())
+ if last_season_number > max_season_number:
+ max_season_number = last_season_number
+ logger.info(f"获取到最终季,季度为 {max_season_number},标题为 {media.title},年份为 {media.year}")
+ else:
+ logger.info(f"媒体: {media.title} 没有季信息,跳过")
+
+ self.vcb_meta.season = max_season_number
+ logger.info(f"获取到最终季,季度为 {self.vcb_meta.season}")
+
+ @staticmethod
+ def roman_to_int(s) -> int:
+ """
+ :param s: 罗马数字字符串
+ 罗马数字转整数
+ """
+ roman_dict = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
+ total = 0
+ prev_value = 0
+
+ for char in reversed(s): # 反向遍历罗马数字字符串
+ current_value = roman_dict[char]
+ if current_value >= prev_value:
+ total += current_value # 如果当前值大于等于前一个值,加上当前值
+ else:
+ total -= current_value # 如果当前值小于前一个值,减去当前值
+ prev_value = current_value
+
+ return total
+
+
+def test(title: str):
+ # 示例文件名
+ pre_title = title
+
+ # 提取方括号内的内容,不包括方括号
+ content = re.findall(r'\[(.*?)\]', pre_title)
+
+ print(content)
+
+
+if __name__ == '__main__':
+ # title = "[BeanSub&VCB-Studio] Jujutsu Kaisen [26][Ma10p_1080p][x265_flac].mkv "
+ # test(title)
+
+ ReMeta(
+ ova_switch=True,
+ ).handel_file(Path(
+ r"[Nekomoe kissaten&VCB-Studio] Fruits Basket The Final [08][Ma10p_1080p][x265_flac].mkv"))
From bd9d1c413fae34fb8a60a0ee42c0e6b38cef6803 Mon Sep 17 00:00:00 2001
From: Pixel-LH <2569646547@qq.com>
Date: Mon, 2 Sep 2024 00:00:45 +0800
Subject: [PATCH 22/27] =?UTF-8?q?Update:VCB=E8=BE=85=E5=8A=A9=E6=95=B4?=
=?UTF-8?q?=E7=90=86=E6=8F=92=E4=BB=B6=E6=8F=90=E9=AB=98=E8=AF=86=E5=88=AB?=
=?UTF-8?q?=E7=8E=87&Fix?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
package.json | 3 +-
plugins/vcbanimemonitor/__init__.py | 65 ++++++-----------
plugins/vcbanimemonitor/remeta.py | 109 +++++++++++++++-------------
3 files changed, 83 insertions(+), 94 deletions(-)
diff --git a/package.json b/package.json
index f2db2d8..de920a7 100644
--- a/package.json
+++ b/package.json
@@ -317,13 +317,14 @@
},
"VCBAnimeMonitor": {
"name": "整理VCB动漫压制组作品",
- "description": "提高部分VCB-Studio作品的识别准确率,将VCB-Studio的作品统一转移到指定目录同时进行刮削整理",
+ "description": "一款辅助整理&提高识别VCB-Stuido动漫压制组作品的插件",
"labels": "文件整理,识别",
"version": "1.8",
"icon": "vcbmonitor.png",
"author": "pixel@qingwa",
"level": 2,
"history": {
+ "v1.8.2": "提高识别率",
"v1.8.1": "重构插件,测试版",
"v1.8": "增加了元数据刮削开关,升级后需要手动打开,否则默认不刮削",
"v1.7.1": "修复偶尔安装失败问题"
diff --git a/plugins/vcbanimemonitor/__init__.py b/plugins/vcbanimemonitor/__init__.py
index 84c5f86..97ae16c 100644
--- a/plugins/vcbanimemonitor/__init__.py
+++ b/plugins/vcbanimemonitor/__init__.py
@@ -5,6 +5,7 @@ import threading
import time
import traceback
from pathlib import Path
+from time import sleep
from typing import List, Tuple, Dict, Any, Optional
import pytz
import qbittorrentapi
@@ -70,11 +71,11 @@ class VCBAnimeMonitor(_PluginBase):
# 插件名称
plugin_name = "整理VCB动漫压制组作品"
# 插件描述
- plugin_desc = "提高部分VCB-Studio作品的识别准确率,将VCB-Studio的作品统一转移到指定目录同时进行刮削整理"
+ plugin_desc = "一款辅助整理&提高识别VCB-Stuido动漫压制组作品的插件"
# 插件图标
plugin_icon = "vcbmonitor.png"
# 插件版本
- plugin_version = "1.8.1"
+ plugin_version = "1.8.2"
# 插件作者
plugin_author = "pixel@qingwa"
# 作者主页
@@ -88,7 +89,6 @@ class VCBAnimeMonitor(_PluginBase):
# 私有属性
_switch_ova = False
- _high_mode = False
_torrents_path = None
new_save_path = None
qb = None
@@ -142,7 +142,6 @@ class VCBAnimeMonitor(_PluginBase):
self._size = config.get("size") or 0
self._scrape = config.get("scrape")
self._switch_ova = config.get("ova")
- self._high_mode = config.get("high_mode")
self._torrents_path = config.get("torrents_path") or ""
# 停止现有任务
@@ -161,13 +160,16 @@ class VCBAnimeMonitor(_PluginBase):
return
# 启用种子目录监控
- if self._torrents_path is not None and Path(self._torrents_path).exists() and self._enabled:
+ if self._torrents_path and Path(self._torrents_path).exists() and self._enabled:
# 只取第一个目录作为新的保存
- first_path = monitor_dirs[0]
- if SystemUtils.is_windows():
- self.new_save_path = first_path.split(':')[0] + ":" + first_path.split(':')[1]
- else:
- self.new_save_path = first_path.split(':')[0]
+ try:
+ first_path = monitor_dirs[0]
+ if SystemUtils.is_windows():
+ self.new_save_path = first_path.split(':')[0] + ":" + first_path.split(':')[1]
+ else:
+ self.new_save_path = first_path.split(':')[0]
+ except Exception:
+ logger.error(f"目录保存失败,请检查输入目录是否合法")
# print(self.new_save_path)
try:
observer = Observer()
@@ -288,7 +290,6 @@ class VCBAnimeMonitor(_PluginBase):
"size": self._size,
"scrape": self._scrape,
"ova": self._switch_ova,
- "high_mode": self._high_mode,
"torrents_path": self._torrents_path
})
@@ -388,7 +389,7 @@ class VCBAnimeMonitor(_PluginBase):
logger.warn("不属于VCB的作品,不处理!")
return
- remeta = ReMeta(ova_switch=self._switch_ova, )
+ remeta = ReMeta(ova_switch=self._switch_ova,)
file_meta = remeta.handel_file(file_path=file_path)
if file_meta:
if not file_meta.name:
@@ -397,15 +398,6 @@ class VCBAnimeMonitor(_PluginBase):
if remeta.is_ova and not self._switch_ova:
logger.warn(f"{file_path.name} 为OVA资源,未开启OVA开关,不处理")
return
- # if remeta.is_ova and self._switch_ova:
- # logger.info(f"{file_path.name} 为OVA资源,开始处理")
- # if self.get_data(key=f"OVA_{file_meta.title}") is not None:
- # ova_history_ep = int(self.get_data(key=f"OVA_{file_meta.title}")) + 1
- # file_meta.begin_episode = ova_history_ep
- # self.save_data(key=f"OVA_{file_meta.title}", value=ova_history_ep)
- # else:
- # file_meta.begin_episode = 1
- # self.save_data(key=f"OVA_{file_meta.title}", value=1)
if remeta.is_ova and self._switch_ova:
logger.info(f"{file_path.name} 为OVA资源,开始历史记录处理")
ova_history_ep_list = self.plugindata.get(file_meta.title, [])
@@ -833,22 +825,6 @@ class VCBAnimeMonitor(_PluginBase):
}
]
},
- {
- 'component': 'VCol',
- 'props': {
- 'cols': 12,
- 'md': 4
- },
- 'content': [
- {
- 'component': 'VSwitch',
- 'props': {
- 'model': 'high_mode',
- 'label': '高性能处理模式',
- }
- }
- ]
- },
{
'component': 'VCol',
'props': {
@@ -1003,7 +979,7 @@ class VCBAnimeMonitor(_PluginBase):
'props': {
'model': 'monitor_dirs',
'label': '监控目录',
- 'rows': 5,
+ 'rows': 4,
'placeholder': '每一行一个目录,支持以下几种配置方式,转移方式支持 move、copy、link、softlink、rclone_copy、rclone_move:\n'
'监控目录\n'
'监控目录#转移方式\n'
@@ -1051,8 +1027,10 @@ class VCBAnimeMonitor(_PluginBase):
'props': {
'type': 'info',
'variant': 'tonal',
- 'text': '核心用法与目录同步插件相同,不同点在于只识别处理VCB-Studio资源,\n'
- '不处理SPs目录下的文件,OVA/OAD集数根据入库顺序累加命名,不保证与TMDB集数匹配'
+ 'text': '核心用法与目录同步插件相同,不同点在于只识别处理VCB-Studio资源。'
+ '默认不处理SPs、CDs、SCans目录下的文件,OVA/OAD集数暂时根据入库顺序累加命名,'
+ '因此不保证与TMDB集数匹配。部分季度以罗马音音译为名的作品暂时无法识别出准确季度。'
+ '有想法,有问题欢迎点击插件作者主页提issue!'
}
}
]
@@ -1073,9 +1051,9 @@ class VCBAnimeMonitor(_PluginBase):
'props': {
'type': 'info',
'variant': 'tonal',
- 'text': '最佳使用方式:监控目录单独设置一个作为保存VCB-Studio资源的目录,\n'
- '填入监控种子目录,开启后会将正在QB(仅支持QB)下载器内的VCB-Studio资源转移到监控目录实现自动整理('
- '仅支持第一个监控目录),\n'
+ 'text': '最佳使用方式:监控目录单独设置一个作为保存VCB-Studio资源的目录,'
+ '填入监控种子目录,开启后会将正在QB(仅支持QB)下载器内正在下载的VCB-Studio资源转移到监控目录实现自动整理('
+ '仅支持第一个监控目录),'
'监控种子目录为空则不转移文件'
}
}
@@ -1097,7 +1075,6 @@ class VCBAnimeMonitor(_PluginBase):
"cron": "",
"size": 0,
"ova": False,
- "high_mode": False,
"torrents_path": "",
}
diff --git a/plugins/vcbanimemonitor/remeta.py b/plugins/vcbanimemonitor/remeta.py
index 5b8a659..260e17f 100644
--- a/plugins/vcbanimemonitor/remeta.py
+++ b/plugins/vcbanimemonitor/remeta.py
@@ -4,6 +4,7 @@ from dataclasses import dataclass
from pathlib import Path
from typing import List
from app.chain.media import MediaChain
+from app.chain.tmdb import TmdbChain
from app.core.metainfo import MetaInfoPath
from app.log import logger
from app.schemas import MediaType
@@ -33,6 +34,11 @@ final_season_patterns = [
re.compile(r'\sFinal')
]
+movie_patterns = [
+ re.compile("Movie", re.IGNORECASE),
+ re.compile("the Movie", re.IGNORECASE),
+]
+
@dataclass
class VCBMetaBase:
@@ -52,6 +58,8 @@ class VCBMetaBase:
ep: int = None
# 是否是OVA/OAD
is_ova: bool = False
+ # TMDB ID
+ tmdb_id: int = None
blocked_words = ["vcb-studio", "360p", "480p", "720p", "1080p", "2160p", "hdr", "x265", "x264", "aac", "flac"]
@@ -83,7 +91,8 @@ class ReMeta:
self.vcb_meta.original_title = file_name
if not self.is_tv(file_name):
logger.warn(
- "不符合VCB-Studio的剧集命名规范,归类为电影,跳过剧集模块处理。注意:年份较为久远的作品可能会判断错误")
+ "不符合VCB-Studio的剧集命名规范,归类为电影,跳过剧集模块处理。注意:年份较为久远的作品可能在此会判断错误")
+ self.parse_movie()
else:
self.tv_mode()
self.is_ova = self.vcb_meta.is_ova
@@ -95,6 +104,8 @@ class ReMeta:
meta.begin_episode = self.vcb_meta.ep
if self.vcb_meta.type == "Movie":
meta.type = MediaType.MOVIE
+ else:
+ meta.type = MediaType.TV
return meta
def split_season_ep(self):
@@ -179,7 +190,8 @@ class ReMeta:
self.vcb_meta.is_ova = True
# 直接获取数字
self.vcb_meta.ep = int(re.search(r"\d+", ep).group()) or 1
- logger.info(f"识别出集数为{self.vcb_meta.ep}")
+ logger.info(f"OVA模式下识别出集数为{self.vcb_meta.ep}")
+ self.vcb_meta.season = 0
return
def culling_blocked_words(self):
@@ -192,42 +204,53 @@ class ReMeta:
def handle_final_season(self):
- meta, medias = MediaChain().search(title=self.vcb_meta.title)
+ _, medias = MediaChain().search(title=self.vcb_meta.title)
if not medias:
logger.warning("匹配到最终季时无法找到对应的媒体信息!季度返回默认值:1")
self.vcb_meta.season = 1
return
- max_season_number = 1
- # 当没有季度参考时用评分来决定
- vote_average = 0
- season_info = False
- for media in medias:
- if media.type != MediaType.TV:
- logger.info(f"搜索到的: {media.title}, 媒体类型为 {media.type},跳过")
- continue
- if media.season_info:
- season_info = True
- last_season_number = int(media.season_info[-1].get("season_number", 1))
- if last_season_number > max_season_number:
- max_season_number = last_season_number
- else:
- logger.info(f"媒体: {media.title} 没有季信息,跳过")
- if not season_info:
- # 备用方案
- for media in medias:
- if media.seasons:
- seasons: dict
- # 获取最大的键,即最大季度
- last_season_number = max(media.seasons.keys())
- if last_season_number > max_season_number:
- max_season_number = last_season_number
- logger.info(f"获取到最终季,季度为 {max_season_number},标题为 {media.title},年份为 {media.year}")
- else:
- logger.info(f"媒体: {media.title} 没有季信息,跳过")
+ filter_medias = [media for media in medias if media.type == MediaType.TV]
+ if not filter_medias:
+ logger.warning("匹配到最终季时无法找到对应的媒体信息!季度返回默认值:1")
+ self.vcb_meta.season = 1
+ return
+ medias = [media for media in filter_medias if media.popularity or media.vote_average]
+ if not medias:
+ logger.warning("匹配到最终季时无法找到对应的媒体信息!季度返回默认值:1")
+ self.vcb_meta.season = 1
+ return
+ # 获取欢迎度最高或者评分最高的媒体
+ medias_sorted = sorted(medias, key=lambda x: x.popularity or x.vote_average, reverse=True)[0]
+ self.vcb_meta.tmdb_id = medias_sorted.tmdb_id
+ if medias_sorted.tmdb_id:
+ seasons_info = TmdbChain().tmdb_seasons(tmdbid=medias_sorted.tmdb_id)
+ if seasons_info:
+ self.vcb_meta.season = len(seasons_info)
+ logger.info(f"获取到最终季度,季度为{self.vcb_meta.season}")
+ return
+ logger.warning("无法获取到最终季度信息,季度返回默认值:1")
+ self.vcb_meta.season = 1
+
+
+
+ def parse_movie(self):
+ logger.info("开始尝试剧场版模式解析")
+ for pattern in movie_patterns:
+ if pattern.search(self.vcb_meta.title):
+ logger.info("命中剧场版匹配规则,加上剧场版标识辅助识别")
+ self.vcb_meta.type = "Movie"
+ self.vcb_meta.title = pattern.sub("", self.vcb_meta.title).strip()
+ self.vcb_meta.title = self.vcb_meta.title
+ return
+
+ def find_ova_episode(self):
+ """
+ 搜索OVA的集数
+ TODO:模糊匹配OVA的集数
+ """
+ pass
- self.vcb_meta.season = max_season_number
- logger.info(f"获取到最终季,季度为 {self.vcb_meta.season}")
@staticmethod
def roman_to_int(s) -> int:
@@ -250,21 +273,9 @@ class ReMeta:
return total
-def test(title: str):
- # 示例文件名
- pre_title = title
- # 提取方括号内的内容,不包括方括号
- content = re.findall(r'\[(.*?)\]', pre_title)
-
- print(content)
-
-
-if __name__ == '__main__':
- # title = "[BeanSub&VCB-Studio] Jujutsu Kaisen [26][Ma10p_1080p][x265_flac].mkv "
- # test(title)
-
- ReMeta(
- ova_switch=True,
- ).handel_file(Path(
- r"[Nekomoe kissaten&VCB-Studio] Fruits Basket The Final [08][Ma10p_1080p][x265_flac].mkv"))
+# if __name__ == '__main__':
+# ReMeta(
+# ova_switch=True,
+# ).handel_file(Path(
+# r"[Airota&Nekomoe kissaten&VCB-Studio] Yuru Camp [Heya Camp EP00][Ma10p_1080p][x265_flac].mkv"))
From 0265a2dc122eac0fbbe356ace88e632c31d1b569 Mon Sep 17 00:00:00 2001
From: Pixel-LH <2569646547@qq.com>
Date: Mon, 2 Sep 2024 00:16:14 +0800
Subject: [PATCH 23/27] =?UTF-8?q?update:=E6=9B=B4=E6=96=B0=E6=95=B4?=
=?UTF-8?q?=E7=90=86VCB=E5=8A=A8=E6=BC=AB=E5=8E=8B=E5=88=B6=E7=BB=84?=
=?UTF-8?q?=E4=BD=9C=E5=93=81=E6=8F=92=E4=BB=B6=E7=89=88=E6=9C=AC=E5=8F=B7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index de920a7..06d08c8 100644
--- a/package.json
+++ b/package.json
@@ -319,7 +319,7 @@
"name": "整理VCB动漫压制组作品",
"description": "一款辅助整理&提高识别VCB-Stuido动漫压制组作品的插件",
"labels": "文件整理,识别",
- "version": "1.8",
+ "version": "1.8.2",
"icon": "vcbmonitor.png",
"author": "pixel@qingwa",
"level": 2,
From 6112d2989f5350705300c64565ce60c3ab628a62 Mon Sep 17 00:00:00 2001
From: Pixel-LH <2569646547@qq.com>
Date: Mon, 2 Sep 2024 01:00:30 +0800
Subject: [PATCH 24/27] =?UTF-8?q?fix:ova/oad=E9=9B=86=E6=95=B0=E7=B4=AF?=
=?UTF-8?q?=E5=8A=A0=E5=BC=82=E5=B8=B8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
plugins/vcbanimemonitor/__init__.py | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/plugins/vcbanimemonitor/__init__.py b/plugins/vcbanimemonitor/__init__.py
index 97ae16c..be92c38 100644
--- a/plugins/vcbanimemonitor/__init__.py
+++ b/plugins/vcbanimemonitor/__init__.py
@@ -400,20 +400,21 @@ class VCBAnimeMonitor(_PluginBase):
return
if remeta.is_ova and self._switch_ova:
logger.info(f"{file_path.name} 为OVA资源,开始历史记录处理")
- ova_history_ep_list = self.plugindata.get(file_meta.title, [])
- if ova_history_ep_list:
+ ova_history_ep_list = self.get_data(file_meta.title)
+ if ova_history_ep_list and isinstance(ova_history_ep_list, list):
ep = file_meta.begin_episode
if ep in ova_history_ep_list:
for i in range(1, 100):
if ep + i not in ova_history_ep_list:
ova_history_ep_list.append(ep + i)
file_meta.begin_episode = ep + i
+ logger.info(f"{file_path.name} 为OVA资源,历史记录中已存在,自动识别为第{ep + i}集")
break
else:
ova_history_ep_list.append(ep)
- self.plugindata.put(file_meta.title, ova_history_ep_list)
+ self.save_data(file_meta.title, ova_history_ep_list)
else:
- self.plugindata.put(file_meta.title, [file_meta.begin_episode])
+ self.save_data(file_meta.title, [file_meta.begin_episode])
else:
return
From 6d68d3c3b03702e647cc522eeefef8520403f17f Mon Sep 17 00:00:00 2001
From: Pixel-LH <2569646547@qq.com>
Date: Mon, 2 Sep 2024 22:40:29 +0800
Subject: [PATCH 25/27] =?UTF-8?q?update:=E4=BF=AE=E5=A4=8D=E6=97=A5?=
=?UTF-8?q?=E5=BF=97=E8=BE=93=E5=87=BA&=E5=90=8C=E6=AD=A5=E7=9B=AE?=
=?UTF-8?q?=E5=BD=95=E7=9B=91=E6=8E=A7=E6=8F=92=E4=BB=B6=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
package.json | 3 +-
plugins/vcbanimemonitor/__init__.py | 49 ++++++++++++++++++++---------
plugins/vcbanimemonitor/remeta.py | 11 +++++--
3 files changed, 45 insertions(+), 18 deletions(-)
diff --git a/package.json b/package.json
index 06d08c8..b9bac71 100644
--- a/package.json
+++ b/package.json
@@ -319,11 +319,12 @@
"name": "整理VCB动漫压制组作品",
"description": "一款辅助整理&提高识别VCB-Stuido动漫压制组作品的插件",
"labels": "文件整理,识别",
- "version": "1.8.2",
+ "version": "1.8.2.1",
"icon": "vcbmonitor.png",
"author": "pixel@qingwa",
"level": 2,
"history": {
+ "v1.8.2.1": "修复日志输出&同步目录监控插件功能",
"v1.8.2": "提高识别率",
"v1.8.1": "重构插件,测试版",
"v1.8": "增加了元数据刮削开关,升级后需要手动打开,否则默认不刮削",
diff --git a/plugins/vcbanimemonitor/__init__.py b/plugins/vcbanimemonitor/__init__.py
index be92c38..5558f60 100644
--- a/plugins/vcbanimemonitor/__init__.py
+++ b/plugins/vcbanimemonitor/__init__.py
@@ -15,6 +15,7 @@ from watchdog.events import FileSystemEventHandler
from watchdog.observers import Observer
from watchdog.observers.polling import PollingObserver
from app import schemas
+from app.chain.media import MediaChain
from app.chain.tmdb import TmdbChain
from app.chain.transfer import TransferChain
from app.core.config import settings
@@ -75,7 +76,7 @@ class VCBAnimeMonitor(_PluginBase):
# 插件图标
plugin_icon = "vcbmonitor.png"
# 插件版本
- plugin_version = "1.8.2"
+ plugin_version = "1.8.2.1"
# 插件作者
plugin_author = "pixel@qingwa"
# 作者主页
@@ -97,6 +98,7 @@ class VCBAnimeMonitor(_PluginBase):
downloadhis = None
transferchian = None
tmdbchain = None
+ mediaChain = None
_observer = []
_enabled = False
_notify = False
@@ -123,6 +125,7 @@ class VCBAnimeMonitor(_PluginBase):
self.transferhis = TransferHistoryOper()
self.downloadhis = DownloadHistoryOper()
self.transferchian = TransferChain()
+ self.mediaChain = MediaChain()
self.tmdbchain = TmdbChain()
# 清空配置
self._dirconf = {}
@@ -180,7 +183,7 @@ class VCBAnimeMonitor(_PluginBase):
observer.start()
logger.info(f"{self._torrents_path} 的种子目录监控服务启动,开启监控新增的VCB-Studio种子文件")
except Exception as e:
- logger.error(f"{self._torrents_path} 启动种子目录监控失败:{str(e)}")
+ logger.debug(f"{self._torrents_path} 启动种子目录监控失败:{str(e)}")
else:
logger.info("种子目录为空,不转移qb中正在下载的VCB-Studio文件")
@@ -375,21 +378,30 @@ class VCBAnimeMonitor(_PluginBase):
logger.debug(f"{event_path} 不是媒体文件")
return
+ # 判断是不是蓝光目录
+ bluray_flag = False
+ if re.search(r"BDMV[/\\]STREAM", event_path, re.IGNORECASE):
+ bluray_flag = True
+ # 截取BDMV前面的路径
+ blurray_dir = event_path[:event_path.find("BDMV")]
+ file_path = Path(blurray_dir)
+ logger.info(f"{event_path} 是蓝光目录,更正文件路径为:{str(file_path)}")
+
# 查询历史记录,已转移的不处理
if self.transferhis.get_by_src(str(file_path)):
logger.info(f"{file_path} 已整理过")
return
# 元数据
- if file_path.parent.name in ["SPs", "Scans", "CDs"]:
- logger.warn("位于特典等其他特殊目录下,跳过处理")
+ if file_path.parent.name.lower() in ["sps", "scans", "cds", "previews", "extras"]:
+ logger.warn("位于特典或其他特殊目录下,跳过处理")
return
if 'VCB-Studio' not in file_path.stem.strip():
logger.warn("不属于VCB的作品,不处理!")
return
- remeta = ReMeta(ova_switch=self._switch_ova,)
+ remeta = ReMeta(ova_switch=self._switch_ova)
file_meta = remeta.handel_file(file_path=file_path)
if file_meta:
if not file_meta.name:
@@ -408,14 +420,14 @@ class VCBAnimeMonitor(_PluginBase):
if ep + i not in ova_history_ep_list:
ova_history_ep_list.append(ep + i)
file_meta.begin_episode = ep + i
- logger.info(f"{file_path.name} 为OVA资源,历史记录中已存在,自动识别为第{ep + i}集")
+ logger.info(
+ f"{file_path.name} 为OVA资源,历史记录中已存在,自动识别为第{ep + i}集")
break
else:
ova_history_ep_list.append(ep)
self.save_data(file_meta.title, ova_history_ep_list)
else:
self.save_data(file_meta.title, [file_meta.begin_episode])
-
else:
return
@@ -431,14 +443,23 @@ class VCBAnimeMonitor(_PluginBase):
# 根据父路径获取下载历史
download_history = None
- # 按文件全路径查询
- download_file = self.downloadhis.get_file_by_fullpath(str(file_path))
- if download_file:
- download_history = self.downloadhis.get_by_hash(download_file.download_hash)
+ if bluray_flag:
+ # 蓝光原盘,按目录名查询
+ # FIXME 理论上DownloadHistory表中的path应该是全路径,但实际表中登记的数据只有目录名,暂按目录名查询
+ download_history = self.downloadhis.get_by_path(file_path.name)
+ else:
+ # 按文件全路径查询
+ download_file = self.downloadhis.get_file_by_fullpath(str(file_path))
+ if download_file:
+ download_history = self.downloadhis.get_by_hash(download_file.download_hash)
# 识别媒体信息
- mediainfo: MediaInfo = self.chain.recognize_media(meta=file_meta,
- tmdbid=download_history.tmdbid if download_history else None)
+ if download_history and download_history.tmdbid:
+ mediainfo: MediaInfo = self.mediaChain.recognize_media(mtype=MediaType(download_history.type),
+ tmdbid=download_history.tmdbid,
+ doubanid=download_history.doubanid)
+ else:
+ mediainfo: MediaInfo = self.mediaChain.recognize_by_meta(file_meta)
if not mediainfo:
logger.warn(f'未识别到媒体信息,标题:{file_meta.name}')
@@ -628,13 +649,13 @@ class VCBAnimeMonitor(_PluginBase):
if not torrent_path.exists():
return
# 只处理刚刚添加的种子也就是获取正在下载的种子
- logger.info(f"开始转移qb中正在下载的VCB资源,转移目录为:{self.new_save_path}")
# 等待种子文件下载完成
time.sleep(5)
with lock:
torrents = self.qb.get_downloading_torrents()
for torrent in torrents:
if "VCB-Studio" in torrent.name:
+ logger.info(f"开始转移qb中正在下载的VCB资源,转移目录为:{self.new_save_path}")
# 原本存在的暂停的种子不处理
if torrent.state_enum == qbittorrentapi.TorrentState.PAUSED_DOWNLOAD:
continue
diff --git a/plugins/vcbanimemonitor/remeta.py b/plugins/vcbanimemonitor/remeta.py
index 260e17f..add6e32 100644
--- a/plugins/vcbanimemonitor/remeta.py
+++ b/plugins/vcbanimemonitor/remeta.py
@@ -98,14 +98,19 @@ class ReMeta:
self.is_ova = self.vcb_meta.is_ova
meta = MetaInfoPath(file_path)
meta.title = self.vcb_meta.title
+ meta.name = self.vcb_meta.title
meta.en_name = self.vcb_meta.title
- meta.begin_season = self.vcb_meta.season
- if self.vcb_meta.ep:
- meta.begin_episode = self.vcb_meta.ep
+ meta.cn_name = self.vcb_meta.title
if self.vcb_meta.type == "Movie":
meta.type = MediaType.MOVIE
else:
meta.type = MediaType.TV
+ if self.vcb_meta.ep is not None:
+ meta.begin_episode = self.vcb_meta.ep
+ if self.vcb_meta.season is not None:
+ meta.begin_season = self.vcb_meta.season
+ if self.vcb_meta.tmdb_id is not None:
+ meta.tmdbid = self.vcb_meta.tmdb_id
return meta
def split_season_ep(self):
From a5b1e33cebb744b86e596f4f410f29d298e57950 Mon Sep 17 00:00:00 2001
From: thsrite
Date: Tue, 3 Sep 2024 12:38:56 +0800
Subject: [PATCH 26/27] =?UTF-8?q?fix=20=E5=AA=92=E4=BD=93=E5=BA=93?=
=?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=99=A8=E9=80=9A=E7=9F=A5v1.3\n=20=E5=85=BC?=
=?UTF-8?q?=E5=AE=B9=E5=A4=84=E7=90=86Emby=E9=83=A8=E5=88=86=E5=AE=A2?=
=?UTF-8?q?=E6=88=B7=E7=AB=AF=E6=9A=82=E5=81=9C=E9=87=8D=E5=A4=8D=E6=8E=A8?=
=?UTF-8?q?=E9=80=81=E5=81=9C=E6=AD=A2=E6=92=AD=E6=94=BEwebhook=E7=9A=84?=
=?UTF-8?q?=E5=9C=BA=E6=99=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
package.json | 1607 ++++++++++++++--------------
plugins/mediaservermsg/__init__.py | 31 +-
2 files changed, 834 insertions(+), 804 deletions(-)
diff --git a/package.json b/package.json
index b9bac71..e1207bc 100644
--- a/package.json
+++ b/package.json
@@ -1,806 +1,807 @@
{
- "AutoSignIn": {
- "name": "站点自动签到",
- "description": "自动模拟登录、签到站点。",
- "labels": "站点",
- "version": "2.4.2",
- "icon": "signin.png",
- "author": "thsrite",
- "level": 2,
- "history": {
- "v2.4.2": "修复PT时间签到失败问题",
- "v2.4.1": "修复海胆签到失败问题",
- "v2.4": "适配m-team Api地址变化",
- "v2.3.2": "修复YemaPT登录失败,支持YemaPT自动签到",
- "v2.3.1": "修复签到报错问题",
- "v2.3": "优化模拟登录逻辑,支持YemaPT模拟登录",
- "v2.2": "适配馒头最新变化,需要升级至v1.8.5+版本且维护好Authorization",
- "v2.1": "增强API安全性",
- "v2.0": "站点签到时更新站点使用统计信息,需要主程序升级至v1.8.3+版本",
- "v1.9": "支持馒头新架构自动签到"
- }
- },
- "CustomSites": {
- "name": "自定义站点",
- "description": "增加自定义站点为签到和统计使用。",
- "labels": "站点",
- "version": "1.0",
- "icon": "world.png",
- "author": "lightolly",
- "level": 2
- },
- "SiteStatistic": {
- "name": "站点数据统计",
- "description": "自动统计和展示站点数据。",
- "labels": "站点,仪表板",
- "version": "4.0.1",
- "icon": "statistic.png",
- "author": "lightolly",
- "level": 2,
- "history": {
- "v4.0.1": "修复PTT的魔力值统计",
- "v4.0": "修复插件数据页异常",
- "v3.9.3": "修复PTT的用户等级统计",
- "v3.9.2": "修复YemaPT的上传下载统计错误",
- "v3.9.1": "修复mteam域名地址",
- "v3.9": "修复YemaPT站点数据统计",
- "v3.8": "适配m-team Api地址变化",
- "v3.7": "修复观众做种数据统计",
- "v3.6": "支持站点数据统计刷新后触发插件事件",
- "v3.5": "站点数据统计支持YemaPT",
- "v3.4": "修复馒头站点数据统计",
- "v3.3": "支持选择仪表板组件规格",
- "v3.2": "支持在仪表板中显示站点统计信息,需要主程序升级至v1.8.7+版本",
- "v3.1": "修复观众无法统计做总数和做种体积的bug",
- "v3.0": "适配馒头数据统计,需要升级至v1.8.5+版本,且在站点信息中维护好API Key",
- "v2.9": "增强API安全性",
- "v2.8": "修复馒头未读消息统计",
- "v2.7": "修复憨憨种子信息只统计第一页的问题,增加移除失效统计选项",
- "v2.6": "支持馒头新架构数据统计"
- }
- },
- "SiteRefresh": {
- "name": "站点自动更新",
- "description": "使用浏览器模拟登录站点获取Cookie和UA。",
- "labels": "站点",
- "version": "1.2",
- "icon": "Chrome_A.png",
- "author": "thsrite",
- "level": 2
- },
- "DoubanSync": {
- "name": "豆瓣想看",
- "description": "同步豆瓣想看数据,自动添加订阅。",
- "labels": "订阅",
- "version": "1.8",
- "icon": "douban.png",
- "author": "jxxghp",
- "level": 2,
- "history": {
- "v1.8": "不同步在看条目",
- "v1.7": "增强API安全性",
- "v1.6": "同步历史记录支持手动删除,需要主程序升级至v1.8.4+版本",
- "v1.5": "豆瓣信息识别后直接添加订阅,不进行搜索下载"
- }
- },
- "DirMonitor": {
- "name": "目录监控",
- "description": "监控目录文件发生变化时实时整理到媒体库。",
- "labels": "文件整理",
- "version": "2.4",
- "icon": "directory.png",
- "author": "jxxghp",
- "level": 1,
- "history": {
- "v2.4": "修复目录监控不使用ChatGPT辅助识别问题",
- "v2.3": "特殊场景下补充转移成功历史记录",
- "v2.2": "更新目录设置说明",
- "v2.1": "增加了元数据刮削开关,升级后需要手动打开,否则默认不刮削",
- "v2.0": "增强API安全性",
- "v1.9": "修复目录监控不能正确获取下载历史记录进行识别的问题"
- }
- },
- "ChineseSubFinder": {
- "name": "ChineseSubFinder",
- "description": "整理入库时通知ChineseSubFinder下载字幕。",
- "labels": "字幕",
- "version": "1.1",
- "icon": "chinesesubfinder.png",
- "author": "jxxghp",
- "level": 1
- },
- "DoubanRank": {
- "name": "豆瓣榜单订阅",
- "description": "监控豆瓣热门榜单,自动添加订阅。",
- "labels": "订阅",
- "version": "1.9.1",
- "icon": "movie.jpg",
- "author": "jxxghp",
- "level": 2,
- "history": {
- "v1.9.1": "优化媒体类型的判断处理",
- "v1.9": "增强API安全性",
- "v1.8": "订阅历史记录支持手动删除,需要主程序升级至v1.8.4+版本"
- }
- },
- "LibraryScraper": {
- "name": "媒体库刮削",
- "description": "定时对媒体库进行刮削,补齐缺失元数据和图片。",
- "labels": "刮削",
- "version": "1.5",
- "icon": "scraper.png",
- "author": "jxxghp",
- "level": 1,
- "history": {
- "v1.5": "修复未获取fanart图片的问题",
- "v1.4.1": "修复nfo文件读取失败时任务中断问题"
- }
- },
- "TorrentRemover": {
- "name": "自动删种",
- "description": "自动删除下载器中的下载任务。",
- "labels": "做种",
- "version": "1.2.2",
- "icon": "delete.jpg",
- "author": "jxxghp",
- "level": 2
- },
- "MediaSyncDel": {
- "name": "媒体文件同步删除",
- "description": "同步删除历史记录、源文件和下载任务。",
- "labels": "文件整理",
- "version": "1.7",
- "icon": "mediasyncdel.png",
- "author": "thsrite",
- "level": 1,
- "history": {
- "v1.7": "修复重新整理被一并删除问题",
- "v1.6": "修复删除辅种",
- "v1.5": "支持手动删除订阅历史记录(本次更新之后的历史)"
- }
- },
- "CustomHosts": {
- "name": "自定义Hosts",
- "description": "修改系统hosts文件,加速网络访问。",
- "labels": "网络",
- "version": "1.2",
- "icon": "hosts.png",
- "author": "thsrite",
- "level": 1,
- "history": {
- "v1.2": "支持写入注释",
- "v1.1": "关闭插件时自动恢复系统hosts"
- }
- },
- "SpeedLimiter": {
- "name": "播放限速",
- "description": "外网播放媒体库视频时,自动对下载器进行限速。",
- "labels": "网络",
- "version": "1.2",
- "icon": "Librespeed_A.png",
- "author": "Shurelol",
- "level": 1,
- "history": {
- "v1.2": "增加不限速路径配置,以应对网盘直链播放的情况"
- }
- },
- "CloudflareSpeedTest": {
- "name": "Cloudflare IP优选",
- "description": "🌩 测试 Cloudflare CDN 延迟和速度,自动优选IP。",
- "labels": "网络,站点",
- "version": "1.4",
- "icon": "cloudflare.jpg",
- "author": "thsrite",
- "level": 1,
- "history": {
- "v1.4": "修复立即运行一次",
- "v1.3": "调整插件开启状态判断条件",
- "v1.2": "增强API安全性"
- }
- },
- "BestFilmVersion": {
- "name": "收藏洗版",
- "description": "Jellyfin/Emby/Plex点击收藏电影后,自动订阅洗版。",
- "labels": "订阅",
- "version": "2.2",
- "icon": "like.jpg",
- "author": "wlj",
- "level": 2,
- "history": {
- "v2.3": "修复定时任务运行问题,Jellyfin的Webhook需要主程序大于1.8.7才能正常订阅。",
- "v2.2": "修复运行报错问题"
- }
- },
- "MediaServerMsg": {
- "name": "媒体库服务器通知",
- "description": "发送Emby/Jellyfin/Plex服务器的播放、入库等通知消息。",
- "labels": "消息通知,媒体库",
- "version": "1.2",
- "icon": "mediaplay.png",
- "author": "jxxghp",
- "level": 1,
- "history": {
- "v1.2": "播放通知增加超链接跳转(需要v1.9.4+)"
- }
- },
- "MediaServerRefresh": {
- "name": "媒体库服务器刷新",
- "description": "入库后自动刷新Emby/Jellyfin/Plex服务器海报墙。",
- "labels": "媒体库",
- "version": "1.2",
- "icon": "refresh2.png",
- "author": "jxxghp",
- "level": 1
- },
- "WebHook": {
- "name": "Webhook",
- "description": "事件发生时向第三方地址发送请求。",
- "version": "1.0",
- "icon": "webhook.png",
- "author": "jxxghp",
- "level": 1
- },
- "ChatGPT": {
- "name": "ChatGPT",
- "description": "消息交互支持与ChatGPT对话。",
- "labels": "消息通知,识别",
- "version": "1.3",
- "icon": "Chatgpt_A.png",
- "author": "jxxghp",
- "level": 1
- },
- "NAStoolSync": {
- "name": "历史记录同步",
- "description": "同步NAStool历史记录、下载记录、插件记录到MoviePilot。",
- "version": "1.0",
- "icon": "Nastools_A.png",
- "author": "thsrite",
- "level": 1
- },
- "MessageForward": {
- "name": "消息转发",
- "description": "根据正则转发通知到其他WeChat应用。",
- "labels": "消息通知",
- "version": "1.1",
- "icon": "forward.png",
- "author": "thsrite",
- "level": 1
- },
- "AutoBackup": {
- "name": "自动备份",
- "description": "自动备份数据和配置文件。",
- "labels": "系统设置",
- "version": "1.3",
- "icon": "Time_machine_B.png",
- "author": "thsrite",
- "level": 1,
- "history": {
- "v1.3": "去除已废弃的环境变量引用",
- "v1.2": "增强API安全性"
- }
- },
- "IYUUAutoSeed": {
- "name": "IYUU自动辅种",
- "description": "基于IYUU官方Api实现自动辅种。",
- "labels": "做种,IYUU",
- "version": "1.9.5",
- "icon": "IYUU.png",
- "author": "jxxghp",
- "level": 2,
- "history": {
- "v1.9.5": "Revert qBittorrent跳检之后自动开始",
- "v1.9.4": "修复qBittorrent辅种后不会自动开始做种",
- "v1.9.3": "修复Monika因缺少rsskey,种子下载失败的问题",
- "v1.9.2": "适配馒头使用API下载种子",
- "v1.9.1": "支持自定义辅种的种子分类",
- "v1.9": "支持自定义辅种后标签,支持将站点名作为标签",
- "v1.8.2": "qBittorrent 支持跳过校验",
- "v1.8.1": "判断辅种失败的情况下,是否是由于token未进行站点绑定导致的",
- "v1.8": "适配新版本IYUU开发版",
- "v1.7": "适配馒头最新变化,需要升级至v1.8.5+版本且维护好Authorization",
- "v1.6": "增加不辅种小体积种子功能",
- "v1.5": "支持馒头新架构辅种"
- }
- },
- "CrossSeed": {
- "name": "青蛙辅种助手",
- "description": "参考ReseedPuppy和IYUU辅种插件实现自动辅种,支持站点:青蛙、AGSVPT、麒麟、UBits、聆音、憨憨等。",
- "labels": "做种",
- "version": "2.3",
- "icon": "qingwa.png",
- "author": "233@qingwa",
- "level": 2,
- "history": {
- "v2.2": "站点停用后会同步暂停对该站点的辅种",
- "v2.3": "站点辅种支持代理"
- }
- },
- "VCBAnimeMonitor": {
- "name": "整理VCB动漫压制组作品",
- "description": "一款辅助整理&提高识别VCB-Stuido动漫压制组作品的插件",
- "labels": "文件整理,识别",
- "version": "1.8.2.1",
- "icon": "vcbmonitor.png",
- "author": "pixel@qingwa",
- "level": 2,
- "history": {
- "v1.8.2.1": "修复日志输出&同步目录监控插件功能",
- "v1.8.2": "提高识别率",
- "v1.8.1": "重构插件,测试版",
- "v1.8": "增加了元数据刮削开关,升级后需要手动打开,否则默认不刮削",
- "v1.7.1": "修复偶尔安装失败问题"
- }
- },
- "TorrentTransfer": {
- "name": "自动转移做种",
- "description": "定期转移下载器中的做种任务到另一个下载器。",
- "labels": "做种",
- "version": "1.5",
- "icon": "seed.png",
- "author": "jxxghp",
- "level": 2,
- "history": {
- "v1.5":"修复在转移时只保留了第一个tracker,导致红种问题。此修复确保保留所有的tracker,以提高在不同网络条件下的可达性。",
- "v1.4": "支持自动删除源下载器在目的下载器中存在的种子"
- }
- },
- "RssSubscribe": {
- "name": "自定义订阅",
- "description": "定时刷新RSS报文,识别内容后添加订阅或直接下载。",
- "labels": "订阅",
- "version": "1.5",
- "icon": "rss.png",
- "author": "jxxghp",
- "level": 2,
- "history": {
- "v1.5": "支持按种子大小过滤种子",
- "v1.4": "修复剧集本地是否存在的判断错误问题",
- "v1.3": "支持手动删除订阅历史记录"
- }
- },
- "SyncDownloadFiles": {
- "name": "下载器文件同步",
- "description": "同步下载器的文件信息到数据库,删除文件时联动删除下载任务。",
- "labels": "下载管理",
- "version": "1.1.1",
- "icon": "Youtube-dl_A.png",
- "author": "thsrite",
- "level": 1,
- "history": {
- "v1.1.1": "修复时区问题导致的上次同步后8h内的种子不同步的问题"
- }
- },
- "BrushFlow": {
- "name": "站点刷流",
- "description": "自动托管刷流,将会提高对应站点的访问频率。",
- "labels": "刷流,仪表板",
- "version": "3.7",
- "icon": "brush.jpg",
- "author": "jxxghp,InfinityPacer",
- "level": 2,
- "history": {
- "v3.7": "下载数量调整为仅获取刷流标签种子并修复了一些细节问题",
- "v3.6": "优化检查服务中的时间管控",
- "v3.5": "移除「删种排除MoviePilot任务」配置项(请使用「删除排除标签」替代),完善刷流任务触发插件事件相关逻辑(联动H&R助手)",
- "v3.4": "移除「记录更多日志」配置项并调整为DEBUG日志,支持「删除排除标签」配置项,增加刷流任务时支持触发插件事件(联动H&R助手)",
- "v3.3": "支持QB删除种子时强制汇报Tracker,站点独立配置增加「站点全局H&R」配置项",
- "v3.2": "支持推送QB种子时启用「先下载首尾文件块」选项",
- "v3.1": "支持仪表板显示站点刷流数据,需要主程序升级v1.8.7+版本",
- "v3.0": "优化不同站点刷流到相同种子的逻辑,修复数据页滚动闪烁,部分日志优化",
- "v2.9": "优化动态删除消息推送,优化配置页UI显示及部分配置项,支持配置种子分类以及开启自动分类管理,取消单独适配站点时区逻辑,可通过配置项「pubtime」自行适配",
- "v2.8": "优化UI显示以及提升性能",
- "v2.7": "动态删除种子规则调整(请注意查阅插件文档),站点独立配置样式优化、日志优化,修复部分配置项无法配置小数的问题,修复部分场景可能导致重复下载的问题",
- "v2.6": "修复排除订阅功能",
- "v2.5": "增加H&R做种时间、下载器监控配置项,刷流前置条件逻辑调整,代理下载种子默认为关闭"
- }
- },
- "DownloadingMsg": {
- "name": "下载进度推送",
- "description": "定时推送正在下载进度。",
- "labels": "消息通知,下载管理",
- "version": "1.1",
- "icon": "downloadmsg.png",
- "author": "thsrite",
- "level": 2
- },
- "AutoClean": {
- "name": "定时清理媒体库",
- "description": "定时清理用户下载的种子、源文件、媒体库文件。",
- "labels": "媒体库",
- "version": "1.1",
- "icon": "clean.png",
- "author": "thsrite",
- "level": 2
- },
- "InvitesSignin": {
- "name": "药丸签到",
- "description": "药丸论坛签到。",
- "labels": "站点",
- "version": "1.4",
- "icon": "invites.png",
- "author": "thsrite",
- "level": 2,
- "history": {
- "v1.4": "自定义保留消息天数"
- }
- },
- "PersonMeta": {
- "name": "演职人员刮削",
- "description": "刮削演职人员图片以及中文名称。",
- "labels": "媒体库,刮削",
- "version": "1.4",
- "icon": "actor.png",
- "author": "jxxghp",
- "level": 1,
- "history": {
- "v1.4": "人物图片调整为优先从TMDB获取,避免douban图片CDN加载过慢的问题",
- "v1.3": "修复v1.8.5版本后刮削报错问题"
- }
- },
- "MoviePilotUpdateNotify": {
- "name": "MoviePilot更新推送",
- "description": "MoviePilot推送release更新通知、自动重启。",
- "labels": "消息通知,自动更新",
- "version": "1.4",
- "icon": "Moviepilot_A.png",
- "author": "thsrite",
- "level": 1,
- "history": {
- "v1.4": "兼容更新内容带版本号的情况",
- "v1.3": "增加前端版本更新检查,需要主程序升级至v1.8.4+版本"
- }
- },
- "CloudDiskDel": {
- "name": "云盘文件删除",
- "description": "媒体库删除strm文件后同步删除云盘资源。",
- "labels": "媒体库",
- "version": "1.3",
- "icon": "clouddisk.png",
- "author": "thsrite",
- "level": 1
- },
- "BarkMsg": {
- "name": "Bark消息推送",
- "description": "支持使用Bark发送消息通知。",
- "labels": "消息通知",
- "version": "1.1",
- "icon": "Bark_A.png",
- "author": "jxxghp",
- "level": 1
- },
- "IyuuMsg": {
- "name": "IYUU消息推送",
- "description": "支持使用IYUU发送消息通知。",
- "labels": "消息通知,IYUU",
- "version": "1.2",
- "icon": "Iyuu_A.png",
- "author": "jxxghp",
- "level": 1
- },
- "PushDeerMsg": {
- "name": "PushDeer消息推送",
- "description": "支持使用PushDeer发送消息通知。",
- "labels": "消息通知",
- "version": "1.1",
- "icon": "pushdeer.png",
- "author": "jxxghp",
- "level": 1
- },
- "ConfigCenter": {
- "name": "配置中心",
- "description": "快速调整部分系统设定。",
- "labels": "系统设置",
- "version": "2.6",
- "icon": "setting.png",
- "author": "jxxghp",
- "level": 1,
- "history": {
- "v2.6": "支持DOH相关配置项",
- "v2.5": "增加Github加速服务器设置项"
- }
- },
- "WorkWechatMsg": {
- "name": "企微机器人消息推送",
- "description": "支持使用企业微信群聊机器人发送消息通知。",
- "labels": "消息通知",
- "version": "1.0",
- "icon": "Wecom_A.png",
- "author": "叮叮当",
- "level": 1
- },
- "EpisodeGroupMeta": {
- "name": "TMDB剧集组刮削",
- "description": "从TMDB剧集组刮削季集的实际顺序。",
- "labels": "刮削",
- "version": "1.1",
- "icon": "Element_A.png",
- "author": "叮叮当",
- "level": 1
- },
- "CustomIndexer": {
- "name": "自定义索引站点",
- "description": "修改或扩展内建索引器支持的站点。",
- "labels": "站点",
- "version": "1.0",
- "icon": "spider.png",
- "author": "jxxghp",
- "level": 1
- },
- "FFmpegThumb": {
- "name": "FFmpeg缩略图",
- "description": "TheMovieDb没有背景图片时使用FFmpeg截取视频文件缩略图",
- "labels": "刮削",
- "version": "1.2",
- "icon": "ffmpeg.png",
- "author": "jxxghp",
- "level": 1
- },
- "PushPlusMsg": {
- "name": "PushPlus消息推送",
- "description": "支持使用PushPlus发送消息通知。",
- "labels": "消息通知",
- "version": "1.1",
- "icon": "Pushplus_A.png",
- "author": "cheng",
- "level": 1
- },
- "DownloadSiteTag": {
- "name": "下载任务分类与标签",
- "description": "自动给下载任务分类与打站点标签、剧集名称标签",
- "labels": "下载管理",
- "version": "2.1",
- "icon": "Youtube-dl_B.png",
- "author": "叮叮当",
- "level": 1,
- "history": {
- "v2.1": "修复错误的TmdbHelper模块引用"
- }
- },
- "RemoveLink": {
- "name": "清理硬链接",
- "description": "监控目录内文件被删除时,同步删除监控目录内所有和它硬链接的文件",
- "labels": "文件整理",
- "version": "2.2",
- "icon": "Ombi_A.png",
- "author": "DzAvril",
- "level": 1,
- "history": {
- "v2.2": "修复直接删除文件夹导致的插件崩溃的bug",
- "v2.1": "联动删除历史记录",
- "v2.0": "联动删除种子,需安装插件[下载器助手]并打开监听源文件事件",
- "v1.9": "增加清理刮削文件功能(beta)",
- "v1.8": "增加清理空目录功能(beta)",
- "v1.7": "修复因未监测重命名事件导致的清理硬链接失败的问题",
- "v1.6": "提升插件性能"
- }
- },
- "LinkMonitor": {
- "name": "实时硬链接",
- "description": "监控目录文件变化,实时硬链接。",
- "labels": "文件整理",
- "version": "1.6",
- "icon": "Linkace_C.png",
- "author": "jxxghp",
- "level": 1,
- "history": {
- "v1.6": "增强API安全性"
- }
- },
- "CategoryEditor": {
- "name": "二级分类策略",
- "description": "编辑下载目录和媒体库目录的二级分类规则。",
- "labels": "文件整理",
- "version": "1.2",
- "icon": "Bookstack_A.png",
- "author": "jxxghp",
- "level": 1
- },
- "RemoteIdentifiers": {
- "name": "共享识别词",
- "description": "从Github、Etherpad等远程文件中获取共享识别词并应用。",
- "labels": "识别",
- "version": "2.2",
- "icon": "words.png",
- "author": "honue",
- "level": 1
- },
- "NeoDBSync": {
- "name": "NeoDB 想看",
- "description": "同步 NeoDB 想看条目,自动添加订阅。",
- "labels": "订阅",
- "version": "1.1",
- "icon": "NeoDB.jpeg",
- "author": "hcplantern",
- "level": 1,
- "history": {
- "v1.1": "直接添加订阅,不提前进行搜索下载"
- }
- },
- "PlayletCategory": {
- "name": "短剧自动分类",
- "description": "网络短剧自动整理到独立的分类目录。",
- "labels": "文件整理",
- "version": "2.0",
- "icon": "Amule_A.png",
- "author": "jxxghp",
- "level": 1,
- "history": {
- "v2.0": "适配新的目录结构变化,短剧分类名称调整为配置目录路径,升级后需要重新调整设置后才能使用。"
- }
- },
- "DiagParamAdjust": {
- "name": "诊断参数调整",
- "description": "Emby专用插件|暂时性解决emby字幕偏移问题,需要emby安装Diagnostics插件。",
- "labels": "Emby",
- "version": "1.3",
- "icon": "Gatus_A.png",
- "author": "jeblove",
- "level": 1
- },
- "QbCommand": {
- "name": "QB远程操作",
- "description": "通过定时任务或交互命令远程操作QB暂停/开始/限速等。",
- "labels": "下载管理,Qbittorrent",
- "version": "1.5",
- "icon": "Qbittorrent_A.png",
- "author": "DzAvril",
- "level": 1,
- "history": {
- "v1.5": "可选特定路径下的做种不会被暂停",
- "v1.4": "可选某些站点不再做种(暂停做种后不会被恢复)"
- }
- },
- "TrCommand": {
- "name": "TR远程操作",
- "description": "通过定时任务或交互命令远程操作TR暂停/开始/限速等。",
- "labels": "下载管理,Transmission",
- "version": "1.1",
- "icon": "Transmission_A.png",
- "author": "Hoey",
- "level": 1
- },
- "IpDetect": {
- "name": "本地IP检测",
- "description": "如果QB、TR等服务在本地部署,当本地IP改变时自动修改其Server IP。",
- "labels": "系统设置",
- "version": "1.1",
- "icon": "ipAddress.png",
- "author": "DzAvril",
- "level": 1
- },
- "TrackerEditor": {
- "name": "Tracker替换",
- "description": "批量替换种子tracker,支持周期性巡检(如为TR,仅支持4.0以上版本)。",
- "labels": "做种",
- "version": "1.5",
- "icon": "trackereditor_A.png",
- "author": "honue",
- "level": 1
- },
- "ContractCheck": {
- "name": "契约检查",
- "description": "定时检查保种契约达成情况。",
- "labels": "做种",
- "version": "1.4",
- "icon": "contract.png",
- "author": "DzAvril",
- "level": 1,
- "history": {
- "v1.4": "支持仪表板组件显示",
- "v1.3": "修复观众做种数据异常问题",
- "v1.2": "修复契约检查无数据返回的问题"
- }
- },
- "FeiShuMsg": {
- "name": "飞书机器人消息通知",
- "description": "支持使用飞书群聊机器人发送消息通知。",
- "labels": "消息通知",
- "version": "1.0",
- "icon": "FeiShu_A.png",
- "author": "InfinityPacer",
- "level": 2
- },
- "IyuuAuth": {
- "name": "IYUU站点绑定",
- "description": "为IYUU账号绑定认证站点,以便用于用户认证和辅种。",
- "labels": "IYUU",
- "version": "1.1",
- "icon": "Iyuu_A.png",
- "author": "jxxghp",
- "level": 1,
- "history": {
- "v1.1": "修复IYUU站点绑定失败问题"
- }
- },
- "NtfyMsg": {
- "name": "ntfy消息推送",
- "description": "支持使用ntfy发送消息通知。",
- "labels": "消息通知",
- "version": "1.0",
- "icon": "Ntfy_A.png",
- "author": "lethargicScribe",
- "level": 1
- },
- "TmdbWallpaper": {
- "name": "登录壁纸本地化",
- "description": "将MoviePilot的登录壁纸下载到本地。",
- "labels": "工具",
- "version": "1.1",
- "icon": "Macos_Sierra.png",
- "author": "jxxghp",
- "level": 1,
- "history": {
- "v1.1": "修复下载Bing每日壁纸时文件名错乱的问题"
- }
- },
- "MPServerStatus": {
- "name": "MoviePilot服务器监控",
- "description": "在仪表板中实时显示MoviePilot公共服务器状态。",
- "labels": "仪表板",
- "version": "1.0",
- "icon": "Duplicati_A.png",
- "author": "jxxghp",
- "level": 1
- },
- "CleanInvalidSeed": {
- "name": "清理QB无效做种",
- "description": "清理已经被站点删除的种子及对应源文件,仅支持QB",
- "labels": "Qbittorrent",
- "version": "2.2",
- "icon": "clean_a.png",
- "author": "DzAvril",
- "level": 1,
- "history": {
- "v2.2": "支持仅标记模式",
- "v2.1": "1. 修复删除无效做种没有tg通知的问题。2. 检测未工作做种排除已暂停做种",
- "v2.0": "修复检测不到无效做种的bug",
- "v1.9": "增加自定义需删除做种的tracker的错误信息",
- "v1.8": "增加远程命令切换全量通知;修复bug",
- "v1.7": "修复因消息内容包含'_'导致telegram API调用失败的问题",
- "v1.6": "修复当种子有多个标签时,通过标签过滤不删除种子会失效的问题",
- "v1.5": "1. 增加通过分类、标签过滤不删除种子功能;2. 全量通知提供更多信息",
- "v1.4": "修复插件功能失效的问题",
- "v1.3": "1. 增加远程命令 2. 根据tracker error_message字段进行过滤,避免误删",
- "v1.2": "修复配置页空白的问题",
- "v1.1": "更新使用说明,以防使用不当误删文件",
- "v1.0": "定时清理已经被站点删除的种子及对应源文件"
- }
- },
- "TrendingShow": {
- "name": "流行趋势轮播",
- "description": "在仪表板中显示流行趋势海报轮播图。",
- "labels": "仪表板",
- "version": "1.3",
- "icon": "TrendingShow.jpg",
- "author": "jxxghp",
- "level": 1,
- "history": {
- "v1.3": "调整组件大小",
- "v1.2": "不同屏幕大小,支持分开设置"
- }
- },
- "DailyWord": {
- "name": "每日一言",
- "description": "在仪表板中显示每日一言卡片。",
- "labels": "仪表板",
- "version": "1.1",
- "icon": "Calibre_B.png",
- "author": "jxxghp",
- "level": 1
- },
- "ZvideoHelper": {
- "name": "极影视助手",
- "description": "极影视功能扩展",
- "labels": "媒体库",
- "version": "1.3",
- "icon": "zvideo.png",
- "author": "DzAvril",
- "level": 1,
- "history": {
- "v1.3": "降低对豆瓣接口的请求频率",
- "v1.2": "修复无法获取豆瓣评分的问题",
- "v1.1": "支持将极影视评分修改为豆瓣评分",
- "v1.0": "同步极影视在看/已看状态到豆瓣"
- }
+ "AutoSignIn": {
+ "name": "站点自动签到",
+ "description": "自动模拟登录、签到站点。",
+ "labels": "站点",
+ "version": "2.4.2",
+ "icon": "signin.png",
+ "author": "thsrite",
+ "level": 2,
+ "history": {
+ "v2.4.2": "修复PT时间签到失败问题",
+ "v2.4.1": "修复海胆签到失败问题",
+ "v2.4": "适配m-team Api地址变化",
+ "v2.3.2": "修复YemaPT登录失败,支持YemaPT自动签到",
+ "v2.3.1": "修复签到报错问题",
+ "v2.3": "优化模拟登录逻辑,支持YemaPT模拟登录",
+ "v2.2": "适配馒头最新变化,需要升级至v1.8.5+版本且维护好Authorization",
+ "v2.1": "增强API安全性",
+ "v2.0": "站点签到时更新站点使用统计信息,需要主程序升级至v1.8.3+版本",
+ "v1.9": "支持馒头新架构自动签到"
}
+ },
+ "CustomSites": {
+ "name": "自定义站点",
+ "description": "增加自定义站点为签到和统计使用。",
+ "labels": "站点",
+ "version": "1.0",
+ "icon": "world.png",
+ "author": "lightolly",
+ "level": 2
+ },
+ "SiteStatistic": {
+ "name": "站点数据统计",
+ "description": "自动统计和展示站点数据。",
+ "labels": "站点,仪表板",
+ "version": "4.0.1",
+ "icon": "statistic.png",
+ "author": "lightolly",
+ "level": 2,
+ "history": {
+ "v4.0.1": "修复PTT的魔力值统计",
+ "v4.0": "修复插件数据页异常",
+ "v3.9.3": "修复PTT的用户等级统计",
+ "v3.9.2": "修复YemaPT的上传下载统计错误",
+ "v3.9.1": "修复mteam域名地址",
+ "v3.9": "修复YemaPT站点数据统计",
+ "v3.8": "适配m-team Api地址变化",
+ "v3.7": "修复观众做种数据统计",
+ "v3.6": "支持站点数据统计刷新后触发插件事件",
+ "v3.5": "站点数据统计支持YemaPT",
+ "v3.4": "修复馒头站点数据统计",
+ "v3.3": "支持选择仪表板组件规格",
+ "v3.2": "支持在仪表板中显示站点统计信息,需要主程序升级至v1.8.7+版本",
+ "v3.1": "修复观众无法统计做总数和做种体积的bug",
+ "v3.0": "适配馒头数据统计,需要升级至v1.8.5+版本,且在站点信息中维护好API Key",
+ "v2.9": "增强API安全性",
+ "v2.8": "修复馒头未读消息统计",
+ "v2.7": "修复憨憨种子信息只统计第一页的问题,增加移除失效统计选项",
+ "v2.6": "支持馒头新架构数据统计"
+ }
+ },
+ "SiteRefresh": {
+ "name": "站点自动更新",
+ "description": "使用浏览器模拟登录站点获取Cookie和UA。",
+ "labels": "站点",
+ "version": "1.2",
+ "icon": "Chrome_A.png",
+ "author": "thsrite",
+ "level": 2
+ },
+ "DoubanSync": {
+ "name": "豆瓣想看",
+ "description": "同步豆瓣想看数据,自动添加订阅。",
+ "labels": "订阅",
+ "version": "1.8",
+ "icon": "douban.png",
+ "author": "jxxghp",
+ "level": 2,
+ "history": {
+ "v1.8": "不同步在看条目",
+ "v1.7": "增强API安全性",
+ "v1.6": "同步历史记录支持手动删除,需要主程序升级至v1.8.4+版本",
+ "v1.5": "豆瓣信息识别后直接添加订阅,不进行搜索下载"
+ }
+ },
+ "DirMonitor": {
+ "name": "目录监控",
+ "description": "监控目录文件发生变化时实时整理到媒体库。",
+ "labels": "文件整理",
+ "version": "2.4",
+ "icon": "directory.png",
+ "author": "jxxghp",
+ "level": 1,
+ "history": {
+ "v2.4": "修复目录监控不使用ChatGPT辅助识别问题",
+ "v2.3": "特殊场景下补充转移成功历史记录",
+ "v2.2": "更新目录设置说明",
+ "v2.1": "增加了元数据刮削开关,升级后需要手动打开,否则默认不刮削",
+ "v2.0": "增强API安全性",
+ "v1.9": "修复目录监控不能正确获取下载历史记录进行识别的问题"
+ }
+ },
+ "ChineseSubFinder": {
+ "name": "ChineseSubFinder",
+ "description": "整理入库时通知ChineseSubFinder下载字幕。",
+ "labels": "字幕",
+ "version": "1.1",
+ "icon": "chinesesubfinder.png",
+ "author": "jxxghp",
+ "level": 1
+ },
+ "DoubanRank": {
+ "name": "豆瓣榜单订阅",
+ "description": "监控豆瓣热门榜单,自动添加订阅。",
+ "labels": "订阅",
+ "version": "1.9.1",
+ "icon": "movie.jpg",
+ "author": "jxxghp",
+ "level": 2,
+ "history": {
+ "v1.9.1": "优化媒体类型的判断处理",
+ "v1.9": "增强API安全性",
+ "v1.8": "订阅历史记录支持手动删除,需要主程序升级至v1.8.4+版本"
+ }
+ },
+ "LibraryScraper": {
+ "name": "媒体库刮削",
+ "description": "定时对媒体库进行刮削,补齐缺失元数据和图片。",
+ "labels": "刮削",
+ "version": "1.5",
+ "icon": "scraper.png",
+ "author": "jxxghp",
+ "level": 1,
+ "history": {
+ "v1.5": "修复未获取fanart图片的问题",
+ "v1.4.1": "修复nfo文件读取失败时任务中断问题"
+ }
+ },
+ "TorrentRemover": {
+ "name": "自动删种",
+ "description": "自动删除下载器中的下载任务。",
+ "labels": "做种",
+ "version": "1.2.2",
+ "icon": "delete.jpg",
+ "author": "jxxghp",
+ "level": 2
+ },
+ "MediaSyncDel": {
+ "name": "媒体文件同步删除",
+ "description": "同步删除历史记录、源文件和下载任务。",
+ "labels": "文件整理",
+ "version": "1.7",
+ "icon": "mediasyncdel.png",
+ "author": "thsrite",
+ "level": 1,
+ "history": {
+ "v1.7": "修复重新整理被一并删除问题",
+ "v1.6": "修复删除辅种",
+ "v1.5": "支持手动删除订阅历史记录(本次更新之后的历史)"
+ }
+ },
+ "CustomHosts": {
+ "name": "自定义Hosts",
+ "description": "修改系统hosts文件,加速网络访问。",
+ "labels": "网络",
+ "version": "1.2",
+ "icon": "hosts.png",
+ "author": "thsrite",
+ "level": 1,
+ "history": {
+ "v1.2": "支持写入注释",
+ "v1.1": "关闭插件时自动恢复系统hosts"
+ }
+ },
+ "SpeedLimiter": {
+ "name": "播放限速",
+ "description": "外网播放媒体库视频时,自动对下载器进行限速。",
+ "labels": "网络",
+ "version": "1.2",
+ "icon": "Librespeed_A.png",
+ "author": "Shurelol",
+ "level": 1,
+ "history": {
+ "v1.2": "增加不限速路径配置,以应对网盘直链播放的情况"
+ }
+ },
+ "CloudflareSpeedTest": {
+ "name": "Cloudflare IP优选",
+ "description": "🌩 测试 Cloudflare CDN 延迟和速度,自动优选IP。",
+ "labels": "网络,站点",
+ "version": "1.4",
+ "icon": "cloudflare.jpg",
+ "author": "thsrite",
+ "level": 1,
+ "history": {
+ "v1.4": "修复立即运行一次",
+ "v1.3": "调整插件开启状态判断条件",
+ "v1.2": "增强API安全性"
+ }
+ },
+ "BestFilmVersion": {
+ "name": "收藏洗版",
+ "description": "Jellyfin/Emby/Plex点击收藏电影后,自动订阅洗版。",
+ "labels": "订阅",
+ "version": "2.2",
+ "icon": "like.jpg",
+ "author": "wlj",
+ "level": 2,
+ "history": {
+ "v2.3": "修复定时任务运行问题,Jellyfin的Webhook需要主程序大于1.8.7才能正常订阅。",
+ "v2.2": "修复运行报错问题"
+ }
+ },
+ "MediaServerMsg": {
+ "name": "媒体库服务器通知",
+ "description": "发送Emby/Jellyfin/Plex服务器的播放、入库等通知消息。",
+ "labels": "消息通知,媒体库",
+ "version": "1.3",
+ "icon": "mediaplay.png",
+ "author": "jxxghp",
+ "level": 1,
+ "history": {
+ "v1.3": "兼容处理Emby部分客户端暂停重复推送停止播放webhook的场景",
+ "v1.2": "播放通知增加超链接跳转(需要v1.9.4+)"
+ }
+ },
+ "MediaServerRefresh": {
+ "name": "媒体库服务器刷新",
+ "description": "入库后自动刷新Emby/Jellyfin/Plex服务器海报墙。",
+ "labels": "媒体库",
+ "version": "1.2",
+ "icon": "refresh2.png",
+ "author": "jxxghp",
+ "level": 1
+ },
+ "WebHook": {
+ "name": "Webhook",
+ "description": "事件发生时向第三方地址发送请求。",
+ "version": "1.0",
+ "icon": "webhook.png",
+ "author": "jxxghp",
+ "level": 1
+ },
+ "ChatGPT": {
+ "name": "ChatGPT",
+ "description": "消息交互支持与ChatGPT对话。",
+ "labels": "消息通知,识别",
+ "version": "1.3",
+ "icon": "Chatgpt_A.png",
+ "author": "jxxghp",
+ "level": 1
+ },
+ "NAStoolSync": {
+ "name": "历史记录同步",
+ "description": "同步NAStool历史记录、下载记录、插件记录到MoviePilot。",
+ "version": "1.0",
+ "icon": "Nastools_A.png",
+ "author": "thsrite",
+ "level": 1
+ },
+ "MessageForward": {
+ "name": "消息转发",
+ "description": "根据正则转发通知到其他WeChat应用。",
+ "labels": "消息通知",
+ "version": "1.1",
+ "icon": "forward.png",
+ "author": "thsrite",
+ "level": 1
+ },
+ "AutoBackup": {
+ "name": "自动备份",
+ "description": "自动备份数据和配置文件。",
+ "labels": "系统设置",
+ "version": "1.3",
+ "icon": "Time_machine_B.png",
+ "author": "thsrite",
+ "level": 1,
+ "history": {
+ "v1.3": "去除已废弃的环境变量引用",
+ "v1.2": "增强API安全性"
+ }
+ },
+ "IYUUAutoSeed": {
+ "name": "IYUU自动辅种",
+ "description": "基于IYUU官方Api实现自动辅种。",
+ "labels": "做种,IYUU",
+ "version": "1.9.5",
+ "icon": "IYUU.png",
+ "author": "jxxghp",
+ "level": 2,
+ "history": {
+ "v1.9.5": "Revert qBittorrent跳检之后自动开始",
+ "v1.9.4": "修复qBittorrent辅种后不会自动开始做种",
+ "v1.9.3": "修复Monika因缺少rsskey,种子下载失败的问题",
+ "v1.9.2": "适配馒头使用API下载种子",
+ "v1.9.1": "支持自定义辅种的种子分类",
+ "v1.9": "支持自定义辅种后标签,支持将站点名作为标签",
+ "v1.8.2": "qBittorrent 支持跳过校验",
+ "v1.8.1": "判断辅种失败的情况下,是否是由于token未进行站点绑定导致的",
+ "v1.8": "适配新版本IYUU开发版",
+ "v1.7": "适配馒头最新变化,需要升级至v1.8.5+版本且维护好Authorization",
+ "v1.6": "增加不辅种小体积种子功能",
+ "v1.5": "支持馒头新架构辅种"
+ }
+ },
+ "CrossSeed": {
+ "name": "青蛙辅种助手",
+ "description": "参考ReseedPuppy和IYUU辅种插件实现自动辅种,支持站点:青蛙、AGSVPT、麒麟、UBits、聆音、憨憨等。",
+ "labels": "做种",
+ "version": "2.3",
+ "icon": "qingwa.png",
+ "author": "233@qingwa",
+ "level": 2,
+ "history": {
+ "v2.2": "站点停用后会同步暂停对该站点的辅种",
+ "v2.3": "站点辅种支持代理"
+ }
+ },
+ "VCBAnimeMonitor": {
+ "name": "整理VCB动漫压制组作品",
+ "description": "一款辅助整理&提高识别VCB-Stuido动漫压制组作品的插件",
+ "labels": "文件整理,识别",
+ "version": "1.8.2.1",
+ "icon": "vcbmonitor.png",
+ "author": "pixel@qingwa",
+ "level": 2,
+ "history": {
+ "v1.8.2.1": "修复日志输出&同步目录监控插件功能",
+ "v1.8.2": "提高识别率",
+ "v1.8.1": "重构插件,测试版",
+ "v1.8": "增加了元数据刮削开关,升级后需要手动打开,否则默认不刮削",
+ "v1.7.1": "修复偶尔安装失败问题"
+ }
+ },
+ "TorrentTransfer": {
+ "name": "自动转移做种",
+ "description": "定期转移下载器中的做种任务到另一个下载器。",
+ "labels": "做种",
+ "version": "1.5",
+ "icon": "seed.png",
+ "author": "jxxghp",
+ "level": 2,
+ "history": {
+ "v1.5": "修复在转移时只保留了第一个tracker,导致红种问题。此修复确保保留所有的tracker,以提高在不同网络条件下的可达性。",
+ "v1.4": "支持自动删除源下载器在目的下载器中存在的种子"
+ }
+ },
+ "RssSubscribe": {
+ "name": "自定义订阅",
+ "description": "定时刷新RSS报文,识别内容后添加订阅或直接下载。",
+ "labels": "订阅",
+ "version": "1.5",
+ "icon": "rss.png",
+ "author": "jxxghp",
+ "level": 2,
+ "history": {
+ "v1.5": "支持按种子大小过滤种子",
+ "v1.4": "修复剧集本地是否存在的判断错误问题",
+ "v1.3": "支持手动删除订阅历史记录"
+ }
+ },
+ "SyncDownloadFiles": {
+ "name": "下载器文件同步",
+ "description": "同步下载器的文件信息到数据库,删除文件时联动删除下载任务。",
+ "labels": "下载管理",
+ "version": "1.1.1",
+ "icon": "Youtube-dl_A.png",
+ "author": "thsrite",
+ "level": 1,
+ "history": {
+ "v1.1.1": "修复时区问题导致的上次同步后8h内的种子不同步的问题"
+ }
+ },
+ "BrushFlow": {
+ "name": "站点刷流",
+ "description": "自动托管刷流,将会提高对应站点的访问频率。",
+ "labels": "刷流,仪表板",
+ "version": "3.7",
+ "icon": "brush.jpg",
+ "author": "jxxghp,InfinityPacer",
+ "level": 2,
+ "history": {
+ "v3.7": "下载数量调整为仅获取刷流标签种子并修复了一些细节问题",
+ "v3.6": "优化检查服务中的时间管控",
+ "v3.5": "移除「删种排除MoviePilot任务」配置项(请使用「删除排除标签」替代),完善刷流任务触发插件事件相关逻辑(联动H&R助手)",
+ "v3.4": "移除「记录更多日志」配置项并调整为DEBUG日志,支持「删除排除标签」配置项,增加刷流任务时支持触发插件事件(联动H&R助手)",
+ "v3.3": "支持QB删除种子时强制汇报Tracker,站点独立配置增加「站点全局H&R」配置项",
+ "v3.2": "支持推送QB种子时启用「先下载首尾文件块」选项",
+ "v3.1": "支持仪表板显示站点刷流数据,需要主程序升级v1.8.7+版本",
+ "v3.0": "优化不同站点刷流到相同种子的逻辑,修复数据页滚动闪烁,部分日志优化",
+ "v2.9": "优化动态删除消息推送,优化配置页UI显示及部分配置项,支持配置种子分类以及开启自动分类管理,取消单独适配站点时区逻辑,可通过配置项「pubtime」自行适配",
+ "v2.8": "优化UI显示以及提升性能",
+ "v2.7": "动态删除种子规则调整(请注意查阅插件文档),站点独立配置样式优化、日志优化,修复部分配置项无法配置小数的问题,修复部分场景可能导致重复下载的问题",
+ "v2.6": "修复排除订阅功能",
+ "v2.5": "增加H&R做种时间、下载器监控配置项,刷流前置条件逻辑调整,代理下载种子默认为关闭"
+ }
+ },
+ "DownloadingMsg": {
+ "name": "下载进度推送",
+ "description": "定时推送正在下载进度。",
+ "labels": "消息通知,下载管理",
+ "version": "1.1",
+ "icon": "downloadmsg.png",
+ "author": "thsrite",
+ "level": 2
+ },
+ "AutoClean": {
+ "name": "定时清理媒体库",
+ "description": "定时清理用户下载的种子、源文件、媒体库文件。",
+ "labels": "媒体库",
+ "version": "1.1",
+ "icon": "clean.png",
+ "author": "thsrite",
+ "level": 2
+ },
+ "InvitesSignin": {
+ "name": "药丸签到",
+ "description": "药丸论坛签到。",
+ "labels": "站点",
+ "version": "1.4",
+ "icon": "invites.png",
+ "author": "thsrite",
+ "level": 2,
+ "history": {
+ "v1.4": "自定义保留消息天数"
+ }
+ },
+ "PersonMeta": {
+ "name": "演职人员刮削",
+ "description": "刮削演职人员图片以及中文名称。",
+ "labels": "媒体库,刮削",
+ "version": "1.4",
+ "icon": "actor.png",
+ "author": "jxxghp",
+ "level": 1,
+ "history": {
+ "v1.4": "人物图片调整为优先从TMDB获取,避免douban图片CDN加载过慢的问题",
+ "v1.3": "修复v1.8.5版本后刮削报错问题"
+ }
+ },
+ "MoviePilotUpdateNotify": {
+ "name": "MoviePilot更新推送",
+ "description": "MoviePilot推送release更新通知、自动重启。",
+ "labels": "消息通知,自动更新",
+ "version": "1.4",
+ "icon": "Moviepilot_A.png",
+ "author": "thsrite",
+ "level": 1,
+ "history": {
+ "v1.4": "兼容更新内容带版本号的情况",
+ "v1.3": "增加前端版本更新检查,需要主程序升级至v1.8.4+版本"
+ }
+ },
+ "CloudDiskDel": {
+ "name": "云盘文件删除",
+ "description": "媒体库删除strm文件后同步删除云盘资源。",
+ "labels": "媒体库",
+ "version": "1.3",
+ "icon": "clouddisk.png",
+ "author": "thsrite",
+ "level": 1
+ },
+ "BarkMsg": {
+ "name": "Bark消息推送",
+ "description": "支持使用Bark发送消息通知。",
+ "labels": "消息通知",
+ "version": "1.1",
+ "icon": "Bark_A.png",
+ "author": "jxxghp",
+ "level": 1
+ },
+ "IyuuMsg": {
+ "name": "IYUU消息推送",
+ "description": "支持使用IYUU发送消息通知。",
+ "labels": "消息通知,IYUU",
+ "version": "1.2",
+ "icon": "Iyuu_A.png",
+ "author": "jxxghp",
+ "level": 1
+ },
+ "PushDeerMsg": {
+ "name": "PushDeer消息推送",
+ "description": "支持使用PushDeer发送消息通知。",
+ "labels": "消息通知",
+ "version": "1.1",
+ "icon": "pushdeer.png",
+ "author": "jxxghp",
+ "level": 1
+ },
+ "ConfigCenter": {
+ "name": "配置中心",
+ "description": "快速调整部分系统设定。",
+ "labels": "系统设置",
+ "version": "2.6",
+ "icon": "setting.png",
+ "author": "jxxghp",
+ "level": 1,
+ "history": {
+ "v2.6": "支持DOH相关配置项",
+ "v2.5": "增加Github加速服务器设置项"
+ }
+ },
+ "WorkWechatMsg": {
+ "name": "企微机器人消息推送",
+ "description": "支持使用企业微信群聊机器人发送消息通知。",
+ "labels": "消息通知",
+ "version": "1.0",
+ "icon": "Wecom_A.png",
+ "author": "叮叮当",
+ "level": 1
+ },
+ "EpisodeGroupMeta": {
+ "name": "TMDB剧集组刮削",
+ "description": "从TMDB剧集组刮削季集的实际顺序。",
+ "labels": "刮削",
+ "version": "1.1",
+ "icon": "Element_A.png",
+ "author": "叮叮当",
+ "level": 1
+ },
+ "CustomIndexer": {
+ "name": "自定义索引站点",
+ "description": "修改或扩展内建索引器支持的站点。",
+ "labels": "站点",
+ "version": "1.0",
+ "icon": "spider.png",
+ "author": "jxxghp",
+ "level": 1
+ },
+ "FFmpegThumb": {
+ "name": "FFmpeg缩略图",
+ "description": "TheMovieDb没有背景图片时使用FFmpeg截取视频文件缩略图",
+ "labels": "刮削",
+ "version": "1.2",
+ "icon": "ffmpeg.png",
+ "author": "jxxghp",
+ "level": 1
+ },
+ "PushPlusMsg": {
+ "name": "PushPlus消息推送",
+ "description": "支持使用PushPlus发送消息通知。",
+ "labels": "消息通知",
+ "version": "1.1",
+ "icon": "Pushplus_A.png",
+ "author": "cheng",
+ "level": 1
+ },
+ "DownloadSiteTag": {
+ "name": "下载任务分类与标签",
+ "description": "自动给下载任务分类与打站点标签、剧集名称标签",
+ "labels": "下载管理",
+ "version": "2.1",
+ "icon": "Youtube-dl_B.png",
+ "author": "叮叮当",
+ "level": 1,
+ "history": {
+ "v2.1": "修复错误的TmdbHelper模块引用"
+ }
+ },
+ "RemoveLink": {
+ "name": "清理硬链接",
+ "description": "监控目录内文件被删除时,同步删除监控目录内所有和它硬链接的文件",
+ "labels": "文件整理",
+ "version": "2.2",
+ "icon": "Ombi_A.png",
+ "author": "DzAvril",
+ "level": 1,
+ "history": {
+ "v2.2": "修复直接删除文件夹导致的插件崩溃的bug",
+ "v2.1": "联动删除历史记录",
+ "v2.0": "联动删除种子,需安装插件[下载器助手]并打开监听源文件事件",
+ "v1.9": "增加清理刮削文件功能(beta)",
+ "v1.8": "增加清理空目录功能(beta)",
+ "v1.7": "修复因未监测重命名事件导致的清理硬链接失败的问题",
+ "v1.6": "提升插件性能"
+ }
+ },
+ "LinkMonitor": {
+ "name": "实时硬链接",
+ "description": "监控目录文件变化,实时硬链接。",
+ "labels": "文件整理",
+ "version": "1.6",
+ "icon": "Linkace_C.png",
+ "author": "jxxghp",
+ "level": 1,
+ "history": {
+ "v1.6": "增强API安全性"
+ }
+ },
+ "CategoryEditor": {
+ "name": "二级分类策略",
+ "description": "编辑下载目录和媒体库目录的二级分类规则。",
+ "labels": "文件整理",
+ "version": "1.2",
+ "icon": "Bookstack_A.png",
+ "author": "jxxghp",
+ "level": 1
+ },
+ "RemoteIdentifiers": {
+ "name": "共享识别词",
+ "description": "从Github、Etherpad等远程文件中获取共享识别词并应用。",
+ "labels": "识别",
+ "version": "2.2",
+ "icon": "words.png",
+ "author": "honue",
+ "level": 1
+ },
+ "NeoDBSync": {
+ "name": "NeoDB 想看",
+ "description": "同步 NeoDB 想看条目,自动添加订阅。",
+ "labels": "订阅",
+ "version": "1.1",
+ "icon": "NeoDB.jpeg",
+ "author": "hcplantern",
+ "level": 1,
+ "history": {
+ "v1.1": "直接添加订阅,不提前进行搜索下载"
+ }
+ },
+ "PlayletCategory": {
+ "name": "短剧自动分类",
+ "description": "网络短剧自动整理到独立的分类目录。",
+ "labels": "文件整理",
+ "version": "2.0",
+ "icon": "Amule_A.png",
+ "author": "jxxghp",
+ "level": 1,
+ "history": {
+ "v2.0": "适配新的目录结构变化,短剧分类名称调整为配置目录路径,升级后需要重新调整设置后才能使用。"
+ }
+ },
+ "DiagParamAdjust": {
+ "name": "诊断参数调整",
+ "description": "Emby专用插件|暂时性解决emby字幕偏移问题,需要emby安装Diagnostics插件。",
+ "labels": "Emby",
+ "version": "1.3",
+ "icon": "Gatus_A.png",
+ "author": "jeblove",
+ "level": 1
+ },
+ "QbCommand": {
+ "name": "QB远程操作",
+ "description": "通过定时任务或交互命令远程操作QB暂停/开始/限速等。",
+ "labels": "下载管理,Qbittorrent",
+ "version": "1.5",
+ "icon": "Qbittorrent_A.png",
+ "author": "DzAvril",
+ "level": 1,
+ "history": {
+ "v1.5": "可选特定路径下的做种不会被暂停",
+ "v1.4": "可选某些站点不再做种(暂停做种后不会被恢复)"
+ }
+ },
+ "TrCommand": {
+ "name": "TR远程操作",
+ "description": "通过定时任务或交互命令远程操作TR暂停/开始/限速等。",
+ "labels": "下载管理,Transmission",
+ "version": "1.1",
+ "icon": "Transmission_A.png",
+ "author": "Hoey",
+ "level": 1
+ },
+ "IpDetect": {
+ "name": "本地IP检测",
+ "description": "如果QB、TR等服务在本地部署,当本地IP改变时自动修改其Server IP。",
+ "labels": "系统设置",
+ "version": "1.1",
+ "icon": "ipAddress.png",
+ "author": "DzAvril",
+ "level": 1
+ },
+ "TrackerEditor": {
+ "name": "Tracker替换",
+ "description": "批量替换种子tracker,支持周期性巡检(如为TR,仅支持4.0以上版本)。",
+ "labels": "做种",
+ "version": "1.5",
+ "icon": "trackereditor_A.png",
+ "author": "honue",
+ "level": 1
+ },
+ "ContractCheck": {
+ "name": "契约检查",
+ "description": "定时检查保种契约达成情况。",
+ "labels": "做种",
+ "version": "1.4",
+ "icon": "contract.png",
+ "author": "DzAvril",
+ "level": 1,
+ "history": {
+ "v1.4": "支持仪表板组件显示",
+ "v1.3": "修复观众做种数据异常问题",
+ "v1.2": "修复契约检查无数据返回的问题"
+ }
+ },
+ "FeiShuMsg": {
+ "name": "飞书机器人消息通知",
+ "description": "支持使用飞书群聊机器人发送消息通知。",
+ "labels": "消息通知",
+ "version": "1.0",
+ "icon": "FeiShu_A.png",
+ "author": "InfinityPacer",
+ "level": 2
+ },
+ "IyuuAuth": {
+ "name": "IYUU站点绑定",
+ "description": "为IYUU账号绑定认证站点,以便用于用户认证和辅种。",
+ "labels": "IYUU",
+ "version": "1.1",
+ "icon": "Iyuu_A.png",
+ "author": "jxxghp",
+ "level": 1,
+ "history": {
+ "v1.1": "修复IYUU站点绑定失败问题"
+ }
+ },
+ "NtfyMsg": {
+ "name": "ntfy消息推送",
+ "description": "支持使用ntfy发送消息通知。",
+ "labels": "消息通知",
+ "version": "1.0",
+ "icon": "Ntfy_A.png",
+ "author": "lethargicScribe",
+ "level": 1
+ },
+ "TmdbWallpaper": {
+ "name": "登录壁纸本地化",
+ "description": "将MoviePilot的登录壁纸下载到本地。",
+ "labels": "工具",
+ "version": "1.1",
+ "icon": "Macos_Sierra.png",
+ "author": "jxxghp",
+ "level": 1,
+ "history": {
+ "v1.1": "修复下载Bing每日壁纸时文件名错乱的问题"
+ }
+ },
+ "MPServerStatus": {
+ "name": "MoviePilot服务器监控",
+ "description": "在仪表板中实时显示MoviePilot公共服务器状态。",
+ "labels": "仪表板",
+ "version": "1.0",
+ "icon": "Duplicati_A.png",
+ "author": "jxxghp",
+ "level": 1
+ },
+ "CleanInvalidSeed": {
+ "name": "清理QB无效做种",
+ "description": "清理已经被站点删除的种子及对应源文件,仅支持QB",
+ "labels": "Qbittorrent",
+ "version": "2.2",
+ "icon": "clean_a.png",
+ "author": "DzAvril",
+ "level": 1,
+ "history": {
+ "v2.2": "支持仅标记模式",
+ "v2.1": "1. 修复删除无效做种没有tg通知的问题。2. 检测未工作做种排除已暂停做种",
+ "v2.0": "修复检测不到无效做种的bug",
+ "v1.9": "增加自定义需删除做种的tracker的错误信息",
+ "v1.8": "增加远程命令切换全量通知;修复bug",
+ "v1.7": "修复因消息内容包含'_'导致telegram API调用失败的问题",
+ "v1.6": "修复当种子有多个标签时,通过标签过滤不删除种子会失效的问题",
+ "v1.5": "1. 增加通过分类、标签过滤不删除种子功能;2. 全量通知提供更多信息",
+ "v1.4": "修复插件功能失效的问题",
+ "v1.3": "1. 增加远程命令 2. 根据tracker error_message字段进行过滤,避免误删",
+ "v1.2": "修复配置页空白的问题",
+ "v1.1": "更新使用说明,以防使用不当误删文件",
+ "v1.0": "定时清理已经被站点删除的种子及对应源文件"
+ }
+ },
+ "TrendingShow": {
+ "name": "流行趋势轮播",
+ "description": "在仪表板中显示流行趋势海报轮播图。",
+ "labels": "仪表板",
+ "version": "1.3",
+ "icon": "TrendingShow.jpg",
+ "author": "jxxghp",
+ "level": 1,
+ "history": {
+ "v1.3": "调整组件大小",
+ "v1.2": "不同屏幕大小,支持分开设置"
+ }
+ },
+ "DailyWord": {
+ "name": "每日一言",
+ "description": "在仪表板中显示每日一言卡片。",
+ "labels": "仪表板",
+ "version": "1.1",
+ "icon": "Calibre_B.png",
+ "author": "jxxghp",
+ "level": 1
+ },
+ "ZvideoHelper": {
+ "name": "极影视助手",
+ "description": "极影视功能扩展",
+ "labels": "媒体库",
+ "version": "1.3",
+ "icon": "zvideo.png",
+ "author": "DzAvril",
+ "level": 1,
+ "history": {
+ "v1.3": "降低对豆瓣接口的请求频率",
+ "v1.2": "修复无法获取豆瓣评分的问题",
+ "v1.1": "支持将极影视评分修改为豆瓣评分",
+ "v1.0": "同步极影视在看/已看状态到豆瓣"
+ }
+ }
}
diff --git a/plugins/mediaservermsg/__init__.py b/plugins/mediaservermsg/__init__.py
index 125eabd..315f1d1 100644
--- a/plugins/mediaservermsg/__init__.py
+++ b/plugins/mediaservermsg/__init__.py
@@ -20,7 +20,7 @@ class MediaServerMsg(_PluginBase):
# 插件图标
plugin_icon = "mediaplay.png"
# 插件版本
- plugin_version = "1.2"
+ plugin_version = "1.3"
# 插件作者
plugin_author = "jxxghp"
# 作者主页
@@ -40,6 +40,7 @@ class MediaServerMsg(_PluginBase):
# 私有属性
_enabled = False
_types = []
+ _webhook_msg_keys = {}
# 拼装消息内容
_webhook_actions = {
@@ -198,6 +199,13 @@ class MediaServerMsg(_PluginBase):
logger.info(f"未开启 {event_info.event} 类型的消息通知")
return
+ expiring_key = f"{event_info.item_id}-{event_info.client}-{event_info.user_name}"
+ # 过滤停止播放重复消息
+ if str(event_info.event) == "playback.stop" and expiring_key in self._webhook_msg_keys.keys():
+ # 刷新过期时间
+ self.__add_element(expiring_key)
+ return
+
# 消息标题
if event_info.item_type in ["TV", "SHOW"]:
message_title = f"{self._webhook_actions.get(event_info.event)}剧集 {event_info.item_name}"
@@ -255,10 +263,31 @@ class MediaServerMsg(_PluginBase):
else:
play_link = None
+ if str(event_info.event) == "playback.stop":
+ # 停止播放消息,添加到过期字典
+ self.__add_element(expiring_key)
+ if str(event_info.event) == "playback.start":
+ # 开始播放消息,删除过期字典
+ self.__remove_element(expiring_key)
+
# 发送消息
self.post_message(mtype=NotificationType.MediaServer,
title=message_title, text=message_content, image=image_url, link=play_link)
+ def __add_element(self, key, duration=600):
+ expiration_time = time.time() + duration
+ # 如果元素已经存在,更新其过期时间
+ self._webhook_msg_keys[key] = expiration_time
+
+ def __remove_element(self, key):
+ self._webhook_msg_keys = {k: v for k, v in self._webhook_msg_keys.items() if k != key}
+
+ def __get_elements(self):
+ current_time = time.time()
+ # 过滤掉过期的元素
+ self._webhook_msg_keys = {k: v for k, v in self._webhook_msg_keys.items() if v > current_time}
+ return list(self._webhook_msg_keys.keys())
+
def stop_service(self):
"""
退出插件
From 215049de11780152ddf8dd5985b5b9cf115ebd40 Mon Sep 17 00:00:00 2001
From: Pixel-LH <2569646547@qq.com>
Date: Tue, 3 Sep 2024 12:58:17 +0800
Subject: [PATCH 27/27] =?UTF-8?q?fix:vcbanimemonitor=20=E4=BF=AE=E5=A4=8D?=
=?UTF-8?q?=E5=A4=84=E7=90=86=E5=BC=82=E5=B8=B8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
package.json | 3 ++-
plugins/vcbanimemonitor/__init__.py | 2 +-
plugins/vcbanimemonitor/remeta.py | 2 --
3 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/package.json b/package.json
index b9bac71..e80e3f3 100644
--- a/package.json
+++ b/package.json
@@ -319,11 +319,12 @@
"name": "整理VCB动漫压制组作品",
"description": "一款辅助整理&提高识别VCB-Stuido动漫压制组作品的插件",
"labels": "文件整理,识别",
- "version": "1.8.2.1",
+ "version": "1.8.2.2",
"icon": "vcbmonitor.png",
"author": "pixel@qingwa",
"level": 2,
"history": {
+ "v1.8.2.2": "修复处理异常",
"v1.8.2.1": "修复日志输出&同步目录监控插件功能",
"v1.8.2": "提高识别率",
"v1.8.1": "重构插件,测试版",
diff --git a/plugins/vcbanimemonitor/__init__.py b/plugins/vcbanimemonitor/__init__.py
index 5558f60..f81f257 100644
--- a/plugins/vcbanimemonitor/__init__.py
+++ b/plugins/vcbanimemonitor/__init__.py
@@ -76,7 +76,7 @@ class VCBAnimeMonitor(_PluginBase):
# 插件图标
plugin_icon = "vcbmonitor.png"
# 插件版本
- plugin_version = "1.8.2.1"
+ plugin_version = "1.8.2.2"
# 插件作者
plugin_author = "pixel@qingwa"
# 作者主页
diff --git a/plugins/vcbanimemonitor/remeta.py b/plugins/vcbanimemonitor/remeta.py
index add6e32..ea261eb 100644
--- a/plugins/vcbanimemonitor/remeta.py
+++ b/plugins/vcbanimemonitor/remeta.py
@@ -98,9 +98,7 @@ class ReMeta:
self.is_ova = self.vcb_meta.is_ova
meta = MetaInfoPath(file_path)
meta.title = self.vcb_meta.title
- meta.name = self.vcb_meta.title
meta.en_name = self.vcb_meta.title
- meta.cn_name = self.vcb_meta.title
if self.vcb_meta.type == "Movie":
meta.type = MediaType.MOVIE
else: