summaryrefslogtreecommitdiff
path: root/data/rbot/plugins/imdb.rb
blob: cfadd3c8568ad4bad79feeed639e39b3606825fd (plain)
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
94
95
96
97
98
99
100
101
102
103
104
#-- vim:sw=2:et
#++
#
# :title: IMDB plugin for rbot
#
# Author:: Arnaud Cornet <arnaud.cornet@gmail.com>
# 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)
    resp = nil
    begin
      resp = @bot.httputil.get_response("http://us.imdb.com/find?q=#{str}",
                                        :max_redir => -1)
    rescue Exception => e
      error e.message
      warning e.backtrace.join("\n")
      return nil
    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 = nil
    begin
      resp = @bot.httputil.get_response('http://us.imdb.com' + sr,
                                        :max_redir => -1)
    rescue Exception => e
      error e.message
      warning e.backtrace.join("\n")
      return nil
    end

    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>\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"