class Pluto::FeedRefresher

note: refresh

refresh will fetch feeds, parse feeds and than update feeds
  (e.g. update is just one operation of refresh)

Public Class Methods

new() click to toggle source
# File lib/pluto/update/feed_refresher.rb, line 16
def initialize
  ## @worker = FeedFetcherBasic.new  ## -- simple fetch (strategy); no cache, no cond get etc.
  @worker  = FeedFetcherCondGetWithCache.new
end

Public Instance Methods

debug?() click to toggle source
# File lib/pluto/update/feed_refresher.rb, line 21
def debug?()  Pluto.config.debug?;  end
refresh_feeds( opts={} ) click to toggle source
# File lib/pluto/update/feed_refresher.rb, line 25
def refresh_feeds( opts={} )  # refresh (fetch+parse+update) all feeds

  start_time = Time.now
  Activity.create!( text: "start update feeds (#{Feed.count})" )

  #### - hack - use order(:id) instead of .all - avoids rails/activerecord 4 warnings
  Feed.order(:id).each do |feed|
    refresh_feed_worker( feed )
    ### todo/fix: add catch exception in loop and log to activity log and continue w/ next feed
  end

  total_secs = Time.now - start_time
  Activity.create!( text: "done update feeds (#{Feed.count}) in #{total_secs}s" )
end
refresh_feeds_for( site_key, opts={} ) click to toggle source
# File lib/pluto/update/feed_refresher.rb, line 41
def refresh_feeds_for( site_key, opts={} ) # refresh (fetch+parse+update) feeds for site

  # -- log update activity
  Activity.create!( text: "update feeds >#{site_key}<" )

  site = Site.find_by_key!( site_key )

  site.feeds.each do |feed|
    refresh_feed_worker( feed )
  end

end

Private Instance Methods

refresh_feed_worker( feed_rec ) click to toggle source
# File lib/pluto/update/feed_refresher.rb, line 56
def refresh_feed_worker( feed_rec )
  text = @worker.fetch( feed_rec )

  # on error or if http-not modified etc. skip update/processing
  return  if text.nil?

  parser = FeedParser::Parser.new( text )
  feed = if parser.is_xml?
           parser.parse_xml
         elsif parser.is_json?    ## support JSON Feed
           parser.parse_json
           ##  note: reading/parsing microformat is for now optional
           ##    microformats gem requires nokogiri
           ##       nokogiri (uses libxml c-extensions) makes it hard to install (sometime)
           ##       thus, if you want to use it, please opt-in to keep the install "light"
         elsif defined?( Microformats ) && parser.is_microformats?
           parser.parse_microformats
         else  ## unknown feed format - return error; do NOT fallback assuming xml for now
           logger.error "*** error: unknown feed format (is XML or JSON?) for '#{feed_rec.key}' - #{feed_rec.feed_url} starting with: #{text.lstrip[0..20]}"
           Activity.create!( text: "*** error: unknown feed format (is XML or JSON?) for '#{feed_rec.key}' - #{feed_rec.feed_url} starting with: #{text.lstrip[0..20]}" )
           
           nil  ## note: return nil for no feed / processing error
        end

  return  if feed.nil?


  ## fix/todo: reload feed_red   - fetched date updated etc.
  ##  check if needed for access to fetched date

  ## todo/check: move feed_rec update to the end (after item updates??)

  # update feed attribs e.g.
  #    generator
  #    published_at,built_at,touched_at,fetched_at
  #    summary,title2

  ## fix:
  ## weird rss exception error on windows w/ dates
  #  e.g. /lib/ruby/1.9.1/rss/rss.rb:37:in `w3cdtf': wrong number of arguments (1 for 0) (ArgumentError)
  #
  #  move to_datetime to feedutils!! if it works
  ##   todo: move this comments to feedutils??

  # fix/todo: find a better name - why? why not?? => use update_from_struct!
  feed_rec.deep_update_from_struct!( feed )

end