module Feedium

Constants

CONTENT_TYPES
VERSION

Public Class Methods

feed?(url) click to toggle source
# File lib/feedium.rb, line 71
def self.feed?(url)
  @request = Request.new(url, @base_uri)
  @request.send
  meta_type = @request.io.meta['content-type']

  content_type = @request.io.content_type.downcase
  content_type = meta_type.gsub(/;.*$/, '') if content_type == 'application/octet-stream' && !meta_type.nil?

  is_feed = CONTENT_TYPES.include?(content_type) ? true : false

  if !is_feed
    begin
      @body = @request.io.read
      is_feed = !self.parse(url, @body).class.name.index('Feedjira::Parser').nil?
      rescue
    end
  end

  is_feed
end
find(url) click to toggle source
# File lib/feedium.rb, line 23
def self.find(url)
  begin
    uri   = URI.parse(url.downcase.index('http') ? url : "http://#{url}")
    query = uri.query.nil? ? '' : "?#{uri.query}"
    url   = "#{uri.scheme}://#{uri.host}#{uri.path}#{query}"
  rescue URI::InvalidURIError => e
    raise Feedium::RequestError.new(e.message)
  end

  return @request.url if self.feed?(url)

  @body = @body || @request.io.read

  doc = Nokogiri::HTML(@body)

  if doc.at('base') && doc.at('base')['href']
    @base_uri = doc.at('base')['href']
  else
    @base_uri = "#{@request.uri.scheme}://#{@request.uri.host}"
  end

  doc.xpath("//link[@rel='alternate'][@href][@type]").each do |l|
    if CONTENT_TYPES.include?(l['type'].downcase.strip)
      return @request.url if self.feed?(l['href'])
    end
  end

  doc.xpath("//a[@href]").each do |a|
    found = %w(feed rss atom).detect {|k| !a['href'].index(k).nil? }

    begin
      return @request.url if found && self.feed?(a['href'])
    rescue Feedium::RequestError
      next
    end
  end

  nil
end
find!(url) click to toggle source
# File lib/feedium.rb, line 63
def self.find!(url)
  feed = self.find(url)

  raise Feedium::RequestError.new('Feed not found') if feed.nil?

  feed
end
parse(url, content = nil) click to toggle source
# File lib/feedium.rb, line 92
def self.parse(url, content = nil)
  if content.nil?
    request = Request.new(url)
    request.send
    content = request.io.read

    if request.io.meta['content-encoding'] == 'gzip'
      content = Zlib::GzipReader.new(StringIO.new(content)).read.force_encoding('utf-8')
    end
  end

  Feedjira::Feed.parse(content)
end