From 2b70e7e639e4a0fbb80758a83d7497d337afec69 Mon Sep 17 00:00:00 2001 From: EstrellaXD Date: Mon, 16 May 2022 14:19:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rename.py | 118 ----------------- rename.sh | 3 - rename_qb.py | 2 - rss_ruleset.sh | 5 - rule_set.py | 28 ++-- shell/rename.sh | 4 + shell/rss_ruleset.sh | 6 + 自动追番机搭建教程.md | 301 ------------------------------------------ 8 files changed, 24 insertions(+), 443 deletions(-) delete mode 100644 rename.py delete mode 100644 rename.sh delete mode 100644 rss_ruleset.sh create mode 100644 shell/rename.sh create mode 100644 shell/rss_ruleset.sh delete mode 100644 自动追番机搭建教程.md diff --git a/rename.py b/rename.py deleted file mode 100644 index d51f0b3b..00000000 --- a/rename.py +++ /dev/null @@ -1,118 +0,0 @@ -import re -import os -import io -import sys -import os.path as op -import argparse -import codecs -from glob import glob -import qbittorrentapi -from pathlib2 import Path -import requests - -log_name=op.join(op.dirname(op.realpath(__file__)), 'log.txt') - -# 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') - -# Parse the input arguments. You can whether input only root, or only path, or both root and name. -parser = argparse.ArgumentParser(description='Regular Expression Match') -parser.add_argument('--root', default='', - help='The root directory of the input file.') -parser.add_argument('--name', default='', - help='The file name of the input file.') -parser.add_argument('--path', default='', - help='The file full path of the input file.') -parser.add_argument('--hash', default='', - help='The torrent Hash value.') - - -def rename(root, name, hash): - root = Path(root) - - for rule in episode_rules: - matchObj = re.match(rule, name, re.I) - if matchObj is not None: - new_name = f'{matchObj.group(1)} E{matchObj.group(2)} {matchObj.group(3)}' - # print(matchObj.group()) - # print(new_name) - print(f'{name} -> {new_name}') - with codecs.open(log_name, 'a+', 'utf-8') as f: - # f.writelines(f'{name} -> {new_name}') - print(f'{name} -> {new_name}', file=f) - - qb_rename(hash, str(name), str(new_name)) -# os.rename(str(root/name), str(root/new_name)) - #general_check(root, new_name) - return - #general_check(root, name) - - -def general_check(root, name): - new_name = ' '.join(name.split()) - if new_name != name: - print(f'{name} -> {new_name}') - with codecs.open(log_name, 'a+', 'utf-8') as f: - print(f'{name} -> {new_name}', file=f) - os.rename(str(root/name), str(root/new_name)) - - -def qb_rename(hash, old_path, new_path): - qbt_client = qbittorrentapi.Client(host='192.168.31.10:8181', username='admin', password='adminadmin') - try: - qbt_client.auth_log_in() - except qbittorrentapi.LoginFailed as e: - print(e) - qbt_client.torrents_rename_file(torrent_hash=hash, old_path=old_path, new_path=new_path) - - -if __name__ == "__main__": - args = parser.parse_args() - if op.isdir(args.path): - args.root = args.path - args.path = '' - - if args.name != '' and args.root != '': - temp = str(args.root/args.name) - if op.isdir(temp): - args.root = temp - args.name = '' - - if args.path != '': - root, name = op.split(args.path) - rename(root, name, args.hash) - elif args.name != '' and args.root != '': - rename(args.root, args.name, args.hash) - elif args.root != '': - files = [] - for suffix in suffixs: - files.extend(Path(args.root).rglob('*.'+suffix)) - files.extend(Path(args.root).rglob('*.'+suffix.upper())) - print(f'Total Files Number: {len(files)}') - for path in files: - root, name = op.split(path) - rename(root, name, args.hash) - else: - print('Please input whether only root, or only path, or both root and name') - # os.system('PAUSE') - # for rule in episode_rules: - # matchObj = re.match(rule, name, re.I) - # if matchObj is not None: - # new_name = f'{matchObj.group(1)} E{matchObj.group(2)} {matchObj.group(3)}' - # # print(matchObj.group()) - # # print(new_name) - # print(f'{name} -> {new_name}') - # with open(r'C:\Users\miracleyoo\Documents\Program\utorrent\log.txt', 'a+') as f: - # print(f'{name} -> {new_name}', file=f) - - # os.rename(str(root/name), str(root/new_name)) - # break \ No newline at end of file diff --git a/rename.sh b/rename.sh deleted file mode 100644 index 4bfabbc1..00000000 --- a/rename.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -python3 /path/Bangumi_Auto_Rename/rename_qb.py --method normal \ No newline at end of file diff --git a/rename_qb.py b/rename_qb.py index 05389f31..94d3467d 100644 --- a/rename_qb.py +++ b/rename_qb.py @@ -96,8 +96,6 @@ class QbittorrentRename: self.rename_hash(args.hash) - - if __name__ == "__main__": rename = QbittorrentRename(method) rename.rename_app() diff --git a/rss_ruleset.sh b/rss_ruleset.sh deleted file mode 100644 index 3984febf..00000000 --- a/rss_ruleset.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -BangumiName=$1 - -python3 /path/rule_set.py --name $BangumiName diff --git a/rule_set.py b/rule_set.py index 2798e5dd..72cc0ef1 100644 --- a/rule_set.py +++ b/rule_set.py @@ -1,31 +1,31 @@ -# utf-8 +# -*- coding: UTF-8 -*- import qbittorrentapi import json import argparse import os +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(): - 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'] - qbt_client = qbittorrentapi.Client(host=host_ip, username=user_name, password=password) try: qbt_client.auth_log_in() except qbittorrentapi.LoginFailed as e: print(e) - - parser = argparse.ArgumentParser(description='Set RSS download rule.') - parser.add_argument('--name', default='', - help='Bangumi Name') args = parser.parse_args() bangumi_name = args.name - rule = {'enable':True, + rule = {'enable': True, 'mustContain': bangumi_name, 'mustNotContain': '720', 'useRegx': True, diff --git a/shell/rename.sh b/shell/rename.sh new file mode 100644 index 00000000..3620e5ad --- /dev/null +++ b/shell/rename.sh @@ -0,0 +1,4 @@ +#!/bin/bash +# -*- coding: UTF-8 -*- + +python3 /path/Bangumi_Auto_Rename/rename_qb.py \ No newline at end of file diff --git a/shell/rss_ruleset.sh b/shell/rss_ruleset.sh new file mode 100644 index 00000000..716e9a95 --- /dev/null +++ b/shell/rss_ruleset.sh @@ -0,0 +1,6 @@ +#!/bin/bash +# -*- coding: UTF-8 -*- + +bangumi_name=$1 + +python3 /path/rule_set.py --name $bangumi_name diff --git a/自动追番机搭建教程.md b/自动追番机搭建教程.md deleted file mode 100644 index f5e18f52..00000000 --- a/自动追番机搭建教程.md +++ /dev/null @@ -1,301 +0,0 @@ -# 后版权时代,打造属于自己的全平台自动追番机 - -# 前言 - -好的时代总是转瞬即逝,作为一个看番接近十年的「老二次元」,观看动画的渠道不断更迭,从最开始的各种论坛找资源,再到看早期 bilibili 字幕组版本,随后迎接大版权时代之后,在各个版权平台反复横跳,最后倒最近这段可谓版权番剧的黑暗时代。索性初心还在,不断更迭自己的追番方式之余,我也在思考是否有一种让自己解放双手,节约时间的追番方式。因此在研习了其他大佬们的追番下载器之后,我做出了这套全流程简化的终极版自动追番机器。 - -本文由 Markdown 撰写,如果要活的较好的体验可以去我的仓库阅读 - -# 搭建思路 - -追番机器的思路非常简单,我在之前的文章中也提到过: - -![Image](https://res.craft.do/user/full/197c92e0-1244-4b84-8135-8bfc5d12ebdc/doc/508D33BF-58F0-4CB1-A374-5BA492EC0949/5F0255F8-9F3E-437D-95DE-62FC32B096D5_2/JrjQ1dHWod9Dp8td7S9pBg5wyCqtM720IxsH3EF5bxwz/Image) - -番剧的信息和下载地址由种子站/资源站提供,通过订阅 RSS 源到 qBittorrent 中,BT 软件可以订阅到所有当季新番的 RSS 种子推送,再手动设定/通过快捷指令调用 WebAPI 在 BT 软件中建立自动下载规则,设定好保存文件的路径,自动下载并且归类在本地硬盘中。再经由 Plex 等本地媒体服务器搜刮元数据,通过网页端的 Plex 或者推送 infuse 等终端播放器上,实现基本全自动的本地追番功能。 - -# 搭建过程 - -了解了思路之后就可以跟着笔者一起来搭建这套追番系统了,你可以用任何平台来搭建他:Windows/macOS/Linux,当然用一台能够 7x24 小时开机的 NAS 系统或者 Linux 系统的主机来搭建可以获得更好的追番体验。那么接下来,让我们 Drive in 吧。 - -## qBittorrent 安装 - -笔者使用 qBittorrent 作为 BT 下载工具,如果你熟悉使用 Aria2 或者其他下载工具可以跳过这一步骤。 - -**Windows/ macOS** - -在 Win 或者 Mac 下,只需要在[官网](https://www.qbittorrent.org/download.php)下载其安装包,一路确定安装到底即可,不过为了之后的操作,你还需要在其 GUI 中打开 WebUI 以及 RSS 下载等几个选项。 - -![Image.png](https://res.craft.do/user/full/197c92e0-1244-4b84-8135-8bfc5d12ebdc/doc/508D33BF-58F0-4CB1-A374-5BA492EC0949/6D6F7A41-69C8-4F4D-BA3B-01EE7452CFD4_2/mfF5VVCGruXYYMXOITPh7kGPzRtgcucEGyDmIWcUWtMz/Image.png) - -![Image.png](https://res.craft.do/user/full/197c92e0-1244-4b84-8135-8bfc5d12ebdc/doc/508D33BF-58F0-4CB1-A374-5BA492EC0949/03E53ED5-D79D-48B0-AEE1-CCF78CB0EBAD_2/I43xM59BeWBnO7rhpCWiJg25XkhW2IeWzghqFsyKDKYz/Image.png) - -打开 WebUI 以及 RSS 订阅的开关 - -之后你就可以在 `http://localhost:8181` 或者 `http://:8181` 访问 qBittorrent 的 Web 端,并且可以对其发送 WebAPI 的指令了。 - -**Linux** - -Linux 下我更推荐使用 Docker 进行安装,有关于 Docker 的安装本文不多赘述,可以通过以下指令一件安装: - -```Bash -docker run -d \ - --name=qbittorrent \ - -e PUID=1000 \ - -e PGID=1000 \ - -e TZ=Europe/London \ - -e WEBUI_PORT=8181 \ - -p 8181:8181 \ - -p 6881:6881 \ - -p 6881:6881/udp \ - -v /path/to/appdata/config:/config \ - -v /path/to/downloads:/downloads \ - --restart unless-stopped \ - lscr.io/linuxserver/qbittorrent:latest -``` - -安装完成之后,一样可以通过 WebUI 访问 qB,同样打开 RSS 订阅以及自动下载的开关。 - -## RSS 源选择 - -关于 RSS 订阅,其实有很多选择,笔者使用的 蜜柑计划 就是其中之一,其他也可以选择诸如 动漫花园资源网 一样的资源网站,这里分别讲一下两者的用法区别: - -**蜜柑计划:** - -蜜柑计划是一个更偏向追番的资源网站,用户可以在首页看到各个番剧的更新状态,点开番剧之后可以看到不同的字幕组或者资源组更新的种子。你只需要订阅你所想看的番剧和其所属的资源组条目,订阅结果就会呈现在你的总 RSS 订阅中,每个季度你只要等待番剧更新,然后点击订阅,就可以等待 BT 软件读取 RSS 条目并且下载。 - -![Image.png](https://res.craft.do/user/full/197c92e0-1244-4b84-8135-8bfc5d12ebdc/doc/508D33BF-58F0-4CB1-A374-5BA492EC0949/87D89E00-E49E-4A4B-B5EF-D3A7D3F640DF_2/9C1ntquFtMpJIjhPdrFurRJ7xPzSAsZUWge0rSGqBjgz/Image.png) - -**动漫花园:** - -与蜜柑计划不同的是,动漫花园更偏向于传统的 BT 站,不过其 RSS 订阅是根据搜索结果呈现的,你可以选择一个字幕组的 TAG 或者一个番剧的 TAG 或者两者一起进行搜索订阅,笔者更推荐订阅经常看的字幕组,再结合自动下载规则进行下载。 - -![Image.png](https://res.craft.do/user/full/197c92e0-1244-4b84-8135-8bfc5d12ebdc/doc/508D33BF-58F0-4CB1-A374-5BA492EC0949/8F286B6D-6EF3-40BD-9CE8-7E7CA77E40FB_2/vkJVixamgK405n81lsgBW4lv4f5vkQWxy6bcvqbAPtEz/Image.png) - -两者对比: - -- 蜜柑计划: - - 优点:UI 更加易用,订阅之后下载比较清爽,不会出现多个下载到同一个番剧多个字幕组的尴尬情况,而且不需要经常更新订阅的 RSS 源。 - - 缺点:每个季度都要上网站进行手动订阅,并且需要等待字幕组更新管理员添加进条目之后才可以订阅,季度开始的时候操作较为繁琐。 -- 动漫花园: - - 优点:不仅可以追新番,也可以追日剧等其他资源。订阅字幕组之后不需要只需要添加规则就可以等待下载,季度初期操作会比较清爽。 - - 缺点:会有多个 RSS 订阅源,需要经常更新后续调用建立自动下载规则的脚本。 - -## 自动下载规则添加 - -订阅好 RSS 之后,我们还需要建立一些自动下载规则。BT 软件会定时更新 RSS 订阅源,但是更新的条目并不会自动下载。自动下载规则就是让 BT 软件匹配RSS 中的条目并且下载。 - -![Image.png](https://res.craft.do/user/full/197c92e0-1244-4b84-8135-8bfc5d12ebdc/doc/508D33BF-58F0-4CB1-A374-5BA492EC0949/90E1C17E-4BCE-4363-B14C-0C43799E4ECB_2/akOAP39E5qPTeBY78DroUk46dPH0AKxC8bZPfFgvsWgz/Image.png) - -除了自动下载之外,自动下载规则还可以指定其保存的目录,在 BT 软件中种子的分类,以及选择需要匹配的 RSS 订阅源。这个功能极大的简化了我们整理下载文件的工作量,甚至可以说通过规范的设定下载规则,可以免除我们后期手动整理的步骤。 - -### 手动添加 - -自动下载规则可以被我们在 WebUI 或者 GUI 中手动添加,点击 `RSS 下载器` 之后点击左上角的添加按钮,就可以添加一个新的规则,并对其命名 - -![Image.png](https://res.craft.do/user/full/197c92e0-1244-4b84-8135-8bfc5d12ebdc/doc/508D33BF-58F0-4CB1-A374-5BA492EC0949/CF5ACC47-CC00-47FA-B244-7A17D8A60042_2/5BjG9f3dKHuLX38PNbaT5qjHVNmUiDLiUQXvyBOo4uoz/Image.png) - -添加完成之后,我们可以输入一些关键词让 BT 软件筛选: - -![Image.png](https://res.craft.do/user/full/197c92e0-1244-4b84-8135-8bfc5d12ebdc/doc/508D33BF-58F0-4CB1-A374-5BA492EC0949/299A2BCC-6020-4B9E-9AE8-502BB36778EC_2/rdDyeoFdeGhxYyLZVrfpCsRk5GcfYyKV68IwNRopgJYz/Image.png) - -当然这里我们也可以勾选使用正则表达式进行更细致的筛选,笔者先以简单的规则的为例子:我们选择标题内含有「夏日重现」的条目进行下载,过滤掉 720P 分辨率的视频。 - -![Image.png](https://res.craft.do/user/full/197c92e0-1244-4b84-8135-8bfc5d12ebdc/doc/508D33BF-58F0-4CB1-A374-5BA492EC0949/F4B32F4D-3A54-4106-8F79-9098F43C0916_2/gTGSRD2xKXONBUHbymEam2ygNpKN5YyQH2FehWBDuT4z/Image.png) - -然后在 UI 中断,可以选择保存的指定分类,以及存储的路径。设定完成之后,把想要下载的 RSS 订阅源打勾即可完成设置。此时如果 RSS 订阅源中出现了匹配的条目,将会出现在右侧,并且当你点按下 `保存` 之后就会自动开始下载。 - -### 脚本 - -细心的读者已经发现了,手动建立下载规则过于繁琐,那么有没有可以更加简化建立规则的方式呢。笔者在查看[ qBittorrent Github 项目](https://github.com/qbittorrent/qBittorrent)的时候,发现官方给出了非常丰富的 [WebAPI](https://github.com/qbittorrent/qBittorrent/wiki/WebUI-API-(qBittorrent-4.1)) 接口,简单的来说我们不需要打开软件或者网页端,只需要在局域网内,对着 qBittorrent 的端口发送一条符合规范的指令,qBittorrent 就会建立好我们需要的所有自动下载规则。笔者这里挑选两种实现方法进行讲解: - -**快捷指令** - -熟悉快捷指令的朋友一定知道,快捷指令具有发送 URL 请求的功能,通过这个功能,我们就能调用 qBittorrent 的 WebAPI。 - -首先我们来分析一下如何使用 WebAPI,在官方文档中,再调用其他接口之前,我们要先进行认证: - -官方给出了如下的代码: - -```Bash -$ curl -i --header 'Referer: http://localhost:8080' --data 'username=admin&password=adminadmin' http://localhost:8080/api/auth/login -``` - -换成快捷指令之后: - -![Image.png](https://res.craft.do/user/full/197c92e0-1244-4b84-8135-8bfc5d12ebdc/doc/508D33BF-58F0-4CB1-A374-5BA492EC0949/53C35D25-0F0F-4912-9792-1D645E5B3ED0_2/lRbNGyIvy7qsxGAOyI3ybJ7Gr8dthmehjeWWuwIxB48z/Image.png) - -而添加 RSS 自动下载规则需要给 qBittorrent 发送一张表单: - -| **Field** | **Type** | **Description** | -| --------------------------- | -------- | --------------- | -| `enabled` | bool | 是否启用规则 | -| `mustContain` | string | 包含的字符 | -| `mustNotContain` | string | 不包含的字符 | -| `useRegex` | bool | 启用正则表达式 | -| `episodeFilter` | string | 剧集过滤 | -| `smartFilter` | bool | 是否启用剧集过滤 | -| `previouslyMatchedEpisodes` | list | 与剧集过滤列表匹配的ID | -| `affectedFeeds` | list | 需要匹配的 RSS 订阅地址 | -| `ignoreDays` | number | 忽略一定时间之后的匹配项 | -| `lastMatch` | string | 最后匹配时间 | -| `addPaused` | bool | 添加到下载之后暂停 | -| `assignedCategory` | string | 所属分类 | -| `savePath` | string | 保存路径 | - -发送的表单就是我们之前在 WebUI 中设定的各类条目,转化为快捷指令之后: - -![Image.png](https://res.craft.do/user/full/197c92e0-1244-4b84-8135-8bfc5d12ebdc/doc/508D33BF-58F0-4CB1-A374-5BA492EC0949/7F559B9A-245C-40E5-9D23-5932D274C178_2/myL4tv90ZDGTRdbRCOaMeLHYMs8FoU6yxwwz7OvFLnUz/Image.png) - -然后再通过 URL 发送给 qBittorrent: - -![Image.png](https://res.craft.do/user/full/197c92e0-1244-4b84-8135-8bfc5d12ebdc/doc/508D33BF-58F0-4CB1-A374-5BA492EC0949/C3DAEE0F-E5F4-4752-B29B-F152A3C2FC08_2/yWZM2HYoyutF0Wqyx4o2L2ZXzZa0e3cUnAX07irwSyEz/Image.png) - -完成了整体快捷指令框架之后,我们就可以做一些优化的设置:在运行快捷指令的时候,要求用户输入「番剧的名称」,用此名称作为番剧的匹配词条,并且建立以此名称为名的自动下载规则,存储路径也已番剧名称设定。在添加一个季度选项: - -![Image.png](https://res.craft.do/user/full/197c92e0-1244-4b84-8135-8bfc5d12ebdc/doc/508D33BF-58F0-4CB1-A374-5BA492EC0949/6C83515A-3BEA-48B2-A9BC-7535E11502BD_2/oesSlRVQH3WLrbsBuevuAYhb3TqZmIUBRtmVFczaoJ0z/Image.png) - -我们运行快捷指令的时候,就可以只输入一次番剧名称,并选择季度。就可以完成番剧自动下载,保存归类一系列操作。 - -笔者也将写好的快捷指令分享在这里: - -[自动追番机-追番规则建立器](https://www.icloud.com/shortcuts/2c99841626244550ae595abd2429b802) - -**Shell 脚本** - -不过不一定所有的读者都有条件使用快捷指令,我们也可以使用 `curl` 命令发送,同样我们可以撰写一个 `bash` 脚本,windows 则为 `cmd` 脚本 - -```shell -# ————————————————————————————以下为 Shell 脚本—————————————————————————————— -#!/bin/bash - -BangumiName=$1 -ruleset={ - 'enable':True, - 'mustContain':'$BangumiName', - 'mustNotContain':'720', - 'useRegx':True, - 'episodeFilter':'', - 'smartFilter':False, - 'previouslyMatchedEpisodes':[], - 'affectedFeeds':[], - 'ignoreDays':0, - 'lastMatch':'', - 'addPaused':False, - 'assignedCategory':'Bangumi', - 'savePath':'/path/$BangumiName' -} - -curl -i --header 'Referer: http://localhost:8080' --data 'username=admin&password=adminadmin' http://localhost:8080/api/v2/auth/login -curl -i --data 'ruleName=$BangumiName&ruleDef=$ruleset' http://localhost:8080/api/v2/rss/setRule - -# ——————————————————————————————以下为 CMD 脚本—————————————————————————————————— -set BangumiName=$1% -set ruleset={ - 'enable':True, - 'mustContain':'$BangumiName', - 'mustNotContain':'720', - 'useRegx':True, - 'episodeFilter':'', - 'smartFilter':False, - 'previouslyMatchedEpisodes':[], - 'affectedFeeds':[], - 'ignoreDays':0, - 'lastMatch':'', - 'addPaused':False, - 'assignedCategory':'Bangumi', - 'savePath':'/path/$BangumiName' - } - -curl -i --header 'Referer: http://localhost:8080' --data 'username=admin&password=adminadmin' http://localhost:8080/api/v2/auth/login -curl -i --data 'ruleName=$BangumiName%&ruleDef=$ruleset%' http://localhost:8080/api/v2/rss/setRule -``` - -运行: - -```Bash -/path/shell.sh <番剧名称> # UNIX -/path/shell.cmd <番剧名称> # Windows -``` - -即可完成和快捷指令一样的操作添加自动下载规则并且规划下载路径。 - -## 媒体搜刮 - Plex 安装与使用 - -完成下载之后我们还需要一个服务端对于下载好的文件进行收集以及元数据搜刮,笔者使用的 Plex 对于日本番剧的支持较好。 - -通向的 Win/Mac 可以在[官网下载](https://www.plex.tv/media-server-downloads/#plex-media-server)到 Plex Server(注意是 Server 不是 Client) - -Linux 下同样推荐使用 Docker 进行安装,安装命令如下: - -```Bash -docker run -d \ - --name=plex \ - --net=host \ - -e PUID=1000 \ - -e PGID=1000 \ - -e VERSION=docker \ - -e PLEX_CLAIM= `#optional` \ - -v /path/to/library:/config \ - -v /path/to/tvseries:/tv \ - -v /path/to/movies:/movies \ - --restart unless-stopped \ - lscr.io/linuxserver/plex:latest -``` - -需要注意的是,在 Plex 路径里面设定刚刚 qBittorrent 的下载路径为媒体文件夹路径。 - -完成安装之后,Plex会引导你进入 `https://127.0.0.1:32400` 也就是 Plex Server 的 WebUI,我们需要注册并登陆 Plex 账号: - -![Image.png](https://res.craft.do/user/full/197c92e0-1244-4b84-8135-8bfc5d12ebdc/doc/508D33BF-58F0-4CB1-A374-5BA492EC0949/D38F5975-82DB-4E3B-B8BE-49711EC41026_2/8HvOnB42lomkwrDbf2hUwXTKO32j1wMgDpkdPfoPUcsz/Image.png) - -![Image.png](https://res.craft.do/user/full/197c92e0-1244-4b84-8135-8bfc5d12ebdc/doc/508D33BF-58F0-4CB1-A374-5BA492EC0949/F7E07CFC-1B01-46BF-910D-9E745890176F_2/2dIyFw6fFNi73egrfoENOZhrRmIPTJWonqY8KdsCfdEz/Image.png) - -设定媒体服务器,并且吧下载番剧的文件夹指定为「电视节目」即可。 - -进入 Plex 主界面之后,我们点击右上角的扳手图标,对资料库进行进一步设置: - -![Image.png](https://res.craft.do/user/full/197c92e0-1244-4b84-8135-8bfc5d12ebdc/doc/508D33BF-58F0-4CB1-A374-5BA492EC0949/C0519115-B58B-4B98-89D4-F0E3C001C457_2/o0xTvWPCfZ0ysLbcRl1xlC7kobQ0l2B5T6G2DjnRMGgz/Image.png) - -![Image.png](https://res.craft.do/user/full/197c92e0-1244-4b84-8135-8bfc5d12ebdc/doc/508D33BF-58F0-4CB1-A374-5BA492EC0949/7C9313F0-95F4-448F-AF43-AF0E2CB61523_2/iJzhNMNl0oKGMpPd4xbsx0x33fPu0YmggCdGhl2zmLQz/Image.png) - -完成这一系列设置之后,等待 Plex Server 对资料库进行扫描之后,我们应该就可以看到整整齐齐的番剧信息了。 - -![Image.png](https://res.craft.do/user/full/197c92e0-1244-4b84-8135-8bfc5d12ebdc/doc/508D33BF-58F0-4CB1-A374-5BA492EC0949/6F38065B-FCF8-47DC-8037-707382CD7000_2/GCdwx9cJMzu7CXuHgzSsJDSwNJ74ZAOVppb1FmsQHMcz/Image.png) - -当然,如果有元数据不匹配的情况,我们也可以点击封面右下角的选项进行修正匹配: - -![Image.png](https://res.craft.do/user/full/197c92e0-1244-4b84-8135-8bfc5d12ebdc/doc/508D33BF-58F0-4CB1-A374-5BA492EC0949/AAC43BF5-C868-42A4-BA9F-0DB535ABC79B_2/UXE3gL7qNq6L5tnLOe4CGuByzC6AMzgZMY2TAkv5iQMz/Image.png) - -### 免费的联动 - infuse - -Plex 虽然是一款免费的媒体服务器,但是如果要使用客户端的话还是要支出一笔不菲的订阅费用。这时候我们可以请出大家熟悉的 infuse 了,在 infuse 中添加媒体库的最下方,提供了联动 Plex 媒体库的选项,我们只需要点击添加 Plex 媒体库,并且登陆,就可以把我们的番剧资料库同时添加进 infuse 中。 - -![Image.png](https://res.craft.do/user/full/197c92e0-1244-4b84-8135-8bfc5d12ebdc/doc/508D33BF-58F0-4CB1-A374-5BA492EC0949/536EEBA7-4DB7-431A-A6D9-7F627945A4EF_2/FT74JfDNQSYAaNfVPqp5rPwApsMS4k8ZrvfYFHVWAE4z/Image.png) - -而 infuse 只有在观看 4K 影片的时候才需要付费解锁,而大部分的动漫番剧均为 1080P,这样在客户端上我们也可以无限制的观看自己媒体库的番剧了。 - -![Image.png](https://res.craft.do/user/full/197c92e0-1244-4b84-8135-8bfc5d12ebdc/doc/508D33BF-58F0-4CB1-A374-5BA492EC0949/4DB3D7E1-6BE9-4825-89BE-4DAD7958F877_2/mAumjoahWaTxzejBdeliRAG40ykHMn7hWkW5Qc9goMUz/Image.png) - -## 意外情况处理 - -不过到这里,我们还有一点小问题需要处理,那就是 Plex 在检索元数据的时候,所使用的检索规则和大部分国内字幕组对番剧的命名规则不匹配,国内的番剧字幕组通常以以下这种形式对番剧进行命名: - -而 Plex 对于中括号的识别非常糟糕,因此我们除了在选择订阅资源组的时候选择命名符合 Plex 识别规范的文件之外,也可以使用 Python 对不符合要求的番剧文件重命名。 - -先前也 [dalao ](https://github.com/miracleyoo/anime_renamer)写过自动重命名的脚本,不过他使用直接重命名的方式,会使得 qBittorrent 中丢失种子和文件的连接。我在 dalao 的其基础上稍加改进,由于 qBittorrent 中提供了更改文件名称的 API,我们只需要在程序中调用即可即更改名称,有不断开种子和文件的关联,并且通过 API 的方式也不需要让 Python 脚本运行在服务器上,在局域网内的任何一个设备上运行即可。 - -相关的程序可以去我的[ Github 仓库](https://github.com/EstrellaXD/Bangumi_Auto_Rename_qbittorrnet)下载。不过由于 Docker 运行的 qBittorrent 存在一些 bug,尝试需求也没成功调用在种子「下载完成之后运行程序」这一功能,因此我才用了 `crontab` 定时运行的方式,让脚本每半小时运行一次,即可完成番剧改名。 - -```shell -crontab -e # 创建 crontab 脚本 -``` - -```shell -0,30 * * * * python3 /path/rename_qb.py -``` - -# 总结 - -至此,自动追番机器的搭建就已经全部完成。我们所需要做的仅仅是每季度番剧更新的时间进行 RSS 订阅,并且通过「快捷指令」或者 Shell 设定想要追的番剧,就可以在 Plex 或者 infuse 上享受一站式的追番体验了。 -