]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - data/rbot/plugins/imdb.rb
plugin(imdb): changed base url
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / imdb.rb
index e1209124252026450909a42df81c7e9499913b0c..0f5c6024b6306ddcd73079500208dde7a02dbf55 100644 (file)
 # License:: MIT license
 
 class Imdb
-  IMDB = "http://www.imdb.com"
+  IMDB = "https://www.imdb.com"
   TITLE_OR_NAME_MATCH = /<a\s+href="(\/(?:title|name)\/(?:tt|nm)[0-9]+\/?)[^"]*"(?:[^>]*)>([^<]*)<\/a>/
   TITLE_MATCH = /<a\s+href="(\/title\/tt[0-9]+\/?)[^"]*"(?:[^>]*)>([^<]*)<\/a>/
-  NAME_MATCH = /<a\s+href="(\/name\/nm[0-9]+\/?)[^"]*"(?:[^>]*)>([^<]*)<\/a>/
+  NAME_MATCH = /<a\s+onclick="[^"]+"\s+href="(\/name\/nm[0-9]+\/?)[^"]*"(?:[^>]*)>([^<]*)<\/a>/
   CHAR_MATCH = /<a\s+href="(\/character\/ch[0-9]+\/?)[^"]*"(?:[^>]*)>([^<]*)<\/a>/
   CREDIT_NAME_MATCH = /#{NAME_MATCH}\s*<\/td>\s*<td[^>]+>\s*\.\.\.\s*<\/td>\s*<td[^>]+>\s*(.+?)\s*<\/td>/m
   FINAL_ARTICLE_MATCH = /, ([A-Z]\S{0,2})$/
@@ -33,8 +33,12 @@ class Imdb
   end
 
   def search(rawstr, rawopts={})
+    # allow the user to search directly for (movie) IDs
+    if rawstr.match /$tt\d+^/ then
+      return ["/movie/#{rawstr}/"]
+    end
     str = CGI.escape(rawstr)
-    str << ";site=aka" if @bot.config['imdb.aka']
+    str << "&site=aka" if @bot.config['imdb.aka']
     opts = rawopts.dup
     opts[:type] = :both unless opts[:type]
     return do_search(str, opts)
@@ -128,6 +132,8 @@ class Imdb
   def info_title(sr, opts={})
     resp = nil
     begin
+      # movie urls without tailing / trigger a redirect
+      sr += '/' if sr[-1,1] != '/'
       resp = @bot.httputil.get_response(IMDB + sr, :max_redir => -1)
     rescue Exception => e
       error e.message
@@ -175,14 +181,18 @@ class Imdb
       end
 
       ratings = "no votes"
-      m = resp.body.match(/<b>([0-9.]+)<\/b><span [^>]+>\/10<\/span><\/span>\s*[^<]+<a\s+[^>]*href="ratings"[^>]+>([0-9,]+) votes?<\/a>/m)
-      if m
-        ratings = "#{m[1]}/10 (#{m[2]} voters)"
+      # parse imdb rating value:
+      if resp.body.match(/itemprop="ratingValue">([^<]+)</)
+        ratings = "#{$1}/10"
+      end
+      # parse imdb rating count:
+      if resp.body.match(/itemprop="ratingCount">([^<]+)</)
+        ratings += " (#{$1} voters)"
       end
 
       genre = Array.new
-      resp.body.scan(/<a href="\/genre\/[^"]+">([^<]+)<\/a>/) do |gnr|
-        genre << gnr
+      resp.body.scan(/<a\s+href="\/genre\/[^\?]+\?[^"]+"\s+>([^<]+)<\/a>/) do |gnr|
+        genre << gnr.first.strip
       end
 
       plot = resp.body.match(DESC_MATCH)[3] rescue nil