Simplify tmdb provider
This commit is contained in:
1 parent
38a5d967dd
commit
06293dc0a2
1 file changed
+28
-41
@@ -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 = 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):
|
params = dict((k, v) for k, v in params.items() if v)
|
||||||
|
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)
|
||||||
|
|
||||||
|
if data and return_key and return_key in data:
|
||||||
data = data.get(return_key)
|
data = data.get(return_key)
|
||||||
|
|
||||||
return data
|
return data
|
||||||
|
|||||||
Reference in new issue
Block a user