Browse Source

Simplify tmdb provider

pull/4054/head
Ruud 11 years ago
parent
commit
06293dc0a2
  1. 65
      couchpotato/core/media/movie/providers/info/themoviedb.py

65
couchpotato/core/media/movie/providers/info/themoviedb.py

@ -1,8 +1,7 @@
import traceback import traceback
import time
from couchpotato.core.event import addEvent, fireEvent from couchpotato.core.event import addEvent, fireEvent
from couchpotato.core.helpers.encoding import simplifyString, toUnicode, ss, tryUrlencode from couchpotato.core.helpers.encoding import toUnicode, ss, tryUrlencode
from couchpotato.core.helpers.variable import tryInt from couchpotato.core.helpers.variable import tryInt
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.media.movie.providers.base import MovieProvider from couchpotato.core.media.movie.providers.base import MovieProvider
@ -14,7 +13,7 @@ autoload = 'TheMovieDb'
class TheMovieDb(MovieProvider): class TheMovieDb(MovieProvider):
http_time_between_calls = .3 http_time_between_calls = .35
configuration = { configuration = {
'images': { 'images': {
@ -23,6 +22,8 @@ class TheMovieDb(MovieProvider):
} }
def __init__(self): def __init__(self):
addEvent('info.search', self.search, priority = 3)
addEvent('movie.search', self.search, priority = 3)
addEvent('movie.info', self.getInfo, priority = 3) addEvent('movie.info', self.getInfo, priority = 3)
addEvent('movie.info_by_tmdb', self.getInfo) addEvent('movie.info_by_tmdb', self.getInfo)
addEvent('app.load', self.config) addEvent('app.load', self.config)
@ -32,29 +33,24 @@ class TheMovieDb(MovieProvider):
if configuration: if configuration:
self.configuration = configuration self.configuration = configuration
def search(self, q, limit = 12): def search(self, q, limit = 3):
""" Find movie by name """ """ Find movie by name """
if self.isDisabled(): if self.isDisabled():
return False return False
search_string = simplifyString(q)
cache_key = 'tmdb.cache.%s.%s' % (search_string, limit)
results = None #self.getCache(cache_key)
if not results:
log.debug('Searching for movie: %s', q) log.debug('Searching for movie: %s', q)
raw = None raw = None
try: try:
name_year = fireEvent('scanner.name_year', q, single = True)
#name_year = fireEvent('scanner.name_year', q, single = True)
raw = self.request('search/movie', { raw = self.request('search/movie', {
'query': q 'query': name_year.get('name', q),
'year': name_year.get('year'),
'search_type': 'ngram' if limit > 1 else 'phrase'
}, return_key = 'results') }, return_key = 'results')
except: except:
log.error('Failed searching TMDB for "%s": %s', (search_string, traceback.format_exc())) log.error('Failed searching TMDB for "%s": %s', (q, traceback.format_exc()))
results = [] results = []
if raw: if raw:
@ -62,7 +58,8 @@ class TheMovieDb(MovieProvider):
nr = 0 nr = 0
for movie in raw: for movie in raw:
results.append(self.parseMovie(movie, extended = False)) parsed_movie = self.parseMovie(movie, extended = False)
results.append(parsed_movie)
nr += 1 nr += 1
if nr == limit: if nr == limit:
@ -70,7 +67,6 @@ class TheMovieDb(MovieProvider):
log.info('Found: %s', [result['titles'][0] + ' (' + str(result.get('year', 0)) + ')' for result in results]) log.info('Found: %s', [result['titles'][0] + ' (' + str(result.get('year', 0)) + ')' for result in results])
self.setCache(cache_key, results)
return results return results
except SyntaxError as e: except SyntaxError as e:
log.error('Failed to parse XML response: %s', e) log.error('Failed to parse XML response: %s', e)
@ -91,19 +87,16 @@ class TheMovieDb(MovieProvider):
def parseMovie(self, movie, extended = True): def parseMovie(self, movie, extended = True):
cache_key = 'tmdb.cache.%s%s' % (movie.get('id'), '.ex' if extended else '') # Do request, append other items
movie_data = None #self.getCache(cache_key) movie = self.request('movie/%s' % movie.get('id'), {
'append_to_response': 'alternative_titles' + (',images,casts' if extended else '')
if not movie_data: })
# Full data
movie = self.request('movie/%s' % movie.get('id'))
# Images # Images
poster = self.getImage(movie, type = 'poster', size = 'w154') poster = self.getImage(movie, type = 'poster', size = 'w154')
poster_original = self.getImage(movie, type = 'poster', size = 'original') poster_original = self.getImage(movie, type = 'poster', size = 'original')
backdrop_original = self.getImage(movie, type = 'backdrop', size = 'original') backdrop_original = self.getImage(movie, type = 'backdrop', size = 'original')
extra_thumbs = self.getMultImages(movie, type = 'backdrops', size = 'original') extra_thumbs = self.getMultImages(movie, type = 'backdrops', size = 'original') if extended else []
images = { images = {
'poster': [poster] if poster else [], 'poster': [poster] if poster else [],
@ -130,7 +123,7 @@ class TheMovieDb(MovieProvider):
if extended: if extended:
# Full data # Full data
cast = self.request('movie/%s/casts' % movie.get('id'), return_key = 'cast') cast = movie.get('casts', {}).get('cast', [])
for cast_item in cast: for cast_item in cast:
try: try:
@ -162,19 +155,14 @@ class TheMovieDb(MovieProvider):
if movie_data['original_title'] and movie_data['original_title'] not in movie_data['titles']: if movie_data['original_title'] and movie_data['original_title'] not in movie_data['titles']:
movie_data['titles'].append(movie_data['original_title']) movie_data['titles'].append(movie_data['original_title'])
if extended: # Add alternative titles
alternate_titles = movie.get('alternative_titles', {}).get('titles', [])
# Full data
alternate_titles = self.request('movie/%s/alternative_titles' % movie.get('id'), return_key = 'titles')
for alt in alternate_titles: for alt in alternate_titles:
alt_name = alt.get('title') alt_name = alt.get('title')
if alt_name and alt_name not in movie_data['titles'] and alt_name.lower() != 'none' and alt_name is not None: if alt_name and alt_name not in movie_data['titles'] and alt_name.lower() != 'none' and alt_name is not None:
movie_data['titles'].append(alt_name) movie_data['titles'].append(alt_name)
# Cache movie parsed
self.setCache(cache_key, movie_data)
return movie_data return movie_data
def getImage(self, movie, type = 'poster', size = 'poster'): def getImage(self, movie, type = 'poster', size = 'poster'):
@ -192,23 +180,22 @@ class TheMovieDb(MovieProvider):
image_urls = [] image_urls = []
try: try:
for image in movie.get('images', {}).get(type, [])[1:5]:
# Full data
images = self.request('movie/%s/images' % movie.get('id'), return_key = type)
for image in images[1:5]:
image_urls.append(self.getImage(image, 'file', size)) image_urls.append(self.getImage(image, 'file', size))
except: except:
log.debug('Failed getting %s.%s for "%s"', (type, size, ss(str(movie)))) log.debug('Failed getting %s.%s for "%s"', (type, size, ss(str(movie))))
return image_urls return image_urls
def request(self, call = '', params = {}, return_key = None): def request(self, call = '', params = {}, return_key = None):
params = dict((k, v) for k, v in params.items() if v)
params = tryUrlencode(params) params = tryUrlencode(params)
url = 'http://api.themoviedb.org/3/%s?api_key=%s%s' % (call, self.conf('api_key'), '&%s' % params if params else '') url = 'http://api.themoviedb.org/3/%s?api_key=%s%s' % (call, self.conf('api_key'), '&%s' % params if params else '')
data = self.getJsonData(url, cache_timeout = 0) data = self.getJsonData(url)
if data and return_key and data.get(return_key): if data and return_key and return_key in data:
data = data.get(return_key) data = data.get(return_key)
return data return data

Loading…
Cancel
Save