Browse Source

Merge branch 'feature/ChangeRefactorTvdb' into develop

pull/1200/head
JackDandy 6 years ago
parent
commit
e2a1809f3e
  1. 4
      CHANGES.md
  2. 152
      lib/tvdb_api/tvdb_api.py

4
CHANGES.md

@ -40,7 +40,7 @@
* Update TZlocal 2.0.0.dev0 (b73a692) to 2.0.0b3 (410a838)
* Update unidecode module 1.0.22 (a5045ab) to 1.1.1 (632af82)
* Update urllib3 release 1.25.2 (49eea80) to 1.25.6 (4a6c288)
* Update xmltodict library 0.12.0 (f3ab7e1) to 0.12.0 (02c9b71)
* Change simplify parsing TVDB images
[develop changelog]
@ -50,11 +50,13 @@
* Update urllib3 release 1.25.2 (49eea80) to 1.25.3 (3387b20)
* Update urllib3 release 1.25.3 (3387b20) to 1.25.3 (67715fd)
* Update urllib3 release 1.25.5 (edc3ddb) to 1.25.6 (4a6c288)
* Update xmltodict library 0.12.0 (f3ab7e1) to 0.12.0 (02c9b71)
### 0.20.11 (2019-11-30 02:45:00 UTC)
* Remove redundant tvdb_api v1
* Remove xmltodict and etreetodict
* Change update Emby api
* Fix update CF IUAM handler

152
lib/tvdb_api/tvdb_api.py

