最近无意中在学校 Linux 群看见有人玩 PT,非常好奇,就用空闲时间入了个坑。入坑发现很多博客的教程只做到了授人以鱼,贴上了大段的示例代码并直言照抄即可,却并没有说明整个软件的框架、作用,翻来覆去还是得自己啃官方文档来的最清楚,本文目的便是笔者记录一下自己的学习理解。
一、什么是 Flexget
FlexGet is a multipurpose automation tool for all of your media
根据官方介绍,Flexget 是一个多用途的自动化媒体工具。笔者尚不清楚 Flexget 的功能究竟有多强大,但是至少明白在 PT 下载里的作用:Flexget 用来自动从多个 PT 站点获取你想要的种子,并下载、推送到指定的 BT 客户端(如 qBitorrent, uTorrent等)。可以说是将 RSS 订阅这一行为进行了自动化。相较于 BT 客户端自带的 RSS 订阅自动下载功能,Flexget 功能性更强(如在筛选种子方面),扩展性更好。
二、如何使用 Flexget
笔者由于环境因素,只在 Windows 系统中使用了 Flexget(没钱买盒子…),因此下文主要为 Windows 端 Flexget 的介绍。
1.安装 Flexget
截止笔者写本篇文章时,Flexget 需要在 python-3.6 至 python-3.10 的环境中安装。此处笔者为了方便管理 python 环境,使用 anaconda 创建并管理 python 环境。anaconda 的安装不再本文赘述。
首先,打开 Anaconda Power Shell Promt,新建一个虚拟 python 环境,此处新建了一个 python 版本为 3.8 的虚拟环境,-n python-3-8
表示将改环境命名为 python-3-8 :
conda create -n python-3-8 python=3.8
为了方便,笔者切换软件源到清华源:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
接着切换到新建好的虚拟环境,按照官方文档上的指示,安装 flexget:
conda activate python-3-8
python -m pip install -U pip setuptools
pip install flexget
安装完成后,输入 flexget -V
应该可以看见版本信息。flexget 安装完成。
2.配置 Flexget
此处以官方文档的顺序,对 Flexget 的配置文件进行简单介绍。
(1).Flexget 基本语法
Flexget 配置文件使用 YAML 语言,该语言主要提供了一种描述键值对集合的方法。在 Flexget 语言中,需要严格遵守缩进格式,每缩进级别之间总是相距偶数倍的空格,并且不允许使用 tab 作为空格的替代。即只允许如下示例的配置文件:
tasks:
test_task:
rss:
可以看到上述示例中,task
和 test_task
之间缩进为两个空格,rss
和 test_task
之间缩进为两个空格。
在 Flexget 的 YAML 配置文件中,不同的关键字视他们的层级不同,缩进级别也不尽相同,但是有一些关键字是无需缩进的(即顶格),列表如下:
tasks
templates
schedule
web_server
variables
irc
Flexget 中其他所有关键字的缩进级别都在上述关键字之下。比如在上个例子中,test_task
在 task
下,因此缩进两个空格。 需要注意的是,键值对(如 port: 1234
)中,冒号后必须有一个空格。
(2).Flexget 任务
知道了 Flexget 基本语法就可以进行简单的配置了,PT 常用的配置文件中,使用 tasks
关键字描述需要执行的任务(不止一个任务)。每个任务在 tasks
层级下(也就是相对 tasks
缩进两个空格,之后不再赘述),名称可以自由命名。如在下面的代码中,自定义了两个任务分别为 M-Team
和 U-2
:
tasks:
M-Team:
# 名称为 M-team 的任务的具体行为,此处省略
U-2:
# 名称为 U-2 的任务的具体行为,此处省略
每次执行 flexget execute
都会执行 tasks
中所有任务。
每个任务描述了 Flexget 具体该如何工作,笔者习惯于按 PT 站点创建对应的任务,故笔者的配置文件中每个任务就描述了不同站点的抓取方式。下面以笔者的馒头站配置文件为例,介绍如何编写一个任务使其工作:
# M-team 站任务
tasks:
M-Team:
rss: http://mysite.com/myfeed.rss # 此处替换为你的 RSS 链接
accept_all: yes
seen:
fields:
- url
content_size:
min: 1024
max: 40960
download: D:\qBittorrent\flexget_torrents
qbittorrent:
path: D:\qBittorrent\flexget_downloads
host: localhost
port: 1234
username: your_user_name
password: your_user_password
free_space:
path: D:\
space: 45000
Flexget 每个任务下的关键字都描述了一个插件(plugins),比如 rss:
表示使用 rss
插件。插件主要分为三类:输入,过滤器和输出。其中,输入类的插件描述了在这个任务中,你希望 Flexget 去哪里获得资源作为任务的输入,过滤器类的插件描述了你希望在输入类插件提供的输入资源中,哪些资源需要,哪些资源不需要。最后,输出类的插件描述了你希望对过滤后的输入资源进行怎样的操作。综上所述,Flexget 的每个任务好比一个工作流,描述了获取资源->过滤资源->加工资源的这样一个过程。而前述的 rss
插件就是一个输入类插件,它告诉我们使用冒号后面的 RSS 链接指向的资源作为输入。
值得注意的是,插件的顺序并不影响他们具体的行为,你可以按任意顺序排列插件,但是最有逻辑性的顺序将会是输入->过滤->输出
在上述代码示例中,我们已经知道该任务先将一个插件 rss
作为输入插件。接下来笔者简单介绍一下其余各个插件的含义:
accept_all
:该插件为过滤插件,接受输入插件rss
中的所有内容seen
:该插件为过滤插件,负责记录所有已接受过的输入,输入的资源中第二或更多次出现的内容将被排除(简而言之,只选择之前执行任务时没有碰到过的内容),后面的fields
以及url
表示通过匹配 URL 来判断某一内容在之前是否遇到过。content_size
:该插件为过滤插件,负责在输入的资源中只选择大小范围在 1024MB – 40960MB 之间的内容。download
:该插件为输出插件,表示将过滤后的内容下载到D:\qBittorrent\flexget_torrents
文件夹中。qbittorrent
:该插件负责和 QB 进行交互,path
字段表示 qb 下载的资源保存路径(不是种子),host
和port
顾名思义为 QB Web UI 的主机名和端口号,username
和password
为QB Web UI 的用户名和密码,均可在 QB 中进行相应的配置。在该任务中,每一个输出的内容(即种子文件,保存在download
插件指向的目录中)都会通过此模块提交给 QB 自动进行下载。free_space
:该插件监测磁盘剩余空间,当path
(此处为D:\
)所指向的目录空间不足size
大小(此处为 45000MB)时,放弃任务。
在 Flexget 中有很多插件,可以实现非常强大的功能,此处仅对常用插件进行介绍,更多的插件说明详见 Flexget 官网。
(3).Flexget 模板
在上节代码示例中只有一个任务,即 M-Team
,许多 PT 大佬往往坐拥数十个 PT 站,一个任务的描述能力是远远不够应付多个站点的。因此我们需要添加更多的任务交给 Flexget 执行。此处,假设我们需要为另一个站增加一个任务,任务名称为 another
,增加任务后的代码如下:
tasks:
# M-team 站任务
M-Team:
rss: http://mysite.com/myfeed.rss # 此处替换为m-team的 RSS 链接
accept_all: yes
seen:
fields:
- url
content_size:
min: 1024
max: 40960
download: D:\qBittorrent\flexget_torrents
qbittorrent:
path: D:\qBittorrent\flexget_downloads
host: localhost
port: 1234
username: your_user_name
password: your_user_password
free_space:
path: D:\
space: 45000
# another 站的任务
another:
rss: http://mysite.com/myfeed.rss # 此处替换为 another 的 RSS 链接
content_size:
min: 1024
max: 40960
download: D:\qBittorrent\another_torrents
qbittorrent:
path: D:\qBittorrent\flexget_downloads
host: localhost
port: 1234
username: your_user_name
password: your_user_password
free_space:
path: D:\
space: 45000
新添加的任务大部分代码都和 M-Team
任务相同(只有 rss
和 download
不同),但是我们却要重新写一遍代码,复制粘贴并不是一种优雅的解决问题的方式,而且冗长的代码可读性并不好,因此这里我们可以使用 Flexget 的模板(templates
)功能来帮我们解决这一问题。
模板(templates
)允许我们定义一个或多个插件并在不同的任务中重复使用它们。在上面的代码示例中,任务 M-Team
和任务 another
都包含了相同的插件 content_size
,qbittorrent
和 free_pace
(并且插件的配置也相同)。因此我们可以为这三个插件各自定义一个模板来复用它们:
templates:
freespace:
free_space:
path: D:\
space: 45000
qb:
qbittorrent:
path: D:\qBittorrent\flexget_downloads
host: localhost
port: 1234
username: your_user_name
password: your_user_password
size:
content_size:
min: 1024
max: 40960
上面的代码在 templates
下定义了三个模板(注意观察缩进关系)。三个模板名称分别为 freespace
,qb
,size
。模板的内容即为它们层级下的插件。
那么如何使用定义好的模板?只需简单地在需要调用模板的任务中引入即可,示例如下:
templates:
freespace:
free_space:
path: D:\
space: 45000
qb:
qbittorrent:
path: D:\qBittorrent\flexget_downloads
host: localhost
port: 1234
username: your_user_name
password: your_user_password
size:
content_size:
min: 1024
max: 40960
####################分隔线#####################
tasks:
# M-team 站任务
M-Team:
rss: http://mysite.com/myfeed.rss # 此处替换为m-team的 RSS 链接
accept_all: yes
seen:
fields:
- url
download: D:\qBittorrent\flexget_torrents
template: # 使用模板
- qb
- freespace
- size
# another 站的任务
another:
rss: http://mysite.com/myfeed.rss # 此处替换为 another 的 RSS 链接
download: D:\qBittorrent\another_torrents
template: # 使用模板
- qb
- freespace
- size
观察引入了模板的代码示例,代码所描述的功能没有变化,但却大大减小了代码长度与冗余。在有更多任务的 Flexget 配置文件中更是如此。Flexget 还支持执行指定模板的任务,非常方便。
3.使用 Flexget
写完配置文件后,便可以让 Flexget 按照写好的配置文件去执行任务,Flexget 默认去当前执行的路径下寻找配置文件(在 Windows 中为 C:\Users\你的用户名\.flexget\config.yml
)(Linux 系统中为 ~/.config/flexget
),也可以在命令行参数中加上 -c [path]
参数来指定一个配置文件。
如果你是按照笔者本篇文章所述配置的 python 环境,则完整手把手执行过程如下:
打开 Anaconda Power Shell Promt(在 Windows 开始菜单应用列表的 Anaconda3 文件夹下),输入 conda activate python-3-8
(本篇文章在开头建立的 python 环境的名称,如果你起的名字不一样换成你自己的)来切换到 python 3.8 环境,进入你的家目录(Windows 下为 C:\Users\你的用户名\
),确保你已经将配置文件放在 C:\Users\你的用户名\.flexget\
文件夹下(没有就自己建一个放进去),然后在命令行输入 flexget execute
即可。第一次执行该命令建议加上 --learn
参数,来避免下载太多的老旧种子抢占硬盘空间。
三、结语
截至本文完成时,笔者接触 PT 坑大约三天,许多资料搜集匆忙,一些高级操作也还没学会,权当给后入坑的(最好是有一定计算机基础,看起来可能比较舒适)的 PT 萌新作为一个简陋的参考。后面有空也许会更新一些其他 PT 的内容如 ART 吧。
四、参考资料
- https://flexget.com/Plugins/
- https://blog.xiaocai.win/2020/02/03/seedbox.html
- https://www.machunjie.com/setup/pt/854.html
- https://blog.deng.cf/posts/flexget/
写的很详细,对于我这种菜鸟都能看懂。但是还有其他比如删种条件。也写上,要写就来一个完整。有始有终的。
感谢建议,这部分内容近期会补上。
大佬快更,就指望你的教程过日子呢,看了看你的引用,一知半解。还是你这个写的好。继续这样详细的写,每名都加上注释,我也好理解。还是我是打算用tr的,但是说要安装什么rpc,你给写写安装这个东西的教程。
m-team的似乎已经不好用了?
配置文件在我这边目前使用没发现什么问题。M-Team 的站点安全性较高,如果频繁更换你的 IP 地址范围的话可能会触发 Cloudflare 5秒盾导致访问失败,可能是不好用的原因之一。
你好,我是MT的站長,方便讓我轉貼此教學文至我們的新手教程區嗎
可以,欢迎转载哟~