Source code for tvrage3.api
import urllib.request
import urllib.parse
import xmltodict
import re
[docs]class Show():
"""Information about a tvshow. Should be initialized by the TVRage search
object. If the requests information about a show is unavailable then it
will return None."""
def __init__(self, show_id=None, quick_info=None,
full_info=None, search_info=None):
self.quick_info = self.parse_quick_info(quick_info)
self.full_info = full_info
self.search_info = search_info
if show_id:
self.get_full_info(show_id)
if not (show_id or quick_info or full_info or search_info):
raise ValueError('Atleast one arg needs a value')
# Internal: Converts a quickinfo response from tvrage into an dict
def parse_quick_info(self, info):
if not info:
return None
quick_info = {}
quick_info['showid'] = re.search('Show ID@(.+)\n', info).group(1)
quick_info['name'] = re.search('Show Name@(.+)\n', info).group(1)
quick_info['link'] = re.search('Show URL@(.+)\n', info).group(1)
started = re.search('Started@(.+)\n', info)
if started:
quick_info['started'] = started.group(1)
else:
quick_info['started'] = None
ended = re.search('Ended@(.+)\n', info)
if ended:
quick_info['ended'] = ended.group(1)
else:
quick_info['ended'] = None
status = re.search('Status@(.+)\n', info)
if status:
quick_info['status'] = status.group(1)
else:
quick_info['status'] = None
classification = re.search('Classification@(.+)\n', info)
if classification:
quick_info['classification'] = classification.group(1)
else:
quick_info['classification'] = None
genres = quick_info['genres'] = re.search('Genres@(.+)\n', info)
if genres:
quick_info['genres'] = genres.group(1).split(' | ')
else:
quick_info['genres'] = None
runtime = re.search('Runtime@(.+)\n', info)
if runtime:
quick_info['runtime'] = runtime.group(1)
else:
quick_info['runtime'] = None
return quick_info
# Internal: Get full show info by id. If Show is initialized with
# quick_info then some info will be missing, if missing info is required
# then this function will be called to fill it.
def get_full_info(self, show_id):
response = urllib.request.urlopen('http://services.tvrage.com/feeds/' +
'showinfo.php?sid=' + show_id)
self.full_info = xmltodict.parse(response.read())['Showinfo']
# Internal: Due to tvrage bug where for some reason the first genre is
# empty which results in empty or a None entry into the genres list.
# Also if there is only one genre the parser will return a string instead
# of a list, this fixed that also.
def fix_genres(self, list):
if isinstance(list, str):
return [list]
return [x for x in list if x]
@property
def show_id(self):
"""Show id as a string"""
if self.search_info:
return self.search_info['showid']
elif self.full_info:
return self.full_info['showid']
elif self.quick_info:
return self.quick_info['showid']
@property
def name(self):
"""The name of the show"""
if self.full_info:
return self.full_info['showname']
elif self.search_info:
return self.search_info['name']
elif self.quick_info:
return self.quick_info['name']
@property
def link(self):
"""The link to the tvrage page with more info about the show"""
if self.full_info:
if self.full_info['showlink'][7:10] == 'www':
return self.full_info['showlink']
else:
return self.full_info['showlink'].replace('http://',
'http://www.')
elif self.search_info:
return self.search_info['link']
elif self.quick_info:
return self.quick_info['link']
@property
def seasons(self):
"""Number of seasons the show has ran"""
try:
if self.full_info:
return int(self.full_info['seasons'])
elif self.search_info:
return int(self.search_info['seasons'])
elif self.quick_info:
self.get_full_info(self.quick_info['showid'])
return self.seasons
except:
return None
@property
def started_year(self):
"""The year the show started"""
try:
if self.full_info:
return int(self.full_info['started'][-4:])
elif self.search_info:
return int(self.search_info['started'][-4:])
elif self.quick_info:
return int(self.quick_info['started'][-4:])
except:
return None
@property
def ended_year(self):
"""The year the show ended"""
try:
if self.full_info:
return int(self.full_info['ended'][-4:])
elif self.search_info:
return int(self.search_info['ended'][-4:])
elif self.quick_info:
return int(self.quick_info['ended'][-4:])
except:
return None
@property
def country(self):
"""Country the show was produced for"""
try:
if self.full_info:
return self.full_info['origin_country']
elif self.search_info:
return self.search_info['country']
elif self.quick_info:
self.get_full_info(self.quick_info['showid'])
return self.country
except:
return None
@property
def status(self):
"""Current status of the show"""
try:
if self.full_info:
return self.full_info['status']
elif self.search_info:
return self.search_info['status']
elif self.quick_info:
return self.quick_info['status']
except:
return None
@property
def classification(self):
"""The classification of the show"""
try:
if self.full_info:
return self.full_info['classification']
elif self.search_info:
return self.search_info['classification']
elif self.quick_info:
return self.quick_info['classification']
except:
return None
@property
def genres(self):
"""The genres of the show"""
try:
if self.full_info:
return self.fix_genres(self.full_info['genres']['genre'])
elif self.search_info:
return self.fix_genres(self.search_info['genres']['genre'])
elif self.quick_info:
return self.fix_genres(self.quick_info['genres'])
except:
return None
@property
def runtime(self):
"""How many minutes an episode of the show is"""
try:
if self.full_info:
return int(self.full_info['runtime'])
elif self.search_info:
return int(self.search_info['runtime'])
elif self.quick_info:
return int(self.quick_info['runtime'])
except:
return None
@property
def network(self):
"""What country/network the show is running on"""
try:
if self.full_info:
return self.full_info['network']
elif self.search_info:
return self.search_info['network']
elif self.quick_info:
self.get_full_info(self.quick_info['showid'])
return self.network
except:
return None
@property
def air_time(self):
"""What time new episodes are televised in the country of origin"""
try:
if self.full_info:
return self.full_info['airtime']
elif self.search_info:
return self.search_info['airtime']
elif self.quick_info:
self.get_full_info(self.quick_info['showid'])
return self.air_time
except:
return None
@property
def air_day(self):
"""What day new episodes are televised in the country of orgin"""
try:
if self.full_info:
return self.full_info['airday']
elif self.search_info:
return self.search_info['airday']
elif self.quick_info:
self.get_full_info(self.quick_info['showid'])
return self.air_day
except:
return None