FlexGet 官网是这样描述自己的,媒体文件的多功能自动化工具。可以支持 torrents, nzbs, podcasts, comics, TV, movies, RSS, HTML, CSV, 等等作为输入。FlexGet 是 Python 编写的,所以如果想要实现更加复杂的功能,也可以自己写脚本来处理。

简单的来说,FlexGet 解决 BT 客户端没有订阅功能的问题,通过 FlexGet 可以方便的制定一些规则来自动订阅并自动下载特定的种子,比如在追剧集时,按照特定的名字以及文件大小,或者分辨率自动进行下载。

FlexGet 一大被称道的就是可以实现 PT 或者 BT 的自动下载,并且直接传给 Deluge, transmission, uTorrent, rTorrent, SABnzb 等等客户端进行下载。FlexGet 也集成了 trakt, thetvdb.com, imdb.com 等等网站可以用来追踪剧集。

FlexGet 可以自定义任务,自定义运行时间,有一个友好的 Web 界面,然后还有很多很多有待发现的功能。

在没有了解到 FlexGet 之前,我都是手动将 torrent 文件下载到 ~/Downloads 目录中,然后在 crontab 中将下载目录中的所有 torrent 文件 rsync 到 Transmission 或者 ruTorrent 的 watch 文件夹中的。

