diff --git a/Docker/Dockerfile b/Docker/Dockerfile new file mode 100644 index 00000000..b9c49427 --- /dev/null +++ b/Docker/Dockerfile @@ -0,0 +1,12 @@ +# 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/Docker/rename_qb.py b/Docker/rename_qb.py new file mode 100644 index 00000000..9b887fd3 --- /dev/null +++ b/Docker/rename_qb.py @@ -0,0 +1,103 @@ +import argparse +import re +import io +import sys +import qbittorrentapi +from os import environ +import time + +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'] +sys.stdout = io.TextIOWrapper(buffer=sys.stdout.buffer, encoding='utf8') +parser = argparse.ArgumentParser(description='Regular Expression Match') +parser.add_argument('--hash', default='', + help='The torrent Hash value.') +args = parser.parse_args() + + +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: + print(e) + self.recent_info = self.qbt_client.torrents_info(status_filter='completed') + self.hash = None + self.name = None + self.new_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 + 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 + 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)} E{matchObj.group(2)}.{n[-1]}') + + def rename_hash(self, torrent_hash): + self.hash = torrent_hash + try: + self.qbt_client.torrents_rename_file(torrent_hash=self.hash, old_path=self.name, new_path=self.new_name) + self.count += 1 + print(f'{self.name} >> {self.new_name}') + except: + return + + def rename_app(self): + if self.method not in ['pn', 'normal', 'hash']: + print('error method') + elif self.method == 'normal': + for i in range(0, self.torrent_count + 1): + try: + self.rename_normal(i) + except: + sys.stdout.write(f"-----已完成对{i + 1}个文件的检查,已对其中{self.count}个文件进行重命名-----" + '\n') + sys.stdout.write("------------------------完成------------------------" + '\n') + sys.stdout.flush() + elif self.method == 'pn': + for i in range(0, self.torrent_count + 1): + try: + self.rename_pn(i) + except: + sys.stdout.write(f"-----已完成对{i + 1}个文件的检查,已对其中{self.count}个文件进行重命名-----" + '\n') + sys.stdout.write("------------------------完成------------------------" + '\n') + sys.stdout.flush() + elif self.method == 'hash': + self.rename_hash(args.hash) + + +if __name__ == "__main__": + sys.stdout.write('Program start.' + '\n') + sys.stdout.flush() + while True: + rename = QbittorrentRename(method) + rename.rename_app() + time.sleep(float(delay_time)) diff --git a/Docker/requirements.txt b/Docker/requirements.txt new file mode 100644 index 00000000..87b12b28 --- /dev/null +++ b/Docker/requirements.txt @@ -0,0 +1 @@ +qbittorrent_api==2022.4.30 \ No newline at end of file diff --git a/README.md b/README.md index bd119eb9..491635c1 100644 --- a/README.md +++ b/README.md @@ -55,5 +55,18 @@ hash = $1 ``` QB 中调用该脚本并且引入 **%I** 属性 +## Docker 部署 +可以使用 Docker 部署重命名应用: +```shell +docker run -d \ + --name=Bangumi_rename \ + -e HOST=192.168.31.10:8181 \ + -e USER=admin \ + -e PASSWORD=adminadmin \ + -e METHOD=pn \ + -e TIME=1800 \ + estrellaxd/bangumi_rename_qb:latest +``` + # 声明 本项目的自动改名规则根据 [miracleyoo/anime_renamer](https://github.com/miracleyoo/anime_renamer) 项目 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..69f84d88 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +qbittorrent_api==2022.4.30