[TV] Use trakt.tv for show searches (better text searching, posters)
This commit is contained in:
@@ -12,7 +12,6 @@ from couchpotato.core.media.show.providers.base import ShowProvider
|
|||||||
from tvdb_api import tvdb_exceptions
|
from tvdb_api import tvdb_exceptions
|
||||||
from tvdb_api.tvdb_api import Tvdb, Show
|
from tvdb_api.tvdb_api import Tvdb, Show
|
||||||
|
|
||||||
|
|
||||||
log = CPLog(__name__)
|
log = CPLog(__name__)
|
||||||
|
|
||||||
autoload = 'TheTVDb'
|
autoload = 'TheTVDb'
|
||||||
@@ -26,8 +25,6 @@ class TheTVDb(ShowProvider):
|
|||||||
# TODO: Expose apikey in setting so it can be changed by user
|
# TODO: Expose apikey in setting so it can be changed by user
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
addEvent('info.search', self.search, priority = 1)
|
|
||||||
addEvent('show.search', self.search, priority = 1)
|
|
||||||
addEvent('show.info', self.getShowInfo, priority = 1)
|
addEvent('show.info', self.getShowInfo, priority = 1)
|
||||||
addEvent('season.info', self.getSeasonInfo, priority = 1)
|
addEvent('season.info', self.getSeasonInfo, priority = 1)
|
||||||
addEvent('episode.info', self.getEpisodeInfo, priority = 1)
|
addEvent('episode.info', self.getEpisodeInfo, priority = 1)
|
||||||
@@ -44,57 +41,6 @@ class TheTVDb(ShowProvider):
|
|||||||
self.tvdb = Tvdb(**self.tvdb_api_parms)
|
self.tvdb = Tvdb(**self.tvdb_api_parms)
|
||||||
self.valid_languages = self.tvdb.config['valid_languages']
|
self.valid_languages = self.tvdb.config['valid_languages']
|
||||||
|
|
||||||
def search(self, q, limit = 12, language = 'en'):
|
|
||||||
''' Find show by name
|
|
||||||
show = { 'id': 74713,
|
|
||||||
'language': 'en',
|
|
||||||
'lid': 7,
|
|
||||||
'seriesid': '74713',
|
|
||||||
'seriesname': u'Breaking Bad',}
|
|
||||||
'''
|
|
||||||
|
|
||||||
if self.isDisabled():
|
|
||||||
return False
|
|
||||||
|
|
||||||
if language != self.tvdb_api_parms['language'] and language in self.valid_languages:
|
|
||||||
self.tvdb_api_parms['language'] = language
|
|
||||||
self._setup()
|
|
||||||
|
|
||||||
query = q
|
|
||||||
#query = simplifyString(query)
|
|
||||||
cache_key = 'thetvdb.cache.search.%s.%s' % (query, limit)
|
|
||||||
results = self.getCache(cache_key)
|
|
||||||
|
|
||||||
if not results:
|
|
||||||
log.debug('Searching for show: %s', q)
|
|
||||||
|
|
||||||
raw = None
|
|
||||||
try:
|
|
||||||
raw = self.tvdb.search(query)
|
|
||||||
except (tvdb_exceptions.tvdb_error, IOError), e:
|
|
||||||
log.error('Failed searching TheTVDB for "%s": %s', (query, traceback.format_exc()))
|
|
||||||
return False
|
|
||||||
|
|
||||||
results = []
|
|
||||||
if raw:
|
|
||||||
try:
|
|
||||||
nr = 0
|
|
||||||
for show_info in raw:
|
|
||||||
|
|
||||||
results.append(self._parseShow(show_info))
|
|
||||||
nr += 1
|
|
||||||
if nr == limit:
|
|
||||||
break
|
|
||||||
|
|
||||||
log.info('Found: %s', [result['titles'][0] + ' (' + str(result.get('year', 0)) + ')' for result in results])
|
|
||||||
self.setCache(cache_key, results)
|
|
||||||
return results
|
|
||||||
except (tvdb_exceptions.tvdb_error, IOError), e:
|
|
||||||
log.error('Failed parsing TheTVDB for "%s": %s', (q, traceback.format_exc()))
|
|
||||||
return False
|
|
||||||
|
|
||||||
return results
|
|
||||||
|
|
||||||
def getShow(self, identifier = None):
|
def getShow(self, identifier = None):
|
||||||
show = None
|
show = None
|
||||||
try:
|
try:
|
||||||
@@ -400,9 +346,9 @@ class TheTVDb(ShowProvider):
|
|||||||
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.')
|
||||||
True
|
return True
|
||||||
else:
|
else:
|
||||||
False
|
return False
|
||||||
|
|
||||||
|
|
||||||
config = [{
|
config = [{
|
||||||
|
|||||||
+86
@@ -0,0 +1,86 @@
|
|||||||
|
import urllib
|
||||||
|
|
||||||
|
from couchpotato.core.event import addEvent
|
||||||
|
from couchpotato.core.logger import CPLog
|
||||||
|
from couchpotato.core.media.show.providers.base import ShowProvider
|
||||||
|
|
||||||
|
log = CPLog(__name__)
|
||||||
|
|
||||||
|
autoload = 'Trakt'
|
||||||
|
|
||||||
|
|
||||||
|
class Trakt(ShowProvider):
|
||||||
|
api_key = 'c043de5ada9d180028c10229d2a3ea5b'
|
||||||
|
base_url = 'http://api.trakt.tv/%%s.json/%s' % api_key
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
addEvent('info.search', self.search, priority = 1)
|
||||||
|
addEvent('show.search', self.search, priority = 1)
|
||||||
|
|
||||||
|
def search(self, q, limit = 12):
|
||||||
|
if self.isDisabled():
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Check for cached result
|
||||||
|
cache_key = 'trakt.cache.search.%s.%s' % (q, limit)
|
||||||
|
results = self.getCache(cache_key) or []
|
||||||
|
|
||||||
|
if results:
|
||||||
|
return results
|
||||||
|
|
||||||
|
# Search
|
||||||
|
log.debug('Searching for show: "%s"', q)
|
||||||
|
response = self._request('search/shows', query=q, limit=limit)
|
||||||
|
|
||||||
|
if not response:
|
||||||
|
return []
|
||||||
|
|
||||||
|
# Parse search results
|
||||||
|
for show in response:
|
||||||
|
results.append(self._parseShow(show))
|
||||||
|
|
||||||
|
log.info('Found: %s', [result['titles'][0] + ' (' + str(result.get('year', 0)) + ')' for result in results])
|
||||||
|
|
||||||
|
self.setCache(cache_key, results)
|
||||||
|
return results
|
||||||
|
|
||||||
|
def _request(self, action, **kwargs):
|
||||||
|
url = self.base_url % action
|
||||||
|
|
||||||
|
if kwargs:
|
||||||
|
url += '?' + urllib.urlencode(kwargs)
|
||||||
|
|
||||||
|
return self.getJsonData(url)
|
||||||
|
|
||||||
|
def _parseShow(self, show):
|
||||||
|
# Images
|
||||||
|
images = show.get('images', {})
|
||||||
|
|
||||||
|
poster = images.get('poster')
|
||||||
|
backdrop = images.get('backdrop')
|
||||||
|
|
||||||
|
# Rating
|
||||||
|
rating = show.get('ratings', {}).get('percentage')
|
||||||
|
|
||||||
|
# Build show dict
|
||||||
|
show_data = {
|
||||||
|
'identifiers': {
|
||||||
|
'thetvdb': show.get('tvdb_id'),
|
||||||
|
'imdb': show.get('imdb_id'),
|
||||||
|
'tvrage': show.get('tvrage_id'),
|
||||||
|
},
|
||||||
|
'type': 'show',
|
||||||
|
'titles': [show.get('title')],
|
||||||
|
'images': {
|
||||||
|
'poster': [poster] if poster else [],
|
||||||
|
'backdrop': [backdrop] if backdrop else [],
|
||||||
|
'poster_original': [],
|
||||||
|
'backdrop_original': [],
|
||||||
|
},
|
||||||
|
'year': show.get('year'),
|
||||||
|
'rating': {
|
||||||
|
'trakt': float(rating) / 10
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
return dict((k, v) for k, v in show_data.iteritems() if v)
|
||||||
Reference in New Issue
Block a user