class Desuraify::Base
base class to inherit, hopefully reducing duplicate code
Attributes
callback[R]
error[R]
hydra[R]
id[R]
Public Class Methods
new(id, options={})
click to toggle source
# File lib/desuraify/base.rb, line 11 def initialize(id, options={}) @id = id @hydra = options[:hydra] || Desuraify.hydra @request_opts = options[:request_opts] || {} @callback = nil @error = nil end
Public Instance Methods
enqueue_update(&block)
click to toggle source
# File lib/desuraify/base.rb, line 27 def enqueue_update(&block) @callback = block @error = nil request = Typhoeus::Request.new(url, @request_opts) request.on_complete do |response| result = nil begin result = handle_response(response) rescue Exception => e @error = e end update_callback(result) end hydra.queue(request) self end
parse_headers(headers)
click to toggle source
# File lib/desuraify/base.rb, line 50 def parse_headers(headers) result = Hash.new headers.each do |header| next if header.text.strip.empty? attribute = header.text.strip.split(" ").join("_").downcase.intern case header.text.strip when /^Platforms?$/i result[:platforms] = header.parent.children.search('a').select do |platform| platform unless platform == header || platform.text.strip.empty? end.map! {|platform| platform.text.strip }.uniq when /^Engine$/i result[:engines] = header.parent.children.select do |engine| engine unless engine == header || engine.text.strip.empty? end.map do |engine| eng = Hash.new eng[:name] = engine.text.strip eng[:id] = engine.child.attribute('href').value.split('/').last rescue nil eng end.uniq when /^Developers?/i, /Publishers?$/i attribute = header.text.downcase attribute << "s" unless attribute[-1] == "s" result[attribute.intern] = header.parent.children.select do |entity| entity unless entity == header || entity.text.strip.empty? end.map do |entity| target = Hash.new target[:name] = entity.text.strip href = entity.child.attribute('href').value.split('/') target[:company] = !!href.find{|company| company.match(/^company$/i)} target[:id] = href.last target end.uniq when /Languages?/i, /^Genres?/i, /^Themes?$/i, "Players", /^Projects?$/ attribute = header.text.downcase attribute << "s" unless attribute[-1] == "s" result[attribute.intern] = header.parent.children.select do |entity| entity unless entity == header || entity.text.strip.empty? end.map! {|entity| entity.text.strip }.uniq when /^This game is an expansion for\s+?/i match = header.text.strip.match(/^This game is an expansion for\s+?(.*)/i) expansion = Hash.new expansion[:title] = match[match.size-1] expansion[:boxshot] = header.parent.search('img').attribute('src').value.strip expansion[:id] = header.parent.search('a').attribute('href').value.split('/').last.strip result[:expansion] = expansion when "Boxshot" result[attribute] = header.parent.search('a').attribute('href').value.strip rescue nil when "Last Update" result[:updated] = header.next.next.text.strip rescue nil when "News", "Members", "Videos", "Games", "Images", "Engines" attribute = header.text.strip.split(" ").push("count").join("_").downcase.intern result[attribute] = header.next.next.text.strip.to_i rescue nil when "Visits", "Profile Visitors" result[:visits] = header.next.next.text.strip rescue nil when "Official Page", "Homepage" result[:official_page] = header.parent.search('a').attribute('href').value.strip rescue nil when "Offline Since" result[:offline] = header.next.next.text.strip rescue nil when "Activity Points" result[:activity_points] = header.next.next.text.strip.to_i rescue nil when "Company", "Office", "Time Online", "Site Visits", /^Gender/, /^Country/, "Established", "Watchers", "Rank", "License", "Release Date", "Phone" result[attribute] = header.next.next.text.strip rescue nil when "Address" addresses = Array.new header.parent.children.each do |child| next if child == header || child.text.strip.empty? break if child.text.strip == "Phone" addresses << child.text.strip end result[:address] = addresses.map { |address| address.split("\n") }.flatten end end result[:engines_count] = result[:engines_count] || 0 result[:images_count] = result[:images_count] || 0 result[:videos_count] = result[:videos_count] || 0 result[:games_count] = result[:games_count] || 0 result[:news_count] = result[:news_count] || 0 result end
parse_similar(doc, img_count=0, vid_count=0)
click to toggle source
# File lib/desuraify/base.rb, line 169 def parse_similar(doc, img_count=0, vid_count=0) result = Hash.new result[:rating] = doc.at_css('.score').text.strip.to_f rescue nil result[:level] = result[:rating] result[:videos] = doc.css('.videobox').search('a').map do |video| values = video.attribute('href').value.strip.split('/') values.pop "http://www.desura.com#{values.join('/')}" end rescue nil result[:videos] = rss_update(video_rss) if result[:videos].size < vid_count rescue nil result[:images] = doc.css('.mediaitem').search('a').select{|item| item if item.attribute('href').value.match(/^https?/i) }.map{|pic| pic.attribute('href').value.strip } result[:images] = rss_update(image_rss) if result[:images].size < img_count rescue nil result[:summary] = doc.at_css('.body.clear').search('p').map{ |paragraph| paragraph.text.strip } result[:page_title] = doc.css('title').text.strip result[:title] = doc.at_css('.title').css('h2').text.strip rescue nil result end
rss_update(url) { |data) : data| ... }
click to toggle source
# File lib/desuraify/base.rb, line 197 def rss_update(url) response = Typhoeus::Request.get(url, @request_opts) if response.success? xml = Nokogiri::XML(response.body) data = xml.search('enclosure').map{|item| item.attribute('url').value.strip } block_given? ? (yield data) : data end end
to_s()
click to toggle source
# File lib/desuraify/base.rb, line 193 def to_s "#{@title}" rescue "#{self.class}::#{self.object_id}" end
update()
click to toggle source
# File lib/desuraify/base.rb, line 19 def update resp = Typhoeus::Request.get(url, @request_opts) result = handle_response(resp) update_callback(result) self end
Private Instance Methods
handle_response(response)
click to toggle source
# File lib/desuraify/base.rb, line 209 def handle_response(response) if response.success? parse(response.body) else raise Desuraify::ResponseError.new("Got unexpected response code: #{response.code}") end end
update_callback(result)
click to toggle source
# File lib/desuraify/base.rb, line 217 def update_callback(result) unless @error self.attributes.each do |a| attr_name = "@#{a}" attr_value = result[a] instance_variable_set(attr_name, attr_value) end end @callback.call(self) if @callback end