def _ep_data(self, ep_obj): """ Creates an elementTree XML structure for a MediaBrowser style episode.xml and returns the resulting data object. show_obj: a TVShow instance to create the NFO for """ eps_to_write = [ep_obj] + ep_obj.relatedEps indexer_lang = ep_obj.show.lang try: # There's gotta be a better way of doing this but we don't wanna # change the language value elsewhere lINDEXER_API_PARMS = sickbeard.indexerApi(ep_obj.show.indexer).api_params.copy() if indexer_lang and not indexer_lang == sickbeard.INDEXER_DEFAULT_LANGUAGE: lINDEXER_API_PARMS['language'] = indexer_lang if ep_obj.show.dvdorder != 0: lINDEXER_API_PARMS['dvdorder'] = True t = sickbeard.indexerApi(ep_obj.show.indexer).indexer(**lINDEXER_API_PARMS) myShow = t[ep_obj.show.indexerid] except sickbeard.indexer_shownotfound, e: raise exceptions.ShowNotFoundException(e.message)
def _ep_data(self, ep_obj): """ Creates an elementTree XML structure for a WDTV style episode.xml and returns the resulting data object. ep_obj: a TVShow instance to create the NFO for """ eps_to_write = [ep_obj] + ep_obj.relatedEps indexer_lang = ep_obj.show.lang try: lINDEXER_API_PARMS = sickbeard.indexerApi( ep_obj.show.indexer).api_params.copy() lINDEXER_API_PARMS['actors'] = True if indexer_lang and not indexer_lang == 'en': lINDEXER_API_PARMS['language'] = indexer_lang if ep_obj.show.dvdorder != 0: lINDEXER_API_PARMS['dvdorder'] = True t = sickbeard.indexerApi( ep_obj.show.indexer).indexer(**lINDEXER_API_PARMS) myShow = t[ep_obj.show.indexerid] except sickbeard.indexer_shownotfound, e: raise exceptions.ShowNotFoundException(e.message)
def _ep_data(self, ep_obj): """ Creates an elementTree XML structure for a MediaBrowser style episode.xml and returns the resulting data object. show_obj: a TVShow instance to create the NFO for """ eps_to_write = [ep_obj] + ep_obj.relatedEps persons_dict = {} persons_dict['Director'] = [] persons_dict['GuestStar'] = [] persons_dict['Writer'] = [] tvdb_lang = ep_obj.show.lang try: # There's gotta be a better way of doing this but we don't wanna # change the language value elsewhere ltvdb_api_parms = sickbeard.TVDB_API_PARMS.copy() if tvdb_lang and not tvdb_lang == 'en': ltvdb_api_parms['language'] = tvdb_lang t = tvdb_api.Tvdb(actors=True, **ltvdb_api_parms) myShow = t[ep_obj.show.tvdbid] except tvdb_exceptions.tvdb_shownotfound, e: raise exceptions.ShowNotFoundException(e.message)
def _get_episode_thumb_url(self, ep_obj): """ Returns the URL to use for downloading an episode's thumbnail. Uses theTVDB.com and TVRage.com data. ep_obj: a TVEpisode object for which to grab the thumb URL """ all_eps = [ep_obj] + ep_obj.relatedEps indexer_lang = ep_obj.show.lang # get a TVDB object try: # There's gotta be a better way of doing this but we don't wanna # change the language value elsewhere lINDEXER_API_PARMS = sickbeard.indexerApi( ep_obj.show.indexer).api_params.copy() lINDEXER_API_PARMS['actors'] = True if indexer_lang and not indexer_lang == 'en': lINDEXER_API_PARMS['language'] = indexer_lang if ep_obj.show.dvdorder != 0: lINDEXER_API_PARMS['dvdorder'] = True t = sickbeard.indexerApi( ep_obj.show.indexer).indexer(**lINDEXER_API_PARMS) indexer_show_obj = t[ep_obj.show.indexerid] except sickbeard.indexer_shownotfound, e: raise exceptions.ShowNotFoundException(e.message)
def _get_episode_thumb_url(self, ep_obj): """ Returns the URL to use for downloading an episode's thumbnail. Uses theTVDB.com data. ep_obj: a TVEpisode object for which to grab the thumb URL """ all_eps = [ep_obj] + ep_obj.relatedEps tvdb_lang = ep_obj.show.lang # get a TVDB object try: # There's gotta be a better way of doing this but we don't wanna # change the language value elsewhere ltvdb_api_parms = sickbeard.TVDB_API_PARMS.copy() if tvdb_lang and not tvdb_lang == 'en': ltvdb_api_parms['language'] = tvdb_lang if ep_obj.show.dvdorder != 0: ltvdb_api_parms['dvdorder'] = True t = tvdb_api.Tvdb(actors=True, **ltvdb_api_parms) tvdb_show_obj = t[ep_obj.show.tvdbid] except tvdb_exceptions.tvdb_shownotfound, e: raise exceptions.ShowNotFoundException(e.message)
def _ep_data(self, ep_obj): """ Creates a key value structure for a Tivo episode metadata file and returns the resulting data object. ep_obj: a TVEpisode instance to create the metadata file for. Lookup the show in http://thetvdb.com/ using the python library: https://github.com/dbr/indexer_api/ The results are saved in the object myShow. The key values for the tivo metadata file are from: http://pytivo.sourceforge.net/wiki/index.php/Metadata """ data = "" eps_to_write = [ep_obj] + ep_obj.relatedEps indexer_lang = ep_obj.show.lang try: lINDEXER_API_PARMS = sickbeard.indexerApi( ep_obj.show.indexer).api_params.copy() lINDEXER_API_PARMS['actors'] = True if indexer_lang and not indexer_lang == 'en': lINDEXER_API_PARMS['language'] = indexer_lang if ep_obj.show.dvdorder != 0: lINDEXER_API_PARMS['dvdorder'] = True t = sickbeard.indexerApi( ep_obj.show.indexer).indexer(**lINDEXER_API_PARMS) myShow = t[ep_obj.show.indexerid] except sickbeard.indexer_shownotfound, e: raise exceptions.ShowNotFoundException(str(e))
def _ep_data(self, ep_obj): """ Creates a key value structure for a Tivo episode metadata file and returns the resulting data object. ep_obj: a TVEpisode instance to create the metadata file for. Lookup the show in http://thetvdb.com/ using the python library: https://github.com/dbr/tvdb_api/ The results are saved in the object myShow. The key values for the tivo metadata file are from: http://pytivo.sourceforge.net/wiki/index.php/Metadata """ data = "" eps_to_write = [ep_obj] + ep_obj.relatedEps tvdb_lang = ep_obj.show.lang try: # There's gotta be a better way of doing this but we don't wanna # change the language value elsewhere ltvdb_api_parms = sickbeard.TVDB_API_PARMS.copy() if tvdb_lang and not tvdb_lang == 'en': ltvdb_api_parms['language'] = tvdb_lang if ep_obj.show.dvdorder != 0: ltvdb_api_parms['dvdorder'] = True t = tvdb_api.Tvdb(actors=True, **ltvdb_api_parms) myShow = t[ep_obj.show.tvdbid] except tvdb_exceptions.tvdb_shownotfound, e: raise exceptions.ShowNotFoundException(str(e))
def _ep_data(self, ep_obj): """ Creates an elementTree XML structure for an XBMC-style episode.nfo and returns the resulting data object. show_obj: a TVEpisode instance to create the NFO for """ eps_to_write = [ep_obj] + ep_obj.relatedEps tvdb_lang = ep_obj.show.lang # There's gotta be a better way of doing this but we don't wanna # change the language value elsewhere ltvdb_api_parms = sickbeard.TVDB_API_PARMS.copy() if tvdb_lang and not tvdb_lang == 'en': ltvdb_api_parms['language'] = tvdb_lang try: t = tvdb_api.Tvdb(actors=True, **ltvdb_api_parms) myShow = t[ep_obj.show.tvdbid] except tvdb_exceptions.tvdb_shownotfound, e: raise exceptions.ShowNotFoundException(str(e))
def _ep_data(self, ep_obj): """ Creates an elementTree XML structure for an XBMC-style episode.nfo and returns the resulting data object. show_obj: a TVEpisode instance to create the NFO for """ eps_to_write = [ep_obj] + ep_obj.relatedEps indexer_lang = ep_obj.show.lang lINDEXER_API_PARMS = sickbeard.indexerApi( ep_obj.show.indexer).api_params.copy() lINDEXER_API_PARMS['actors'] = True if indexer_lang and not indexer_lang == 'en': lINDEXER_API_PARMS['language'] = indexer_lang if ep_obj.show.dvdorder != 0: lINDEXER_API_PARMS['dvdorder'] = True try: t = sickbeard.indexerApi( ep_obj.show.indexer).indexer(**lINDEXER_API_PARMS) myShow = t[ep_obj.show.indexerid] except sickbeard.indexer_shownotfound as e: raise exceptions.ShowNotFoundException(e.message) except sickbeard.indexer_error as e: logger.log( u"Unable to connect to " + sickbeard.indexerApi(ep_obj.show.indexer).name + " while creating meta files - skipping - " + ex(e), logger.ERROR) return if not self._valid_show(myShow, ep_obj.show): return if len(eps_to_write) > 1: rootNode = etree.Element("xbmcmultiepisode") else: rootNode = etree.Element("episodedetails") # write an NFO containing info for all matching episodes for curEpToWrite in eps_to_write: try: myEp = myShow[curEpToWrite.season][curEpToWrite.episode] except (sickbeard.indexer_episodenotfound, sickbeard.indexer_seasonnotfound): logger.log(u"Unable to find episode " + str(curEpToWrite.season) + "x" + str(curEpToWrite.episode) + " on " + sickbeard.indexerApi(ep_obj.show.indexer).name + ".. has it been removed? Should I delete from db?") return None except (StandardError, Exception): logger.log( u"Not generating nfo because failed to fetched tv info data at this time", logger.DEBUG) return None if getattr(myEp, 'firstaired', None) is None: myEp["firstaired"] = str(datetime.date.fromordinal(1)) if getattr(myEp, 'episodename', None) is None: logger.log(u"Not generating nfo because the ep has no title", logger.DEBUG) return None logger.log( u"Creating metadata for episode " + str(ep_obj.season) + "x" + str(ep_obj.episode), logger.DEBUG) if len(eps_to_write) > 1: episode = etree.SubElement(rootNode, "episodedetails") else: episode = rootNode title = etree.SubElement(episode, "title") if curEpToWrite.name != None: title.text = curEpToWrite.name showtitle = etree.SubElement(episode, "showtitle") if curEpToWrite.show.name != None: showtitle.text = curEpToWrite.show.name season = etree.SubElement(episode, "season") season.text = str(curEpToWrite.season) episodenum = etree.SubElement(episode, "episode") episodenum.text = str(curEpToWrite.episode) uniqueid = etree.SubElement(episode, "uniqueid") uniqueid.text = str(curEpToWrite.indexerid) aired = etree.SubElement(episode, "aired") if curEpToWrite.airdate != datetime.date.fromordinal(1): aired.text = str(curEpToWrite.airdate) else: aired.text = '' plot = etree.SubElement(episode, "plot") if curEpToWrite.description != None: plot.text = curEpToWrite.description runtime = etree.SubElement(episode, "runtime") if curEpToWrite.season != 0: if getattr(myShow, 'runtime', None) is not None: runtime.text = myShow["runtime"] displayseason = etree.SubElement(episode, "displayseason") if getattr(myEp, 'airsbefore_season', None) is not None: displayseason_text = myEp['airsbefore_season'] if displayseason_text != None: displayseason.text = displayseason_text displayepisode = etree.SubElement(episode, "displayepisode") if getattr(myEp, 'airsbefore_episode', None) is not None: displayepisode_text = myEp['airsbefore_episode'] if displayepisode_text != None: displayepisode.text = displayepisode_text thumb = etree.SubElement(episode, "thumb") thumb_text = getattr(myEp, 'filename', None) if thumb_text != None: thumb.text = thumb_text watched = etree.SubElement(episode, "watched") watched.text = 'false' credits = etree.SubElement(episode, "credits") credits_text = getattr(myEp, 'writer', None) if credits_text != None: credits.text = credits_text director = etree.SubElement(episode, "director") director_text = getattr(myEp, 'director', None) if director_text is not None: director.text = director_text rating = etree.SubElement(episode, "rating") rating_text = getattr(myEp, 'rating', None) if rating_text != None: rating.text = rating_text gueststar_text = getattr(myEp, 'gueststars', None) if isinstance(gueststar_text, basestring): for actor in (x.strip() for x in gueststar_text.split('|') if x.strip()): cur_actor = etree.SubElement(episode, "actor") cur_actor_name = etree.SubElement(cur_actor, "name") cur_actor_name.text = actor self.add_actor_element(myShow, etree, episode) # Make it purdy helpers.indentXML(rootNode) data = etree.ElementTree(rootNode) return data
def _ep_data(self, ep_obj): """ Creates an elementTree XML structure for a Kodi-style episode.nfo and returns the resulting data object. show_obj: a TVEpisode instance to create the NFO for """ eps_to_write = [ep_obj] + ep_obj.relatedEps indexer_lang = ep_obj.show.lang lINDEXER_API_PARMS = sickbeard.indexerApi( ep_obj.show.indexer).api_params.copy() lINDEXER_API_PARMS['actors'] = True if indexer_lang and not indexer_lang == 'en': lINDEXER_API_PARMS['language'] = indexer_lang if ep_obj.show.dvdorder != 0: lINDEXER_API_PARMS['dvdorder'] = True try: t = sickbeard.indexerApi( ep_obj.show.indexer).indexer(**lINDEXER_API_PARMS) myShow = t[ep_obj.show.indexerid] except sickbeard.indexer_shownotfound as e: raise exceptions.ShowNotFoundException(e.message) except sickbeard.indexer_error as e: logger.log( u'Unable to connect to ' + sickbeard.indexerApi(ep_obj.show.indexer).name + ' while creating meta files - skipping - ' + ex(e), logger.ERROR) return if len(eps_to_write) > 1: rootNode = etree.Element('xbmcmultiepisode') else: rootNode = etree.Element('episodedetails') # write an NFO containing info for all matching episodes for curEpToWrite in eps_to_write: try: myEp = myShow[curEpToWrite.season][curEpToWrite.episode] except (sickbeard.indexer_episodenotfound, sickbeard.indexer_seasonnotfound): logger.log(u'Unable to find episode ' + str(curEpToWrite.season) + 'x' + str(curEpToWrite.episode) + ' on ' + sickbeard.indexerApi(ep_obj.show.indexer).name + '.. has it been removed? Should I delete from db?') return None if getattr(myEp, 'firstaired', None) is None: myEp['firstaired'] = str(datetime.date.fromordinal(1)) if getattr(myEp, 'episodename', None) is None: logger.log(u'Not generating nfo because the ep has no title', logger.DEBUG) return None logger.log( u'Creating metadata for episode ' + str(ep_obj.season) + 'x' + str(ep_obj.episode), logger.DEBUG) if len(eps_to_write) > 1: episode = etree.SubElement(rootNode, 'episodedetails') else: episode = rootNode title = etree.SubElement(episode, 'title') if curEpToWrite.name != None: title.text = curEpToWrite.name showtitle = etree.SubElement(episode, 'showtitle') if curEpToWrite.show.name != None: showtitle.text = curEpToWrite.show.name season = etree.SubElement(episode, 'season') season.text = str(curEpToWrite.season) episodenum = etree.SubElement(episode, 'episode') episodenum.text = str(curEpToWrite.episode) uniqueid = etree.SubElement(episode, 'uniqueid') uniqueid.text = str(curEpToWrite.indexerid) aired = etree.SubElement(episode, 'aired') if curEpToWrite.airdate != datetime.date.fromordinal(1): aired.text = str(curEpToWrite.airdate) else: aired.text = '' plot = etree.SubElement(episode, 'plot') if curEpToWrite.description != None: plot.text = curEpToWrite.description runtime = etree.SubElement(episode, 'runtime') if curEpToWrite.season != 0: if getattr(myShow, 'runtime', None) is not None: runtime.text = myShow['runtime'] displayseason = etree.SubElement(episode, 'displayseason') if getattr(myEp, 'airsbefore_season', None) is not None: displayseason_text = myEp['airsbefore_season'] if displayseason_text != None: displayseason.text = displayseason_text displayepisode = etree.SubElement(episode, 'displayepisode') if getattr(myEp, 'airsbefore_episode', None) is not None: displayepisode_text = myEp['airsbefore_episode'] if displayepisode_text != None: displayepisode.text = displayepisode_text thumb = etree.SubElement(episode, 'thumb') thumb_text = getattr(myEp, 'filename', None) if thumb_text != None: thumb.text = thumb_text watched = etree.SubElement(episode, 'watched') watched.text = 'false' credits = etree.SubElement(episode, 'credits') credits_text = getattr(myEp, 'writer', None) if credits_text != None: credits.text = credits_text director = etree.SubElement(episode, 'director') director_text = getattr(myEp, 'director', None) if director_text is not None: director.text = director_text rating = etree.SubElement(episode, 'rating') rating_text = getattr(myEp, 'rating', None) if rating_text != None: rating.text = rating_text gueststar_text = getattr(myEp, 'gueststars', None) if isinstance(gueststar_text, basestring): for actor in (x.strip() for x in gueststar_text.split('|') if x.strip()): cur_actor = etree.SubElement(episode, 'actor') cur_actor_name = etree.SubElement(cur_actor, 'name') cur_actor_name.text = actor if getattr(myEp, '_actors', None) is not None: for actor in myShow['_actors']: cur_actor = etree.SubElement(episode, 'actor') cur_actor_name = etree.SubElement(cur_actor, 'name') cur_actor_name_text = actor['name'] if isinstance(cur_actor_name_text, basestring): cur_actor_name.text = cur_actor_name_text.strip() cur_actor_role = etree.SubElement(cur_actor, 'role') cur_actor_role_text = actor['role'] if cur_actor_role_text != None: cur_actor_role.text = cur_actor_role_text cur_actor_thumb = etree.SubElement(cur_actor, 'thumb') cur_actor_thumb_text = actor['image'] if cur_actor_thumb_text != None: cur_actor_thumb.text = cur_actor_thumb_text # Make it purdy helpers.indentXML(rootNode) data = etree.ElementTree(rootNode) return data
def _ep_data(self, ep_obj): """ Creates a key value structure for a Tivo episode metadata file and returns the resulting data object. ep_obj: a TVEpisode instance to create the metadata file for. Lookup the show in http://thetvdb.com/ using the python library: https://github.com/dbr/indexer_api/ The results are saved in the object myShow. The key values for the tivo metadata file are from: http://pytivo.sourceforge.net/wiki/index.php/Metadata """ data = "" eps_to_write = [ep_obj] + ep_obj.relatedEps indexer_lang = ep_obj.show.lang try: lINDEXER_API_PARMS = sickbeard.indexerApi(ep_obj.show.indexer).api_params.copy() lINDEXER_API_PARMS['actors'] = True if indexer_lang and not indexer_lang == 'en': lINDEXER_API_PARMS['language'] = indexer_lang if ep_obj.show.dvdorder != 0: lINDEXER_API_PARMS['dvdorder'] = True t = sickbeard.indexerApi(ep_obj.show.indexer).indexer(**lINDEXER_API_PARMS) myShow = t[ep_obj.show.indexerid] except sickbeard.indexer_shownotfound as e: raise exceptions.ShowNotFoundException(str(e)) except sickbeard.indexer_error as e: logger.log(u"Unable to connect to " + sickbeard.indexerApi( ep_obj.show.indexer).name + " while creating meta files - skipping - " + str(e), logger.ERROR) return False if not self._valid_show(myShow, ep_obj.show): return for curEpToWrite in eps_to_write: try: myEp = myShow[curEpToWrite.season][curEpToWrite.episode] except (StandardError, Exception): logger.log(u"Unable to find episode " + str(curEpToWrite.season) + "x" + str( curEpToWrite.episode) + " on " + sickbeard.indexerApi( ep_obj.show.indexer).name + "... has it been removed? Should I delete from db?") return None if getattr(myEp, 'firstaired', None) is None and ep_obj.season == 0: myEp["firstaired"] = str(datetime.date.fromordinal(1)) if getattr(myEp, 'episodename', None) is None or getattr(myEp, 'firstaired', None) is None: return None if getattr(myShow, 'seriesname', None) is not None: data += ("title : " + myShow["seriesname"] + "\n") data += ("seriesTitle : " + myShow["seriesname"] + "\n") data += ("episodeTitle : " + curEpToWrite._format_pattern('%Sx%0E %EN') + "\n") # This should be entered for episodic shows and omitted for movies. The standard tivo format is to enter # the season number followed by the episode number for that season. For example, enter 201 for season 2 # episode 01. # This only shows up if you go into the Details from the Program screen. # This seems to disappear once the video is transferred to TiVo. # NOTE: May not be correct format, missing season, but based on description from wiki leaving as is. data += ("episodeNumber : " + str(curEpToWrite.episode) + "\n") # Must be entered as true or false. If true, the year from originalAirDate will be shown in parentheses # after the episode's title and before the description on the Program screen. # FIXME: Hardcode isEpisode to true for now, not sure how to handle movies data += ("isEpisode : true\n") # Write the synopsis of the video here # Micrsoft Word's smartquotes can die in a fire. sanitizedDescription = curEpToWrite.description # Replace double curly quotes sanitizedDescription = sanitizedDescription.replace(u"\u201c", "\"").replace(u"\u201d", "\"") # Replace single curly quotes sanitizedDescription = sanitizedDescription.replace(u"\u2018", "'").replace(u"\u2019", "'").replace( u"\u02BC", "'") data += ("description : " + sanitizedDescription + "\n") # Usually starts with "SH" and followed by 6-8 digits. # Tivo uses zap2it for thier data, so the series id is the zap2it_id. if getattr(myShow, 'zap2it_id', None) is not None: data += ("seriesId : " + myShow["zap2it_id"] + "\n") # This is the call sign of the channel the episode was recorded from. if getattr(myShow, 'network', None) is not None: data += ("callsign : " + myShow["network"] + "\n") # This must be entered as yyyy-mm-ddThh:mm:ssZ (the t is capitalized and never changes, the Z is also # capitalized and never changes). This is the original air date of the episode. # NOTE: Hard coded the time to T00:00:00Z as we really don't know when during the day the first run happened if curEpToWrite.airdate != datetime.date.fromordinal(1): data += ("originalAirDate : " + str(curEpToWrite.airdate) + "T00:00:00Z\n") # This shows up at the beginning of the description on the Program screen and on the Details screen. for actor in getattr(myShow, 'actors', []): data += ('vActor : %s\n' % actor['character']['name'] and actor['person']['name'] and actor['character']['name'] != actor['person']['name'] and '%s (%s)' % (actor['character']['name'], actor['person']['name']) or actor['person']['name'] or actor['character']['name']) # This is shown on both the Program screen and the Details screen. if getattr(myEp, 'rating', None) is not None: try: rating = float(myEp['rating']) except ValueError: rating = 0.0 # convert 10 to 4 star rating. 4 * rating / 10 # only whole numbers or half numbers work. multiply by 2, round, divide by 2.0 rating = round(8 * rating / 10) / 2.0 data += ("starRating : " + str(rating) + "\n") # This is shown on both the Program screen and the Details screen. # It uses the standard TV rating system of: TV-Y7, TV-Y, TV-G, TV-PG, TV-14, TV-MA and TV-NR. if getattr(myShow, 'contentrating', None) is not None: data += ("tvRating : " + str(myShow["contentrating"]) + "\n") # This field can be repeated as many times as necessary or omitted completely. if ep_obj.show.genre: for genre in ep_obj.show.genre.split('|'): if genre: data += ("vProgramGenre : " + str(genre) + "\n") # NOTE: The following are metadata keywords are not used # displayMajorNumber # showingBits # displayMinorNumber # colorCode # vSeriesGenre # vGuestStar, vDirector, vExecProducer, vProducer, vWriter, vHost, vChoreographer # partCount # partIndex return data
def _ep_data(self, ep_obj): """ Creates an elementTree XML structure for a MediaBrowser style episode.xml and returns the resulting data object. show_obj: a TVShow instance to create the NFO for """ eps_to_write = [ep_obj] + ep_obj.relatedEps indexer_lang = ep_obj.show.lang try: # There's gotta be a better way of doing this but we don't wanna # change the language value elsewhere lINDEXER_API_PARMS = sickbeard.indexerApi( ep_obj.show.indexer).api_params.copy() if indexer_lang and not indexer_lang == 'en': lINDEXER_API_PARMS['language'] = indexer_lang if ep_obj.show.dvdorder != 0: lINDEXER_API_PARMS['dvdorder'] = True t = sickbeard.indexerApi( ep_obj.show.indexer).indexer(**lINDEXER_API_PARMS) myShow = t[ep_obj.show.indexerid] except sickbeard.indexer_shownotfound as e: raise exceptions.ShowNotFoundException(e.message) except sickbeard.indexer_error as e: logger.log( u"Unable to connect to TVDB while creating meta files - skipping - " + ex(e), logger.ERROR) return False if not self._valid_show(myShow, ep_obj.show): return rootNode = etree.Element("details") movie = etree.SubElement(rootNode, "movie") movie.attrib["isExtra"] = "false" movie.attrib["isSet"] = "false" movie.attrib["isTV"] = "true" # write an MediaBrowser XML containing info for all matching episodes for curEpToWrite in eps_to_write: try: myEp = myShow[curEpToWrite.season][curEpToWrite.episode] except (StandardError, Exception): logger.log( u"Unable to find episode " + str(curEpToWrite.season) + "x" + str(curEpToWrite.episode) + " on tvdb... has it been removed? Should I delete from db?" ) return None if curEpToWrite == ep_obj: # root (or single) episode # default to today's date for specials if firstaired is not set if myEp['firstaired'] == None and ep_obj.season == 0: myEp['firstaired'] = str(datetime.date.fromordinal(1)) if myEp['episodename'] == None or myEp['firstaired'] == None: return None episode = movie EpisodeName = etree.SubElement(episode, "title") if curEpToWrite.name != None: EpisodeName.text = curEpToWrite.name else: EpisodeName.text = "" SeasonNumber = etree.SubElement(episode, "season") SeasonNumber.text = str(curEpToWrite.season) EpisodeNumber = etree.SubElement(episode, "episode") EpisodeNumber.text = str(ep_obj.episode) year = etree.SubElement(episode, "year") if myShow["firstaired"] != None: try: year_text = str( datetime.datetime.strptime(myShow["firstaired"], '%Y-%m-%d').year) if year_text: year.text = year_text except: pass plot = etree.SubElement(episode, "plot") if myShow["overview"] != None: plot.text = myShow["overview"] Overview = etree.SubElement(episode, "episodeplot") if curEpToWrite.description != None: Overview.text = curEpToWrite.description else: Overview.text = "" mpaa = etree.SubElement(episode, "mpaa") if myShow["contentrating"] != None: mpaa.text = myShow["contentrating"] if not ep_obj.relatedEps: if myEp["rating"] != None: try: rating = int((float(myEp['rating']) * 10)) except ValueError: rating = 0 Rating = etree.SubElement(episode, "rating") rating_text = str(rating) if rating_text != None: Rating.text = rating_text director = etree.SubElement(episode, "director") director_text = myEp['director'] if director_text != None: director.text = director_text credits = etree.SubElement(episode, "credits") credits_text = myEp['writer'] if credits_text != None: credits.text = credits_text cast = etree.SubElement(episode, "cast") self.add_actor_element(myShow, etree, cast) else: # append data from (if any) related episodes if curEpToWrite.name: if not EpisodeName.text: EpisodeName.text = curEpToWrite.name else: EpisodeName.text = EpisodeName.text + ", " + curEpToWrite.name if curEpToWrite.description: if not Overview.text: Overview.text = curEpToWrite.description else: Overview.text = Overview.text + "\r" + curEpToWrite.description helpers.indentXML(rootNode) data = etree.ElementTree(rootNode) return data
def _ep_data(self, ep_obj): """ Creates an elementTree XML structure for a MediaBrowser style episode.xml and returns the resulting data object. show_obj: a TVShow instance to create the NFO for """ eps_to_write = [ep_obj] + ep_obj.relatedEps persons_dict = {} persons_dict['Director'] = [] persons_dict['GuestStar'] = [] persons_dict['Writer'] = [] indexer_lang = ep_obj.show.lang try: lINDEXER_API_PARMS = sickbeard.indexerApi(ep_obj.show.indexer).api_params.copy() lINDEXER_API_PARMS['actors'] = True if indexer_lang and not indexer_lang == 'en': lINDEXER_API_PARMS['language'] = indexer_lang if ep_obj.show.dvdorder != 0: lINDEXER_API_PARMS['dvdorder'] = True t = sickbeard.indexerApi(ep_obj.show.indexer).indexer(**lINDEXER_API_PARMS) myShow = t[ep_obj.show.indexerid] except sickbeard.indexer_shownotfound as e: raise exceptions.ShowNotFoundException(e.message) except sickbeard.indexer_error as e: logger.log(u"Unable to connect to " + sickbeard.indexerApi( ep_obj.show.indexer).name + " while creating meta files - skipping - " + ex(e), logger.ERROR) return False if not self._valid_show(myShow, ep_obj.show): return rootNode = etree.Element("Item") # write an MediaBrowser XML containing info for all matching episodes for curEpToWrite in eps_to_write: try: myEp = myShow[curEpToWrite.season][curEpToWrite.episode] except (StandardError, Exception): logger.log(u"Unable to find episode " + str(curEpToWrite.season) + "x" + str( curEpToWrite.episode) + " on " + sickbeard.indexerApi( ep_obj.show.indexer).name + ".. has it been removed? Should I delete from db?") return None if curEpToWrite == ep_obj: # root (or single) episode # default to today's date for specials if firstaired is not set if getattr(myEp, 'firstaired', None) is None and ep_obj.season == 0: myEp['firstaired'] = str(datetime.date.fromordinal(1)) if getattr(myEp, 'episodename', None) is None or getattr(myEp, 'firstaired', None) is None: return None episode = rootNode EpisodeName = etree.SubElement(episode, "EpisodeName") if curEpToWrite.name != None: EpisodeName.text = curEpToWrite.name else: EpisodeName.text = "" EpisodeNumber = etree.SubElement(episode, "EpisodeNumber") EpisodeNumber.text = str(ep_obj.episode) if ep_obj.relatedEps: EpisodeNumberEnd = etree.SubElement(episode, "EpisodeNumberEnd") EpisodeNumberEnd.text = str(curEpToWrite.episode) SeasonNumber = etree.SubElement(episode, "SeasonNumber") SeasonNumber.text = str(curEpToWrite.season) if not ep_obj.relatedEps: absolute_number = etree.SubElement(episode, "absolute_number") if getattr(myEp, 'absolute_number', None) is not None: absolute_number.text = myEp['absolute_number'] FirstAired = etree.SubElement(episode, "FirstAired") if curEpToWrite.airdate != datetime.date.fromordinal(1): FirstAired.text = str(curEpToWrite.airdate) else: FirstAired.text = "" MetadataType = etree.SubElement(episode, "Type") MetadataType.text = "Episode" Overview = etree.SubElement(episode, "Overview") if curEpToWrite.description != None: Overview.text = curEpToWrite.description else: Overview.text = "" if not ep_obj.relatedEps: Rating = etree.SubElement(episode, "Rating") if getattr(myEp, 'rating', None) is not None: Rating.text = myEp['rating'] IMDB_ID = etree.SubElement(episode, "IMDB_ID") IMDB = etree.SubElement(episode, "IMDB") IMDbId = etree.SubElement(episode, "IMDbId") if getattr(myShow, 'imdb_id', None) is not None: IMDB_ID.text = myShow['imdb_id'] IMDB.text = myShow['imdb_id'] IMDbId.text = myShow['imdb_id'] indexerid = etree.SubElement(episode, "id") indexerid.text = str(curEpToWrite.indexerid) indexer = etree.SubElement(episode, "indexer") indexer.text = str(curEpToWrite.show.indexer) Persons = etree.SubElement(episode, "Persons") Language = etree.SubElement(episode, "Language") try: Language.text = curEpToWrite.show.lang except: Language.text = 'en' # tvrage api doesn't provide language so we must assume a value here thumb = etree.SubElement(episode, "filename") # TODO: See what this is needed for.. if its still needed # just write this to the NFO regardless of whether it actually exists or not # note: renaming files after nfo generation will break this, tough luck thumb_text = self.get_episode_thumb_path(ep_obj) if thumb_text: thumb.text = thumb_text else: # append data from (if any) related episodes EpisodeNumberEnd.text = str(curEpToWrite.episode) if curEpToWrite.name: if not EpisodeName.text: EpisodeName.text = curEpToWrite.name else: EpisodeName.text = EpisodeName.text + ", " + curEpToWrite.name if curEpToWrite.description: if not Overview.text: Overview.text = curEpToWrite.description else: Overview.text = Overview.text + "\r" + curEpToWrite.description # collect all directors, guest stars and writers if getattr(myEp, 'director', None) is not None: persons_dict['Director'] += [x.strip() for x in myEp['director'].split('|') if x] if getattr(myEp, 'gueststars', None) is not None: persons_dict['GuestStar'] += [x.strip() for x in myEp['gueststars'].split('|') if x] if getattr(myEp, 'writer', None) is not None: persons_dict['Writer'] += [x.strip() for x in myEp['writer'].split('|') if x] # fill in Persons section with collected directors, guest starts and writers for person_type, names in iteritems(persons_dict): # remove doubles names = list(set(names)) for cur_name in names: Person = etree.SubElement(Persons, "Person") cur_person_name = etree.SubElement(Person, "Name") cur_person_name.text = cur_name cur_person_type = etree.SubElement(Person, "Type") cur_person_type.text = person_type helpers.indentXML(rootNode) data = etree.ElementTree(rootNode) return data
def _ep_data(self, ep_obj): """ Creates an elementTree XML structure for a WDTV style episode.xml and returns the resulting data object. ep_obj: a TVShow instance to create the NFO for """ eps_to_write = [ep_obj] + ep_obj.relatedEps indexer_lang = ep_obj.show.lang try: lINDEXER_API_PARMS = sickbeard.indexerApi( ep_obj.show.indexer).api_params.copy() lINDEXER_API_PARMS['actors'] = True if indexer_lang and not indexer_lang == 'en': lINDEXER_API_PARMS['language'] = indexer_lang if ep_obj.show.dvdorder != 0: lINDEXER_API_PARMS['dvdorder'] = True t = sickbeard.indexerApi( ep_obj.show.indexer).indexer(**lINDEXER_API_PARMS) myShow = t[ep_obj.show.indexerid] except sickbeard.indexer_shownotfound as e: raise exceptions.ShowNotFoundException(e.message) except sickbeard.indexer_error as e: logger.log( u"Unable to connect to " + sickbeard.indexerApi(ep_obj.show.indexer).name + " while creating meta files - skipping - " + ex(e), logger.ERROR) return False rootNode = etree.Element("details") # write an WDTV XML containing info for all matching episodes for curEpToWrite in eps_to_write: try: myEp = myShow[curEpToWrite.season][curEpToWrite.episode] except (sickbeard.indexer_episodenotfound, sickbeard.indexer_seasonnotfound): logger.log(u"Unable to find episode " + str(curEpToWrite.season) + "x" + str(curEpToWrite.episode) + " on " + sickbeard.indexerApi(ep_obj.show.indexer).name + "... has it been removed? Should I delete from db?") return None if getattr(myEp, 'firstaired', None) is None and ep_obj.season == 0: myEp["firstaired"] = str(datetime.date.fromordinal(1)) if getattr(myEp, 'episodename', None) is None or getattr( myEp, 'firstaired', None) is None: return None if len(eps_to_write) > 1: episode = etree.SubElement(rootNode, "details") else: episode = rootNode # TODO: get right EpisodeID episodeID = etree.SubElement(episode, "id") episodeID.text = str(curEpToWrite.indexerid) title = etree.SubElement(episode, "title") title.text = ep_obj.prettyName() seriesName = etree.SubElement(episode, "series_name") if getattr(myShow, 'seriesname', None) is not None: seriesName.text = myShow["seriesname"] episodeName = etree.SubElement(episode, "episode_name") if curEpToWrite.name != None: episodeName.text = curEpToWrite.name seasonNumber = etree.SubElement(episode, "season_number") seasonNumber.text = str(curEpToWrite.season) episodeNum = etree.SubElement(episode, "episode_number") episodeNum.text = str(curEpToWrite.episode) firstAired = etree.SubElement(episode, "firstaired") if curEpToWrite.airdate != datetime.date.fromordinal(1): firstAired.text = str(curEpToWrite.airdate) year = etree.SubElement(episode, "year") if getattr(myShow, 'firstaired', None) is not None: try: year_text = str( datetime.datetime.strptime(myShow["firstaired"], '%Y-%m-%d').year) if year_text: year.text = year_text except: pass runtime = etree.SubElement(episode, "runtime") if curEpToWrite.season != 0: if getattr(myShow, 'runtime', None) is not None: runtime.text = myShow["runtime"] genre = etree.SubElement(episode, "genre") if getattr(myShow, 'genre', None) is not None: genre.text = " / ".join( [x for x in myShow["genre"].split('|') if x]) director = etree.SubElement(episode, "director") director_text = getattr(myEp, 'director', None) if director_text is not None: director.text = director_text if getattr(myShow, '_actors', None) is not None: for actor in myShow['_actors']: cur_actor = etree.SubElement(episode, "actor") cur_actor_name = etree.SubElement(cur_actor, "name") cur_actor_name.text = actor['name'] cur_actor_role = etree.SubElement(cur_actor, "role") cur_actor_role_text = actor['role'] if cur_actor_role_text != None: cur_actor_role.text = cur_actor_role_text overview = etree.SubElement(episode, "overview") if curEpToWrite.description != None: overview.text = curEpToWrite.description # Make it purdy helpers.indentXML(rootNode) data = etree.ElementTree(rootNode) return data