Packages update

This commit is contained in:
Ruud
2012-02-11 16:28:06 +01:00
parent 3bbf1126c3
commit 02e01fb2d6
217 changed files with 26395 additions and 21194 deletions
+212 -30
View File
@@ -8,34 +8,37 @@
"""An interface to the themoviedb.org API"""
__author__ = "doganaydin"
__version__ = "0.2"
__version__ = "0.5"
class Config:
lang = 'en'
api_key = 'API_KEY'
urls = {
'movie.search': "http://api.themoviedb.org/2.1/Movie.search/%(lang)s/xml/%(apikey)s/%%s",
'movie.getInfo': "http://api.themoviedb.org/2.1/Movie.getInfo/%(lang)s/xml/%(apikey)s/%%s",
'media.getInfo': "http://api.themoviedb.org/2.1/Media.getInfo/%(lang)s/xml/%(apikey)s/%%s/%%s",
'imdb.lookUp': "http://api.themoviedb.org/2.1/Movie.imdbLookup/%(lang)s/xml/%(apikey)s/%%s",
}
@staticmethod
def getUrl(type):
return Config.urls[type] % {'lang': Config.lang, 'apikey': Config.api_key}
config = {}
def configure(api_key):
config['apikey'] = api_key
config['urls'] = {}
config['urls']['movie.search'] = "http://api.themoviedb.org/2.1/Movie.search/en/xml/%(apikey)s/%%s" % (config)
config['urls']['movie.getInfo'] = "http://api.themoviedb.org/2.1/Movie.getInfo/en/xml/%(apikey)s/%%s" % (config)
config['urls']['media.getInfo'] = "http://api.themoviedb.org/2.1/Media.getInfo/en/xml/%(apikey)s/%%s/%%s" % (config)
config['urls']['imdb.lookUp'] = "http://api.themoviedb.org/2.1/Movie.imdbLookup/en/xml/%(apikey)s/%%s" % (config)
config['urls']['movie.browse'] = "http://api.themoviedb.org/2.1/Movie.browse/en-US/xml/%(apikey)s?%%s" % (config)
import os, struct, urllib, urllib2, xml.etree.cElementTree as ElementTree
class TmdBaseError(Exception):
pass
class TmdNoResults(TmdBaseError):
pass
class TmdHttpError(TmdBaseError):
pass
class TmdXmlError(TmdBaseError):
pass
class TmdConfigError(TmdBaseError):
pass
def opensubtitleHashFile(name):
"""Hashes a file using OpenSubtitle's method.
> In natural language it calculates: size + 64bit chksum of the first and
@@ -52,7 +55,7 @@ def opensubtitleHashFile(name):
fhash = filesize
if filesize < 65536 * 2:
raise ValueError("File size must be larger than %s bytes (is %s)" % (65536 * 2, filesize))
raise ValueError("File size must be larger than %s bytes (is %s)" % (65536 * 2, filesize))
for x in range(65536 / bytesize):
buf = f.read(bytesize)
@@ -193,13 +196,10 @@ class ImagesList(list):
size = image_et.get("size")
url = image_et.get("url")
cur = self.find_by('id', _id)
if len(cur) == 0:
nimg = Image(_id = _id, _type = _type, size = size, url = url)
self.append(nimg)
cur = self.find_by('id', _id)
if len(cur) == 1:
elif len(cur) == 1:
cur[0][size] = url
else:
raise ValueError("Found more than one poster with id %s, this should never happen" % (_id))
@@ -264,7 +264,6 @@ class MovieDb:
cur_images.set(subitem)
else:
cur_movie[item.tag] = item.text
cur_movie['images'] = cur_images
return cur_movie
@@ -314,7 +313,7 @@ class MovieDb:
Returns SearchResults (a list) containing all matches (Movie instances)
"""
title = urllib.quote(title.encode("utf-8"))
url = Config.getUrl('movie.search') % (title)
url = config['urls']['movie.search'] % (title)
etree = XmlHandler(url).getEt()
search_results = SearchResults()
for cur_result in etree.find("movies").findall("movie"):
@@ -326,7 +325,7 @@ class MovieDb:
"""Returns movie info by it's TheMovieDb ID.
Returns a Movie instance
"""
url = Config.getUrl('movie.getInfo') % (id)
url = config['urls']['movie.getInfo'] % (id)
etree = XmlHandler(url).getEt()
moviesTree = etree.find("movies").findall("movie")
@@ -338,7 +337,7 @@ class MovieDb:
"""Used to retrieve specific information about a movie but instead of
passing a TMDb ID, you pass a file hash and filesize in bytes
"""
url = Config.getUrl('media.getInfo') % (hash, size)
url = config['urls']['media.getInfo'] % (hash, size)
etree = XmlHandler(url).getEt()
moviesTree = etree.find("movies").findall("movie")
if len(moviesTree) == 0:
@@ -346,23 +345,140 @@ class MovieDb:
return [self._parseMovie(x) for x in moviesTree]
def imdbLookup(self, id = 0, title = False):
if not config.get('apikey'):
raise TmdConfigError("API Key not set")
if id > 0:
url = Config.getUrl('imdb.lookUp') % (id)
url = config['urls']['imdb.lookUp'] % (id)
else:
_imdb_id = self.search(title)[0]["imdb_id"]
url = Config.getUrl('imdb.lookUp') % (_imdb_id)
url = config['urls']['imdb.lookUp'] % (_imdb_id)
etree = XmlHandler(url).getEt()
lookup_results = SearchResults()
for cur_lookup in etree.find("movies").findall("movie"):
cur_movie = self._parseMovie(cur_lookup)
cur_movie = self._parseSearchResults(cur_lookup)
lookup_results.append(cur_movie)
return lookup_results
class Browse:
def __init__(self, params = {}):
"""
tmdb.Browse(params)
default params = {"order_by":"release","order":"desc"}
params = {"query":"some query","release_max":"1991",...}
all posible parameters = http://api.themoviedb.org/2.1/methods/Movie.browse
"""
if "order_by" not in params:
params.update({"order_by":"release"})
if "order" not in params:
params.update({"order":"desc"})
self.params = urllib.urlencode(params)
self.movie = self.look(self.params)
def look(self, look_for):
url = config['urls']['movie.browse'] % (look_for)
etree = XmlHandler(url).getEt()
look_results = SearchResults()
for cur_lookup in etree.find("movies").findall("movie"):
cur_movie = self._parseSearchResults(cur_lookup)
look_results.append(cur_movie)
return look_results
def _parseSearchResults(self, movie_element):
cur_movie = MovieResult()
cur_images = ImagesList()
for item in movie_element.getchildren():
if item.tag.lower() == "images":
for subitem in item.getchildren():
cur_images.set(subitem)
else:
cur_movie[item.tag] = item.text
cur_movie['images'] = cur_images
return cur_movie
def getTotal(self):
return len(self.movie)
def getRating(self, i):
return self.movie[i]["rating"]
def getVotes(self, i):
return self.movie[i]["votes"]
def getName(self, i):
return self.movie[i]["name"]
def getLanguage(self, i):
return self.movie[i]["language"]
def getCertification(self, i):
return self.movie[i]["certification"]
def getUrl(self, i):
return self.movie[i]["url"]
def getOverview(self, i):
return self.movie[i]["overview"]
def getPopularity(self, i):
return self.movie[i]["popularity"]
def getOriginalName(self, i):
return self.movie[i]["original_name"]
def getLastModified(self, i):
return self.movie[i]["last_modified_at"]
def getImdbId(self, i):
return self.movie[i]["imdb_id"]
def getReleased(self, i):
return self.movie[i]["released"]
def getScore(self, i):
return self.movie[i]["score"]
def getAdult(self, i):
return self.movie[i]["adult"]
def getVersion(self, i):
return self.movie[i]["version"]
def getTranslated(self, i):
return self.movie[i]["translated"]
def getType(self, i):
return self.movie[i]["type"]
def getId(self, i):
return self.movie[i]["id"]
def getAlternativeName(self, i):
return self.movie[i]["alternative_name"]
def getPoster(self, i, size):
if size == "thumb" or size == "t":
return self.movie[i]["images"][0]["thumb"]
elif size == "cover" or size == "c":
return self.movie[i]["images"][0]["cover"]
else:
return self.movie[i]["images"][0]["mid"]
def getBackdrop(self, i, size):
if size == "poster" or size == "p":
return self.movie[i]["images"][1]["poster"]
else:
return self.movie[i]["images"][1]["thumb"]
# Shortcuts for tmdb search method
# using:
# movie = tmdb.tmdb("Sin City")
# print movie.getRating -> 7.0
class tmdb:
def __init__(self, name):
"""Convenience wrapper for MovieDb.search - so you can do..
>>> import tmdb
@@ -371,45 +487,68 @@ class tmdb:
<Search results: [<MovieResult: Fight Club (1999-09-16)>]>
"""
mdb = MovieDb()
self.movie = mdb.search(name)[int(result)]
self.movie = mdb.search(name)
def getTotal(self):
return len(self.movie)
def getRating(self, i):
return self.movie[i]["rating"]
def getVotes(self, i):
return self.movie[i]["votes"]
def getName(self, i):
return self.movie[i]["name"]
def getLanguage(self, i):
return self.movie[i]["language"]
def getCertification(self, i):
return self.movie[i]["certification"]
def getUrl(self, i):
return self.movie[i]["url"]
def getOverview(self, i):
return self.movie[i]["overview"]
def getPopularity(self, i):
return self.movie[i]["popularity"]
def getOriginalName(self, i):
return self.movie[i]["original_name"]
def getLastModified(self, i):
return self.movie[i]["last_modified_at"]
def getImdbId(self, i):
return self.movie[i]["imdb_id"]
def getReleased(self, i):
return self.movie[i]["released"]
def getScore(self, i):
return self.movie[i]["score"]
def getAdult(self, i):
return self.movie[i]["adult"]
def getVersion(self, i):
return self.movie[i]["version"]
def getTranslated(self, i):
return self.movie[i]["translated"]
def getType(self, i):
return self.movie[i]["type"]
def getId(self, i):
return self.movie[i]["id"]
def getAlternativeName(self, i):
return self.movie[i]["alternative_name"]
def getPoster(self, i, size):
if size == "thumb" or size == "t":
return self.movie[i]["images"][0]["thumb"]
@@ -427,8 +566,9 @@ class tmdb:
# Shortcuts for imdb lookup method
# using:
# movie = tmdb.imdb("Sin City")
# print movie.getRating -> 7.0
# print movie.getRating -> 7.0
class imdb:
def __init__(self, id = 0, title = False):
# get first movie if result=0
"""Convenience wrapper for MovieDb.search - so you can do..
@@ -441,11 +581,16 @@ class imdb:
self.title = title
self.mdb = MovieDb()
self.movie = self.mdb.imdbLookup(self.id, self.title)
def getTotal(self):
return len(self.movie)
def getRuntime(self, i):
return self.movie[i]["runtime"]
def getCategories(self):
from xml.dom.minidom import parse
adres = Config.getUrl('imdb.lookUp') % self.getImdbId()
adres = config['urls']['imdb.lookUp'] % self.getImdbId()
d = parse(urllib2.urlopen(adres))
s = d.getElementsByTagName("categories")
ds = []
@@ -453,42 +598,61 @@ class imdb:
if i % 2 > 0:
ds.append(s[0].childNodes[i].getAttribute("name"))
return ds
def getRating(self, i):
return self.movie[i]["rating"]
def getVotes(self, i):
return self.movie[i]["votes"]
def getName(self, i):
return self.movie[i]["name"]
def getLanguage(self, i):
return self.movie[i]["language"]
def getCertification(self, i):
return self.movie[i]["certification"]
def getUrl(self, i):
return self.movie[i]["url"]
def getOverview(self, i):
return self.movie[i]["overview"]
def getPopularity(self, i):
return self.movie[i]["popularity"]
def getOriginalName(self, i):
return self.movie[i]["original_name"]
def getLastModified(self, i):
return self.movie[i]["last_modified_at"]
def getImdbId(self, i):
return self.movie[i]["imdb_id"]
def getReleased(self, i):
return self.movie[i]["released"]
def getAdult(self, i):
return self.movie[i]["adult"]
def getVersion(self, i):
return self.movie[i]["version"]
def getTranslated(self, i):
return self.movie[i]["translated"]
def getType(self, i):
return self.movie[i]["type"]
def getId(self, i):
return self.movie[i]["id"]
def getAlternativeName(self, i):
return self.movie[i]["alternative_name"]
def getPoster(self, i, size):
poster = []
if size == "thumb" or size == "t":
@@ -502,6 +666,7 @@ class imdb:
poster.append(a[_size])
return poster
del poster
def getBackdrop(self, i, size):
backdrop = []
if size == "thumb" or size == "t":
@@ -524,6 +689,7 @@ def imdbLookup(id = 0, title = False):
"""
mdb = MovieDb()
return mdb.imdbLookup(id, title)
def search(name):
"""Convenience wrapper for MovieDb.search - so you can do..
>>> import tmdb
@@ -532,6 +698,7 @@ def search(name):
"""
mdb = MovieDb()
return mdb.search(name)
def getMovieInfo(id):
"""Convenience wrapper for MovieDb.search - so you can do..
>>> import tmdb
@@ -554,5 +721,20 @@ def mediaGetInfo(hash, size):
def searchByHashingFile(filename):
"""Searches for the specified file using the OpenSubtitle hashing method
"""
return mediaGetInfo(opensubtitleHashFile(filename), os.path.getsize(filename))
return mediaGetInfo(opensubtitleHashFile(filename), os.path.size(filename))
def main():
results = search("Fight Club")
searchResult = results[0]
movie = getMovieInfo(searchResult['id'])
print movie['name']
print "Producers:"
for prodr in movie['cast']['producer']:
print " " * 4, prodr['name']
print movie['images']
for genreName in movie['categories']['genre']:
print "%s (%s)" % (genreName, movie['categories']['genre'][genreName])
if __name__ == '__main__':
main()