#-- vim:sw=2:et #++ # # :title: IMDB plugin for rbot # # Author:: Arnaud Cornet # Copyright:: (C) 2005 Arnaud Cornet # License:: MIT license # # Notes by Giuseppe Bilotta: # TODO return more than one match (configurable) # TODO why do we use CGI.unescapeHTML? shall we rely on the rbot methods? require 'cgi' require 'uri/common' class Imdb def initialize(bot) @bot = bot end def search(rawstr) str = URI.escape(rawstr) @http = @bot.httputil.get_proxy(URI.parse("http://us.imdb.com/find?q=#{str}")) @http.start begin resp, data = @http.get("/find?q=#{str}", @bot.httputil.headers) rescue Net::ProtoRetriableError => detail head = detail.data if head.code == "301" or head.code == "302" return head['location'].gsub(/http:\/\/us.imdb.com/, "").gsub(/\?.*/, "") end end if resp.code == "200" m = /]*)>([^<]*)<\/a>/.match(resp.body) if m url = m[1] title = m[2] return url end elsif resp.code == "302" return resp['location'].gsub(/http:\/\/us.imdb.com/, "").gsub(/\?.*/, "") end return nil end def info(rawstr) sr = search(rawstr) if !sr debug "IMDB: search returned NIL" return nil end resp, data = @http.get(sr, @bot.httputil.headers) if resp.code == "200" m = /([^<]*)<\/title>/.match(resp.body) return nil if !m title = CGI.unescapeHTML(m[1]) m = /<b>([0-9.]+)\/10<\/b>\n?\r?\s+<small>\(<a href="ratings">([0-9,]+) votes?<\/a>\)<\/small>/.match(resp.body) return nil if !m score = m[1] votes = m[2] genre = Array.new resp.body.scan(/<a href="\/Sections\/Genres\/[^\/]+\/">([^<]+)<\/a>/) do |gnr| genre << gnr end return ["http://us.imdb.com" + sr, title, score, votes, genre] end return nil end end class ImdbPlugin < Plugin def help(plugin, topic="") "imdb <string> => search http://www.imdb.org for <string>" end def imdb(m, params) what = params[:what].to_s i = Imdb.new(@bot) info = i.info(what) if !info m.reply "Nothing found for #{what}" return nil end m.reply "#{info[1]} : #{info[0]}" m.reply "Ratings: #{info[2]}/10 (#{info[3]} voters). Genre: #{info[4].join('/')}" end end plugin = ImdbPlugin.new plugin.map "imdb *what"