如何在Ruby RSS库中正确指定Enclosure以生成播客Feed
问题
我尝试使用Ruby RSS库构建播客的RSS Feed,已为Enclosure提供相关参数,但Enclosure未被添加到Feed中且无报错提示。请问需如何操作才能让Enclosure被包含在Feed条目里?
代码示例:
rss = RSS::Maker.make("atom") do |maker| maker.channel.id = "my_channel" maker.channel.updated = Time.now.to_s maker.channel.author = "me" maker.channel.title = "my channel" maker.items.new_item do |item| item.title = "my episode" item.id = "my_episode" item.updated = Time.now.to_s item.enclosure.url = "https://example.com" item.enclosure.type = "audio/mpeg" item.enclosure.length = 123 end end
输出XML:
<?xml version="1.0" encoding="UTF-8"?> <feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"> <author> <name>me</name> </author> <id>my_channel</id> <title>my channel</title> <updated>2024-05-11T12:09:06+01:00</updated> <entry> <id>my_episode</id> <title>my episode</title> <updated>2024-05-11T12:09:06+01:00</updated> <dc:date>2024-05-11T12:09:06+01:00</dc:date> </entry> <dc:date>2024-05-11T12:09:06+01:00</dc:date> </feed>
解决方案
原因分析
你当前用的是Atom格式Feed,但Atom标准本身没有原生的<enclosure>元素——这个元素是RSS 2.0的原生特性。Ruby RSS库生成Atom Feed时,会忽略未被标准定义的元素,所以设置的enclosure不会输出,也不会报错。
方案1:改用RSS 2.0格式(最简单)
如果不需要严格用Atom,直接生成RSS 2.0格式即可,它原生支持<enclosure>,代码修改如下:
rss = RSS::Maker.make("rss2.0") do |maker| maker.channel.id = "my_channel" maker.channel.updated = Time.now.to_s maker.channel.author = "me" maker.channel.title = "my channel" # RSS 2.0要求channel必须有link字段 maker.channel.link = "https://your-podcast-site.com" maker.items.new_item do |item| item.title = "my episode" item.id = "my_episode" item.updated = Time.now.to_s # RSS 2.0条目也需要link字段 item.link = "https://your-podcast-site.com/episodes/my-episode" item.enclosure.url = "https://example.com/audio.mp3" item.enclosure.type = "audio/mpeg" item.enclosure.length = 12345678 # 填实际音频文件的字节数 end end
生成的RSS会包含符合规范的<enclosure>元素,播客客户端都能识别。
方案2:在Atom Feed中添加播客扩展元素
如果必须用Atom格式,需要用播客行业通用的podcast:enclosure扩展(属于Podcast Index命名空间),代码如下:
rss = RSS::Maker.make("atom") do |maker| # 注册Podcast命名空间 maker.xmlns = { podcast: "https://podcastindex.org/namespace/1.0" } maker.channel.id = "my_channel" maker.channel.updated = Time.now.to_s maker.channel.author = "me" maker.channel.title = "my channel" maker.items.new_item do |item| item.title = "my episode" item.id = "my_episode" item.updated = Time.now.to_s # 创建并添加podcast:enclosure元素 pod_enclosure = RSS::XML::Element.new("podcast:enclosure") pod_enclosure.attributes["url"] = "https://example.com/audio.mp3" pod_enclosure.attributes["type"] = "audio/mpeg" pod_enclosure.attributes["length"] = "12345678" item.elements << pod_enclosure end end
生成的Atom Feed会带有<podcast:enclosure>元素,主流播客客户端都支持该扩展。
注意事项
length字段必须填实际音频文件的字节数,不能用示例值;- RSS 2.0的
channel和item都必须包含link字段,否则生成的Feed不符合规范。
内容的提问来源于stack exchange,提问作者crantok
相关产品推荐
相关产品推荐

