From e3c76754d8384ee5dfb955fa35b792c4d1cf6839 Mon Sep 17 00:00:00 2001
From: Sean
@@ -29,7 +29,6 @@
- 修改文件名但是不破坏作种
- 傻瓜式文件整理
-
## 相关文档和群组
- [AutoBangumi V2 简易说明](https://www.craft.do/s/4viN6M3tBqigLp)
@@ -38,11 +37,13 @@
- Bug 反馈群:[Telegram](https://t.me/+yNisOnDGaX5jMTM9)
# 部署说明
+
1. 安装 qBittorrent:
-
+
2. 用 Docker 部署 `AutoBangumi` :
最简部署方法
+
```dash
docker run -d \
--name=AutoBangumi \
@@ -53,6 +54,7 @@ docker run -d \
--restart unless-stopped \
estrellaxd/auto_bangumi:latest
```
+
**进阶部署:**
Docker-Compose
@@ -101,6 +103,7 @@ docker run -d \
--restart unless-stopped \
estrellaxd/auto_bangumi:latest
```
+
### 参数说明
| 环境变量 | 作用 | 参数 |
@@ -119,8 +122,8 @@ docker run -d \
- `TIME` : 程序运行的间隔时间,默认为 `1800` 也就是 30 分钟,如果更新时间要求比较高可以适当降低该值。
- `HOST`, `USER`, `PASSWORD`: qBittorrent 的地址,用户名,密码。
- `METHOD`: 重命名规则
- - `pn`: Pure Name 模式,去掉所有字幕组以及番剧额外信息,只保留名称、季度和集数。
- - `normal`: 正常模式,仅重命名会影响搜刮的非正常字符。
+ - `pn`: Pure Name 模式,去掉所有字幕组以及番剧额外信息,只保留名称、季度和集数。
+ - `normal`: 正常模式,仅重命名会影响搜刮的非正常字符。
- `GROUP_TAG`: 开启后自动在自动下载规则中创建组名,方便管理。
- `DOWNLOAD_PATH`: qBittorrent 的下载地址。
- `RSS`: Mikan Project 的个人 RSS 订阅链接
@@ -161,13 +164,16 @@ docker run -d \
## Roadmap
***开发中的功能:***
+
- RSS 解析器:AutoBangumi 可以自行解析分析种子无需依赖下载器。
- Transmission & Aria2 的支持。
- 遗漏番剧下载:中间开始追番可以补全之前的剧集。
***计划开发的功能:***
+
- Web UI
- 更为智能细致的分类预设。
# 声明
+
本项目的自动改名规则根据 [miracleyoo/anime_renamer](https://github.com/miracleyoo/anime_renamer) 项目
diff --git a/AutoBangumi/app/RssFilter/RSSFilter.py b/auto_bangumi/RssFilter/RSSFilter.py
similarity index 100%
rename from AutoBangumi/app/RssFilter/RSSFilter.py
rename to auto_bangumi/RssFilter/RSSFilter.py
diff --git a/AutoBangumi/app/RssFilter/__init__.py b/auto_bangumi/RssFilter/__init__.py
similarity index 100%
rename from AutoBangumi/app/RssFilter/__init__.py
rename to auto_bangumi/RssFilter/__init__.py
diff --git a/AutoBangumi/app/RssFilter/clean_rule.json b/auto_bangumi/RssFilter/clean_rule.json
similarity index 100%
rename from AutoBangumi/app/RssFilter/clean_rule.json
rename to auto_bangumi/RssFilter/clean_rule.json
diff --git a/AutoBangumi/app/RssFilter/dmhy.csv b/auto_bangumi/RssFilter/dmhy.csv
similarity index 100%
rename from AutoBangumi/app/RssFilter/dmhy.csv
rename to auto_bangumi/RssFilter/dmhy.csv
diff --git a/AutoBangumi/app/RssFilter/fliter_base.py b/auto_bangumi/RssFilter/fliter_base.py
similarity index 100%
rename from AutoBangumi/app/RssFilter/fliter_base.py
rename to auto_bangumi/RssFilter/fliter_base.py
diff --git a/AutoBangumi/app/RssFilter/mikan.csv b/auto_bangumi/RssFilter/mikan.csv
similarity index 100%
rename from AutoBangumi/app/RssFilter/mikan.csv
rename to auto_bangumi/RssFilter/mikan.csv
diff --git a/AutoBangumi/app/__init__.py b/auto_bangumi/__init__.py
similarity index 100%
rename from AutoBangumi/app/__init__.py
rename to auto_bangumi/__init__.py
diff --git a/auto_bangumi/__main__.py b/auto_bangumi/__main__.py
new file mode 100644
index 00000000..9a5ee96d
--- /dev/null
+++ b/auto_bangumi/__main__.py
@@ -0,0 +1,4 @@
+import app
+
+if __name__ == "__main__":
+ app.run()
\ No newline at end of file
diff --git a/AutoBangumi/app/app.py b/auto_bangumi/app.py
similarity index 88%
rename from AutoBangumi/app/app.py
rename to auto_bangumi/app.py
index 296d5574..a9a4ae62 100644
--- a/AutoBangumi/app/app.py
+++ b/auto_bangumi/app.py
@@ -33,8 +33,10 @@ def save_data_file(bangumi_data):
def run():
args = parse()
if args.debug:
- from const_dev import DEV_SETTINGS
-
+ try:
+ from const_dev import DEV_SETTINGS
+ except ModuleNotFoundError:
+ logger.debug("Please copy `const_dev.sample.py` to `const_dev.py` to use custom settings")
settings.init(DEV_SETTINGS)
else:
settings.init()
diff --git a/AutoBangumi/app/argument_parser.py b/auto_bangumi/argument_parser.py
similarity index 100%
rename from AutoBangumi/app/argument_parser.py
rename to auto_bangumi/argument_parser.py
diff --git a/AutoBangumi/app/bangumi_parser/__init__.py b/auto_bangumi/bangumi_parser/__init__.py
similarity index 100%
rename from AutoBangumi/app/bangumi_parser/__init__.py
rename to auto_bangumi/bangumi_parser/__init__.py
diff --git a/AutoBangumi/app/bangumi_parser/analyser/__init__.py b/auto_bangumi/bangumi_parser/analyser/__init__.py
similarity index 100%
rename from AutoBangumi/app/bangumi_parser/analyser/__init__.py
rename to auto_bangumi/bangumi_parser/analyser/__init__.py
diff --git a/AutoBangumi/app/bangumi_parser/analyser/rss_parser.py b/auto_bangumi/bangumi_parser/analyser/rss_parser.py
similarity index 89%
rename from AutoBangumi/app/bangumi_parser/analyser/rss_parser.py
rename to auto_bangumi/bangumi_parser/analyser/rss_parser.py
index 11f1e0e9..53108345 100644
--- a/AutoBangumi/app/bangumi_parser/analyser/rss_parser.py
+++ b/auto_bangumi/bangumi_parser/analyser/rss_parser.py
@@ -1,8 +1,8 @@
import logging
import re
-from bangumi_parser.episode import Episode
from utils import json_config
from conf import settings
+from bangumi_parser.episode import Episode
logger = logging.getLogger(__name__)
@@ -81,7 +81,10 @@ class ParserLV2:
def process(self, raw_name):
raw_name = raw_name.replace("【", "[").replace("】", "]")
- match_obj = re.match(r"(.*|\[.*])( -? \d{1,3} |\[\d{1,3}]|\[\d{1,3}.?[vV]\d{1}]|[第第]\d{1,3}[话話集集]|\[\d{1,3}.?END])(.*)", raw_name)
+ match_obj = re.match(
+ r"(.*|\[.*])( -? \d{1,3} |\[\d{1,3}]|\[\d{1,3}.?[vV]\d{1}]|[第第]\d{1,3}[话話集集]|\[\d{1,3}.?END])(.*)",
+ raw_name,
+ )
name_season = self.pre_process(match_obj.group(1))
name, season_number, season_raw = self.season_process(name_season)
name = self.name_process(name).strip()
@@ -124,8 +127,13 @@ if __name__ == "__main__":
print(season)
print(episode)
except:
- if re.search(r"\d{1,3}[-~]\d{1,3}|OVA|BD|電影|剧场版|老番|冷番|OAD|合集|劇場版|柯南|海賊王|蜡笔小新|整理|樱桃小丸子", name) is None:
+ if (
+ re.search(
+ r"\d{1,3}[-~]\d{1,3}|OVA|BD|電影|剧场版|老番|冷番|OAD|合集|劇場版|柯南|海賊王|蜡笔小新|整理|樱桃小丸子",
+ name,
+ )
+ is None
+ ):
print(f"{BCOLORS._(BCOLORS.HEADER, name)}")
err_count += 1
print(BCOLORS._(BCOLORS.WARNING, err_count))
-
diff --git a/AutoBangumi/app/bangumi_parser/analyser/simple_analyser.py b/auto_bangumi/bangumi_parser/analyser/simple_analyser.py
similarity index 100%
rename from AutoBangumi/app/bangumi_parser/analyser/simple_analyser.py
rename to auto_bangumi/bangumi_parser/analyser/simple_analyser.py
diff --git a/AutoBangumi/app/bangumi_parser/episode.py b/auto_bangumi/bangumi_parser/episode.py
similarity index 100%
rename from AutoBangumi/app/bangumi_parser/episode.py
rename to auto_bangumi/bangumi_parser/episode.py
diff --git a/AutoBangumi/app/bangumi_parser/names.txt b/auto_bangumi/bangumi_parser/names.txt
similarity index 100%
rename from AutoBangumi/app/bangumi_parser/names.txt
rename to auto_bangumi/bangumi_parser/names.txt
diff --git a/AutoBangumi/app/bangumi_parser/parser.py b/auto_bangumi/bangumi_parser/parser.py
similarity index 100%
rename from AutoBangumi/app/bangumi_parser/parser.py
rename to auto_bangumi/bangumi_parser/parser.py
diff --git a/AutoBangumi/app/bangumi_parser/preprocessor/__init__.py b/auto_bangumi/bangumi_parser/preprocessor/__init__.py
similarity index 100%
rename from AutoBangumi/app/bangumi_parser/preprocessor/__init__.py
rename to auto_bangumi/bangumi_parser/preprocessor/__init__.py
diff --git a/AutoBangumi/app/bangumi_parser/preprocessor/char_standardize.py b/auto_bangumi/bangumi_parser/preprocessor/char_standardize.py
similarity index 100%
rename from AutoBangumi/app/bangumi_parser/preprocessor/char_standardize.py
rename to auto_bangumi/bangumi_parser/preprocessor/char_standardize.py
diff --git a/AutoBangumi/app/bangumi_parser/token_generator/__init__.py b/auto_bangumi/bangumi_parser/token_generator/__init__.py
similarity index 100%
rename from AutoBangumi/app/bangumi_parser/token_generator/__init__.py
rename to auto_bangumi/bangumi_parser/token_generator/__init__.py
diff --git a/AutoBangumi/app/conf.py b/auto_bangumi/conf.py
similarity index 100%
rename from AutoBangumi/app/conf.py
rename to auto_bangumi/conf.py
diff --git a/AutoBangumi/app/const.py b/auto_bangumi/const.py
similarity index 54%
rename from AutoBangumi/app/const.py
rename to auto_bangumi/const.py
index 987d9a5b..a86eeef1 100644
--- a/AutoBangumi/app/const.py
+++ b/auto_bangumi/const.py
@@ -1,10 +1,7 @@
# -*- encoding: utf-8 -*-
-from math import fabs
-
-
DEFAULT_SETTINGS = {
- "host_ip": "192.168.31.10:10101",
+ "host_ip": "localhost:8080",
"sleep_time": 1800,
"user_name": "admin",
"password": "adminadmin",
@@ -22,17 +19,20 @@ DEFAULT_SETTINGS = {
}
ENV_TO_ATTR = {
- "HOST": "host_ip",
- "TIME": ("sleep_time", lambda e: float(e)),
- "USER": "user_name",
- "PASSWORD": "password",
- "RSS": "rss_link",
- "DOWNLOAD_PATH": "download_path",
- "METHOD": "method",
- "GROUP_TAG": ("enable_group_tag", lambda e: e.lower() in ("true", "1", "t")),
- "NOT_CONTAIN": "not_contain",
- "RULE_DEBUG": ("get_rule_debug", lambda e: e.lower() in ("true", "1", "t")),
- "EP_COMPLETE": ("enable_eps_complete", lambda e: e.lower() in ("true", "1", "t")),
+ "AB_DOWNLOADER_HOST": "host_ip",
+ "AB_INTERVAL_TIME": ("sleep_time", lambda e: float(e)),
+ "AB_DOWNLOADER_USERNAME": "user_name",
+ "AB_DOWNLOADER_PASSWORD": "password",
+ "AB_RSS": "rss_link",
+ "AB_DOWNLOAD_PATH": "download_path",
+ "AB_METHOD": "method",
+ "AB_GROUP_TAG": ("enable_group_tag", lambda e: e.lower() in ("true", "1", "t")),
+ "AB_NOT_CONTAIN": "not_contain",
+ "AB_RULE_DEBUG": ("get_rule_debug", lambda e: e.lower() in ("true", "1", "t")),
+ "AB_EP_COMPLETE": (
+ "enable_eps_complete",
+ lambda e: e.lower() in ("true", "1", "t"),
+ ),
}
FULL_SEASON_SUPPORT_GROUP = ["Lilith-Raws"]
@@ -40,8 +40,9 @@ FULL_SEASON_SUPPORT_GROUP = ["Lilith-Raws"]
class BCOLORS:
@staticmethod
- def _(color: str, string: str) -> str:
- return f"{color}{string}{BCOLORS.ENDC}"
+ def _(color: str, *args: str) -> str:
+ strings = [str(s) for s in args]
+ return f"{color}{', '.join(strings)}{BCOLORS.ENDC}"
HEADER = "\033[95m"
OKBLUE = "\033[94m"
diff --git a/AutoBangumi/app/const_dev.py b/auto_bangumi/const_dev.sample.py
similarity index 59%
rename from AutoBangumi/app/const_dev.py
rename to auto_bangumi/const_dev.sample.py
index e119b47f..a762595e 100644
--- a/AutoBangumi/app/const_dev.py
+++ b/auto_bangumi/const_dev.sample.py
@@ -1,8 +1,8 @@
DEV_SETTINGS = {
- "host_ip": "192.168.31.10:10101",
+ "host_ip": "localhost:8080",
"user_name": "admin",
"password": "adminadmin",
- "rss_link": "https://mikanani.me/RSS/MyBangumi?token=Td8ceWZZv3s2OZm5ji9RoMer8vk5VS3xzC1Hmg8A26E%3d",
+ "rss_link": "https://mikanani.me/RSS/classic",
"sleep_time": 10,
"info_path": "../config/bangumi.json",
"rule_path": "../config/rule.json",
diff --git a/AutoBangumi/app/core/__init__.py b/auto_bangumi/core/__init__.py
similarity index 100%
rename from AutoBangumi/app/core/__init__.py
rename to auto_bangumi/core/__init__.py
diff --git a/AutoBangumi/app/core/download_client.py b/auto_bangumi/core/download_client.py
similarity index 98%
rename from AutoBangumi/app/core/download_client.py
rename to auto_bangumi/core/download_client.py
index b388e5aa..1b1f6ce8 100644
--- a/AutoBangumi/app/core/download_client.py
+++ b/auto_bangumi/core/download_client.py
@@ -70,7 +70,7 @@ class DownloadClient:
def eps_collect(self, bangumi_info):
logger.debug("Start collect past eps.")
for info in bangumi_info:
- if not info["download_past"]:
+ if "download_past" not in info:
FullSeasonGet(info["group"], info["title"], info["season"]).run()
diff --git a/AutoBangumi/app/core/eps_complete.py b/auto_bangumi/core/eps_complete.py
similarity index 100%
rename from AutoBangumi/app/core/eps_complete.py
rename to auto_bangumi/core/eps_complete.py
diff --git a/AutoBangumi/app/core/renamer.py b/auto_bangumi/core/renamer.py
similarity index 100%
rename from AutoBangumi/app/core/renamer.py
rename to auto_bangumi/core/renamer.py
index 0707ec02..b3497f9a 100644
--- a/AutoBangumi/app/core/renamer.py
+++ b/auto_bangumi/core/renamer.py
@@ -1,8 +1,8 @@
import re
import logging
-from core.download_client import DownloadClient
from conf import settings
+from core.download_client import DownloadClient
logger = logging.getLogger(__name__)
diff --git a/AutoBangumi/app/core/rss_collector.py b/auto_bangumi/core/rss_collector.py
similarity index 100%
rename from AutoBangumi/app/core/rss_collector.py
rename to auto_bangumi/core/rss_collector.py
diff --git a/AutoBangumi/app/downloader/__init__.py b/auto_bangumi/downloader/__init__.py
similarity index 100%
rename from AutoBangumi/app/downloader/__init__.py
rename to auto_bangumi/downloader/__init__.py
diff --git a/AutoBangumi/app/downloader/exceptions.py b/auto_bangumi/downloader/exceptions.py
similarity index 100%
rename from AutoBangumi/app/downloader/exceptions.py
rename to auto_bangumi/downloader/exceptions.py
diff --git a/AutoBangumi/app/downloader/qb_downloader.py b/auto_bangumi/downloader/qb_downloader.py
similarity index 100%
rename from AutoBangumi/app/downloader/qb_downloader.py
rename to auto_bangumi/downloader/qb_downloader.py
diff --git a/AutoBangumi/app/log.py b/auto_bangumi/log.py
similarity index 100%
rename from AutoBangumi/app/log.py
rename to auto_bangumi/log.py
diff --git a/AutoBangumi/app/utils/__init__.py b/auto_bangumi/utils/__init__.py
similarity index 100%
rename from AutoBangumi/app/utils/__init__.py
rename to auto_bangumi/utils/__init__.py
diff --git a/AutoBangumi/app/utils/json_config.py b/auto_bangumi/utils/json_config.py
similarity index 100%
rename from AutoBangumi/app/utils/json_config.py
rename to auto_bangumi/utils/json_config.py
diff --git a/AutoBangumi/config/rule.json b/config/rule.json
similarity index 100%
rename from AutoBangumi/config/rule.json
rename to config/rule.json
diff --git a/old version/Docker/Dockerfile b/old version/Docker/Dockerfile
deleted file mode 100644
index b9c49427..00000000
--- a/old version/Docker/Dockerfile
+++ /dev/null
@@ -1,12 +0,0 @@
-# syntax=docker/dockerfile:1
-
-FROM python:3.10-slim-buster
-
-WORKDIR /app
-
-COPY requirements.txt requirements.txt
-RUN pip3 install -r requirements.txt
-
-COPY . .
-
-CMD [ "python3", "rename_qb.py"]
\ No newline at end of file
diff --git a/old version/Docker/rename_qb.py b/old version/Docker/rename_qb.py
deleted file mode 100644
index 6ada288b..00000000
--- a/old version/Docker/rename_qb.py
+++ /dev/null
@@ -1,116 +0,0 @@
-import re
-import io
-import sys
-import qbittorrentapi
-from os import environ
-import time
-import logging
-
-logger = logging.getLogger(__name__)
-
-host_ip = environ['HOST']
-user_name = environ['USER']
-password = environ['PASSWORD']
-method = environ['METHOD']
-delay_time = environ['TIME']
-
-
-# Episode Regular Expression Matching Rules
-episode_rules = [r'(.*)\[(\d{1,3}|\d{1,3}\.\d{1,2})(?:v\d{1,2})?(?:END)?\](.*)',
- r'(.*)\[E(\d{1,3}|\d{1,3}\.\d{1,2})(?:v\d{1,2})?(?:END)?\](.*)',
- r'(.*)\[第(\d*\.*\d*)话(?:END)?\](.*)',
- r'(.*)\[第(\d*\.*\d*)話(?:END)?\](.*)',
- r'(.*)第(\d*\.*\d*)话(?:END)?(.*)',
- r'(.*)第(\d*\.*\d*)話(?:END)?(.*)',
- r'(.*)- (\d{1,3}|\d{1,3}\.\d{1,2})(?:v\d{1,2})?(?:END)? (.*)']
-# Suffixs of files we are going to rename
-suffixs = ['mp4', 'mkv', 'avi', 'mov', 'flv', 'rmvb', 'ass', 'idx']
-
-class QbittorrentRename:
- def __init__(self, rename_method):
- self.qbt_client = qbittorrentapi.Client(host=host_ip, username=user_name, password=password)
- try:
- self.qbt_client.auth_log_in()
- except qbittorrentapi.LoginFailed as e:
- logger.exception(e)
- self.recent_info = self.qbt_client.torrents_info(status_filter='completed')
- self.hash = None
- self.name = None
- self.new_name = None
- self.path_name = None
- self.count = 0
- self.rename_count = 0
- self.torrent_count = len(self.recent_info)
- self.method = rename_method
-
- def rename_normal(self, idx):
- self.name = self.recent_info[idx].name
- self.hash = self.recent_info[idx].hash
- self.path_name = self.recent_info[idx].content_path.split("/")[-1]
- file_name = self.name
- for rule in episode_rules:
- matchObj = re.match(rule, file_name, re.I)
- if matchObj is not None:
- self.new_name = f'{matchObj.group(1).strip()} E{matchObj.group(2)}{matchObj.group(3)}'
-
- def rename_pn(self, idx):
- self.name = self.recent_info[idx].name
- self.hash = self.recent_info[idx].hash
- self.path_name = self.recent_info[idx].content_path.split("/")[-1]
- n = re.split(r'\[|\]', self.name)
- file_name = self.name.replace(f'[{n[1]}]', '')
- for rule in episode_rules:
- matchObj = re.match(rule, file_name, re.I)
- if matchObj is not None:
- self.new_name = re.sub(r'\[|\]', '', f'{matchObj.group(1).strip()} E{matchObj.group(2)}{n[-1]}')
-
- def rename(self):
- if self.path_name != self.new_name:
- self.qbt_client.torrents_rename_file(torrent_hash=self.hash, old_path=self.path_name, new_path=self.new_name)
- logger.debug("{self.path_name} >> {self.new_name}")
- self.count += 1
- else:
- return
-
- def clear_info(self):
- self.name = None
- self.hash = None
- self.new_name = None
- self.path_name = None
-
- def print_result(self):
- logger.debug("已完成对{self.torrent_count}个文件的检查")
- logger.debug("已对其中{self.count}个文件进行重命名")
- logger.debug("完成")
-
- def rename_app(self):
- if self.method not in ['pn', 'normal']:
- logger.error('error method')
- elif self.method == 'normal':
- for i in range(0, self.torrent_count + 1):
- try:
- self.rename_normal(i)
- self.rename()
- self.clear_info()
- except:
- self.print_result()
- elif self.method == 'pn':
- for i in range(0, self.torrent_count + 1):
- try:
- self.rename_pn(i)
- self.rename()
- self.clear_info()
- except:
- self.print_result()
-
-
-def rename_main():
- logger.debug("Program start.")
- while True:
- rename = QbittorrentRename(method)
- rename.rename_app()
- time.sleep(float(delay_time))
-
-
-if __name__ == "__main__":
- rename_main()
diff --git a/old version/Docker/requirements.txt b/old version/Docker/requirements.txt
deleted file mode 100644
index 87b12b28..00000000
--- a/old version/Docker/requirements.txt
+++ /dev/null
@@ -1 +0,0 @@
-qbittorrent_api==2022.4.30
\ No newline at end of file
diff --git a/old version/config.json b/old version/config.json
deleted file mode 100644
index c74b7c2c..00000000
--- a/old version/config.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "host_ip": "192.168.31.10:8181",
- "username": "admin",
- "password": "adminadmin",
- "savepath": "/downloads/Bangumi",
- "method": "pn"
-}
\ No newline at end of file
diff --git a/old version/rename_qb.py b/old version/rename_qb.py
deleted file mode 100644
index 8c2cc7df..00000000
--- a/old version/rename_qb.py
+++ /dev/null
@@ -1,111 +0,0 @@
-import re
-import io
-import sys
-import os.path as op
-import time
-import logging
-
-import qbittorrentapi
-import json
-
-logger = logging.getLogger(__name__)
-
-with open("config.json") as f:
- server_info = json.load(f)
-host_ip = "192.168.1.18:6363"
-user_name = "admin"
-password = "adminadmin"
-log_name = op.join(op.dirname(op.realpath(__file__)), 'log.txt')
-method = "pn"
-
-# Episode Regular Expression Matching Rules
-episode_rules = [r'(.*)\[(\d{1,3}|\d{1,3}\.\d{1,2})(?:v\d{1,2})?(?:END)?\](.*)',
- r'(.*)\[E(\d{1,3}|\d{1,3}\.\d{1,2})(?:v\d{1,2})?(?:END)?\](.*)',
- r'(.*)\[第(\d*\.*\d*)话(?:END)?\](.*)',
- r'(.*)\[第(\d*\.*\d*)話(?:END)?\](.*)',
- r'(.*)第(\d*\.*\d*)话(?:END)?(.*)',
- r'(.*)第(\d*\.*\d*)話(?:END)?(.*)',
- r'(.*)- (\d{1,3}|\d{1,3}\.\d{1,2})(?:v\d{1,2})?(?:END)? (.*)']
-# Suffixs of files we are going to rename
-suffixs = ['mp4', 'mkv', 'avi', 'mov', 'flv', 'rmvb', 'ass', 'idx']
-
-
-class QbittorrentRename:
- def __init__(self, rename_method):
- self.qbt_client = qbittorrentapi.Client(host=host_ip, username=user_name, password=password)
- try:
- self.qbt_client.auth_log_in()
- except qbittorrentapi.LoginFailed as e:
- logger.exception(e)
- self.recent_info = self.qbt_client.torrents_info(status_filter='completed')
- self.hash = None
- self.name = None
- self.new_name = None
- self.path_name = None
- self.count = 0
- self.rename_count = 0
- self.torrent_count = len(self.recent_info)
- self.method = rename_method
-
- def rename_normal(self, idx):
- self.name = self.recent_info[idx].name
- self.hash = self.recent_info[idx].hash
- file_name = self.name
- for rule in episode_rules:
- matchObj = re.match(rule, file_name, re.I)
- if matchObj is not None:
- self.new_name = f'{matchObj.group(1)} E{matchObj.group(2)} {matchObj.group(3)}'
-
- def rename_pn(self, idx):
- self.name = self.recent_info[idx].name
- self.hash = self.recent_info[idx].hash
- self.path_name = self.recent_info[idx].content_path.split("/")[-1]
- n = re.split(r'\[|\]', self.name)
- file_name = self.name.replace(f'[{n[1]}]', '')
- for rule in episode_rules:
- matchObj = re.match(rule, file_name, re.I)
- if matchObj is not None:
- self.new_name = re.sub(r'\[|\]', '', f'{matchObj.group(1).strip()} E{matchObj.group(2)}{n[-1]}')
-
- def rename(self):
- if self.path_name != self.new_name:
- self.qbt_client.torrents_rename_file(torrent_hash=self.hash, old_path=self.path_name, new_path=self.new_name)
- logger.debug("{self.path_name} >> {self.new_name}")
- self.count += 1
- else:
- return
-
- def clear_info(self):
- self.name = None
- self.hash = None
- self.new_name = None
-
- def print_result(self):
- logger.debug(f"已完成对{self.torrent_count}个文件的检查")
- logger.debug(f"已对其中{self.count}个文件进行重命名")
- logger.debug(f"完成")
-
- def rename_app(self):
- if self.method not in ['pn', 'normal']:
- logger.error('error method')
- elif self.method == 'normal':
- for i in range(0, self.torrent_count + 1):
- try:
- self.rename_normal(i)
- self.rename()
- self.clear_info()
- except:
- self.print_result()
- elif self.method == 'pn':
- for i in range(0, self.torrent_count + 1):
- try:
- self.rename_pn(i)
- self.rename()
- self.clear_info()
- except:
- self.print_result()
-
-
-if __name__ == "__main__":
- rename = QbittorrentRename(method)
- rename.rename_app()
diff --git a/old version/requirements.txt b/old version/requirements.txt
deleted file mode 100644
index daa0131b..00000000
--- a/old version/requirements.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-qbittorrent_api==2022.4.30
-
-requests~=2.27.1
-bs4~=0.0.1
-beautifulsoup4~=4.11.1
\ No newline at end of file
diff --git a/old version/rule_set.py b/old version/rule_set.py
deleted file mode 100644
index bdc761aa..00000000
--- a/old version/rule_set.py
+++ /dev/null
@@ -1,49 +0,0 @@
-# -*- coding: UTF-8 -*-
-import qbittorrentapi
-import json
-import argparse
-import os
-import logging
-
-logger = logging.getLogger(__name__)
-
-f = open("config.json")
-server_info = json.load(f)
-
-host_ip = "http://" + server_info['host_ip']
-user_name = server_info['username']
-password = server_info['password']
-save_path = server_info['savepath']
-
-parser = argparse.ArgumentParser(description='Set RSS download rule.')
-parser.add_argument('--name', default='',
- help='Bangumi Name')
-
-
-def rule_set():
- qbt_client = qbittorrentapi.Client(host=host_ip, username=user_name, password=password)
- try:
- qbt_client.auth_log_in()
- except qbittorrentapi.LoginFailed as e:
- logger.exception(e)
- args = parser.parse_args()
- bangumi_name = args.name
- rule = {'enable': True,
- 'mustContain': bangumi_name,
- 'mustNotContain': '720',
- 'useRegx': True,
- 'episodeFilter': '',
- 'smartFilter': False,
- 'previouslyMatchedEpisodes': [],
- 'affectedFeeds': [],
- 'ignoreDays': 0,
- 'lastMatch': '',
- 'addPaused': False,
- 'assignedCategory': 'Bangumi',
- 'savePath': os.path.join(save_path, bangumi_name)
- }
- qbt_client.rss_set_rule(rule_name=bangumi_name, rule_def=rule)
-
-
-if __name__ == "__main__":
- rule_set()
diff --git a/AutoBangumi/requirements.txt b/requirements.txt
similarity index 100%
rename from AutoBangumi/requirements.txt
rename to requirements.txt
diff --git a/setup.py b/setup.py
new file mode 100644
index 00000000..e524c257
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,28 @@
+# coding:utf-8
+
+from setuptools import setup, find_packages
+
+setup(
+ name="auto_bangumi", # 包名字
+ version="2.4.0b4", # 包版本
+ description="一个全自动追番整理下载工具",
+ long_description="""
+ 本项目是基于 Mikan Project、qBittorrent 的全自动追番整理下载工具。
+ 只需要在 Mikan Project 上订阅番剧,就可以全自动追番。
+ 并且整理完成的名称和目录可以直接被 Plex、Jellyfin 等媒体库软件识别,
+ 无需二次刮削。""", # 简单描述
+ author="Estrella Pan", # 作者
+ author_email="estrellaxd05@gmail.com", # 作者邮箱
+ url="https://github.com/EstrellaXD/Auto_Bangumi", # 包的主页
+ packages=find_packages(where=".", exclude=("tests",), include=('*',)),
+ package_data={"auto_bangumi.RssFilter":["*.json"]},
+ package_dir={"auto_bangumi":"auto_bangumi"},
+ data_files=[("config", ["config/rule.json"])],
+ install_requires= [
+ "qbittorrent-api",
+ "bs4",
+ "requests",
+ "lxml",
+ "zhconv",
+ ]
+)