You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 06:02:15