Orbit/vendor/built_in_modules/feed/lib/rss_dynamic.rb

92 lines
2.9 KiB
Ruby
Raw Normal View History

2013-11-15 09:23:06 +00:00
# encoding: utf-8
require 'rss'
require 'mongo'
2013-11-20 07:16:48 +00:00
# Change this according to local DB
DB_NAME = "production_0"
2013-11-15 09:23:06 +00:00
2013-11-20 07:16:48 +00:00
# Create a hash rss site list from mongodb
db = Mongo::Connection.new("localhost", 27017).db("#{DB_NAME}")
SITES = Hash[ db["announcement_feeds"].find().entries.collect {|f| [ f["name"], f["link"] ] } ]
CATEGORIES = Array(db["announcement_feeds"].find().entries.collect {|f| f["categories"] })
2013-11-15 09:23:06 +00:00
yesterday = Time.now - 86400
two_weeks_ago = Time.new - 60 * 60 * 24 * 14
recent_feed = {}
SITES.each_with_index do |(name, url), i|
2013-11-15 09:23:06 +00:00
open("http://#{url}/panel/announcement/front_end/bulletins.rss?inner=true") do |rss|
2013-11-20 07:16:48 +00:00
# Giving 'false' parameter is for skipping irregular format of the RSS
2013-11-15 09:23:06 +00:00
feed = RSS::Parser.parse(rss, false)
feed.items.each do |item|
category = item.category.to_s.gsub(/\<(\/)*category\>/, '')
if item.pubDate > yesterday && CATEGORIES[i].include?(category)
2013-11-15 09:23:06 +00:00
recent_feed[item.title.strip] = { date: item.pubDate, description: item.description.gsub("\r\n", '<br/>').strip,
link: item.link, category: category, source: name }
end
end
end
end
def get_category_id(category, categories, coll_cat)
if categories.keys.include? "rss_#{category}"
[categories["rss_#{category}"], categories]
else
cat = {
_type: "BulletinCategory",
key: "rss_#{category}",
disable: false,
title: {:zh_tw => category},
created_at: Time.now,
updated_at: Time.now
}
categories["rss_#{category}"] = result = coll_cat.save(cat)
[result, categories]
end
end
def get_mongo_and_categories
db = Mongo::Connection.new("localhost", 27017).db("#{DB_NAME}")
2013-11-15 09:23:06 +00:00
coll_bulletin = db["bulletins"]
coll_cat = db["bulletin_categories"]
categories = coll_cat.find().to_a.inject({}) do |categories, category|
categories[category['key']] = category['_id']
categories
end
[categories, coll_bulletin, coll_cat]
end
recent_feed.each do |title, bulletin|
categories, coll_bulletin, coll_cat = get_mongo_and_categories
category_id, categories = get_category_id(bulletin[:category], categories, coll_cat)
unless coll_bulletin.find_one(rss_link: bulletin[:link])
bulletin = { _type: "Bulletin",
postdate: bulletin[:date],
created_at: bulletin[:date],
updated_at: bulletin[:date],
is_checked: true,
is_pending: false,
is_rejected: false,
bulletin_category_id: category_id,
title: {:zh_tw => title},
text: {:zh_tw => bulletin[:description]},
available_for_zh_tw: true,
rss_link: bulletin[:link],
rss_source: bulletin[:source],
is_top: false,
is_hot: false,
is_hidden: false }
coll_bulletin.save(bulletin)
end
end