*/1 * * * * rsync -avz -e "ssh -p xxxx" --remove-source-files /home/einverne/Downloads/*.torrent xxx@ip:/share/Transmission/watch/

但是自从有了 Flexget 我发现借助 Flexget 可以实现很多自动化工作,以前手工执行的工作完全可以解放出来。比如将 PT 中收藏的内容添加到下载的 RSS 中,然后通过 Flexget 自动下载到硬盘中,比如自动下载 PT 中最近更新的 Free 种子。

docker install

使用 Docker 进行安装,我这里用的是 wiserain/flexget 镜像:1

这里的 PUID,PGID 可以在终端使用 id 命令来查看,替换成当前用户的 ID 即可。

docker run -d \
    --name=flexget \
    -e PUID=1000 \
    -e PGID=1000 \
    -e FG_WEBUI_PASSWD=yourhorriblesecret \
    -e FG_LOG_LEVEL=info \
    -e TZ=Asia/Shanghai \
    -p 5050:5050 \
    -v ~/flexget/config:/config \
    -v ~/flexget/data:/data \
    wiserain/flexget

说明:

  • ~/flexget/config: 目录中是 flexget 的配置文件
  • ~/flexget/data: 目录保存 Flexget 下载的文件

或者使用 Docker Compose 安装

docker-compose:

version: '3.3'

services:
  flexget:
    image: wiserain/flexget
    restart: always
    container_name: flexget
    environment:
      - PUID=1000
      - PGID=1000
      - FG_WEBUI_PASSWD=${PASSWD}
      - FG_LOG_LEVEL=info
      - TZ=Asia/Shanghai
    ports:
      - '5050:5050'
    volumes:
      - '~/flexget/config:/config'
      - '~/flexget/data:/data'

等容器启动之后,访问 5050 端口,用户名 flexget 密码为在配置中设定的密码,访问后台。

Plugins

flexget 更多的插件可以在这里 查到。

配置详解

进入后台,或者直接编辑配置文件夹中的 config.yml 文件都可以直接对 flexget 进行配置,更推荐在命令行中进行修改。

一份简单的配置

首先来看一个最简单的配置,方便快速入门,这个配置仅有一个 task,并且只定义了一个定时器。

web_server:
  bind: 0.0.0.0
  port: 5050
  web_ui: yes

tasks:
  btschool:
    rss: http://example.com/rss
    # 种子的下载目录
    download: /data
    # 把 RSS 链接里的所有种子都下载下来,不做过滤
    accept_all: yes

schedules:
  - tasks: '*'
    interval:
      minutes: 60

上面的配置一目了然,也不过多解释,大致就是定义了一个RSS 下载任务,会下载这个 RSS 中所有的内容,并保存到 /data/ 目录。

下面就单独演示一下稍微复杂一些的用例,比如过滤标题,文件大小,等等。

针对个别任务设置定时

在上面的配置中使用通配符 * 来匹配了所有的任务,如果要指定任务设定定时,可以

schedules:
  - tasks: 'task_name'
    interval:
      minutes: 15

稍微复杂一些的配置

通过正则表达式过滤标题

tasks 定义:

# tasks 定义多个任务,在下方定义
tasks:
  # 自定义 task 名字,名字可以自己起
  task_name:
    rss: http://example.com/torrentrss.php
	# 可选项 yes/no,是否下载全部内容,还是按条件过滤
    accept_all: no
    regexp:
      accept:
        - some-title
      reject:
        - 1080
      from: title
    content_size:
      min: 1000
      max: 10000
      strict: no
	# 种子下载的路径
    download: /data
    deluge:
      password: "deluge"
      path: /data
  another-task:
    rss: https://example.com/torrentrss.php
    accept_all: no
    if:
      - "'1996' in title": accept
      - "'720' in title": accept
    content_size:
      min: 1000
      max: 10000
      strict: no
    download: /data
    deluge:
	  host: locahost
	  port: 13222
	  user: someone
      password: "deluge"
      path: /data

还可以通过配置预设模板的方法:

# 预设模板
templates:
# 剩余空间模板,当配置的 path 路径的剩余空间小于 space 规定的数值时,停止 RSS 下载
  freespace:
    free_space:
      path: /home/einverne
      space: 10240
# qb 的模板,之后写 qb 就是指把种子推送到 qb 进行下载;下面 tr de rt 也是如此
  qb:
    qbittorrent:
      path: /home/einverne/qbittorrent/download/
      host: localhost
      port: 2017
      username: einverne
      password: password
  tr:
    transmission:
      path: /home/einverne/transmission/download/
      host: localhost
      port: 9091
      username: einverne
      password: password
  de:
    deluge:
      path: /home/einverne/deluge/download/
      host: localhost
      port: 58846
      username: einverne
      password: password
# 体积过滤模板,min 是符合条件的最小种子体积,max 是符合条件的最大种子体积,单位均为 MB
# strict 默认是 yes,表示在无法确定大小的情况下就不下载,这里把它改成 no 了
# 这段 size 的意思是,只下载体积为 6000-666666 MB 的种子,其他不满足条件的种子不下载
  size:
    content_size:
      min: 6000
      max: 666666
      strict: no

# 任务
tasks:
# Web-HDSky 是任务名称,基本上随便起
  Web-HDSky:
    rss: https://hdsky.me/torrentrss.php
    # 因为 HDSWEB 发单集的时候用的标题是一样的, 因此下过一次后
    # 之后新发出来的单集由于标题一样,flexget 会当成是以前已经下过的种子
    # 为了避免这个问题,对 seen 插件设定为只检查 url 是否一致
    seen:
      fields:
        - url
  # 正则表达式;标题带 HDSWEB 的种子就下载(accept,接受),不想下载的话就写拒绝(reject)
    regexp:
      accept:
        - HDSWEB
  # 调用上边的 de 模板
    template: de
  # 可以不使用模板的体积过滤,针对每个任务单独设置体积过滤
    content_size:
      min: 3000
      max: 500000
      strict: no
  # 以下设定实现的效果:对这个任务加载到 deluge 的种子,自动添加 WEB-DL 的标签
  # 自动限制上传速度到 10MB/s(防止超速),下完后自动移动到 /mnt/HDSky/HDSWEB
    deluge:
      label: WEB-DL
      # Limit upload speed to 100 MiB/s in case of being auto-banned
      max_up_speed: 10240
      move_completed_path: /mnt/HDSky/HDSWEB
  ADC-AnimeBD-JPN:
    rss: http://asiandvdclub.org/rss.xml
    if:
      - "'Anime' and 'AVC' in title": accept
      - "'subs only' in title": reject
      - "'Custom' in description": reject
      # 这三个过滤条件组合起来就是,下载标题里带 Anime 和 AVC 且不含 subs only 的种子
      # 并排除掉描述里含有 Custom 的种子
      # 这也就约等于,RSS 日版动画蓝光碟(非日版、DIY 碟、DVD 都过滤掉)
    # RSS ADC 需要 Cookies,这里我们用 headers 插件来加上 cookies
    headers:
      Cookie: "uid=12345; pass=abcdefg"
    # 转换 RSS 链接,将原本形如 http://asiandvdclub.org/details.php?id=123456 的种子描述页面链接
    # 替换为形如 http://asiandvdclub.org/download.php?id=123456 的种子下载链接
    urlrewrite:
      sitename:
        regexp: 'http://asiandvdclub.org/details.php\?id=(?P<id>\d+)'
        format: 'http://asiandvdclub.org/download.php?id=\g<id>'
    qbittorrent:
      label: ADC
      # Flexget 支持添加种子到 qBittorrent 的时候自动设定单种限速
      maxdownspeed: 30000

Web UI 设置

# Flexget WebUI 设定 (WebUI如何开启见后文)
web_server:
  port: 6566
  web_ui: yes
# base_url: /flexget
# base_url 是为了反代设置的,需要使用反代的话就取消这个的注释,然后在安装了 rTorrent 的情况下(不装 rt 的话没有 nginx)
# Flexget WebUI 地址就变成了 https://IP/flexget

Transmission 配置

如果要配置 Transmission 可以通过 Transmission 插件配置

tasks:
  one-task:
    rss: https://example.com/torrentrss.php
    accept_all: no
    # 通过正则表达式匹配标题中有 some-title 的内容,accept 表示接受,而 reject 表示带有 1080 的就不接受
    regexp:
      accept:
        - some-title
      reject:
        - 1080
      from: title
    content_size:
      min: 3000
      max: 180000
      strict: no
    download: /data
    transmission:
      host: localhost
      port: 9091
      username: user
      password: "pass"

更多该插件的参数和使用可以参考官网

template

如果需要配置更加复杂的,可以使用 template

templates:
  # freespace 插件
  freespace:
    free_space:
      path: /data
      space: 10240
  qb:
    qbittorrent:
      path: /data
      host: localhost
      port: 8080
      username: admin
      password: password
  de:
    deluge:
      password: "deluge"
      path: /data
  tr:
    transmission:
      host: localhost
      port: 9091
      username: admin
      password: "password"
tasks:
  BTSchool:
    rss: https://pt.btschool.net/torrentrss.php
    accept_all: yes
    template:
      - de
  HDChina:
    rss: https://hdchina.org/torrentrss.php
    accept_all: yes
    template:
      - qb
    qbittorrent:
      label: HDChina
  CHDBits:
    rss: https://chdbits.co/torrentrss.php
    accept_all: no
    if:
      - "'CHDPAD' in title": reject
      - "'CHDPad' in title": reject
      - "'CHD' in title": accept
    template:
      - tr
  U2:
    rss: https://u2.dmhy.org/torrentrss.php
    accept_all: no
    regexp:
      accept_excluding:
        - DVD
        - ADC
        - TTG
        - TSDM
      from: title
    download: /data/torrent/
  Mteam:
    rss: https://tp.m-team.cc/torrentrss.php
    accept_all: no
    regexp:
      accept:
        - sweety
      from: title
    download: /data/torrent/
  GZtown:
    rss: https://pt.gztown.net/torrentrss.php
    accept_all: no
    if:
      - "'GZtown' in title": accept
    download: /data/torrent/
  HDSky:
    rss: https://hdsky.me/torrentrss.php
    accept_all: yes
    download: /data/torrent/
  Ourbits:
    rss: https://ourbits.club/torrentrss.php
    accept_all: yes
    download: /data/torrent/
  ezrss:
    rss: http://eztv.ag/ezrss.xml
    accept_all: yes
    content_size:
      min: 200
      max: 4444
      strict: no
    download: /data

定义 Schedules

常见的定时器,比如定时每 10 分钟跑一次,或者在特定时间执行一次。

设置固定间隔时间执行:

# 针对所有的任务,每隔 10 分钟执行一次
schedules:
  - tasks: '*'
    interval:
      minutes: 10

或者你可以设置更加复杂的定时规则,针对具体的任务名设定:[^schedule]

[^schedule]

schedules:
  - tasks: 'Update-Queue'
    interval:
      hours: 3
  - tasks: 'Series-*'
    interval:
      minutes: 30
  - tasks: 'Movies-*'
    interval:
      hours: 1
  - tasks: 'Update-trakt-*'
    interval:
      days: 1
      at_time: 4:43 am
  - tasks: [HDC, btschool]
    interval:
      minutes: 30

如果不配置 Schedule 也可以通过 cron 命令来定时执行,比如每隔 30 分钟执行一次:

*/30 * * * * /usr/local/bin/flexget --cron execute

常用命令

使用 Docker 安装的话,可以手动进入容器执行 sudo docker exec -it flexget /bin/bash,然后执行:

  • flexget check : 用于检查 config.yml 配置文件是否有格式错误。
  • flexget --test execute : 手动模拟一次 RSS 操作,仅供测试,不会下载种子文件到本地。
  • flexget execute : 手动执行所有任务
  • flexget execute --tasks Series-*: 手动执行指定的任务
  • flexget status : 查看 flexget 的 RSS 记录。
  • flexget execute --learn : 这样子不会下载种子,但是会把这次 RSS 到的种子标记为已下载,这样之后就不会下到老种了

疑难杂症

下载后文件名乱码问题

查看终端编码是否配置了支持 UTF-8.

reference