PT 之 Flexget

最近无意中在学校 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

官方安装文档见:https://flexget.com/InstallWizard/Windows

截止笔者写本篇文章时,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

官方配置教程:https://flexget.com/Configuration

此处以官方文档的顺序,对 Flexget 的配置文件进行简单介绍。

(1).Flexget 基本语法

Flexget 配置文件使用 YAML 语言,该语言主要提供了一种描述键值对集合的方法。在 Flexget 语言中,需要严格遵守缩进格式,每缩进级别之间总是相距偶数倍的空格,并且不允许使用 tab 作为空格的替代。即只允许如下示例的配置文件:

tasks:
  test_task:
    rss:

可以看到上述示例中,tasktest_task 之间缩进为两个空格,rsstest_task 之间缩进为两个空格。

在 Flexget 的 YAML 配置文件中,不同的关键字视他们的层级不同,缩进级别也不尽相同,但是有一些关键字是无需缩进的(即顶格),列表如下:

  • tasks
  • templates
  • schedule
  • web_server
  • variables
  • irc

Flexget 中其他所有关键字的缩进级别都在上述关键字之下。比如在上个例子中,test_tasktask 下,因此缩进两个空格。 需要注意的是,键值对(如 port: 1234)中,冒号后必须有一个空格

(2).Flexget 任务

知道了 Flexget 基本语法就可以进行简单的配置了,PT 常用的配置文件中,使用 tasks 关键字描述需要执行的任务(不止一个任务)。每个任务在 tasks 层级下(也就是相对 tasks 缩进两个空格,之后不再赘述),名称可以自由命名。如在下面的代码中,自定义了两个任务分别为 M-TeamU-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 下载的资源保存路径(不是种子),hostport 顾名思义为 QB Web UI 的主机名和端口号,usernamepassword 为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 任务相同(只有 rssdownload 不同),但是我们却要重新写一遍代码,复制粘贴并不是一种优雅的解决问题的方式,而且冗长的代码可读性并不好,因此这里我们可以使用 Flexget 的模板(templates)功能来帮我们解决这一问题。

模板(templates)允许我们定义一个或多个插件并在不同的任务中重复使用它们。在上面的代码示例中,任务 M-Team 和任务 another 都包含了相同的插件 content_sizeqbittorrentfree_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 下定义了三个模板(注意观察缩进关系)。三个模板名称分别为 freespaceqbsize。模板的内容即为它们层级下的插件。

那么如何使用定义好的模板?只需简单地在需要调用模板的任务中引入即可,示例如下:

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/

《PT 之 Flexget》上有1条评论

发表回复

您的电子邮箱地址不会被公开。