class Feedigest::FeedFetcher

Constants

Feed
USER_AGENT

Attributes

feed_urls[R]
filter_cmd[R]

Public Class Methods

new(feed_urls, filter_cmd = nil) click to toggle source
# File lib/feedigest/feed_fetcher.rb, line 12
def initialize(feed_urls, filter_cmd = nil)
  @feed_urls = feed_urls
  @filter_cmd = filter_cmd
end

Public Instance Methods

feeds() click to toggle source
# File lib/feedigest/feed_fetcher.rb, line 17
def feeds
  @feeds ||= all_feeds.select { |f| process_feed?(f) }
end

Private Instance Methods

all_feeds() click to toggle source
# File lib/feedigest/feed_fetcher.rb, line 27
def all_feeds
  feed_urls.map { |url| feed_from_url(url) }
end
feed_entries(feed) click to toggle source
# File lib/feedigest/feed_fetcher.rb, line 57
def feed_entries(feed)
  feed.entries.select { |e| process_entry?(e) }.sort_by(&:published).reverse
end
feed_from_url(url) click to toggle source
# File lib/feedigest/feed_fetcher.rb, line 31
def feed_from_url(url)
  feed, error = fetch_and_parse_feed(url)
  Feed.new(
    url,
    feed&.title,
    error ? [] : feed_entries(feed),
    error
  )
end
fetch_and_parse_feed(url) click to toggle source
# File lib/feedigest/feed_fetcher.rb, line 51
def fetch_and_parse_feed(url)
  [Feedjira::Feed.parse(fetch_feed(url)), nil]
rescue StandardError => e
  [nil, e.message]
end
fetch_feed(url) click to toggle source
# File lib/feedigest/feed_fetcher.rb, line 41
def fetch_feed(url)
  feed_fd = OpenURI.open_uri(url, 'User-Agent' => USER_AGENT)

  if filter_cmd
    filter_feed(feed_fd)
  else
    feed_fd.read
  end
end
filter_feed(feed_fd) click to toggle source
# File lib/feedigest/feed_fetcher.rb, line 69
def filter_feed(feed_fd)
  IO.popen(filter_cmd, 'r+') do |io|
    IO.copy_stream(feed_fd, io)
    io.close_write
    io.read
  end
end
process_entry?(entry) click to toggle source
# File lib/feedigest/feed_fetcher.rb, line 61
def process_entry?(entry)
  !entry.published.nil? && entry.published >= window_start
end
process_feed?(feed) click to toggle source
# File lib/feedigest/feed_fetcher.rb, line 23
def process_feed?(feed)
  feed[:error] || feed[:entries].any?
end
window_start() click to toggle source
# File lib/feedigest/feed_fetcher.rb, line 65
def window_start
  @window_start ||= Time.now - Feedigest.config.fetch(:entry_window) * 3600
end