1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
#-- vim:sw=2:et
#++
#
# :title: IMDB plugin for rbot
#
# Author:: Arnaud Cornet <arnaud.cornet@gmail.com>
# Copyright:: (C) 2005 Arnaud Cornet
# License:: 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
debug "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 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"
|