From ab18d5d5d98b360c5269dbcf4c55a1876fd6f3ec Mon Sep 17 00:00:00 2001 From: Giuseppe Bilotta Date: Sat, 7 Apr 2007 21:40:43 +0000 Subject: imdb plugin: command to display the characters (and actors) in a given movie --- data/rbot/plugins/imdb.rb | 52 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 9 deletions(-) (limited to 'data/rbot/plugins') diff --git a/data/rbot/plugins/imdb.rb b/data/rbot/plugins/imdb.rb index b1f566c6..240ded86 100644 --- a/data/rbot/plugins/imdb.rb +++ b/data/rbot/plugins/imdb.rb @@ -18,6 +18,7 @@ class Imdb TITLE_OR_NAME_MATCH = /]*)>([^<]*)<\/a>/ TITLE_MATCH = /]*)>([^<]*)<\/a>/ NAME_MATCH = /]*)>([^<]*)<\/a>/ + CREDIT_NAME_MATCH = /#{NAME_MATCH}<\/td>]+> \.\.\. <\/td>]+>(.+?)<\/td>/ FINAL_ARTICLE_MATCH = /, ([A-Z]\S{0,2})$/ MATCHER = { @@ -89,9 +90,9 @@ class Imdb type = sr.match(/^\/([^\/]+)\//)[1].downcase.intern rescue nil case type when :title - results << info_title(sr) + results << info_title(sr, opts) when :name - results << info_name(sr) + results << info_name(sr, opts) else results << "#{sr}" end @@ -158,6 +159,13 @@ class Imdb return info if opts[:title_only] + if opts[:characters] + info << resp.body.scan(CREDIT_NAME_MATCH).map { |url, name, role| + "%s: %s" % [name, role] + }.join('; ') + return info + end + ratings = "no votes" m = /([0-9.]+)\/10<\/b>\n?\r?\s+\(([0-9,]+) votes?<\/a>\)<\/small>/.match(resp.body) if m @@ -322,7 +330,7 @@ class Imdb valid = [] data = @bot.httputil.get(IMDB + movie + "fullcredits") - data.scan(/#{NAME_MATCH}<\/td>]+> \.\.\. <\/td>]+>(.+?)<\/td>/).each { |url, name, role| + data.scan(CREDIT_NAME_MATCH).each { |url, name, role| valid << [url, name.ircify_html, role.ircify_html] if name_urls.include?(url) } valid.each { |url, name, role| @@ -363,13 +371,21 @@ class ImdbPlugin < Plugin @i = Imdb.new(@bot) end + # Find a person or movie on IMDB. A :type (name/title, default both) can be + # specified to limit the search to either. + # def imdb(m, params) - what = params[:what].to_s - type = params[:type].intern - info = i.info(what, :type => type) - if !info - m.reply "Nothing found for #{what}" - return nil + if params[:movie] + movie = params[:movie].to_s + info = i.info(movie, :type => :title, :characters => true) + else + what = params[:what].to_s + type = params[:type].intern + info = i.info(what, :type => type) + if !info + m.reply "nothing found for #{what}" + return nil + end end if info.length == 1 m.reply Utils.decode_html_entities info.first.join("\n") @@ -380,6 +396,9 @@ class ImdbPlugin < Plugin end end + # Find the movies with a participation of :who in the year :year + # TODO: allow year to be either a year or a decade ('[in the] 1960s') + # def movies(m, params) who = params[:who].to_s year = params[:year] @@ -404,6 +423,8 @@ class ImdbPlugin < Plugin end end + # Find the character played by :who in :movie + # def character(m, params) who = params[:who].to_s movie = params[:movie].to_s @@ -428,6 +449,18 @@ class ImdbPlugin < Plugin end end + # Report the characters in movie :movie + # + def characters(m, params) + movie = params[:movie].to_s + + urls = i.search(movie, :type => :title) + unless urls + m.reply "nothing found about #{movie}" + end + + end + end plugin = ImdbPlugin.new @@ -436,4 +469,5 @@ plugin.map "imdb [:type] *what", :requirements => { :type => /name|title/ }, :de plugin.map "movies :prefix *who in :year", :requirements => { :prefix => /with|by|from/, :year => /\d+/ } plugin.map "character [played] by *who in *movie" plugin.map "character of *who in *movie" +plugin.map "characters in *movie", :action => :imdb -- cgit v1.2.3