diff options
author | Tom Gilbert <tom@linuxbrit.co.uk> | 2006-01-27 09:21:51 +0000 |
---|---|---|
committer | Tom Gilbert <tom@linuxbrit.co.uk> | 2006-01-27 09:21:51 +0000 |
commit | 340709f3efdad7ebf4f711434a450abf89e376c6 (patch) | |
tree | 514fea3e6ac6b758603e247ca680f34b700c5440 /data/rbot | |
parent | db236f7d9c386ff74fe111689e99dfff2a2fc536 (diff) |
ticket #18
Diffstat (limited to 'data/rbot')
-rw-r--r-- | data/rbot/plugins/imdb.rb | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/data/rbot/plugins/imdb.rb b/data/rbot/plugins/imdb.rb new file mode 100644 index 00000000..759e380c --- /dev/null +++ b/data/rbot/plugins/imdb.rb @@ -0,0 +1,92 @@ +# IMDB plugin for RubyBot +# (c) 2005 Arnaud Cornet <arnaud.cornet@gmail.com> +# Licensed under MIT License. + +require 'net/http' +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}", "User-Agent" => "Mozilla/5.0") + 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 href="(\/title\/tt[0-9]+\/?)[^"]*"(:?[^>]*)>([^<]*)<\/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 + puts "IMDB : search returned NIL" + return nil + end + resp, data = @http.get(sr, "User-Agent" => + "Mozilla/5.0 (compatible; Konqueror/3.1; Linux)") + if resp.code == "200" + m = /<title>([^<]*)<\/title>/.match(resp.body) + return nil if !m + title = CGI.unescapeHTML(m[1]) + + m = /<b>([0-9.]+)\/10<\/b> \(([0-9,]+) votes?\)/.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 privmsg(m) + unless(m.params && m.params.length > 0) + m.reply "incorrect usage: " + help(m.plugin) + return + end + + i = Imdb.new(@bot) + info = i.info(m.params) + if !info + m.reply "Nothing found for #{m.params}" + 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.register("imdb") + |