From 856d0e0aa3e2f80cc0725288f56def12714b0fbd Mon Sep 17 00:00:00 2001 From: Ruud Date: Sun, 5 Feb 2012 15:04:09 +0100 Subject: [PATCH] Use imdbapi.com --- .../core/providers/movie/imdbapi/main.py | 125 ++++++------------ 1 file changed, 43 insertions(+), 82 deletions(-) diff --git a/couchpotato/core/providers/movie/imdbapi/main.py b/couchpotato/core/providers/movie/imdbapi/main.py index fc584ba3..81de2dee 100644 --- a/couchpotato/core/providers/movie/imdbapi/main.py +++ b/couchpotato/core/providers/movie/imdbapi/main.py @@ -1,7 +1,10 @@ -from couchpotato.core.event import addEvent -from couchpotato.core.helpers.encoding import simplifyString, toUnicode +from couchpotato.core.event import addEvent, fireEvent +from couchpotato.core.helpers.variable import tryInt, tryFloat from couchpotato.core.logger import CPLog from couchpotato.core.providers.movie.base import MovieProvider +from urllib import urlencode +import json +import traceback log = CPLog(__name__) @@ -9,106 +12,64 @@ log = CPLog(__name__) class IMDBAPI(MovieProvider): urls = { - 'search': 'http://www.imdbapi.com/?t=%s', + 'search': 'http://www.imdbapi.com/?%s', 'info': 'http://www.imdbapi.com/?i=%s&tomatoes=true', } def __init__(self): - pass - #addEvent('movie.search', self.search) - #addEvent('movie.info', self.getInfo) + addEvent('movie.search', self.search) + addEvent('movie.info', self.getInfo) def search(self, q, limit = 12): - search_string = simplifyString(q) - cache_key = 'imdbapi.cache.%s.%s' % (search_string, limit) - results = self.getCache(cache_key) + name_year = fireEvent('scanner.name_year', q, single = True) - if not results: - log.debug('Searching for movie: %s' % q) - raw = self.urlopen() + cache_key = 'imdbapi.cache.%s' % q + cached = self.getCache(cache_key, self.urls['search'] % urlencode({'t': name_year.get('name'), 'y': name_year.get('year')})) - results = [] - if raw: - try: - nr = 0 - for movie in raw: + result = self.parseMovie(cached) + log.info('Found: %s' % result['titles'][0] + ' (' + str(result['year']) + ')') - results.append(self.parseMovie(movie)) - - nr += 1 - if nr == limit: - break - - log.info('Found: %s' % [result['titles'][0] + ' (' + str(result['year']) + ')' for result in results]) - - self.setCache(cache_key, results) - return results - except SyntaxError, e: - log.error('Failed to parse XML response: %s' % e) - return False - - return results + return [result] def getInfo(self, identifier = None): - cache_key = 'tmdb.cache.%s' % identifier - result = None #self.getCache(cache_key) + cache_key = 'imdbapi.cache.%s' % identifier + cached = self.getCache(cache_key, self.urls['info'] % identifier) - if not result: - result = {} - movie = None - - raw = self.urlopen() - - if movie: - result = self.parseMovie(movie[0]) - self.setCache(cache_key, result) + result = self.parseMovie(cached) + log.info('Found: %s' % result['titles'][0] + ' (' + str(result['year']) + ')') return result def parseMovie(self, movie): - # Images - poster = self.getImage(movie, type = 'poster') - backdrop = self.getImage(movie, type = 'backdrop') - poster_original = self.getImage(movie, type = 'poster', size = 'mid') - backdrop_original = self.getImage(movie, type = 'backdrop', size = 'w1280') - - # Genres + movie_data = {} try: - genres = self.getCategory(movie, 'genre') + + if isinstance(movie, (str, unicode)): + movie = json.loads(movie) + + movie_data = { + 'titles': [movie.get('Title', '')], + 'original_title': movie.get('Title', ''), + 'images': { + 'poster': [movie.get('Poster', '')], + }, + 'rating': { + 'imdb': (tryFloat(movie.get('Rating', 0)), tryInt(movie.get('Votes', ''))), + 'rotten': (tryFloat(movie.get('tomatoRating', 0)), tryInt(movie.get('tomatoReviews', 0))), + }, + 'imdb': movie.get('ID', ''), + 'runtime': movie.get('Runtime', ''), + 'released': movie.get('Released', ''), + 'year': movie.get('Year', ''), + 'plot': movie.get('Plot', ''), + 'genres': movie.get('Genre').split(','), + 'director': movie.get('Director', ''), + 'actors': movie.get('Actors', '').split(','), + } except: - genres = [] - - # 1900 is the same as None - year = str(movie.get('released', 'none'))[:4] - if year == '1900' or year.lower() == 'none': - year = None - - movie_data = { - 'id': int(movie.get('id', 0)), - 'titles': [toUnicode(movie.get('name'))], - 'original_title': movie.get('original_name'), - 'images': { - 'poster': [poster], - 'backdrop': [backdrop], - 'poster_original': [poster_original], - 'backdrop_original': [backdrop_original], - }, - 'imdb': movie.get('imdb_id'), - 'runtime': movie.get('runtime'), - 'released': movie.get('released'), - 'year': year, - 'plot': movie.get('overview', ''), - 'tagline': '', - 'genres': genres, - } - - # Add alternative names - for alt in ['original_name', 'alternative_name']: - alt_name = toUnicode(movie.get(alt)) - if alt_name and not alt_name in movie_data['titles'] and alt_name.lower() != 'none' and alt_name != None: - movie_data['titles'].append(alt_name) + log.error('Failed parsing IMDB API json: %s' % traceback.format_exc()) return movie_data