This repository has been archived on 2021-07-13. You can view files and clone it, but cannot push or open issues or pull requests.
feedfu/app/models/feed.rb

72 lines
2 KiB
Ruby

require "pp"
class Feed < ActiveRecord::Base
has_many :items, :dependent => :destroy
has_many :errors, :dependent => :destroy
validates_uniqueness_of :url
default_scope where(:has_errors => false)
scope :with_error, unscoped.where(:has_errors => true)
def fetch!
Feedzirra::Feed.fetch_and_parse(url,
:on_success => lambda do |url, feed|
begin
feed.entries.each do |entry|
unless Item.exists?(:url => entry.url)
entry.sanitize!
items << Item.create_from_feed_entry!(entry)
end
end
by_url(url).update_attribute(:has_errors, false)
rescue Exception => e
Error.create!(:feed_id => self.id, :action => :fetch_and_parse,
:message => e)
end
end,
:on_failure => lambda do |url, response_code, response_header, response_body|
by_url(url).update_attribute(:has_errors, true)
Error.create!(:feed_id => self.id, :action => :fetch_and_parse,
:message => "
url: #{url}
response-code: #{response_code}
response-header: #{response_header}
response-body: #{response_body}
")
end
)
end
def self.import(url, *params)
Feedzirra::Feed.fetch_and_parse(url,
:on_success => lambda do |url, feed|
Feed.create!(:url => feed.feed_url, :title => feed.title).fetch!
end,
:on_failure => lambda do |url, response_code, response_header, response_body|
if params.first.include?(:force)
feed = Feed.create!(:url => url, :has_errors => true)
Error.create!(:feed_id => feed.id, :action => :import,
:message => "
url: #{url}
response-code: #{response_code}
response-header: #{response_header}
response-body: #{response_body}
")
end
end
)
end
def self.update_all!
Feed.all.each do |feed|
feed.fetch!
end
end
private
def by_url(feed_url)
Feed.where(:url => feed_url).first
end
end