RSS 轮询:从 YouTube 频道源读取视频描述

我们通过 RSS 轮询将多个 YouTube 频道导入到一个论坛分类中。每个主题都会包含视频 URL,并自动转换为播放器,但视频描述从未出现在帖子中。对于许多视频而言,描述才是真正的内容——例如路线、地点、装备、链接等——会员们经常询问这些信息。

YouTube 频道的源是带有 Media RSS 扩展的 Atom 格式,每个条目都在 <media:group><media:description> 中包含完整的描述,以及 <media:thumbnail>。RSS 轮询使用 rss gem(0.3.3 版本,Gemfile.lock#L614)来解析源,该 gem 没有 Media RSS 模块,因此这些元素在 FeedItem 处理之前就被丢弃了,导致 YouTube 条目回退到仅显示 URL(feed_item.rb#L17-L23)。

以下改进会有所帮助:

  1. 为 YouTube 条目读取 media:description(以及 media:thumbnail)。
  2. 提供一个按源或全站范围的选项,以便在导入的帖子中将描述显示在视频下方。

目前,我们通过一个小型配套插件在轮询期间重新读取源 XML 来实现这一功能(discourse-rss-onebox)。它在我们论坛的主题中运行正常,但它依赖于 RSS 轮询的内部实现,如果能在核心功能中实现,会更简单且更稳定。

1 个赞

请问 rss gem 是否支持媒体 RSS 扩展?如果支持,我很乐意审查并合并一个用于升级 rss gem 并添加对这些媒体扩展支持的 pull request :+1:

1 个赞

已确认:没有。无论是 Discourse 捆绑的版本(0.3.3),还是 ruby/rss 当前的 master 分支(0.3.4),都不包含 Media RSS 模块——它只包含 content、Dublin Core、image、iTunes、slash、syndication、taxonomy 和 trackback,并会忽略 media:* 元素。因此,仅升级该 gem 无法解决问题。

我能想到两种方法:

  1. 在 ruby/rss 上游添加一个 Media RSS 模块(参考其 iTunes 模块的实现方式),然后在此处升级 gem 版本。
  2. 在 RSS 轮询中,使用 Nokogiri 直接从原始 XML 中读取 media:description——获取步骤在解析前已经拥有了 XML,因此无需更改 gem。我们的配套插件目前就是这样做的,并且在 YouTube 频道上运行稳定。

选项 2 看起来改动更小。你愿意接受一个基于此思路的 PR 吗?

1 个赞