class PodcastFeedGenerator::Generator

Public Instance Methods

generate(feed_info) click to toggle source
# File lib/podcast_feed_generator.rb, line 92
def generate feed_info
  builder = Nokogiri::XML::Builder.new do |xml|

    detect_duplicate_guids feed_info["episodes"]
    verifyHasArtwork    feed_info["podcast"]
    verifyHasCategories feed_info["podcast"]

    xml.rss('xmlns:content' => "http://purl.org/rss/1.0/modules/content/",  "xmlns:wfw" => "http://wellformedweb.org/CommentAPI/", "xmlns:itunes" => "http://www.itunes.com/dtds/podcast-1.0.dtd", "xmlns:dc" => "http://purl.org/dc/elements/1.1/", "xmlns:media" => "http://search.yahoo.com/mrss/",  "version" => "2.0") {
      channel_details = feed_info["podcast"]
      xml.channel {
        
          xml.title         channel_details["title"]
          xml.description   channel_details["description"]
          xml.link          channel_details["link"]
          xml.lastBuildDate channel_details["lastBuildDate"] || Time.now.rfc2822
          xml.generator     channel_details["generator"]     || DEFAULT_GENERATOR_STRING
          xml.language      channel_details["language"]     || "en-US"
          xml.copyright     channel_details["copyright"]

          xml['itunes'].author   channel_details["author"]      || channel_details["author"]
          xml['itunes'].subtitle channel_details["subtitle"]    || channel_details["description"]
          xml['itunes'].summary  channel_details["summary"]     || channel_details["description"]
          xml['itunes'].explicit channel_details["explicit"]    || "no"
          xml['itunes'].type     channel_details["podcastType"] || "episodic"

          xml['itunes'].owner {
            xml['itunes'].name  channel_details["ownerName"]
            xml['itunes'].email channel_details["ownerEmail"]
          }
          
          xml['itunes'].image("href"    =>     channel_details["podcastArtworkUrl"] )
          
          unless channel_details["categories"].nil?
            channel_details["categories"].each do |category_name|
              xml['itunes'].category("text" => category_name)
            end
          end 
          

          episodes = feed_info["episodes"].each_with_index do |episode, index|
            episode["episodeNumber"] = episode["episodeNumber"] || (feed_info["episodes"].length - index)
          end

          feed_info["episodes"].each_with_index do |episode, index|
            
            verifyHasDuration episode
            verifyMediaFileUrl episode
            verifyMediaFileBytes episode

            xml.item {
              xml.title episode["title"]
              xml['dc'].creator episode["creator"] || channel_details["author"]
              xml.author episode["creator"] || channel_details["author"]
              xml.pubDate episode["pubDate"]
              xml.link episode["link"]
              xml.guid("isPermalink": episode["guidIsPermalink"]){
                xml.text episode["guid"] || (0...32).map { (65 + rand(26)).chr }.join
              } 

              xml.description episode["description"]
              xml["content"].encoded {
                xml.text "<![CDATA[#{episode["htmlDescription"]} ]]>"
              }
              xml['itunes'].author episode["author"]
              xml['itunes'].subtitle episode["subtitle"] || episode["description"]
              xml['itunes'].summary episode["summary"] || episode["description"]
              

              xml['itunes'].explicit episode["explicit"] || 'no'
              xml['itunes'].duration episode["duration"]
              xml['itunes'].image("href"=> episode["episodeArtUrl"] || channel_details["podcastArtworkUrl"])

              
              xml['itunes'].episode episode["episodeNumber"]
              xml['itunes'].season episode["seasonNumber"]

              xml['itunes'].title episode["itunesTitle"] || episode["title"]
              xml['itunes'].episodeType episode["episodeType"] || "full"
  
              xml.enclosure(
                "url" => episode["mediaFileUrl"], 
                "type" => episode["mediaMimeType"] || "audio/mpeg",
                "length" => episode["mediaFileSizeBytes"] 
              )

              xml['media'].content(
                "url"=> episode["mediaFileUrl"], 
                "type" => episode["mediaMimeType"] || "audio/mpeg",
                "length" => episode["mediaFileSizeBytes"],
                "isDefault" => episode["mediaIsDefault"] || "true", 
                "medium" => episode["medium"] || "audio"
              ) {
                xml['media'].title("type" => "plain") {
                  xml.text episode["title"]
                }
              }
            }
          end
        }
      }
  end
  
  builder.to_xml
end