IMDB = "http://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})$/
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)
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
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