def update_show_indexer_metadata(self, show_obj): if self.show_metadata and show_obj and self._has_show_metadata( show_obj): sickrage.srLogger.debug( "Metadata provider " + self.name + " updating show indexer info metadata file for " + show_obj.name) nfo_file_path = self.get_show_file_path(show_obj) try: with io.open(nfo_file_path, 'rb') as xmlFileObj: showXML = ElementTree(file=xmlFileObj) indexerid = showXML.find('id') root = showXML.getroot() if indexerid is not None: indexerid.text = str(show_obj.indexerid) else: SubElement(root, "id").text = str(show_obj.indexerid) # Make it purdy indentXML(root) showXML.write(nfo_file_path, encoding='UTF-8') chmodAsParent(nfo_file_path) return True except IOError as e: sickrage.srLogger.error( "Unable to write file to " + nfo_file_path + " - are you sure the folder is writable? {}".format( e.message))
def update_show_indexer_metadata(self, show_obj): if self.show_metadata and show_obj and self._has_show_metadata(show_obj): sickrage.srLogger.debug( "Metadata provider " + self.name + " updating show indexer info metadata file for " + show_obj.name) nfo_file_path = self.get_show_file_path(show_obj) try: with io.open(nfo_file_path, 'rb') as xmlFileObj: showXML = ElementTree(file=xmlFileObj) indexerid = showXML.find('id') root = showXML.getroot() if indexerid is not None: indexerid.text = str(show_obj.indexerid) else: SubElement(root, "id").text = str(show_obj.indexerid) # Make it purdy indentXML(root) showXML.write(nfo_file_path, encoding='UTF-8') chmodAsParent(nfo_file_path) return True except IOError as e: sickrage.srLogger.error( "Unable to write file to " + nfo_file_path + " - are you sure the folder is writable? {}".format(e.message))
def _show_data(self, show_obj): """ Creates an elementTree XML structure for a MediaBrowser-style series.xml returns the resulting data object. show_obj: a TVShow instance to create the NFO for """ indexer_lang = show_obj.lang lINDEXER_API_PARMS = sickrage.srCore.INDEXER_API(show_obj.indexer).api_params.copy() lINDEXER_API_PARMS[b'actors'] = True if indexer_lang and not indexer_lang == sickrage.srConfig.INDEXER_DEFAULT_LANGUAGE: lINDEXER_API_PARMS[b'language'] = indexer_lang if show_obj.dvdorder != 0: lINDEXER_API_PARMS[b'dvdorder'] = True t = sickrage.srCore.INDEXER_API(show_obj.indexer).indexer(**lINDEXER_API_PARMS) rootNode = Element("details") tv_node = SubElement(rootNode, "movie") tv_node.attrib[b"isExtra"] = "false" tv_node.attrib[b"isSet"] = "false" tv_node.attrib[b"isTV"] = "true" try: myShow = t[int(show_obj.indexerid)] except indexer_shownotfound: sickrage.srLogger.error("Unable to find show with id " + str(show_obj.indexerid) + " on tvdb, skipping it") raise except indexer_error: sickrage.srLogger.error("TVDB is down, can't use its data to make the NFO") raise # check for title and id if not (getattr(myShow, 'seriesname', None) and getattr(myShow, 'id', None)): sickrage.srLogger.info("Incomplete info for show with id " + str(show_obj.indexerid) + " on " + sickrage.srCore.INDEXER_API( show_obj.indexer).name + ", skipping it") return False SeriesName = SubElement(tv_node, "title") SeriesName.text = myShow[b'seriesname'] if getattr(myShow, "genre", None): Genres = SubElement(tv_node, "genres") for genre in myShow[b'genre'].split('|'): if genre and genre.strip(): cur_genre = SubElement(Genres, "Genre") cur_genre.text = genre.strip() if getattr(myShow, 'firstaired', None): FirstAired = SubElement(tv_node, "premiered") FirstAired.text = myShow[b'firstaired'] if getattr(myShow, "firstaired", None): try: year_text = str(datetime.strptime(myShow[b"firstaired"], dateFormat).year) if year_text: year = SubElement(tv_node, "year") year.text = year_text except Exception: pass if getattr(myShow, 'overview', None): plot = SubElement(tv_node, "plot") plot.text = myShow[b"overview"] if getattr(myShow, 'rating', None): try: rating = int(float(myShow[b'rating']) * 10) except ValueError: rating = 0 if rating: Rating = SubElement(tv_node, "rating") Rating.text = str(rating) if getattr(myShow, 'status', None): Status = SubElement(tv_node, "status") Status.text = myShow[b'status'] if getattr(myShow, "contentrating", None): mpaa = SubElement(tv_node, "mpaa") mpaa.text = myShow[b"contentrating"] if getattr(myShow, 'imdb_id', None): imdb_id = SubElement(tv_node, "id") imdb_id.attrib[b"moviedb"] = "imdb" imdb_id.text = myShow[b'imdb_id'] if getattr(myShow, 'id', None): indexerid = SubElement(tv_node, "indexerid") indexerid.text = myShow[b'id'] if getattr(myShow, 'runtime', None): Runtime = SubElement(tv_node, "runtime") Runtime.text = myShow[b'runtime'] if getattr(myShow, '_actors', None): cast = SubElement(tv_node, "cast") for actor in myShow[b'_actors']: if 'name' in actor and actor[b'name'].strip(): cur_actor = SubElement(cast, "actor") cur_actor.text = actor[b'name'].strip() indentXML(rootNode) data = 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 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 = sickrage.srCore.INDEXER_API(ep_obj.show.indexer).api_params.copy() if indexer_lang and not indexer_lang == sickrage.srConfig.INDEXER_DEFAULT_LANGUAGE: lINDEXER_API_PARMS[b'language'] = indexer_lang if ep_obj.show.dvdorder != 0: lINDEXER_API_PARMS[b'dvdorder'] = True t = sickrage.srCore.INDEXER_API(ep_obj.show.indexer).indexer(**lINDEXER_API_PARMS) myShow = t[ep_obj.show.indexerid] except indexer_shownotfound as e: raise ShowNotFoundException(e.message) except indexer_error as e: sickrage.srLogger.error("Unable to connect to TVDB while creating meta files - skipping - {}".format(e.message)) return False rootNode = Element("details") movie = SubElement(rootNode, "movie") movie.attrib[b"isExtra"] = "false" movie.attrib[b"isSet"] = "false" movie.attrib[b"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 (indexer_episodenotfound, indexer_seasonnotfound): sickrage.srLogger.info("Unable to find episode %dx%d on %s... has it been removed? Should I delete from db?" % (curEpToWrite.season, curEpToWrite.episode(ep_obj.show.indexer).name)) return None if curEpToWrite == ep_obj: # root (or single) episode # default to today's date for specials if firstaired is not set if curEpToWrite.season == 0 and not getattr(myEp, 'firstaired', None): myEp[b'firstaired'] = str(date.fromordinal(1)) if not (getattr(myEp, 'episodename', None) and getattr(myEp, 'firstaired', None)): return None episode = movie if curEpToWrite.name: EpisodeName = SubElement(episode, "title") EpisodeName.text = curEpToWrite.name SeasonNumber = SubElement(episode, "season") SeasonNumber.text = str(curEpToWrite.season) EpisodeNumber = SubElement(episode, "episode") EpisodeNumber.text = str(curEpToWrite.episode) if getattr(myShow, "firstaired", None): try: year_text = str(datetime.strptime(myShow[b"firstaired"], dateFormat).year) if year_text: year = SubElement(episode, "year") year.text = year_text except: pass if getattr(myShow, "overview", None): plot = SubElement(episode, "plot") plot.text = myShow[b"overview"] if curEpToWrite.description: Overview = SubElement(episode, "episodeplot") Overview.text = curEpToWrite.description if getattr(myShow, 'contentrating', None): mpaa = SubElement(episode, "mpaa") mpaa.text = myShow[b"contentrating"] if not ep_obj.relatedEps and getattr(myEp, "rating", None): try: rating = int((float(myEp[b'rating']) * 10)) except ValueError: rating = 0 if rating: Rating = SubElement(episode, "rating") Rating.text = str(rating) if getattr(myEp, 'director', None): director = SubElement(episode, "director") director.text = myEp[b'director'] if getattr(myEp, 'writer', None): writer = SubElement(episode, "credits") writer.text = myEp[b'writer'] if getattr(myShow, '_actors', None) or getattr(myEp, 'gueststars', None): cast = SubElement(episode, "cast") if getattr(myEp, 'gueststars', None) and isinstance(myEp[b'gueststars'], basestring): for actor in (x.strip() for x in myEp[b'gueststars'].split('|') if x.strip()): cur_actor = SubElement(cast, "actor") cur_actor.text = actor if getattr(myShow, '_actors', None): for actor in myShow[b'_actors']: if 'name' in actor and actor[b'name'].strip(): cur_actor = SubElement(cast, "actor") cur_actor.text = actor[b'name'].strip() 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 indentXML(rootNode) data = ElementTree(rootNode) return data
def _show_data(self, show_obj): """ Creates an elementTree XML structure for an KODI-style tvshow.nfo and returns the resulting data object. show_obj: a TVShow instance to create the NFO for """ show_ID = show_obj.indexerid indexer_lang = show_obj.lang lINDEXER_API_PARMS = sickrage.srCore.INDEXER_API( show_obj.indexer).api_params.copy() lINDEXER_API_PARMS[b'actors'] = True if indexer_lang and not indexer_lang == sickrage.srConfig.INDEXER_DEFAULT_LANGUAGE: lINDEXER_API_PARMS[b'language'] = indexer_lang if show_obj.dvdorder != 0: lINDEXER_API_PARMS[b'dvdorder'] = True t = sickrage.srCore.INDEXER_API( show_obj.indexer).indexer(**lINDEXER_API_PARMS) tv_node = Element("tvshow") try: myShow = t[int(show_ID)] except indexer_shownotfound: sickrage.srLogger.error( "Unable to find show with id " + str(show_ID) + " on " + sickrage.srCore.INDEXER_API(show_obj.indexer).name + ", skipping it") raise except indexer_error: sickrage.srLogger.error( "" + sickrage.srCore.INDEXER_API(show_obj.indexer).name + " is down, can't use its data to add this show") raise # check for title and id if not (getattr(myShow, 'seriesname', None) and getattr(myShow, 'id', None)): sickrage.srLogger.info( "Incomplete info for show with id " + str(show_ID) + " on " + sickrage.srCore.INDEXER_API(show_obj.indexer).name + ", skipping it") return False title = SubElement(tv_node, "title") title.text = myShow[b"seriesname"] if getattr(myShow, 'rating', None): rating = SubElement(tv_node, "rating") rating.text = myShow[b"rating"] if getattr(myShow, 'firstaired', None): try: year_text = str( datetime.strptime(myShow[b"firstaired"], dateFormat).year) if year_text: year = SubElement(tv_node, "year") year.text = year_text except: pass if getattr(myShow, 'overview', None): plot = SubElement(tv_node, "plot") plot.text = myShow[b"overview"] if getattr(myShow, 'id', None): episodeguide = SubElement(tv_node, "episodeguide") episodeguideurl = SubElement(episodeguide, "url") episodeguideurl.text = sickrage.srCore.INDEXER_API( show_obj.indexer).config[b'base_url'] + str( myShow[b"id"]) + '/all/en.zip' if getattr(myShow, 'contentrating', None): mpaa = SubElement(tv_node, "mpaa") mpaa.text = myShow[b"contentrating"] if getattr(myShow, 'id', None): indexerid = SubElement(tv_node, "id") indexerid.text = str(myShow[b"id"]) if getattr(myShow, 'genre', None) and isinstance( myShow[b"genre"], basestring): genre = SubElement(tv_node, "genre") genre.text = " / ".join(x.strip() for x in myShow[b"genre"].split('|') if x.strip()) if getattr(myShow, 'firstaired', None): premiered = SubElement(tv_node, "premiered") premiered.text = myShow[b"firstaired"] if getattr(myShow, 'network', None): studio = SubElement(tv_node, "studio") studio.text = myShow[b"network"].strip() if getattr(myShow, '_actors', None): for actor in myShow[b'_actors']: cur_actor = SubElement(tv_node, "actor") if 'name' in actor and actor[b'name'].strip(): cur_actor_name = SubElement(cur_actor, "name") cur_actor_name.text = actor[b'name'].strip() else: continue if 'role' in actor and actor[b'role'].strip(): cur_actor_role = SubElement(cur_actor, "role") cur_actor_role.text = actor[b'role'].strip() if 'image' in actor and actor[b'image'].strip(): cur_actor_thumb = SubElement(cur_actor, "thumb") cur_actor_thumb.text = actor[b'image'].strip() # Make it purdy indentXML(tv_node) data = ElementTree(tv_node) return data
def _ep_data(self, ep_obj): """ Creates an elementTree XML structure for an 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 = sickrage.srCore.INDEXER_API( ep_obj.show.indexer).api_params.copy() lINDEXER_API_PARMS[b'actors'] = True if indexer_lang and not indexer_lang == sickrage.srConfig.INDEXER_DEFAULT_LANGUAGE: lINDEXER_API_PARMS[b'language'] = indexer_lang if ep_obj.show.dvdorder != 0: lINDEXER_API_PARMS[b'dvdorder'] = True try: t = sickrage.srCore.INDEXER_API( ep_obj.show.indexer).indexer(**lINDEXER_API_PARMS) myShow = t[ep_obj.show.indexerid] except indexer_shownotfound as e: raise ShowNotFoundException(e.message) except indexer_error as e: sickrage.srLogger.error( "Unable to connect to {} while creating meta files - skipping - {}" .format( sickrage.srCore.INDEXER_API(ep_obj.show.indexer).name, e)) return if len(eps_to_write) > 1: rootNode = Element("kodimultiepisode") else: rootNode = 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 (indexer_episodenotfound, indexer_seasonnotfound): sickrage.srLogger.info( "Unable to find episode %dx%d on %s... has it been removed? Should I delete from db?" % (curEpToWrite.season, curEpToWrite.episode(ep_obj.show.indexer).name)) return None if not getattr(myEp, 'firstaired', None): myEp[b"firstaired"] = str(date.fromordinal(1)) if not getattr(myEp, 'episodename', None): sickrage.srLogger.debug( "Not generating nfo because the ep has no title") return None sickrage.srLogger.debug("Creating metadata for episode " + str(ep_obj.season) + "x" + str(ep_obj.episode)) if len(eps_to_write) > 1: episode = SubElement(rootNode, "episodedetails") else: episode = rootNode if getattr(myEp, 'episodename', None): title = SubElement(episode, "title") title.text = myEp[b'episodename'] if getattr(myShow, 'seriesname', None): showtitle = SubElement(episode, "showtitle") showtitle.text = myShow[b'seriesname'] season = SubElement(episode, "season") season.text = str(curEpToWrite.season) episodenum = SubElement(episode, "episode") episodenum.text = str(curEpToWrite.episode) uniqueid = SubElement(episode, "uniqueid") uniqueid.text = str(curEpToWrite.indexerid) if curEpToWrite.airdate != date.fromordinal(1): aired = SubElement(episode, "aired") aired.text = str(curEpToWrite.airdate) if getattr(myEp, 'overview', None): plot = SubElement(episode, "plot") plot.text = myEp[b'overview'] if curEpToWrite.season and getattr(myShow, 'runtime', None): runtime = SubElement(episode, "runtime") runtime.text = myShow[b"runtime"] if getattr(myEp, 'airsbefore_season', None): displayseason = SubElement(episode, "displayseason") displayseason.text = myEp[b'airsbefore_season'] if getattr(myEp, 'airsbefore_episode', None): displayepisode = SubElement(episode, "displayepisode") displayepisode.text = myEp[b'airsbefore_episode'] if getattr(myEp, 'filename', None): thumb = SubElement(episode, "thumb") thumb.text = myEp[b'filename'].strip() # watched = SubElement(episode, "watched") # watched.text = 'false' if getattr(myEp, 'writer', None): ep_credits = SubElement(episode, "credits") ep_credits.text = myEp[b'writer'].strip() if getattr(myEp, 'director', None): director = SubElement(episode, "director") director.text = myEp[b'director'].strip() if getattr(myEp, 'rating', None): rating = SubElement(episode, "rating") rating.text = myEp[b'rating'] if getattr(myEp, 'gueststars', None) and isinstance( myEp[b'gueststars'], basestring): for actor in (x.strip() for x in myEp[b'gueststars'].split('|') if x.strip()): cur_actor = SubElement(episode, "actor") cur_actor_name = SubElement(cur_actor, "name") cur_actor_name.text = actor if getattr(myShow, '_actors', None): for actor in myShow[b'_actors']: cur_actor = SubElement(episode, "actor") if 'name' in actor and actor[b'name'].strip(): cur_actor_name = SubElement(cur_actor, "name") cur_actor_name.text = actor[b'name'].strip() else: continue if 'role' in actor and actor[b'role'].strip(): cur_actor_role = SubElement(cur_actor, "role") cur_actor_role.text = actor[b'role'].strip() if 'image' in actor and actor[b'image'].strip(): cur_actor_thumb = SubElement(cur_actor, "thumb") cur_actor_thumb.text = actor[b'image'].strip() # Make it purdy indentXML(rootNode) data = 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 = { 'Director': [], 'GuestStar': [], 'Writer': [] } indexer_lang = ep_obj.show.lang try: lINDEXER_API_PARMS = sickrage.srCore.INDEXER_API(ep_obj.show.indexer).api_params.copy() lINDEXER_API_PARMS[b'actors'] = True if indexer_lang and not indexer_lang == sickrage.srConfig.INDEXER_DEFAULT_LANGUAGE: lINDEXER_API_PARMS[b'language'] = indexer_lang if ep_obj.show.dvdorder != 0: lINDEXER_API_PARMS[b'dvdorder'] = True t = sickrage.srCore.INDEXER_API(ep_obj.show.indexer).indexer(**lINDEXER_API_PARMS) myShow = t[ep_obj.show.indexerid] except indexer_shownotfound as e: raise ShowNotFoundException(e.message) except indexer_error as e: sickrage.srLogger.error("Unable to connect to " + sickrage.srCore.INDEXER_API( ep_obj.show.indexer).name + " while creating meta files - skipping - {}".format(e.message)) return False rootNode = 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 (indexer_episodenotfound, indexer_seasonnotfound): sickrage.srLogger.info("Unable to find episode %dx%d on %s... has it been removed? Should I delete from db?" % (curEpToWrite.season, curEpToWrite.episode(ep_obj.show.indexer).name)) return None if curEpToWrite == ep_obj: # root (or single) episode # default to today's date for specials if firstaired is not set if ep_obj.season == 0 and not getattr(myEp, 'firstaired', None): myEp[b'firstaired'] = str(date.fromordinal(1)) if not (getattr(myEp, 'episodename', None) and getattr(myEp, 'firstaired', None)): return None episode = rootNode if curEpToWrite.name: EpisodeName = SubElement(episode, "EpisodeName") EpisodeName.text = curEpToWrite.name EpisodeNumber = SubElement(episode, "EpisodeNumber") EpisodeNumber.text = str(ep_obj.episode) if ep_obj.relatedEps: EpisodeNumberEnd = SubElement(episode, "EpisodeNumberEnd") EpisodeNumberEnd.text = str(curEpToWrite.episode) SeasonNumber = SubElement(episode, "SeasonNumber") SeasonNumber.text = str(curEpToWrite.season) if not ep_obj.relatedEps and getattr(myEp, 'absolute_number', None): absolute_number = SubElement(episode, "absolute_number") absolute_number.text = str(myEp[b'absolute_number']) if curEpToWrite.airdate != date.fromordinal(1): FirstAired = SubElement(episode, "FirstAired") FirstAired.text = str(curEpToWrite.airdate) MetadataType = SubElement(episode, "Type") MetadataType.text = "Episode" if curEpToWrite.description: Overview = SubElement(episode, "Overview") Overview.text = curEpToWrite.description if not ep_obj.relatedEps: if getattr(myEp, 'rating', None): Rating = SubElement(episode, "Rating") Rating.text = myEp[b'rating'] if getattr(myShow, 'imdb_id', None): IMDB_ID = SubElement(episode, "IMDB_ID") IMDB_ID.text = myShow[b'imdb_id'] IMDB = SubElement(episode, "IMDB") IMDB.text = myShow[b'imdb_id'] IMDbId = SubElement(episode, "IMDbId") IMDbId.text = myShow[b'imdb_id'] indexerid = SubElement(episode, "id") indexerid.text = str(curEpToWrite.indexerid) # fill in Persons section with collected directors, guest starts and writers Persons = SubElement(episode, "Persons") for person_type, names in persons_dict.iteritems(): # remove doubles names = list(set(names)) for cur_name in names: Person = SubElement(Persons, "Person") cur_person_name = SubElement(Person, "Name") cur_person_name.text = cur_name cur_person_type = SubElement(Person, "Type") cur_person_type.text = person_type if getattr(myShow, '_actors', None): for actor in myShow[b'_actors']: if not ('name' in actor and actor[b'name'].strip()): continue cur_actor = SubElement(Persons, "Person") cur_actor_name = SubElement(cur_actor, "Name") cur_actor_name.text = actor[b'name'].strip() cur_actor_type = SubElement(cur_actor, "Type") cur_actor_type.text = "Actor" if 'role' in actor and actor[b'role'].strip(): cur_actor_role = SubElement(cur_actor, "Role") cur_actor_role.text = actor[b'role'].strip() Language = SubElement(episode, "Language") try: Language.text = myEp[b'language'] except Exception: Language.text = sickrage.srConfig.INDEXER_DEFAULT_LANGUAGE # tvrage api doesn't provide language so we must assume a value here thumb = 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 if curEpToWrite.episode: if not EpisodeNumberEnd.text: EpisodeNumberEnd.text = curEpToWrite.episode else: EpisodeNumberEnd.text = EpisodeNumberEnd.text + ", " + 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): persons_dict[b'Director'] += [x.strip() for x in myEp[b'director'].split('|') if x.strip()] if getattr(myEp, 'gueststars', None): persons_dict[b'GuestStar'] += [x.strip() for x in myEp[b'gueststars'].split('|') if x.strip()] if getattr(myEp, 'writer', None): persons_dict[b'Writer'] += [x.strip() for x in myEp[b'writer'].split('|') if x.strip()] indentXML(rootNode) data = ElementTree(rootNode) return data
def _show_data(self, show_obj): """ Creates an elementTree XML structure for a MediaBrowser-style series.xml returns the resulting data object. show_obj: a TVShow instance to create the NFO for """ indexer_lang = show_obj.lang # There's gotta be a better way of doing this but we don't wanna # change the language value elsewhere lINDEXER_API_PARMS = sickrage.srCore.INDEXER_API(show_obj.indexer).api_params.copy() lINDEXER_API_PARMS[b'actors'] = True if indexer_lang and not indexer_lang == sickrage.srConfig.INDEXER_DEFAULT_LANGUAGE: lINDEXER_API_PARMS[b'language'] = indexer_lang if show_obj.dvdorder != 0: lINDEXER_API_PARMS[b'dvdorder'] = True t = sickrage.srCore.INDEXER_API(show_obj.indexer).indexer(**lINDEXER_API_PARMS) tv_node = Element("Series") try: myShow = t[int(show_obj.indexerid)] except indexer_shownotfound: sickrage.srLogger.error("Unable to find show with id " + str(show_obj.indexerid) + " on " + sickrage.srCore.INDEXER_API( show_obj.indexer).name + ", skipping it") raise except indexer_error: sickrage.srLogger.error( "" + sickrage.srCore.INDEXER_API(show_obj.indexer).name + " is down, can't use its data to make the NFO") raise # check for title and id if not (getattr(myShow, 'seriesname', None) and getattr(myShow, 'id', None)): sickrage.srLogger.info("Incomplete info for show with id " + str(show_obj.indexerid) + " on " + sickrage.srCore.INDEXER_API( show_obj.indexer).name + ", skipping it") return False if getattr(myShow, 'id', None): indexerid = SubElement(tv_node, "id") indexerid.text = str(myShow[b'id']) if getattr(myShow, 'seriesname', None): SeriesName = SubElement(tv_node, "SeriesName") SeriesName.text = myShow[b'seriesname'] if getattr(myShow, 'status', None): Status = SubElement(tv_node, "Status") Status.text = myShow[b'status'] if getattr(myShow, 'network', None): Network = SubElement(tv_node, "Network") Network.text = myShow[b'network'] if getattr(myShow, 'airs_time', None): Airs_Time = SubElement(tv_node, "Airs_Time") Airs_Time.text = myShow[b'airs_time'] if getattr(myShow, 'airs_dayofweek', None): Airs_DayOfWeek = SubElement(tv_node, "Airs_DayOfWeek") Airs_DayOfWeek.text = myShow[b'airs_dayofweek'] FirstAired = SubElement(tv_node, "FirstAired") if getattr(myShow, 'firstaired', None): FirstAired.text = myShow[b'firstaired'] if getattr(myShow, 'contentrating', None): ContentRating = SubElement(tv_node, "ContentRating") ContentRating.text = myShow[b'contentrating'] MPAARating = SubElement(tv_node, "MPAARating") MPAARating.text = myShow[b'contentrating'] certification = SubElement(tv_node, "certification") certification.text = myShow[b'contentrating'] MetadataType = SubElement(tv_node, "Type") MetadataType.text = "Series" if getattr(myShow, 'overview', None): Overview = SubElement(tv_node, "Overview") Overview.text = myShow[b'overview'] if getattr(myShow, 'firstaired', None): PremiereDate = SubElement(tv_node, "PremiereDate") PremiereDate.text = myShow[b'firstaired'] if getattr(myShow, 'rating', None): Rating = SubElement(tv_node, "Rating") Rating.text = myShow[b'rating'] if getattr(myShow, 'firstaired', None): try: year_text = str(datetime.strptime(myShow[b'firstaired'], dateFormat).year) if year_text: ProductionYear = SubElement(tv_node, "ProductionYear") ProductionYear.text = year_text except Exception: pass if getattr(myShow, 'runtime', None): RunningTime = SubElement(tv_node, "RunningTime") RunningTime.text = myShow[b'runtime'] Runtime = SubElement(tv_node, "Runtime") Runtime.text = myShow[b'runtime'] if getattr(myShow, 'imdb_id', None): imdb_id = SubElement(tv_node, "IMDB_ID") imdb_id.text = myShow[b'imdb_id'] imdb_id = SubElement(tv_node, "IMDB") imdb_id.text = myShow[b'imdb_id'] imdb_id = SubElement(tv_node, "IMDbId") imdb_id.text = myShow[b'imdb_id'] if getattr(myShow, 'zap2it_id', None): Zap2ItId = SubElement(tv_node, "Zap2ItId") Zap2ItId.text = myShow[b'zap2it_id'] if getattr(myShow, 'genre', None) and isinstance(myShow[b"genre"], basestring): Genres = SubElement(tv_node, "Genres") for genre in myShow[b'genre'].split('|'): if genre.strip(): cur_genre = SubElement(Genres, "Genre") cur_genre.text = genre.strip() Genre = SubElement(tv_node, "Genre") Genre.text = "|".join([x.strip() for x in myShow[b"genre"].split('|') if x.strip()]) if getattr(myShow, 'network', None): Studios = SubElement(tv_node, "Studios") Studio = SubElement(Studios, "Studio") Studio.text = myShow[b'network'] if getattr(myShow, '_actors', None): Persons = SubElement(tv_node, "Persons") for actor in myShow[b'_actors']: if not ('name' in actor and actor[b'name'].strip()): continue cur_actor = SubElement(Persons, "Person") cur_actor_name = SubElement(cur_actor, "Name") cur_actor_name.text = actor[b'name'].strip() cur_actor_type = SubElement(cur_actor, "Type") cur_actor_type.text = "Actor" if 'role' in actor and actor[b'role'].strip(): cur_actor_role = SubElement(cur_actor, "Role") cur_actor_role.text = actor[b'role'].strip() indentXML(tv_node) data = ElementTree(tv_node) 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 = {'Director': [], 'GuestStar': [], 'Writer': []} indexer_lang = ep_obj.show.lang try: lINDEXER_API_PARMS = sickrage.srCore.INDEXER_API( ep_obj.show.indexer).api_params.copy() lINDEXER_API_PARMS[b'actors'] = True if indexer_lang and not indexer_lang == sickrage.srConfig.INDEXER_DEFAULT_LANGUAGE: lINDEXER_API_PARMS[b'language'] = indexer_lang if ep_obj.show.dvdorder != 0: lINDEXER_API_PARMS[b'dvdorder'] = True t = sickrage.srCore.INDEXER_API( ep_obj.show.indexer).indexer(**lINDEXER_API_PARMS) myShow = t[ep_obj.show.indexerid] except indexer_shownotfound as e: raise ShowNotFoundException(e.message) except indexer_error as e: sickrage.srLogger.error( "Unable to connect to " + sickrage.srCore.INDEXER_API(ep_obj.show.indexer).name + " while creating meta files - skipping - {}".format(e.message)) return False rootNode = 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 (indexer_episodenotfound, indexer_seasonnotfound): sickrage.srLogger.info( "Unable to find episode %dx%d on %s... has it been removed? Should I delete from db?" % (curEpToWrite.season, curEpToWrite.episode(ep_obj.show.indexer).name)) return None if curEpToWrite == ep_obj: # root (or single) episode # default to today's date for specials if firstaired is not set if ep_obj.season == 0 and not getattr(myEp, 'firstaired', None): myEp[b'firstaired'] = str(date.fromordinal(1)) if not (getattr(myEp, 'episodename', None) and getattr(myEp, 'firstaired', None)): return None episode = rootNode if curEpToWrite.name: EpisodeName = SubElement(episode, "EpisodeName") EpisodeName.text = curEpToWrite.name EpisodeNumber = SubElement(episode, "EpisodeNumber") EpisodeNumber.text = str(ep_obj.episode) if ep_obj.relatedEps: EpisodeNumberEnd = SubElement(episode, "EpisodeNumberEnd") EpisodeNumberEnd.text = str(curEpToWrite.episode) SeasonNumber = SubElement(episode, "SeasonNumber") SeasonNumber.text = str(curEpToWrite.season) if not ep_obj.relatedEps and getattr(myEp, 'absolute_number', None): absolute_number = SubElement(episode, "absolute_number") absolute_number.text = str(myEp[b'absolute_number']) if curEpToWrite.airdate != date.fromordinal(1): FirstAired = SubElement(episode, "FirstAired") FirstAired.text = str(curEpToWrite.airdate) MetadataType = SubElement(episode, "Type") MetadataType.text = "Episode" if curEpToWrite.description: Overview = SubElement(episode, "Overview") Overview.text = curEpToWrite.description if not ep_obj.relatedEps: if getattr(myEp, 'rating', None): Rating = SubElement(episode, "Rating") Rating.text = myEp[b'rating'] if getattr(myShow, 'imdb_id', None): IMDB_ID = SubElement(episode, "IMDB_ID") IMDB_ID.text = myShow[b'imdb_id'] IMDB = SubElement(episode, "IMDB") IMDB.text = myShow[b'imdb_id'] IMDbId = SubElement(episode, "IMDbId") IMDbId.text = myShow[b'imdb_id'] indexerid = SubElement(episode, "id") indexerid.text = str(curEpToWrite.indexerid) # fill in Persons section with collected directors, guest starts and writers Persons = SubElement(episode, "Persons") for person_type, names in persons_dict.iteritems(): # remove doubles names = list(set(names)) for cur_name in names: Person = SubElement(Persons, "Person") cur_person_name = SubElement(Person, "Name") cur_person_name.text = cur_name cur_person_type = SubElement(Person, "Type") cur_person_type.text = person_type if getattr(myShow, '_actors', None): for actor in myShow[b'_actors']: if not ('name' in actor and actor[b'name'].strip()): continue cur_actor = SubElement(Persons, "Person") cur_actor_name = SubElement(cur_actor, "Name") cur_actor_name.text = actor[b'name'].strip() cur_actor_type = SubElement(cur_actor, "Type") cur_actor_type.text = "Actor" if 'role' in actor and actor[b'role'].strip(): cur_actor_role = SubElement(cur_actor, "Role") cur_actor_role.text = actor[b'role'].strip() Language = SubElement(episode, "Language") try: Language.text = myEp[b'language'] except Exception: Language.text = sickrage.srConfig.INDEXER_DEFAULT_LANGUAGE # tvrage api doesn't provide language so we must assume a value here thumb = 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 if curEpToWrite.episode: if not EpisodeNumberEnd.text: EpisodeNumberEnd.text = curEpToWrite.episode else: EpisodeNumberEnd.text = EpisodeNumberEnd.text + ", " + 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): persons_dict[b'Director'] += [ x.strip() for x in myEp[b'director'].split('|') if x.strip() ] if getattr(myEp, 'gueststars', None): persons_dict[b'GuestStar'] += [ x.strip() for x in myEp[b'gueststars'].split('|') if x.strip() ] if getattr(myEp, 'writer', None): persons_dict[b'Writer'] += [ x.strip() for x in myEp[b'writer'].split('|') if x.strip() ] indentXML(rootNode) data = ElementTree(rootNode) return data
def _show_data(self, show_obj): """ Creates an elementTree XML structure for a MediaBrowser-style series.xml returns the resulting data object. show_obj: a TVShow instance to create the NFO for """ indexer_lang = show_obj.lang # There's gotta be a better way of doing this but we don't wanna # change the language value elsewhere lINDEXER_API_PARMS = sickrage.srCore.INDEXER_API( show_obj.indexer).api_params.copy() lINDEXER_API_PARMS[b'actors'] = True if indexer_lang and not indexer_lang == sickrage.srConfig.INDEXER_DEFAULT_LANGUAGE: lINDEXER_API_PARMS[b'language'] = indexer_lang if show_obj.dvdorder != 0: lINDEXER_API_PARMS[b'dvdorder'] = True t = sickrage.srCore.INDEXER_API( show_obj.indexer).indexer(**lINDEXER_API_PARMS) tv_node = Element("Series") try: myShow = t[int(show_obj.indexerid)] except indexer_shownotfound: sickrage.srLogger.error( "Unable to find show with id " + str(show_obj.indexerid) + " on " + sickrage.srCore.INDEXER_API(show_obj.indexer).name + ", skipping it") raise except indexer_error: sickrage.srLogger.error( "" + sickrage.srCore.INDEXER_API(show_obj.indexer).name + " is down, can't use its data to make the NFO") raise # check for title and id if not (getattr(myShow, 'seriesname', None) and getattr(myShow, 'id', None)): sickrage.srLogger.info( "Incomplete info for show with id " + str(show_obj.indexerid) + " on " + sickrage.srCore.INDEXER_API(show_obj.indexer).name + ", skipping it") return False if getattr(myShow, 'id', None): indexerid = SubElement(tv_node, "id") indexerid.text = str(myShow[b'id']) if getattr(myShow, 'seriesname', None): SeriesName = SubElement(tv_node, "SeriesName") SeriesName.text = myShow[b'seriesname'] if getattr(myShow, 'status', None): Status = SubElement(tv_node, "Status") Status.text = myShow[b'status'] if getattr(myShow, 'network', None): Network = SubElement(tv_node, "Network") Network.text = myShow[b'network'] if getattr(myShow, 'airs_time', None): Airs_Time = SubElement(tv_node, "Airs_Time") Airs_Time.text = myShow[b'airs_time'] if getattr(myShow, 'airs_dayofweek', None): Airs_DayOfWeek = SubElement(tv_node, "Airs_DayOfWeek") Airs_DayOfWeek.text = myShow[b'airs_dayofweek'] FirstAired = SubElement(tv_node, "FirstAired") if getattr(myShow, 'firstaired', None): FirstAired.text = myShow[b'firstaired'] if getattr(myShow, 'contentrating', None): ContentRating = SubElement(tv_node, "ContentRating") ContentRating.text = myShow[b'contentrating'] MPAARating = SubElement(tv_node, "MPAARating") MPAARating.text = myShow[b'contentrating'] certification = SubElement(tv_node, "certification") certification.text = myShow[b'contentrating'] MetadataType = SubElement(tv_node, "Type") MetadataType.text = "Series" if getattr(myShow, 'overview', None): Overview = SubElement(tv_node, "Overview") Overview.text = myShow[b'overview'] if getattr(myShow, 'firstaired', None): PremiereDate = SubElement(tv_node, "PremiereDate") PremiereDate.text = myShow[b'firstaired'] if getattr(myShow, 'rating', None): Rating = SubElement(tv_node, "Rating") Rating.text = myShow[b'rating'] if getattr(myShow, 'firstaired', None): try: year_text = str( datetime.strptime(myShow[b'firstaired'], dateFormat).year) if year_text: ProductionYear = SubElement(tv_node, "ProductionYear") ProductionYear.text = year_text except Exception: pass if getattr(myShow, 'runtime', None): RunningTime = SubElement(tv_node, "RunningTime") RunningTime.text = myShow[b'runtime'] Runtime = SubElement(tv_node, "Runtime") Runtime.text = myShow[b'runtime'] if getattr(myShow, 'imdb_id', None): imdb_id = SubElement(tv_node, "IMDB_ID") imdb_id.text = myShow[b'imdb_id'] imdb_id = SubElement(tv_node, "IMDB") imdb_id.text = myShow[b'imdb_id'] imdb_id = SubElement(tv_node, "IMDbId") imdb_id.text = myShow[b'imdb_id'] if getattr(myShow, 'zap2it_id', None): Zap2ItId = SubElement(tv_node, "Zap2ItId") Zap2ItId.text = myShow[b'zap2it_id'] if getattr(myShow, 'genre', None) and isinstance( myShow[b"genre"], basestring): Genres = SubElement(tv_node, "Genres") for genre in myShow[b'genre'].split('|'): if genre.strip(): cur_genre = SubElement(Genres, "Genre") cur_genre.text = genre.strip() Genre = SubElement(tv_node, "Genre") Genre.text = "|".join( [x.strip() for x in myShow[b"genre"].split('|') if x.strip()]) if getattr(myShow, 'network', None): Studios = SubElement(tv_node, "Studios") Studio = SubElement(Studios, "Studio") Studio.text = myShow[b'network'] if getattr(myShow, '_actors', None): Persons = SubElement(tv_node, "Persons") for actor in myShow[b'_actors']: if not ('name' in actor and actor[b'name'].strip()): continue cur_actor = SubElement(Persons, "Person") cur_actor_name = SubElement(cur_actor, "Name") cur_actor_name.text = actor[b'name'].strip() cur_actor_type = SubElement(cur_actor, "Type") cur_actor_type.text = "Actor" if 'role' in actor and actor[b'role'].strip(): cur_actor_role = SubElement(cur_actor, "Role") cur_actor_role.text = actor[b'role'].strip() indentXML(tv_node) data = ElementTree(tv_node) 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 = sickrage.srCore.INDEXER_API(ep_obj.show.indexer).api_params.copy() lINDEXER_API_PARMS[b'actors'] = True if indexer_lang and not indexer_lang == sickrage.srConfig.INDEXER_DEFAULT_LANGUAGE: lINDEXER_API_PARMS[b'language'] = indexer_lang if ep_obj.show.dvdorder != 0: lINDEXER_API_PARMS[b'dvdorder'] = True t = sickrage.srCore.INDEXER_API(ep_obj.show.indexer).indexer(**lINDEXER_API_PARMS) myShow = t[ep_obj.show.indexerid] except indexer_shownotfound as e: raise ShowNotFoundException(e.message) except indexer_error as e: sickrage.srLogger.error("Unable to connect to " + sickrage.srCore.INDEXER_API( ep_obj.show.indexer).name + " while creating meta files - skipping - {}".format(e.message)) return False rootNode = 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 (indexer_episodenotfound, indexer_seasonnotfound): sickrage.srLogger.info("Unable to find episode %dx%d on %s... has it been removed? Should I delete from db?" % (curEpToWrite.season, curEpToWrite.episode(ep_obj.show.indexer).name)) return None if ep_obj.season == 0 and not getattr(myEp, 'firstaired', None): myEp[b"firstaired"] = str(date.fromordinal(1)) if not (getattr(myEp, 'episodename', None) and getattr(myEp, 'firstaired', None)): return None if len(eps_to_write) > 1: episode = SubElement(rootNode, "details") else: episode = rootNode # TODO: get right EpisodeID episodeID = SubElement(episode, "id") episodeID.text = str(curEpToWrite.indexerid) title = SubElement(episode, "title") title.text = ep_obj.prettyName() if getattr(myShow, 'seriesname', None): seriesName = SubElement(episode, "series_name") seriesName.text = myShow[b"seriesname"] if curEpToWrite.name: episodeName = SubElement(episode, "episode_name") episodeName.text = curEpToWrite.name seasonNumber = SubElement(episode, "season_number") seasonNumber.text = str(curEpToWrite.season) episodeNum = SubElement(episode, "episode_number") episodeNum.text = str(curEpToWrite.episode) firstAired = SubElement(episode, "firstaired") if curEpToWrite.airdate != date.fromordinal(1): firstAired.text = str(curEpToWrite.airdate) if getattr(myShow, 'firstaired', None): try: year_text = str(datetime.strptime(myShow[b"firstaired"], dateFormat).year) if year_text: year = SubElement(episode, "year") year.text = year_text except Exception: pass if curEpToWrite.season != 0 and getattr(myShow, 'runtime', None): runtime = SubElement(episode, "runtime") runtime.text = myShow[b"runtime"] if getattr(myShow, 'genre', None): genre = SubElement(episode, "genre") genre.text = " / ".join([x.strip() for x in myShow[b"genre"].split('|') if x.strip()]) if getattr(myEp, 'director', None): director = SubElement(episode, "director") director.text = myEp[b'director'] if getattr(myShow, '_actors', None): for actor in myShow[b'_actors']: if not ('name' in actor and actor[b'name'].strip()): continue cur_actor = SubElement(episode, "actor") cur_actor_name = SubElement(cur_actor, "name") cur_actor_name.text = actor[b'name'] if 'role' in actor and actor[b'role'].strip(): cur_actor_role = SubElement(cur_actor, "role") cur_actor_role.text = actor[b'role'].strip() if curEpToWrite.description: overview = SubElement(episode, "overview") overview.text = curEpToWrite.description # Make it purdy indentXML(rootNode) data = ElementTree(rootNode) return data
def _show_data(self, show_obj): """ Creates an elementTree XML structure for an KODI-style tvshow.nfo and returns the resulting data object. show_obj: a TVShow instance to create the NFO for """ show_ID = show_obj.indexerid indexer_lang = show_obj.lang lINDEXER_API_PARMS = sickrage.srCore.INDEXER_API(show_obj.indexer).api_params.copy() lINDEXER_API_PARMS[b'actors'] = True if indexer_lang and not indexer_lang == sickrage.srConfig.INDEXER_DEFAULT_LANGUAGE: lINDEXER_API_PARMS[b'language'] = indexer_lang if show_obj.dvdorder != 0: lINDEXER_API_PARMS[b'dvdorder'] = True t = sickrage.srCore.INDEXER_API(show_obj.indexer).indexer(**lINDEXER_API_PARMS) tv_node = Element("tvshow") try: myShow = t[int(show_ID)] except indexer_shownotfound: sickrage.srLogger.error("Unable to find show with id " + str(show_ID) + " on " + sickrage.srCore.INDEXER_API( show_obj.indexer).name + ", skipping it") raise except indexer_error: sickrage.srLogger.error( "" + sickrage.srCore.INDEXER_API(show_obj.indexer).name + " is down, can't use its data to add this show") raise # check for title and id if not (getattr(myShow, 'seriesname', None) and getattr(myShow, 'id', None)): sickrage.srLogger.info("Incomplete info for show with id " + str(show_ID) + " on " + sickrage.srCore.INDEXER_API( show_obj.indexer).name + ", skipping it") return False title = SubElement(tv_node, "title") title.text = myShow[b"seriesname"] if getattr(myShow, 'rating', None): rating = SubElement(tv_node, "rating") rating.text = myShow[b"rating"] if getattr(myShow, 'firstaired', None): try: year_text = str(datetime.strptime(myShow[b"firstaired"], dateFormat).year) if year_text: year = SubElement(tv_node, "year") year.text = year_text except: pass if getattr(myShow, 'overview', None): plot = SubElement(tv_node, "plot") plot.text = myShow[b"overview"] if getattr(myShow, 'id', None): episodeguide = SubElement(tv_node, "episodeguide") episodeguideurl = SubElement(episodeguide, "url") episodeguideurl.text = sickrage.srCore.INDEXER_API(show_obj.indexer).config[b'base_url'] + str( myShow[b"id"]) + '/all/en.zip' if getattr(myShow, 'contentrating', None): mpaa = SubElement(tv_node, "mpaa") mpaa.text = myShow[b"contentrating"] if getattr(myShow, 'id', None): indexerid = SubElement(tv_node, "id") indexerid.text = str(myShow[b"id"]) if getattr(myShow, 'genre', None) and isinstance(myShow[b"genre"], basestring): genre = SubElement(tv_node, "genre") genre.text = " / ".join(x.strip() for x in myShow[b"genre"].split('|') if x.strip()) if getattr(myShow, 'firstaired', None): premiered = SubElement(tv_node, "premiered") premiered.text = myShow[b"firstaired"] if getattr(myShow, 'network', None): studio = SubElement(tv_node, "studio") studio.text = myShow[b"network"].strip() if getattr(myShow, '_actors', None): for actor in myShow[b'_actors']: cur_actor = SubElement(tv_node, "actor") if 'name' in actor and actor[b'name'].strip(): cur_actor_name = SubElement(cur_actor, "name") cur_actor_name.text = actor[b'name'].strip() else: continue if 'role' in actor and actor[b'role'].strip(): cur_actor_role = SubElement(cur_actor, "role") cur_actor_role.text = actor[b'role'].strip() if 'image' in actor and actor[b'image'].strip(): cur_actor_thumb = SubElement(cur_actor, "thumb") cur_actor_thumb.text = actor[b'image'].strip() # Make it purdy indentXML(tv_node) data = ElementTree(tv_node) return data
def _ep_data(self, ep_obj): """ Creates an elementTree XML structure for an 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 = sickrage.srCore.INDEXER_API(ep_obj.show.indexer).api_params.copy() lINDEXER_API_PARMS[b'actors'] = True if indexer_lang and not indexer_lang == sickrage.srConfig.INDEXER_DEFAULT_LANGUAGE: lINDEXER_API_PARMS[b'language'] = indexer_lang if ep_obj.show.dvdorder != 0: lINDEXER_API_PARMS[b'dvdorder'] = True try: t = sickrage.srCore.INDEXER_API(ep_obj.show.indexer).indexer(**lINDEXER_API_PARMS) myShow = t[ep_obj.show.indexerid] except indexer_shownotfound as e: raise ShowNotFoundException(e.message) except indexer_error as e: sickrage.srLogger.error("Unable to connect to {} while creating meta files - skipping - {}".format( sickrage.srCore.INDEXER_API( ep_obj.show.indexer).name, e)) return if len(eps_to_write) > 1: rootNode = Element("kodimultiepisode") else: rootNode = 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 (indexer_episodenotfound, indexer_seasonnotfound): sickrage.srLogger.info("Unable to find episode %dx%d on %s... has it been removed? Should I delete from db?" % (curEpToWrite.season, curEpToWrite.episode(ep_obj.show.indexer).name)) return None if not getattr(myEp, 'firstaired', None): myEp[b"firstaired"] = str(date.fromordinal(1)) if not getattr(myEp, 'episodename', None): sickrage.srLogger.debug("Not generating nfo because the ep has no title") return None sickrage.srLogger.debug("Creating metadata for episode " + str(ep_obj.season) + "x" + str(ep_obj.episode)) if len(eps_to_write) > 1: episode = SubElement(rootNode, "episodedetails") else: episode = rootNode if getattr(myEp, 'episodename', None): title = SubElement(episode, "title") title.text = myEp[b'episodename'] if getattr(myShow, 'seriesname', None): showtitle = SubElement(episode, "showtitle") showtitle.text = myShow[b'seriesname'] season = SubElement(episode, "season") season.text = str(curEpToWrite.season) episodenum = SubElement(episode, "episode") episodenum.text = str(curEpToWrite.episode) uniqueid = SubElement(episode, "uniqueid") uniqueid.text = str(curEpToWrite.indexerid) if curEpToWrite.airdate != date.fromordinal(1): aired = SubElement(episode, "aired") aired.text = str(curEpToWrite.airdate) if getattr(myEp, 'overview', None): plot = SubElement(episode, "plot") plot.text = myEp[b'overview'] if curEpToWrite.season and getattr(myShow, 'runtime', None): runtime = SubElement(episode, "runtime") runtime.text = myShow[b"runtime"] if getattr(myEp, 'airsbefore_season', None): displayseason = SubElement(episode, "displayseason") displayseason.text = myEp[b'airsbefore_season'] if getattr(myEp, 'airsbefore_episode', None): displayepisode = SubElement(episode, "displayepisode") displayepisode.text = myEp[b'airsbefore_episode'] if getattr(myEp, 'filename', None): thumb = SubElement(episode, "thumb") thumb.text = myEp[b'filename'].strip() # watched = SubElement(episode, "watched") # watched.text = 'false' if getattr(myEp, 'writer', None): ep_credits = SubElement(episode, "credits") ep_credits.text = myEp[b'writer'].strip() if getattr(myEp, 'director', None): director = SubElement(episode, "director") director.text = myEp[b'director'].strip() if getattr(myEp, 'rating', None): rating = SubElement(episode, "rating") rating.text = myEp[b'rating'] if getattr(myEp, 'gueststars', None) and isinstance(myEp[b'gueststars'], basestring): for actor in (x.strip() for x in myEp[b'gueststars'].split('|') if x.strip()): cur_actor = SubElement(episode, "actor") cur_actor_name = SubElement(cur_actor, "name") cur_actor_name.text = actor if getattr(myShow, '_actors', None): for actor in myShow[b'_actors']: cur_actor = SubElement(episode, "actor") if 'name' in actor and actor[b'name'].strip(): cur_actor_name = SubElement(cur_actor, "name") cur_actor_name.text = actor[b'name'].strip() else: continue if 'role' in actor and actor[b'role'].strip(): cur_actor_role = SubElement(cur_actor, "role") cur_actor_role.text = actor[b'role'].strip() if 'image' in actor and actor[b'image'].strip(): cur_actor_thumb = SubElement(cur_actor, "thumb") cur_actor_thumb.text = actor[b'image'].strip() # Make it purdy indentXML(rootNode) data = ElementTree(rootNode) return data