def Engine::grab_feed(feed)
meth = 'Engine.grab_feed'
t = Time.now
Thread::current['feed'] = feed
Thread::current.priority = $config['thread_priority_feed']
msg = _("Checking feed")
$new_status = " #{msg} \"#{feed['title']}\"..."
$log.info(meth) { "#{msg} \"#{feed['title']}\"" }
return unless feed['refresh'] > 0 &&
feed['updated'] + (feed['refresh'] * 60) < t.to_i
msg, src_msg = _("Updating feed"), _('from')
$new_status = " #{msg} \"#{feed['title']}\"..."
$log.info(meth) { "#{msg} \"#{feed['title']}\" #{src_msg} \"#{feed['url']}\"" }
begin
chan = Raggle::Feed::Channel.new(feed['url'], feed['last_modified'])
feed.delete 'error'
rescue
err_msg = _('Error updating')
err = feed['error'] = "#$!"
if $config['mode'] == 'view'
Raggle::Interfaces::NcursesInterface::set_status "#{err_msg} \"#{feed['title']}\"."
end
$log.error(meth) { "#{err_msg}: #{err}" }
feed['updated'] = t.to_i
return
end
if !chan.last_modified ||
chan.last_modified != feed['last_modified']
Thread::critical = $config['use_critical_regions']
feed['title'] = chan.title unless $config['lock_feed_title'] ||
feed['lock_title?'] == true
feed['desc'] = chan.desc
feed['site'] = chan.link
feed['image'] = chan.image
feed['updated'] = t.to_i
feed['last_modified'] = chan.last_modified
status = {}
feed['items'].each { |item| status[item['url']] = { :read => item['read?'], :visible => item['visible'] } }
Thread::critical = $config['use_critical_regions']
feed['items'].clear unless $config['save_feed_items'] ||
feed['save_items?']
Thread::critical = false
new_items = []
chan.items.each { |item|
unless (($config['save_feed_items'] ||
feed['save_items?']) &&
status.has_key?(item.link))
if status.has_key?(item.link)
was_read = status[item.link][:read]
is_visible = status[item.link][:visible]
else
was_read = false; is_visible = true
end
new_items << {
'title' => item.title,
'date' => item.date,
'url' => item.link,
'desc' => item.desc,
'read?' => was_read,
'visible' => is_visible,
'added' => Time.now.to_i,
}
end
}
Thread::critical = $config['use_critical_regions']
if $config['save_feed_items'] || feed['save_items?']
feed['items'] = new_items + feed['items']
max = $config['max_feed_items'] || feed['max_items']
if max && max > 0
old = (feed['items'].slice!(max .. -1) || []).size
rm_msg = _('Removing %d old items.')
$log.info(meth) { rm_msg % [old] }
end
else
feed['items'] = new_items
end
if $config['do_beep']
print "\a"
end
Thread::critical = false
else
feed['updated'] = t.to_i
same_msg = _("Feed \"%s\" hasn't changed.")
$log.info(meth) { same_msg % [feed['title']] }
end
if $config['mode'] == 'view' &&
!$config['run_http_server'] && !$config['run_drb_server'] &&
$config['feeds'].get($a_feed)['url'] == feed['url']
feed_win_id = Raggle::Interfaces::NcursesInterface::get_win_id('feed')
$wins[feed_win_id].select_win_item
end
$update_wins = true
end