Remove tmdb3 dependency

This commit is contained in:
Ruud
2014-10-07 21:40:32 +02:00
parent 2104cb2839
commit 4cdb9bc81d
@@ -1,11 +1,11 @@
import traceback import traceback
import time
from couchpotato.core.event import addEvent from couchpotato.core.event import addEvent, fireEvent
from couchpotato.core.helpers.encoding import simplifyString, toUnicode, ss from couchpotato.core.helpers.encoding import simplifyString, 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
import tmdb3
log = CPLog(__name__) log = CPLog(__name__)
@@ -13,15 +13,24 @@ autoload = 'TheMovieDb'
class TheMovieDb(MovieProvider): class TheMovieDb(MovieProvider):
MAX_EXTRATHUMBS = 4
http_time_between_calls = .3
configuration = {
'images': {
'secure_base_url': 'https://image.tmdb.org/t/p/',
},
}
def __init__(self): def __init__(self):
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)
# Configure TMDB settings def config(self):
tmdb3.set_key(self.conf('api_key')) configuration = self.request('configuration')
tmdb3.set_cache('null') if configuration:
self.configuration = configuration
def search(self, q, limit = 12): def search(self, q, limit = 12):
""" Find movie by name """ """ Find movie by name """
@@ -31,14 +40,19 @@ class TheMovieDb(MovieProvider):
search_string = simplifyString(q) search_string = simplifyString(q)
cache_key = 'tmdb.cache.%s.%s' % (search_string, limit) cache_key = 'tmdb.cache.%s.%s' % (search_string, limit)
results = self.getCache(cache_key) results = None #self.getCache(cache_key)
if not results: if not results:
log.debug('Searching for movie: %s', q) log.debug('Searching for movie: %s', q)
raw = None raw = None
try: try:
raw = tmdb3.searchMovie(search_string)
#name_year = fireEvent('scanner.name_year', q, single = True)
raw = self.request('search/movie', {
'query': q
}, 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', (search_string, traceback.format_exc()))
@@ -69,39 +83,27 @@ class TheMovieDb(MovieProvider):
if not identifier: if not identifier:
return {} return {}
cache_key = 'tmdb.cache.%s%s' % (identifier, '.ex' if extended else '') result = self.parseMovie({
result = self.getCache(cache_key) 'id': identifier
}, extended = extended)
if not result:
try:
log.debug('Getting info: %s', cache_key)
# noinspection PyArgumentList
movie = tmdb3.Movie(identifier)
try: exists = movie.title is not None
except: exists = False
if exists:
result = self.parseMovie(movie, extended = extended)
self.setCache(cache_key, result)
else:
result = {}
except:
log.error('Failed getting info for %s: %s', (identifier, traceback.format_exc()))
return result return result
def parseMovie(self, movie, extended = True): def parseMovie(self, movie, extended = True):
cache_key = 'tmdb.cache.%s%s' % (movie.id, '.ex' if extended else '') cache_key = 'tmdb.cache.%s%s' % (movie.get('id'), '.ex' if extended else '')
movie_data = self.getCache(cache_key) movie_data = None #self.getCache(cache_key)
if not movie_data: 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', n = self.MAX_EXTRATHUMBS, skipfirst = True) extra_thumbs = self.getMultImages(movie, type = 'backdrops', size = 'original')
images = { images = {
'poster': [poster] if poster else [], 'poster': [poster] if poster else [],
@@ -114,39 +116,43 @@ class TheMovieDb(MovieProvider):
# Genres # Genres
try: try:
genres = [genre.name for genre in movie.genres] genres = [genre.get('name') for genre in movie.get('genres', [])]
except: except:
genres = [] genres = []
# 1900 is the same as None # 1900 is the same as None
year = str(movie.releasedate or '')[:4] year = str(movie.get('release_date') or '')[:4]
if not movie.releasedate or year == '1900' or year.lower() == 'none': if not movie.get('release_date') or year == '1900' or year.lower() == 'none':
year = None year = None
# Gather actors data # Gather actors data
actors = {} actors = {}
if extended: if extended:
for cast_item in movie.cast:
# Full data
cast = self.request('movie/%s/casts' % movie.get('id'), return_key = 'cast')
for cast_item in cast:
try: try:
actors[toUnicode(cast_item.name)] = toUnicode(cast_item.character) actors[toUnicode(cast_item.get('name'))] = toUnicode(cast_item.get('character'))
images['actors'][toUnicode(cast_item.name)] = self.getImage(cast_item, type = 'profile', size = 'original') images['actors'][toUnicode(cast_item.get('name'))] = self.getImage(cast_item, type = 'profile', size = 'original')
except: except:
log.debug('Error getting cast info for %s: %s', (cast_item, traceback.format_exc())) log.debug('Error getting cast info for %s: %s', (cast_item, traceback.format_exc()))
movie_data = { movie_data = {
'type': 'movie', 'type': 'movie',
'via_tmdb': True, 'via_tmdb': True,
'tmdb_id': movie.id, 'tmdb_id': movie.get('id'),
'titles': [toUnicode(movie.title)], 'titles': [toUnicode(movie.get('title'))],
'original_title': movie.originaltitle, 'original_title': movie.get('original_title'),
'images': images, 'images': images,
'imdb': movie.imdb, 'imdb': movie.get('imdb_id'),
'runtime': movie.runtime, 'runtime': movie.get('runtime'),
'released': str(movie.releasedate), 'released': str(movie.get('release_date')),
'year': tryInt(year, None), 'year': tryInt(year, None),
'plot': movie.overview, 'plot': movie.get('overview'),
'genres': genres, 'genres': genres,
'collection': getattr(movie.collection, 'name', None), 'collection': getattr(movie.get('belongs_to_collection'), 'name', None),
'actor_roles': actors 'actor_roles': actors
} }
@@ -157,8 +163,12 @@ class TheMovieDb(MovieProvider):
movie_data['titles'].append(movie_data['original_title']) movie_data['titles'].append(movie_data['original_title'])
if extended: if extended:
for alt in movie.alternate_titles:
alt_name = alt.title # Full data
alternate_titles = self.request('movie/%s/alternative_titles' % movie.get('id'), return_key = 'titles')
for alt in alternate_titles:
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)
@@ -171,36 +181,38 @@ class TheMovieDb(MovieProvider):
image_url = '' image_url = ''
try: try:
image_url = getattr(movie, type).geturl(size = size) path = movie.get('%s_path' % type)
image_url = '%s%s%s' % (self.configuration['images']['secure_base_url'], size, path)
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_url return image_url
def getMultImages(self, movie, type = 'backdrops', size = 'original', n = -1, skipfirst = False): def getMultImages(self, movie, type = 'backdrops', size = 'original'):
"""
If n < 0, return all images. Otherwise return n images.
If n > len(getattr(movie, type)), then return all images.
If skipfirst is True, then it will skip getattr(movie, type)[0]. This
is because backdrops[0] is typically backdrop.
"""
image_urls = [] image_urls = []
try: try:
images = getattr(movie, type)
if n < 0 or n > len(images):
num_images = len(images)
else:
num_images = n
for i in range(int(skipfirst), num_images + int(skipfirst)): # Full data
image_urls.append(images[i].geturl(size = size)) 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))
except: except:
log.debug('Failed getting %i %s.%s for "%s"', (n, 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):
params = tryUrlencode(params)
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)
if data and return_key and data.get(return_key):
data = data.get(return_key)
return data
def isDisabled(self): def isDisabled(self):
if self.conf('api_key') == '': if self.conf('api_key') == '':
log.error('No API key provided.') log.error('No API key provided.')