2013-06-16 01:16:25 -07:00
|
|
|
###
|
|
|
|
# Copyright (c) 2012, Dan
|
|
|
|
# All rights reserved.
|
|
|
|
#
|
|
|
|
#
|
|
|
|
###
|
|
|
|
|
|
|
|
import supybot.utils as utils
|
|
|
|
from supybot.commands import *
|
|
|
|
import supybot.plugins as plugins
|
|
|
|
import supybot.ircutils as ircutils
|
|
|
|
import supybot.callbacks as callbacks
|
|
|
|
|
2013-06-16 01:32:02 -07:00
|
|
|
import sys
|
2013-06-16 01:16:25 -07:00
|
|
|
import json
|
|
|
|
import socket
|
|
|
|
import unicodedata
|
|
|
|
from lxml import html
|
2013-06-16 01:32:02 -07:00
|
|
|
|
|
|
|
if sys.version_info[0] >= 3:
|
|
|
|
def u(s):
|
|
|
|
return s
|
|
|
|
import urllib
|
|
|
|
Request = urllib.request.Request
|
|
|
|
urlopen = urllib.request.urlopen
|
|
|
|
HTTPError = urllib.error.HTTPError
|
|
|
|
URLError = urllib.error.URLError
|
|
|
|
urlencode = urllib.parse.urlencode
|
|
|
|
else:
|
|
|
|
import urllib2
|
|
|
|
from urllib import urlencode
|
|
|
|
Request = urllib2.Request
|
|
|
|
urlopen = urllib2.urlopen
|
|
|
|
HTTPError = urllib2.HTTPError
|
|
|
|
URLError = urllib2.URLError
|
|
|
|
def u(s):
|
|
|
|
return unicode(s, "unicode_escape")
|
2013-06-16 01:16:25 -07:00
|
|
|
|
|
|
|
def unid(s):
|
2013-06-16 01:32:02 -07:00
|
|
|
if sys.version_info[0] < 3 and isinstance(s, unicode):
|
2013-06-16 01:16:25 -07:00
|
|
|
return unicodedata.normalize('NFKD', s).encode('ascii', 'ignore')
|
|
|
|
else:
|
|
|
|
return s
|
|
|
|
|
|
|
|
class IMDb(callbacks.Plugin):
|
|
|
|
"""Add the help for "@plugin help IMDb" here
|
|
|
|
This should describe *how* to use this plugin."""
|
|
|
|
threaded = True
|
|
|
|
|
|
|
|
def __init__(self, irc):
|
|
|
|
self.__parent = super(IMDb, self)
|
|
|
|
self.__parent.__init__(irc)
|
|
|
|
|
|
|
|
|
|
|
|
def imdb(self, irc, msg, args, opts, text):
|
|
|
|
"""<movie>
|
|
|
|
output info from IMDb about a movie"""
|
|
|
|
|
|
|
|
textencoded = urlencode({'q': 'site:http://www.imdb.com/title/ %s' % text})
|
|
|
|
url = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&%s' % (textencoded)
|
2013-06-16 01:32:02 -07:00
|
|
|
request = Request(url)
|
2013-06-16 01:16:25 -07:00
|
|
|
try:
|
2013-06-16 01:32:02 -07:00
|
|
|
page = urlopen(request)
|
|
|
|
except socket.timeout as e:
|
2013-06-16 01:16:25 -07:00
|
|
|
irc.error('\x0304Connection timed out.\x03', prefixNick=False)
|
|
|
|
return
|
2013-06-16 01:32:02 -07:00
|
|
|
except HTTPError as e:
|
2013-06-16 01:16:25 -07:00
|
|
|
irc.error('\x0304HTTP Error\x03', prefixNick=False)
|
|
|
|
return
|
2013-06-16 01:32:02 -07:00
|
|
|
except URLError as e:
|
2013-06-16 01:16:25 -07:00
|
|
|
irc.error('\x0304URL Error\x03', prefixNick=False)
|
|
|
|
return
|
|
|
|
|
|
|
|
result = json.loads(page.read().decode('utf-8'))
|
|
|
|
|
|
|
|
if result['responseStatus'] != 200:
|
|
|
|
irc.error('\x0304Google search didnt work, returned status %s' % result['responseStatus'])
|
|
|
|
return
|
|
|
|
|
|
|
|
imdb_url = None
|
|
|
|
|
|
|
|
for r in result['responseData']['results']:
|
|
|
|
if r['url'][-1] == '/':
|
|
|
|
imdb_url = r['url']
|
|
|
|
break
|
|
|
|
|
|
|
|
if imdb_url is None:
|
|
|
|
irc.error('\x0304Couldnt find a title')
|
|
|
|
return
|
|
|
|
|
2013-06-16 01:32:02 -07:00
|
|
|
request = Request(imdb_url,
|
2013-06-16 01:16:25 -07:00
|
|
|
headers={'User-Agent': 'Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',
|
|
|
|
'Accept-Language': 'en-us,en;q=0.5'})
|
|
|
|
try:
|
2013-06-16 01:32:02 -07:00
|
|
|
page = urlopen(request)
|
|
|
|
except socket.timeout as e:
|
2013-06-16 01:16:25 -07:00
|
|
|
irc.error('\x0304Connection timed out.\x03', prefixNick=False)
|
|
|
|
return
|
2013-06-16 01:32:02 -07:00
|
|
|
except HTTPError as e:
|
2013-06-16 01:16:25 -07:00
|
|
|
irc.error('\x0304HTTP Error\x03', prefixNick=False)
|
|
|
|
return
|
2013-06-16 01:32:02 -07:00
|
|
|
except URLError as e:
|
2013-06-16 01:16:25 -07:00
|
|
|
irc.error('\x0304URL Error\x03', prefixNick=False)
|
|
|
|
return
|
|
|
|
|
|
|
|
root = html.parse(page)
|
|
|
|
|
|
|
|
elem = root.xpath('//h1/span[@itemprop="name"]')
|
|
|
|
name = unid(elem[0].text.strip())
|
|
|
|
|
|
|
|
elem = root.xpath('//h2[@class="tv_header"]')
|
|
|
|
if elem:
|
|
|
|
tv = unid(elem[0].text_content().strip().replace('\n ', ''))
|
|
|
|
else:
|
|
|
|
tv = ''
|
|
|
|
|
|
|
|
elem = root.xpath('//div[@itemprop="genre"]')
|
|
|
|
if elem:
|
|
|
|
genres = unid(' '.join(elem[0].text_content().split()).strip().replace('Genres: ', ''))
|
|
|
|
else:
|
|
|
|
genres = ''
|
|
|
|
|
|
|
|
elem = root.xpath('//div[h4="Stars:"]')
|
|
|
|
if elem:
|
|
|
|
stars = unid(' '.join(elem[0].text_content().split()).replace('Stars: ', '').replace(' | See full cast and crew', ''))
|
|
|
|
else:
|
|
|
|
stars = ''
|
|
|
|
|
|
|
|
elem = root.xpath('//div[h4="Plot Keywords:"]')
|
|
|
|
if elem:
|
2013-06-16 01:32:02 -07:00
|
|
|
plot_keywords = unid(' '.join(elem[0].text_content().replace(u('\xbb'), '').split()).strip().replace(' | See more', '').replace('Plot Keywords: ', ''))
|
2013-06-16 01:16:25 -07:00
|
|
|
else:
|
|
|
|
plot_keywords = ''
|
|
|
|
|
|
|
|
elem = root.xpath('//h1[span/@itemprop="name"]/span[last()]/a')
|
|
|
|
if elem:
|
|
|
|
year = elem[0].text
|
|
|
|
else:
|
2013-08-25 12:39:07 -07:00
|
|
|
year = unid(root.xpath('//h1[span/@itemprop="name"]/span[last()]')[0].text.strip().strip(')(').replace(u('\u2013'), '-'))
|
2013-06-16 01:16:25 -07:00
|
|
|
|
|
|
|
elem = root.xpath('//div[@class="star-box-details"]/strong/span|//div[@class="star-box-details"]/span[@class="mellow"]/span')
|
|
|
|
if elem:
|
|
|
|
rating = elem[0].text + '/' + elem[1].text
|
|
|
|
else:
|
|
|
|
rating = '-/10'
|
|
|
|
|
|
|
|
elem = root.xpath('//p[@itemprop="description"]')
|
|
|
|
if elem:
|
|
|
|
description = elem[0].text_content()
|
2013-06-16 01:32:02 -07:00
|
|
|
description = unid(description.replace(u('\xbb'), '').strip().replace('See full summary', '').strip())
|
2013-06-16 01:16:25 -07:00
|
|
|
else:
|
|
|
|
description = ''
|
|
|
|
|
|
|
|
elem = root.xpath('//div[@itemprop="director"]/a/span')
|
|
|
|
if elem:
|
|
|
|
director = unid(elem[0].text)
|
|
|
|
else:
|
|
|
|
director = ''
|
|
|
|
|
|
|
|
elem = root.xpath('//div[h4="\n Creator:\n "]/a')
|
|
|
|
if elem:
|
|
|
|
creator = unid(elem[0].text)
|
|
|
|
else:
|
|
|
|
creator = ''
|
|
|
|
|
|
|
|
elem = root.xpath('//div[h4="Runtime:"]/time')
|
|
|
|
if elem:
|
|
|
|
runtime = elem[0].text
|
|
|
|
else:
|
|
|
|
runtime = ''
|
|
|
|
|
|
|
|
irc.reply('\x02\x031,8IMDb\x03 %s' % imdb_url, prefixNick=False)
|
|
|
|
if tv:
|
|
|
|
irc.reply('\x02TV Show\x02 /\x0311 %s' % tv, prefixNick=False)
|
|
|
|
irc.reply('\x02\x0304\x1F%s\x1F\x0311\x02 (%s) %s' % (name, year, rating), prefixNick=False)
|
|
|
|
if description:
|
|
|
|
irc.reply('\x0305Description\03 /\x0311 %s' % description, prefixNick=False)
|
|
|
|
if creator:
|
|
|
|
irc.reply('\x0305Creator\03 /\x0311 %s' % creator, prefixNick=False)
|
|
|
|
|
|
|
|
out = []
|
|
|
|
if director:
|
|
|
|
out.append('\x0305Director\03 /\x0311 %s' % director)
|
|
|
|
if stars:
|
|
|
|
out.append('\x0305Stars\x03 /\x0311 %s' % stars)
|
|
|
|
if out:
|
|
|
|
irc.reply(' '.join(out), prefixNick=False)
|
|
|
|
|
|
|
|
out = []
|
|
|
|
if genres:
|
|
|
|
out.append('\x0305Genres\03 /\x0311 %s' % genres)
|
|
|
|
if plot_keywords:
|
|
|
|
out.append('\x0305Plot Keywords\03 /\x0311 %s' % plot_keywords)
|
|
|
|
if out:
|
|
|
|
irc.reply(' '.join(out), prefixNick=False)
|
|
|
|
|
|
|
|
if runtime:
|
|
|
|
irc.reply('\x0305Runtime\x03 /\x0311 %s' % runtime, prefixNick=False)
|
|
|
|
|
|
|
|
imdb = wrap(imdb, [getopts({'s': '', 'short': ''}), 'text'])
|
|
|
|
|
|
|
|
|
|
|
|
Class = IMDb
|
|
|
|
|
|
|
|
|
|
|
|
# vim:set shiftwidth=4 softtabstop=4 expandtab:
|