@ -513,17 +513,17 @@ class Tvdb:
# http://thetvdb.com/wiki/index.php/Programmers_API
self.config['base_url'] = 'https://api.thetvdb.com/'
self.config['url_get_series'] = '%(base_url)s/search/series' % self.config
self.config['params_get_series'] = {'name': ''}
self.config['url_search_series'] = '%(base_url)s/search/series' % self.config
self.config['params_search_series'] = {'name': ''}
self.config['url_epInfo'] = '%(base_url)sseries/%%s/episodes?page=%%s' % self.config
self.config['url_series_episodes_info'] = '%(base_url)sseries/%%s/episodes?page=%%s' % self.config
self.config['url_seriesInfo'] = '%(base_url)sseries/%%s' % self.config
self.config['url_episodeInfo'] = '%(base_url)sepisodes/%%s' % self.config
self.config['url_actorsInfo'] = '%(base_url)sseries/%%s/actors' % self.config
self.config['url_series_info'] = '%(base_url)sseries/%%s' % self.config
self.config['url_episodes_info'] = '%(base_url)sepisodes/%%s' % self.config
self.config['url_actors_info'] = '%(base_url)sseries/%%s/actors' % self.config
self.config['url_seriesBanner'] = '%(base_url)sseries/%%s/images/query?keyType=%%s' % self.config
self.config['url_artworkPrefix'] = 'https://artworks.thetvdb.com/banners/%s'
self.config['url_series_images'] = '%(base_url)sseries/%%s/images/query?keyType=%%s' % self.config
self.config['url_artworks'] = 'https://artworks.thetvdb.com/banners/%s'
def get_new_token(self):
token = sickbeard.THETVDB_V2_API_TOKEN.get('token', None)
@ -590,7 +590,7 @@ class Tvdb:
headers.update({'Accept-Language': language})
resp = None
is_series_info = self._match_url_pattern('url_seriesInfo', url)
is_series_info = self._match_url_pattern('url_series_info', url)
if is_series_info:
self.show_not_found = False
self.not_found = False
@ -605,7 +605,7 @@ class Tvdb:
elif 404 == e.response.status_code:
if is_series_info:
self.show_not_found = True
elif self._match_url_pattern('url_epInfo', url):
elif self._match_url_pattern('url_series_episodes_info', url):
resp = {'data': []}
self.not_found = True
elif 404 != e.response.status_code:
@ -631,7 +631,7 @@ class Tvdb:
k = k.lower()
if None is not v:
if k in ['banner', 'fanart', 'poster'] and v:
v = self.config['url_artworkPrefix'] % v
v = self.config['url_artworks'] % v
elif 'genre' == k:
keep_data['genre_list'] = v
v = '|%s|' % '|'.join([clean_data(c) for c in v if isinstance(c, basestring)])
@ -754,11 +754,11 @@ class Tvdb:
and returns the result list
"""
series = series.encode('utf-8')
self.config['params_get_series']['name'] = series
self.config['params_search_series']['name'] = series
log().debug('Searching for show %s' % series)
try:
series_found = self._getetsrc(self.config['url_get_series'], params=self.config['params_get_series'],
series_found = self._getetsrc(self.config['url_search_series'], params=self.config['params_search_series'],
language=self.config['language'])
if series_found:
return series_found.values()[0]
@ -802,15 +802,10 @@ class Tvdb:
for cur_banner in img_list:
bid = cur_banner['id']
btype = (cur_banner['keytype'], 'banner')['series' == cur_banner['keytype']]
btype2 = (cur_banner['resolution'], tryInt(cur_banner['subkey'], cur_banner['subkey']))[btype in ('season', 'seasonwide')]
btype2 = (cur_banner['resolution'], tryInt(cur_banner['subkey'], cur_banner['subkey']))[
btype in ('season', 'seasonwide')]
if None is btype or None is btype2:
continue
if btype not in banners:
banners[btype] = OrderedDict()
if btype2 not in banners[btype]:
banners[btype][btype2] = OrderedDict()
if bid not in banners[btype][btype2]:
banners[btype][btype2][bid] = {}
for k, v in cur_banner.iteritems():
if None is k or None is v:
@ -818,13 +813,15 @@ class Tvdb:
k, v = k.lower(), v.lower() if isinstance(v, (str, unicode)) else v
if k == 'filename':
banners[btype][btype2][bid]['bannerpath'] = self.config['url_artworkPrefix'] % v
k = 'bannerpath'
v = self.config['url_artworks'] % v
elif k == 'thumbnail':
banners[btype][btype2][bid]['thumbnailpath'] = self.config['url_artworkPrefix'] % v
k = 'thumbnailpath'
v = self.config['url_artworks'] % v
elif k == 'keytype':
banners[btype][btype2][bid]['bannertype'] = v
else:
banners[btype][btype2][bid][k] = v
k = 'bannertype'
banners.setdefault(btype, OrderedDict()).setdefault(btype2, OrderedDict()).setdefault(bid, {})[
k] = v
except (StandardError, Exception):
pass
@ -839,7 +836,7 @@ class Tvdb:
a.append({'character': {'id': None,
'name': n.get('role', '').strip(),
'url': None, # not supported by tvdb
'image': (None, self.config['url_artworkPrefix'] %
'image': (None, self.config['url_artworks'] %
n.get('image'))[any([n.get('image')])],
},
'person': {'id': None, # not supported by tvdb
@ -860,7 +857,7 @@ class Tvdb:
# Parse episode information
data = None
log().debug('Getting all episode data for %s' % epid)
url = self.config['url_episodeInfo'] % epid
url = self.config['url_episodes_info'] % epid
episode_data = self._getetsrc(url, language=self.config['language'])
if episode_data and 'data' in episode_data:
@ -871,13 +868,33 @@ class Tvdb:
if None is not v:
if 'filename' == k and v:
v = self.config['url_artworkPrefix'] % v
v = self.config['url_artworks'] % v
else:
v = clean_data(v)
data[k] = v
return data
def _parse_images(self, sid, language, show_data, image_type, enabled_type):
mapped_img_types = {'banner': 'series'}
excluded_main_data = ['seasons_enabled', 'seasonwides_enabled']
if self.config[enabled_type]:
image_data = self._getetsrc(self.config['url_series_images'] %
(sid, mapped_img_types.get(image_type, image_type)), language=language)
if image_data and 0 < len(image_data.get('data', '') or ''):
image_data['data'] = sorted(image_data['data'], reverse=True,
key=lambda x: (x['ratingsinfo']['average'], x['ratingsinfo']['count']))
if enabled_type not in excluded_main_data:
url_image = self.config['url_artworks'] % image_data['data'][0]['filename']
url_thumb = self.config['url_artworks'] % image_data['data'][0]['thumbnail']
self._set_show_data(sid, image_type, url_image)
self._set_show_data(sid, u'%s_thumb' % image_type, url_thumb)
self._parse_banners(sid, image_data['data'])
if enabled_type not in excluded_main_data and show_data['data'][image_type]:
self._set_show_data(sid, u'%s_thumb' % image_type,
re.sub(r'\.jpg$', '_t.jpg', show_data['data'][image_type], flags=re.I))
def _get_show_data(self, sid, language, get_ep_info=False):
"""Takes a series ID, gets the epInfo URL and parses the TVDB
XML file into the shows dict in layout:
@ -886,7 +903,7 @@ class Tvdb:
# Parse show information
log().debug('Getting all series data for %s' % sid)
url = self.config['url_seriesInfo'] % sid
url = self.config['url_series_info'] % sid
show_data = self._getetsrc(url, language=language)
# check and make sure we have data to process and that it contains a series name
@ -899,76 +916,13 @@ class Tvdb:
if sid in self.shows:
self.shows[sid].ep_loaded = get_ep_info
p = ''
pt = ''
if self.config['posters_enabled']:
poster_data = self._getetsrc(self.config['url_seriesBanner'] % (sid, 'poster'), language=language)
if poster_data and len(poster_data.get('data', '') or '') > 0:
poster_data['data'] = sorted(poster_data['data'], reverse=True,
key=lambda x: (x['ratingsinfo']['average'], x['ratingsinfo']['count']))
p = self.config['url_artworkPrefix'] % poster_data['data'][0]['filename']
pt = self.config['url_artworkPrefix'] % poster_data['data'][0]['thumbnail']
self._parse_banners(sid, poster_data['data'])
if p:
self._set_show_data(sid, u'poster', p)
if pt:
self._set_show_data(sid, u'poster_thumb', pt)
elif show_data['data']['poster']:
self._set_show_data(sid, u'poster_thumb',
re.sub(r'\.jpg$', '_t.jpg', show_data['data']['poster'], flags=re.I))
b = ''
bt = ''
if self.config['banners_enabled']:
poster_data = self._getetsrc(self.config['url_seriesBanner'] % (sid, 'series'), language=language)
if poster_data and len(poster_data.get('data', '') or '') > 0:
poster_data['data'] = sorted(poster_data['data'], reverse=True,
key=lambda x: (x['ratingsinfo']['average'], x['ratingsinfo']['count']))
b = self.config['url_artworkPrefix'] % poster_data['data'][0]['filename']
bt = self.config['url_artworkPrefix'] % poster_data['data'][0]['thumbnail']
self._parse_banners(sid, poster_data['data'])
if b:
self._set_show_data(sid, u'banner', b)
if bt:
self._set_show_data(sid, u'banner_thumb', bt)
elif show_data['data']['banner']:
self._set_show_data(sid, u'banner_thumb',
re.sub(r'\.jpg$', '_t.jpg', show_data['data']['banner'], flags=re.I))
if self.config['seasons_enabled']:
poster_data = self._getetsrc(self.config['url_seriesBanner'] % (sid, 'season'), language=language)
if poster_data and len(poster_data.get('data', '') or '') > 0:
poster_data['data'] = sorted(poster_data['data'], reverse=True,
key=lambda x: (-1 * tryInt(x['subkey']), x['ratingsinfo']['average'], x['ratingsinfo']['count']))
self._parse_banners(sid, poster_data['data'])
if self.config['seasonwides_enabled']:
poster_data = self._getetsrc(self.config['url_seriesBanner'] % (sid, 'seasonwide'), language=language)
if poster_data and len(poster_data.get('data', '') or '') > 0:
poster_data['data'] = sorted(poster_data['data'], reverse=True,
key=lambda x: (-1 * tryInt(x['subkey']), x['ratingsinfo']['average'], x['ratingsinfo']['count']))
self._parse_banners(sid, poster_data['data'])
f = ''
ft = ''
if self.config['fanart_enabled']:
fanart_data = self._getetsrc(self.config['url_seriesBanner'] % (sid, 'fanart'), language=language)
if fanart_data and len(fanart_data.get('data', '') or '') > 0:
fanart_data['data'] = sorted(fanart_data['data'], reverse=True,
key=lambda x: (x['ratingsinfo']['average'], x['ratingsinfo']['count']))
f = self.config['url_artworkPrefix'] % fanart_data['data'][0]['filename']
ft = self.config['url_artworkPrefix'] % fanart_data['data'][0]['thumbnail']
self._parse_banners(sid, fanart_data['data'])
if f:
self._set_show_data(sid, u'fanart', f)
if ft:
self._set_show_data(sid, u'fanart_thumb', ft)
elif show_data[u'data'][u'fanart']:
self._set_show_data(sid, u'fanart_thumb',
re.sub(r'\.jpg$', '_t.jpg', show_data[u'data'][u'fanart'], flags=re.I))
for img_type, en_type in [(u'poster', 'posters_enabled'), (u'banner', 'banners_enabled'),
(u'fanart', 'fanart_enabled'), (u'season', 'seasons_enabled'),
(u'seasonwide', 'seasonwides_enabled')]:
self._parse_images(sid, language, show_data, img_type, en_type)
if self.config['actors_enabled']:
actor_data = self._getetsrc(self.config['url_actorsInfo'] % sid, language=language)
actor_data = self._getetsrc(self.config['url_actors_info'] % sid, language=language)
if actor_data and len(actor_data.get('data', '') or '') > 0:
self._parse_actors(sid, actor_data['data'])
@ -979,7 +933,7 @@ class Tvdb:
page = 1
episodes = []
while page <= 400:
episode_data = self._getetsrc(self.config['url_epInfo'] % (sid, page), language=language)
episode_data = self._getetsrc(self.config['url_series_episodes_info'] % (sid, page), language=language)
if None is episode_data:
raise tvdb_error('Exception retrieving episodes for show')
if isinstance(episode_data, dict) and not episode_data.get('data', []):
@ -1030,7 +984,7 @@ class Tvdb:
if None is not v:
if 'filename' == k and v:
v = self.config['url_artworkPrefix'] % v
v = self.config['url_artworks'] % v
else:
v = clean_data(v)

Loading…
Cancel
Save