class FeedNinja

Constants

VERSION

Attributes

limit[RW]
picture_xpath[RW]
text_xpath[RW]
title_regex[RW]
uri[RW]

Public Class Methods

new() click to toggle source
# File lib/feed_ninja/feed_ninja.rb, line 13
def initialize
  @limit = 4
  @writer = AtomIshWriter.new
  @ninja_prefix = "N! "
end

Public Instance Methods

fetch(url) click to toggle source

get the feed and iterate over the entries

# File lib/feed_ninja/feed_ninja.rb, line 35
def fetch url
  open(url) do |feed|
    if feed.content_encoding == ['gzip'] then
      feed = Zlib::GzipReader.new(StringIO.new(feed.read)).read
    end
    doc = RSS::Parser.parse(feed)
    initialize_writer(doc)
    process_items(doc)
  end
end
initialize_writer(doc) click to toggle source
# File lib/feed_ninja/feed_ninja.rb, line 19
def initialize_writer doc
  @writer.updated = DateTime.now.to_s

  case doc.feed_type
  when "atom"
    @writer.title = @ninja_prefix + doc.title.content
    @writer.link = doc.link.href
  when "rss"
    @writer.title = @ninja_prefix + doc.channel.title
    @writer.link = doc.channel.link
  else
    raise "Invalid feed format"
  end
end
picture_at(*xpath) click to toggle source

DSL convenience setters

# File lib/feed_ninja/feed_ninja.rb, line 94
def picture_at *xpath
  @picture_xpath = xpath
end
process_item(original, feed_type, index) click to toggle source
# File lib/feed_ninja/feed_ninja.rb, line 58
def process_item(original, feed_type, index)
  @writer.new_entry(index) do |entry|
    LOGGER.debug{ "making new entry #{index}" }
    extractor = Extractor.new
    case feed_type
    when "atom"
      entry.title = original.title.content
      entry.link = original.link.href
      entry.updated = original.updated.content
      entry.id = original.id.content
      extractor.fetch original.link.href
    when "rss"
      entry.title = original.title
      entry.link = original.link
      entry.updated = original.pubDate ? original.pubDate.xmlschema : DateTime.now.to_s
      entry.id = entry.link
      extractor.fetch original.link
    end

    LOGGER.debug{ "extracting for entry #{index} #{entry}" }

    entry.images = extractor.extract_images(@picture_xpath)
    LOGGER.debug{ "RATATAT" }
    entry.summary = extractor.extract_xml @text_xpath

    LOGGER.debug{ "adding entry #{index} #{entry}" }
    entry #it's kind of fishy to explicitly have to return the entry here...
  end
end
process_items(doc) click to toggle source
# File lib/feed_ninja/feed_ninja.rb, line 46
def process_items doc
  items = doc.items
  if title_regex
    items = items.select { |item| title_regex =~ item.title }
  end
  threads = []
  items.first(@limit).each_with_index do |item, index|
    threads << Thread.new { process_item(item, doc.feed_type, index) }
  end
  ThreadsWait.all_waits(*threads)
end
text_at(*xpath) click to toggle source
# File lib/feed_ninja/feed_ninja.rb, line 98
def text_at *xpath
  @text_xpath = xpath
end
title_matches(regex) click to toggle source
# File lib/feed_ninja/feed_ninja.rb, line 102
def title_matches regex
  @title_regex = regex
end
to_s() click to toggle source
# File lib/feed_ninja/feed_ninja.rb, line 88
def to_s
  @writer.to_s
end