Techioz Blog

Ruby RSSライブラリでエンクロージャを指定するにはどうすればよいですか?

概要

Ruby RSS ライブラリを使用してポッドキャスト用の RSS フィードを構築しようとしています。エンクロージャの値を指定していますが、エンクロージャはフィードに追加されず、サイレントに失敗します。

エンクロージャをフィード項目に含めるには何をする必要がありますか?

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 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 Maker の使用法です。 Atom は、RSS 仕様と同じように「エンクロージャー」を認識しません。

Atom はリンク rel 属性 (仕様) を介して「エンクロージャ」を持つことができます。

したがって、Atom Maker を使用するには、次のようなことができるはずです。

item.link.rel = "enclosure"
item.link.href = "https://example.com"
item.link.type = "audio/mpeg"
item.link.length = 123

これにより、次のようなリンク ノードが生成されます。

 <link rel="enclosure" type="audio/mpeg" length="123" href="https://example.com"/>

真のエンクロージャ ノードを生成したい場合は、RSS Maker のいずれかを使用する必要があります。例 2.0 (仕様) の場合。そうすれば、既存のコードは期待どおりに動作します。

RSS::Maker.make("2.0") do |maker|
  # ...
  maker.items.new_item do |item|
    #...
    item.enclosure.url = "https://example.com"
    item.enclosure.type = "audio/mpeg"
    item.enclosure.length = 123
  end
end 

これにより、次のようなエンクロージャ ノードが生成されます。

<enclosure url="https://example.com" length="123" type="audio/mpeg" />