半年前写了篇文章,当时提到了我会用Podsync订阅视频网站,并fork了一个支持B站的版本供自己使用,到今天已经稳定运行了半年多,再简单介绍下使用方法,以飨读者。

Podsync

关于Podsync的介绍少数派上有相关文章已经提到过。

Podsync 曾经是最火的 YouTube2Podcast 线上服务,但其生成 Youtube 视频的纯音频 RSS 需要支付 $1/mo 的服务费。另外由于树大招风,几年前已经被 YouTube 杀掉了其所有 API keys 而关门歇业。

开发者无私开源了 Podsync 的服务端程序,在自备 VPS 和 Youtube API 的前提下,我们可以搭建属于自己的 YouTube2Podcast 服务。

总结下说,Podsync是一款自搭建的提取视频网站音频子托管成RSS服务软件。很多使用泛用性播客客户端如我上一篇文章里介绍的Anntenapod的用户无法直接收听视频网站上适合直接收听的内容,如作品本人经常收“听”秃头海豹、圆脸等这种画面只有一张大脸的自媒体内容,那块屏幕直接变得可有可无。当然,如果不嫌麻烦且比较富有,也可以通过Youtube Premium会员或者B站后台播放功能直接收听。不过,作为一个RSS原教旨主义爱折腾穷B,没有可靠的订阅方式显然是不可接受的。

有一些up主比较适合采用听的方式

这里就有了Podsync的用武之地,本质上Podsync只做两件事,一是抓取对应自媒体信息,如视频标题、简介、播放时长、更新时间等托管到自建RSS服务器,二是通过youtuble-dl下载对应视频通过ffmpeg提取音频到服务器上供订阅者收听。

搭建方法

原作者提供了Youtube,Vimeo和Soundclod三个网站的转音频功能,对于国内用户来说,B站是另一个经常会用来收听的载体,虽然有一些视频制作者会将作者同时上传到外网,但也有不少作者只有B站一个平台,且YouTube的更新往往会很不及时,因此我个人fork了一个支持B站的版本,已提交pull request给原作者,暂时还没有被merge,有兴趣的可以也使用我fork的版本搭建。

原作者版本可以运行在x86或arm平台的Windows、Linux和Mac系统上,我自己的版本理论上也可以支持全平台,但个人只在x86架构Ubuntu系统上测试过。Podsync不需要占用太多资源,且更新频率不需要太高(Youtube的token是有次数限制的,且从使用角度也不需要太实时的抓取),也没有大管道需求,因此随便找个国外的小主机就可以很方便的部署服务,我本人使用的是一只单核/1g内存/20g存储非国内优化线路主机,年费大概100人民币出头,订阅大概20+作者,完全可以满足需求。

这里建议用docker搭建,具体搭建过程可参考这篇文章,这里只对需要B站版本的不同部分做出说明。

  • 创建Youtube api
  • 安装docker环境
  • 配置Podsync config文件
[server]
port = 8080
hostname = "http://127.0.0.1" # 此处填写 IP 地址或者域名,如果有HTTPS证书的话记得改成 https://
data_dir = "/app/data" # docker内数据存放目录,对应映射到宿主机目录,不建议改动

# Tokens from `Access tokens` section
[tokens]
youtube = "XriA7WSI3qOLkXriA7WSI3qOLkXriA7WSI3qOLk" # 引号内填写 YouTube API Key.
bilibili= "123" #由于不想破坏源代码结构,必须给B站定义一个key,可填写任意字符串,不能为空

[feeds]
  [feeds.ID1]
  # ID1 为最终生成的RSS文件的名称,可以修改
  url = "www.youtube.com/channel/UCtAIPjABiQD3qjlEl1T5VpA" # 引号内填写Youtube频道/组织/用户/播放列表的链接,注意不要有 http:// 部分!!!
  page_size = 10 # 每次更新节目时的分页大小
  update_period = "12h" # 更新周期,例如: "60m", "4h", "2h45m"
  cron_schedule = "0 1,7,11,16 * * *" #crontab更新方式
  quality = "high" # 文件品质高-high,或低-low
  format = "audio" # 文件类型音频-audio,视频-video,通常播客使用音频类型即可
  # filters = { title = "111", not_title = "222", description = "333", not_description = "444" } # [可选项,使用时去除行首井号]过滤节目,只保留「标题含有111,不含222,描述包含 333,不含 444 的节目」
  clean = { keep_last = 10 } # 自动清理,只保留最近10期节目
  private_feed = true #是否私有,非私有的话会可以被iTunes等客户端搜索到,建议true
  # 可以配置多个 feeds
  [feeds.ID2]
  url = "https://space.bilibili.com/xxxxxxxx" #要订阅的B站用户主页链接
  #全部同上
  page_size = 10
  cron_schedule = "0 1,7,11,16 * * *"
  quality = "high" # "high" or "low"
  format = "audio" # "audio", "video" or "custom"
  # filters = {}
  opml = true
  clean = { keep_last = 20 }
  private_feed = true

[database]
  badger = { truncate = true, file_io = true } # 数据库配置,无需改动

[downloader]
self_update = true # 自动更新下载程序

# 程序运行日志配置,无需改动
[log]
filename = "podsync.log"
max_size = 50 # MB
max_age = 30 # days
max_backups = 7
compress = true
  • 运行docker
docker run \
    -d \
    -p 8080:8080 \
    -v $(pwd)/data:/app/data/ \
    -v $(pwd)/config.toml:/app/config.toml \
   ghcr.io/yangtfu/podsync:latest #原作者版本替换为mxpv/podsync:latest

 

成功后访问vps主机:8080端口,可以看到文件树,其中xml文件为单播客订阅地址,podsync.opml为全部订阅导出文件。

一些说明

B站api的调用采用的是GitHub上的repo,由于B站风控的原因,调用的都是免登录的接口,因此不需要提供cookie等信息,但对于充电视频就无法下载了,会自动过滤掉充电视频,日志里会有对应信息,同样是风控方面原因也无法像youtube一样提供合集和列表的订阅作为一个频道,如果有这方面需求的小伙伴欢迎提交你的pull request。