Browse Source

[TV] Fixes to xem info provider, updated data structure

pull/3730/merge
Dean Gardiner 11 years ago
parent
commit
02d4a7625b
  1. 102
      couchpotato/core/media/show/providers/info/xem.py

102
couchpotato/core/media/show/providers/info/xem.py

@ -5,6 +5,8 @@ from couchpotato.core.media.show.providers.base import ShowProvider
log = CPLog(__name__)
autoload = 'Xem'
class Xem(ShowProvider):
'''
@ -76,75 +78,78 @@ class Xem(ShowProvider):
self.config['url_all_names'] = u"%(base_url)s/map/allNames?" % self.config
# TODO: Also get show aliases (store as titles)
def getShowInfo(self, identifier = None):
def getShowInfo(self, identifiers = None):
if self.isDisabled():
return {}
identifier = identifiers.get('thetvdb')
if not identifier:
return {}
cache_key = 'xem.cache.%s' % identifier
log.debug('Getting showInfo: %s', cache_key)
result = self.getCache(cache_key) or {}
if result:
return result
result['seasons'] = {}
# Create season/episode and absolute mappings
url = self.config['url_all'] + "id=%s&origin=tvdb" % tryUrlencode(identifier)
response = self.getJsonData(url)
if response:
if response.get('result') == 'success':
if response and response.get('result') == 'success':
data = response.get('data', None)
result = self._parse(data)
self.parseMaps(result, data)
# Create name alias mappings
url = self.config['url_names'] + "id=%s&origin=tvdb" % tryUrlencode(identifier)
response = self.getJsonData(url)
if response:
if response.get('result') == 'success':
if response and response.get('result') == 'success':
data = response.get('data', None)
result.update({'map_names': data})
self.parseNames(result, data)
self.setCache(cache_key, result)
return result
def getEpisodeInfo(self, identifier = None, params = {}):
episode = params.get('episode', None)
if episode is None:
def getEpisodeInfo(self, identifiers = None, params = {}):
episode_number = params.get('episode_number', None)
if episode_number is None:
return False
season_identifier = params.get('season_identifier', None)
if season_identifier is None:
season_number = params.get('season_number', None)
if season_number is None:
return False
episode_identifier = params.get('episode_identifier', None)
absolute = params.get('absolute', None)
# season_identifier must contain the 'show id : season number' since there is no tvdb id
# for season and we need a reference to both the show id and season number
if season_identifier:
try:
identifier, season_identifier = season_identifier.split(':')
season = int(season_identifier)
except: return False
absolute_number = params.get('absolute_number', None)
episode_identifier = params.get('episode_identifiers', {}).get('thetvdb')
result = self.getShowInfo(identifier)
result = self.getShowInfo(identifiers)
map = {}
if result:
map_episode = result.get('map_episode', {}).get(season, {}).get(episode, {})
map_episode = result.get('map_episode', {}).get(season_number, {}).get(episode_number, {})
if map_episode:
map.update({'map_episode': map_episode})
if absolute:
map_absolute = result.get('map_absolute', {}).get(absolute, {})
if absolute_number:
map_absolute = result.get('map_absolute', {}).get(absolute_number, {})
if map_absolute:
map.update({'map_absolute': map_absolute})
map_names = result.get('map_names', {}).get(toUnicode(season), {})
map_names = result.get('map_names', {}).get(toUnicode(season_number), {})
if map_names:
map.update({'map_names': map_names})
return map
def _parse(self, data, master = 'tvdb'):
def parseMaps(self, result, data, master = 'tvdb'):
'''parses xem map and returns a custom formatted dict map
To retreive map for scene:
@ -152,17 +157,44 @@ class Xem(ShowProvider):
print map['map_episode'][1][1]['scene']['season']
'''
if not isinstance(data, list):
return {}
return
map = {'map_episode': {}, 'map_absolute': {}}
for maps in data:
origin = maps.pop(master, None)
for episode_map in data:
origin = episode_map.pop(master, None)
if origin is None:
continue # No master origin to map to
map.get('map_episode').setdefault(origin['season'], {}).setdefault(origin['episode'], maps.copy())
map.get('map_absolute').setdefault(origin['absolute'], maps.copy())
return map
o_season = origin['season']
o_episode = origin['episode']
# Create season info
if o_season not in result['seasons']:
result['seasons'][o_season] = {}
season = result['seasons'][o_season]
if 'episodes' not in season:
season['episodes'] = {}
# Create episode info
if o_episode not in season['episodes']:
season['episodes'][o_episode] = {}
episode = season['episodes'][o_episode]
episode['episode_map'] = episode_map
def parseNames(self, result, data):
result['title_map'] = data.pop('all', None)
for season, title_map in data.items():
season = int(season)
# Create season info
if season not in result['seasons']:
result['seasons'][season] = {}
season = result['seasons'][season]
season['title_map'] = title_map
def isDisabled(self):
if __name__ == '__main__':

Loading…
Cancel
Save