discourse/lib/oneboxer/rottentomatoes_onebox.rb
2013-04-28 16:24:03 -04:00

73 lines
2.7 KiB
Ruby

require_dependency 'oneboxer/handlebars_onebox'
module Oneboxer
class RottentomatoesOnebox < HandlebarsOnebox
SYNOPSIS_MAX_TEXT = 370
ROTTEN_IMG = 'http://images.rottentomatoescdn.com/images/icons/rt.rotten.med.png'
FRESH_IMG = 'http://images.rottentomatoescdn.com/images/icons/rt.fresh.med.png'
POPCORN_IMG = 'http://images.rottentomatoescdn.com/images/icons/popcorn_27x31.png'
matcher /^http:\/\/(?:www\.)?rottentomatoes\.com(\/mobile)?\/m\/.*$/
favicon 'rottentomatoes.png'
def http_params
{'User-Agent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31' }
end
def template
template_path('rottentomatoes_onebox')
end
def translate_url
m = @url.match(/^http:\/\/(?:www\.)?rottentomatoes\.com(\/mobile)?\/m\/(?<movie>.*)$/mi)
"http://rottentomatoes.com/mobile/m/#{m[:movie]}"
end
def parse(data)
html_doc = Nokogiri::HTML(data)
result = {}
result[:title] = html_doc.at('h1').content
result[:poster] = html_doc.at_css('.poster img')['src']
synopsis = html_doc.at_css('#movieSynopsis').content.squish
synopsis.gsub!(/\$\(function\(\).+$/, '')
result[:synopsis] = (synopsis.length > SYNOPSIS_MAX_TEXT ? "#{synopsis[0..SYNOPSIS_MAX_TEXT]}..." : synopsis)
result[:verdict_percentage], result[:user_percentage] = html_doc.css('.rtscores .rating .percentage span').map(&:content)
result[:popcorn_image] = POPCORN_IMG
if html_doc.at_css('.rtscores .rating .splat')
result[:verdict_image] = ROTTEN_IMG
elsif html_doc.at_css('.rtscores .rating .tomato')
result[:verdict_image] = FRESH_IMG
end
result[:cast] = html_doc.css('.summary .actors a').map(&:content).join(", ")
html_doc.css('#movieInfo .info').map(&:inner_html).each do |element|
case
when element.include?('Director:') then result[:director] = clean_up_info(element)
when element.include?('Rated:') then result[:rated] = clean_up_info(element)
when element.include?('Running Time:') then result[:running_time] = clean_up_info(element)
when element.include?('DVD Release:')
result[:release_date] = clean_up_info(element)
result[:release_type] = 'DVD'
# Only show the theater release date if there is no DVD release date
when element.include?('Theater Release:') && !result[:release_type]
result[:release_date] = clean_up_info(element)
result[:release_type] = 'Theater'
end
end
result.delete_if { |k, v| v.blank? }
end
def clean_up_info(inner_html)
inner_html.squish.gsub(/^.*<\/span>\s*/, '')
end
end
end