Sha256: 6320fa0b9e6a368e851e79664612cd7c4157b44cbe9c07f3c7ccec2566625942

Contents?: true

Size: 1.28 KB

Versions: 1

Compression:

Stored size: 1.28 KB

Contents

$:.unshift(File.dirname(__FILE__))

require 'curb'
require 'nokogiri'
require 'time'

require 'fed/http'
require 'fed/http/curb'
require 'fed/feed/base'
require 'fed/feed/atom'
require 'fed/feed/rss1'
require 'fed/feed/rss2'
require 'fed/feed/entry'

module Fed
  VERSION = '0.0.3'

  class <<self

    def fetch_and_parse(feed_url)
      parse fetch(feed_url)
    end

    def fetch(feed_url)
      Fed::Http.client.get(feed_url)
    end

    def parse(xml)
      document = Nokogiri::XML(xml)
      parser_for(document).parse
    end

    def parser_for(doc)
      if is_atom?(doc)
        Fed::Feed::Atom.new(doc)
      elsif is_rss1?(doc)
        Fed::Feed::Rss1.new(doc)
      elsif is_rss2?(doc)
        Fed::Feed::Rss2.new(doc)
      elsif (new_url = find_link_in_html(doc))
        parser_for(fetch(new_url))
      else
        raise "Bad feed."
      end
    end

    def is_atom?(document)
      document.css('feed entry').any?
    end

    def is_rss1?(document)
      document.xpath('/rdf:RDF').any?
    end

    def is_rss2?(document)
      document.css('rss channel').any?
    end

    def find_link_in_html(document)
      elems = document.css("link[type='application/atom+xml']")

      if elems.any?
        elems.first.attributes['href'].value
      else
        nil
      end
    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
fed-0.0.3 lib/fed.rb