def update_show_indexer_metadata(self, show_obj): if self.show_metadata and show_obj and self._has_show_metadata(show_obj): logger.log(u'Metadata provider %s updating show indexer metadata file for %s' % (self.name, show_obj.name), logger.DEBUG) nfo_file_path = self.get_show_file_path(show_obj) with ek.ek(open, nfo_file_path, 'r') as xmlFileObj: show_xml = etree.ElementTree(file=xmlFileObj) indexer = show_xml.find('indexer') indexerid = show_xml.find('id') root = show_xml.getroot() show_indexer = str(show_obj.indexer) if None is not indexer: indexer.text = show_indexer else: etree.SubElement(root, 'indexer').text = show_indexer show_indexerid = str(show_obj.indexerid) if None is not indexerid: indexerid.text = show_indexerid else: etree.SubElement(root, 'id').text = show_indexerid # Make it purdy helpers.indentXML(root) helpers.write_file(nfo_file_path, show_xml, xmltree=True, utf8=True) return True
def update_show_indexer_metadata(self, show_obj): if self.show_metadata and show_obj and self._has_show_metadata(show_obj): logger.log( u"Metadata provider " + self.name + " updating show indexer info metadata file for " + show_obj.name, logger.DEBUG, ) nfo_file_path = self.get_show_file_path(show_obj) try: with ek.ek(open, nfo_file_path, "r") as xmlFileObj: showXML = etree.ElementTree(file=xmlFileObj) indexerid = showXML.find("id") root = showXML.getroot() if indexerid: indexerid.text = show_obj.indexerid else: etree.SubElement(root, "id").text = str(show_obj.indexerid) # Make it purdy helpers.indentXML(root) showXML.write(nfo_file_path) helpers.chmodAsParent(nfo_file_path) return True except IOError, e: logger.log( u"Unable to write file to " + nfo_file_path + " - are you sure the folder is writable? " + ex(e), logger.ERROR, )
def update_show_indexer_metadata(self, show_obj): if self.show_metadata and show_obj and self._has_show_metadata(show_obj): logger.log( u"Metadata provider " + self.name + " updating show indexer info metadata file for " + show_obj.name, logger.DEBUG) nfo_file_path = self.get_show_file_path(show_obj) assert isinstance(nfo_file_path, unicode) try: with io.open(nfo_file_path, 'rb') as xmlFileObj: showXML = etree.ElementTree(file=xmlFileObj) indexerid = showXML.find('id') root = showXML.getroot() if indexerid is not None: indexerid.text = str(show_obj.indexerid) else: etree.SubElement(root, "id").text = str(show_obj.indexerid) # Make it purdy helpers.indentXML(root) showXML.write(nfo_file_path, encoding='UTF-8') helpers.chmodAsParent(nfo_file_path) return True except IOError, e: logger.log( u"Unable to write file to " + nfo_file_path + " - are you sure the folder is writable? " + ex(e), logger.ERROR)
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 lINDEXER_API_PARMS[ 'language'] = indexer_lang or sickbeard.INDEXER_DEFAULT_LANGUAGE if ep_obj.show.dvdorder: 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 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 {0:d}x{1:d} on {2}... has it been removed? Should I delete from db?" .format(curEpToWrite.season, curEpToWrite.episode, sickbeard.indexerApi(ep_obj.show.indexer).name)) return None if ep_obj.season == 0 and not getattr(myEp, 'firstaired', None): myEp["firstaired"] = str(datetime.date.fromordinal(1)) if not (getattr(myEp, 'episodename', None) and getattr(myEp, 'firstaired', 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() if getattr(myShow, 'seriesname', None): seriesName = etree.SubElement(episode, "series_name") seriesName.text = myShow["seriesname"] if curEpToWrite.name: episodeName = etree.SubElement(episode, "episode_name") 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) if getattr(myShow, 'firstaired', None): try: year_text = str( datetime.datetime.strptime(myShow["firstaired"], dateFormat).year) if year_text: year = etree.SubElement(episode, "year") year.text = year_text except Exception: pass if curEpToWrite.season != 0 and getattr(myShow, 'runtime', None): runtime = etree.SubElement(episode, "runtime") runtime.text = myShow["runtime"] if getattr(myShow, 'genre', None): genre = etree.SubElement(episode, "genre") genre.text = " / ".join([ x.strip() for x in myShow["genre"].split('|') if x.strip() ]) if getattr(myEp, 'director', None): director = etree.SubElement(episode, "director") director.text = myEp['director'] if getattr(myShow, '_actors', None): for actor in myShow['_actors']: if not ('name' in actor and actor['name'].strip()): continue cur_actor = etree.SubElement(episode, "actor") cur_actor_name = etree.SubElement(cur_actor, "name") cur_actor_name.text = actor['name'] if 'role' in actor and actor['role'].strip(): cur_actor_role = etree.SubElement(cur_actor, "role") cur_actor_role.text = actor['role'].strip() if curEpToWrite.description: overview = etree.SubElement(episode, "overview") overview.text = curEpToWrite.description # 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 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 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 (sickbeard.indexer_episodenotfound, sickbeard.indexer_seasonnotfound): 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") if getattr(myShow, "_actors", None) is not None: for actor in myShow["_actors"]: cur_actor_name_text = actor["name"] if cur_actor_name_text != None and cur_actor_name_text.strip(): cur_actor = etree.SubElement(cast, "actor") cur_actor.text = cur_actor_name_text.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 helpers.indentXML(rootNode) data = etree.ElementTree(rootNode) return data
def _show_data(self, show_obj): """ Creates an elementTree XML structure for a 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 = sickbeard.indexerApi(show_obj.indexer).api_params.copy() lINDEXER_API_PARMS['actors'] = True if indexer_lang and not indexer_lang == 'en': lINDEXER_API_PARMS['language'] = indexer_lang if show_obj.dvdorder != 0: lINDEXER_API_PARMS['dvdorder'] = True t = sickbeard.indexerApi(show_obj.indexer).indexer(**lINDEXER_API_PARMS) tv_node = etree.Element('tvshow') try: myShow = t[int(show_ID)] except sickbeard.indexer_shownotfound: logger.log(u'Unable to find show with id ' + str(show_ID) + ' on ' + sickbeard.indexerApi( show_obj.indexer).name + ', skipping it', logger.ERROR) raise except sickbeard.indexer_error: logger.log( u'' + sickbeard.indexerApi(show_obj.indexer).name + ' is down, can\'t use its data to add this show', logger.ERROR) raise # check for title and id if getattr(myShow, 'seriesname', None) is None or getattr(myShow, 'id', None) is None: logger.log(u'Incomplete info for show with id ' + str(show_ID) + ' on ' + sickbeard.indexerApi( show_obj.indexer).name + ', skipping it', logger.ERROR) return False title = etree.SubElement(tv_node, 'title') if getattr(myShow, 'seriesname', None) is not None: title.text = myShow['seriesname'] rating = etree.SubElement(tv_node, 'rating') if getattr(myShow, 'rating', None) is not None: rating.text = myShow['rating'] year = etree.SubElement(tv_node, '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 plot = etree.SubElement(tv_node, 'plot') if getattr(myShow, 'overview', None) is not None: plot.text = myShow['overview'] episodeguide = etree.SubElement(tv_node, 'episodeguide') episodeguideurl = etree.SubElement(episodeguide, 'url') episodeguideurl2 = etree.SubElement(tv_node, 'episodeguideurl') if getattr(myShow, 'id', None) is not None: showurl = sickbeard.indexerApi(show_obj.indexer).config['base_url'] + str(myShow['id']) + '/all/en.zip' episodeguideurl.text = showurl episodeguideurl2.text = showurl mpaa = etree.SubElement(tv_node, 'mpaa') if getattr(myShow, 'contentrating', None) is not None: mpaa.text = myShow['contentrating'] indexerid = etree.SubElement(tv_node, 'id') if getattr(myShow, 'id', None) is not None: indexerid.text = str(myShow['id']) indexer = etree.SubElement(tv_node, 'indexer') if show_obj.indexer is not None: indexer.text = str(show_obj.indexer) genre = etree.SubElement(tv_node, 'genre') if getattr(myShow, 'genre', None) is not None: if isinstance(myShow['genre'], basestring): genre.text = ' / '.join(x.strip() for x in myShow['genre'].split('|') if x.strip()) premiered = etree.SubElement(tv_node, 'premiered') if getattr(myShow, 'firstaired', None) is not None: premiered.text = myShow['firstaired'] studio = etree.SubElement(tv_node, 'studio') if getattr(myShow, 'network', None) is not None: studio.text = myShow['network'] if getattr(myShow, '_actors', None) is not None: for actor in myShow['_actors']: cur_actor = etree.SubElement(tv_node, '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(tv_node) data = etree.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 = 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("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 (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 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 for actor in getattr(myShow, 'actors', []): cur_actor = etree.SubElement(episode, 'actor') cur_actor_name = etree.SubElement(cur_actor, 'name') cur_actor_name.text = actor['person']['name'] cur_actor_role = etree.SubElement(cur_actor, 'role') cur_actor_role_text = actor['character']['name'] if cur_actor_role_text: 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
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 """ show_id = show_obj.indexerid 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 l_indexer_api_params = sickbeard.indexerApi(show_obj.indexer).api_params.copy() l_indexer_api_params['actors'] = True if indexer_lang and not indexer_lang == sickbeard.INDEXER_DEFAULT_LANGUAGE: l_indexer_api_params['language'] = indexer_lang if show_obj.dvdorder != 0: l_indexer_api_params['dvdorder'] = True t = sickbeard.indexerApi(show_obj.indexer).indexer(**l_indexer_api_params) tv_node = etree.Element('Series') try: my_show = t[int(show_id)] except sickbeard.indexer_shownotfound: logger.log(u'Unable to find {indexer} show {id}, skipping it'.format (indexer=sickbeard.indexerApi(show_obj.indexer).name, id=show_id), logger.ERROR) raise except sickbeard.indexer_error: logger.log(u'{indexer} is down, can\'t use its data to add this show'.format (indexer=sickbeard.indexerApi(show_obj.indexer).name), logger.ERROR) raise # check for title and id if not (getattr(my_show, 'seriesname', None) and getattr(my_show, 'id', None)): logger.log(u'Incomplete info for {indexer} show {id}, skipping it'.format (indexer=sickbeard.indexerApi(show_obj.indexer).name, id=show_id), logger.ERROR) return False if getattr(my_show, 'id', None): indexerid = etree.SubElement(tv_node, 'id') indexerid.text = str(my_show['id']) if getattr(my_show, 'seriesname', None): series_name = etree.SubElement(tv_node, 'SeriesName') series_name.text = my_show['seriesname'] if getattr(my_show, 'status', None): status = etree.SubElement(tv_node, 'Status') status.text = my_show['status'] if getattr(my_show, 'network', None): network = etree.SubElement(tv_node, 'Network') network.text = my_show['network'] if getattr(my_show, 'airs_time', None): airs_time = etree.SubElement(tv_node, 'Airs_Time') airs_time.text = my_show['airs_time'] if getattr(my_show, 'airs_dayofweek', None): airs_day_of_week = etree.SubElement(tv_node, 'Airs_DayOfWeek') airs_day_of_week.text = my_show['airs_dayofweek'] first_aired = etree.SubElement(tv_node, 'FirstAired') if getattr(my_show, 'firstaired', None): first_aired.text = my_show['firstaired'] if getattr(my_show, 'contentrating', None): content_rating = etree.SubElement(tv_node, 'ContentRating') content_rating.text = my_show['contentrating'] mpaa = etree.SubElement(tv_node, 'MPAARating') mpaa.text = my_show['contentrating'] certification = etree.SubElement(tv_node, 'certification') certification.text = my_show['contentrating'] metadata_type = etree.SubElement(tv_node, 'Type') metadata_type.text = 'Series' if getattr(my_show, 'overview', None): overview = etree.SubElement(tv_node, 'Overview') overview.text = my_show['overview'] if getattr(my_show, 'firstaired', None): premiere_date = etree.SubElement(tv_node, 'PremiereDate') premiere_date.text = my_show['firstaired'] if getattr(my_show, 'rating', None): rating = etree.SubElement(tv_node, 'Rating') rating.text = my_show['rating'] if getattr(my_show, 'firstaired', None): try: year_text = str(datetime.datetime.strptime(my_show['firstaired'], dateFormat).year) if year_text: production_year = etree.SubElement(tv_node, 'ProductionYear') production_year.text = year_text except Exception: pass if getattr(my_show, 'runtime', None): running_time = etree.SubElement(tv_node, 'RunningTime') running_time.text = my_show['runtime'] runtime = etree.SubElement(tv_node, 'Runtime') runtime.text = my_show['runtime'] if getattr(my_show, 'imdb_id', None): imdb_id = etree.SubElement(tv_node, 'IMDB_ID') imdb_id.text = my_show['imdb_id'] imdb_id = etree.SubElement(tv_node, 'IMDB') imdb_id.text = my_show['imdb_id'] imdb_id = etree.SubElement(tv_node, 'IMDbId') imdb_id.text = my_show['imdb_id'] if getattr(my_show, 'zap2it_id', None): zap2it_id = etree.SubElement(tv_node, 'Zap2ItId') zap2it_id.text = my_show['zap2it_id'] if getattr(my_show, 'genre', None) and isinstance(my_show['genre'], string_types): genres = etree.SubElement(tv_node, 'Genres') for genre in my_show['genre'].split('|'): if genre.strip(): cur_genre = etree.SubElement(genres, 'Genre') cur_genre.text = genre.strip() genre = etree.SubElement(tv_node, 'Genre') genre.text = '|'.join([x.strip() for x in my_show['genre'].split('|') if x.strip()]) if getattr(my_show, 'network', None): studios = etree.SubElement(tv_node, 'Studios') studio = etree.SubElement(studios, 'Studio') studio.text = my_show['network'] if getattr(my_show, '_actors', None): persons = etree.SubElement(tv_node, 'Persons') for actor in my_show['_actors']: if not ('name' in actor and actor['name'].strip()): continue cur_actor = etree.SubElement(persons, 'Person') cur_actor_name = etree.SubElement(cur_actor, 'Name') cur_actor_name.text = actor['name'].strip() cur_actor_type = etree.SubElement(cur_actor, 'Type') cur_actor_type.text = 'Actor' if 'role' in actor and actor['role'].strip(): cur_actor_role = etree.SubElement(cur_actor, 'Role') cur_actor_role.text = actor['role'].strip() helpers.indentXML(tv_node) data = etree.ElementTree(tv_node) return data
def _show_data(self, show_obj): """ Creates an elementTree XML structure for an XBMC-style tvshow.nfo and returns the resulting data object. show_obj: a TVShow instance to create the NFO for """ show_ID = show_obj.tvdbid tvdb_lang = show_obj.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 t = tvdb_api.Tvdb(actors=True, **ltvdb_api_parms) tv_node = etree.Element("tvshow") for ns in XML_NSMAP.keys(): tv_node.set(ns, XML_NSMAP[ns]) try: myShow = t[int(show_ID)] except tvdb_exceptions.tvdb_shownotfound: logger.log(u"Unable to find show with id " + str(show_ID) + " on tvdb, skipping it", logger.ERROR) raise except tvdb_exceptions.tvdb_error: logger.log(u"TVDB is down, can't use its data to add this show", logger.ERROR) raise # check for title and id try: if myShow["seriesname"] == None or myShow["seriesname"] == "" or myShow["id"] == None or myShow["id"] == "": logger.log(u"Incomplete info for show with id " + str(show_ID) + " on tvdb, skipping it", logger.ERROR) return False except tvdb_exceptions.tvdb_attributenotfound: logger.log(u"Incomplete info for show with id " + str(show_ID) + " on tvdb, skipping it", logger.ERROR) return False title = etree.SubElement(tv_node, "title") if myShow["seriesname"] != None: title.text = myShow["seriesname"] rating = etree.SubElement(tv_node, "rating") if myShow["rating"] != None: rating.text = myShow["rating"] plot = etree.SubElement(tv_node, "plot") if myShow["overview"] != None: plot.text = myShow["overview"] episodeguide = etree.SubElement(tv_node, "episodeguide") episodeguideurl = etree.SubElement( episodeguide, "url") episodeguideurl2 = etree.SubElement(tv_node, "episodeguideurl") if myShow["id"] != None: showurl = sickbeard.TVDB_BASE_URL + '/series/' + myShow["id"] + '/all/en.zip' episodeguideurl.text = showurl episodeguideurl2.text = showurl mpaa = etree.SubElement(tv_node, "mpaa") if myShow["contentrating"] != None: mpaa.text = myShow["contentrating"] tvdbid = etree.SubElement(tv_node, "id") if myShow["id"] != None: tvdbid.text = myShow["id"] genre = etree.SubElement(tv_node, "genre") if myShow["genre"] != None: genre.text = " / ".join([x for x in myShow["genre"].split('|') if x]) premiered = etree.SubElement(tv_node, "premiered") if myShow["firstaired"] != None: premiered.text = myShow["firstaired"] studio = etree.SubElement(tv_node, "studio") if myShow["network"] != None: studio.text = myShow["network"] for actor in myShow['_actors']: cur_actor = etree.SubElement(tv_node, "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 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(tv_node) data = etree.ElementTree(tv_node) return data
def _show_data(self, show_obj): """ Creates an elementTree XML structure for an XBMC-style tvshow.nfo and returns the resulting data object. show_obj: a TVShow instance to create the NFO for """ show_ID = show_obj.tvdbid tvdb_lang = show_obj.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 if show_obj.dvdorder != 0: ltvdb_api_parms['dvdorder'] = True t = tvdb_api.Tvdb(actors=True, **ltvdb_api_parms) tv_node = etree.Element("tvshow") try: myShow = t[int(show_ID)] except tvdb_exceptions.tvdb_shownotfound: logger.log( u"Unable to find show with id " + str(show_ID) + " on tvdb, skipping it", logger.ERROR) raise except tvdb_exceptions.tvdb_error: logger.log(u"TVDB is down, can't use its data to add this show", logger.ERROR) raise # check for title and id try: if myShow["seriesname"] == None or myShow[ "seriesname"] == "" or myShow["id"] == None or myShow[ "id"] == "": logger.log( u"Incomplete info for show with id " + str(show_ID) + " on tvdb, skipping it", logger.ERROR) return False except tvdb_exceptions.tvdb_attributenotfound: logger.log( u"Incomplete info for show with id " + str(show_ID) + " on tvdb, skipping it", logger.ERROR) return False title = etree.SubElement(tv_node, "title") if myShow["seriesname"] != None: title.text = myShow["seriesname"] rating = etree.SubElement(tv_node, "rating") if myShow["rating"] != None: rating.text = myShow["rating"] year = etree.SubElement(tv_node, "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(tv_node, "plot") if myShow["overview"] != None: plot.text = myShow["overview"] episodeguide = etree.SubElement(tv_node, "episodeguide") episodeguideurl = etree.SubElement(episodeguide, "url") episodeguideurl2 = etree.SubElement(tv_node, "episodeguideurl") if myShow["id"] != None: showurl = sickbeard.TVDB_BASE_URL + '/series/' + myShow[ "id"] + '/all/en.zip' episodeguideurl.text = showurl episodeguideurl2.text = showurl mpaa = etree.SubElement(tv_node, "mpaa") if myShow["contentrating"] != None: mpaa.text = myShow["contentrating"] tvdbid = etree.SubElement(tv_node, "id") if myShow["id"] != None: tvdbid.text = myShow["id"] genre = etree.SubElement(tv_node, "genre") if myShow["genre"] != None: genre.text = " / ".join( [x for x in myShow["genre"].split('|') if x]) premiered = etree.SubElement(tv_node, "premiered") if myShow["firstaired"] != None: premiered.text = myShow["firstaired"] studio = etree.SubElement(tv_node, "studio") if myShow["network"] != None: studio.text = myShow["network"] for actor in myShow['_actors']: cur_actor = etree.SubElement(tv_node, "actor") cur_actor_name = etree.SubElement(cur_actor, "name") cur_actor_name.text = actor['name'].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(tv_node) data = etree.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 # There's gotta be a better way of doing this but we don't wanna # change the language value elsewhere l_indexer_api_params = sickbeard.indexerApi(ep_obj.show.indexer).api_params.copy() l_indexer_api_params[b'actors'] = True if indexer_lang and not indexer_lang == sickbeard.INDEXER_DEFAULT_LANGUAGE: l_indexer_api_params[b'language'] = indexer_lang if ep_obj.show.dvdorder != 0: l_indexer_api_params[b'dvdorder'] = True try: t = sickbeard.indexerApi(ep_obj.show.indexer).indexer(**l_indexer_api_params) my_show = t[ep_obj.show.indexerid] except sickbeard.indexer_shownotfound as e: raise ShowNotFoundException(e.message) except sickbeard.indexer_error: logger.log(u'Unable to connect to {indexer} while creating meta files - skipping it.'.format (indexer=sickbeard.indexerApi(ep_obj.show.indexer).name), logger.WARNING) return if len(eps_to_write) > 1: root_node = etree.Element('kodimultiepisode') else: root_node = etree.Element('episodedetails') # write an NFO containing info for all matching episodes for ep_to_write in eps_to_write: try: my_ep = my_show[ep_to_write.season][ep_to_write.episode] except (sickbeard.indexer_episodenotfound, sickbeard.indexer_seasonnotfound): logger.log(u'Unable to find episode {ep_num} on {indexer}... ' u'has it been removed? Should I delete from db?'.format (ep_num=episode_num(ep_to_write.season, ep_to_write.episode), indexer=sickbeard.indexerApi(ep_obj.show.indexer).name)) return None if not getattr(my_ep, 'firstaired', None): my_ep['firstaired'] = str(datetime.date.fromordinal(1)) if not getattr(my_ep, 'episodename', None): logger.log(u'Not generating nfo because the ep has no title', logger.DEBUG) return None logger.log(u'Creating metadata for episode {ep_num}'.format (ep_num=episode_num(ep_obj.season, ep_obj.episode)), logger.DEBUG) if len(eps_to_write) > 1: episode = etree.SubElement(root_node, 'episodedetails') else: episode = root_node if getattr(my_ep, 'episodename', None): title = etree.SubElement(episode, 'title') title.text = my_ep['episodename'] if getattr(my_show, 'seriesname', None): showtitle = etree.SubElement(episode, 'showtitle') showtitle.text = my_show['seriesname'] season = etree.SubElement(episode, 'season') season.text = str(ep_to_write.season) episodenum = etree.SubElement(episode, 'episode') episodenum.text = str(ep_to_write.episode) uniqueid = etree.SubElement(episode, 'uniqueid') uniqueid.text = str(ep_to_write.indexerid) if ep_to_write.airdate != datetime.date.fromordinal(1): aired = etree.SubElement(episode, 'aired') aired.text = str(ep_to_write.airdate) if getattr(my_ep, 'overview', None): plot = etree.SubElement(episode, 'plot') plot.text = my_ep['overview'] if ep_to_write.season and getattr(my_show, 'runtime', None): runtime = etree.SubElement(episode, 'runtime') runtime.text = my_show['runtime'] if getattr(my_ep, 'airsbefore_season', None): displayseason = etree.SubElement(episode, 'displayseason') displayseason.text = my_ep['airsbefore_season'] if getattr(my_ep, 'airsbefore_episode', None): displayepisode = etree.SubElement(episode, 'displayepisode') displayepisode.text = my_ep['airsbefore_episode'] if getattr(my_ep, 'filename', None): thumb = etree.SubElement(episode, 'thumb') thumb.text = my_ep['filename'].strip() # watched = etree.SubElement(episode, 'watched') # watched.text = 'false' if getattr(my_ep, 'rating', None): rating = etree.SubElement(episode, 'rating') rating.text = my_ep['rating'] if getattr(my_ep, 'writer', None) and isinstance(my_ep['writer'], basestring): for writer in self._split_info(my_ep['writer']): cur_writer = etree.SubElement(episode, 'credits') cur_writer.text = writer if getattr(my_ep, 'director', None) and isinstance(my_ep['director'], basestring): for director in self._split_info(my_ep['director']): cur_director = etree.SubElement(episode, 'director') cur_director.text = director if getattr(my_ep, 'gueststars', None) and isinstance(my_ep['gueststars'], basestring): for actor in self._split_info(my_ep['gueststars']): cur_actor = etree.SubElement(episode, 'actor') cur_actor_name = etree.SubElement(cur_actor, 'name') cur_actor_name.text = actor if getattr(my_show, '_actors', None): for actor in my_show['_actors']: cur_actor = etree.SubElement(episode, 'actor') if 'name' in actor and actor['name'].strip(): cur_actor_name = etree.SubElement(cur_actor, 'name') cur_actor_name.text = actor['name'].strip() else: continue if 'role' in actor and actor['role'].strip(): cur_actor_role = etree.SubElement(cur_actor, 'role') cur_actor_role.text = actor['role'].strip() if 'image' in actor and actor['image'].strip(): cur_actor_thumb = etree.SubElement(cur_actor, 'thumb') cur_actor_thumb.text = actor['image'].strip() # Make it purdy helpers.indentXML(root_node) data = etree.ElementTree(root_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 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 as e: raise 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 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 (sickbeard.indexer_episodenotfound, sickbeard.indexer_seasonnotfound): logger.log( u"Unable to find episode %dx%d on %s... has it been removed? Should I delete from db?" % (curEpToWrite.season, curEpToWrite.episode, sickbeard.indexerApi(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['firstaired'] = str(datetime.date.fromordinal(1)) if not (getattr(myEp, 'episodename', None) and getattr(myEp, 'firstaired', None)): return None episode = movie if curEpToWrite.name: EpisodeName = etree.SubElement(episode, "title") EpisodeName.text = curEpToWrite.name SeasonNumber = etree.SubElement(episode, "season") SeasonNumber.text = str(curEpToWrite.season) EpisodeNumber = etree.SubElement(episode, "episode") EpisodeNumber.text = str(curEpToWrite.episode) if getattr(myShow, "firstaired", None): try: year_text = str( datetime.datetime.strptime(myShow["firstaired"], dateFormat).year) if year_text: year = etree.SubElement(episode, "year") year.text = year_text except Exception: pass if getattr(myShow, "overview", None): plot = etree.SubElement(episode, "plot") plot.text = myShow["overview"] if curEpToWrite.description: Overview = etree.SubElement(episode, "episodeplot") Overview.text = curEpToWrite.description if getattr(myShow, 'contentrating', None): mpaa = etree.SubElement(episode, "mpaa") mpaa.text = myShow["contentrating"] if not ep_obj.relatedEps and getattr(myEp, "rating", None): try: rating = int((float(myEp['rating']) * 10)) except ValueError: rating = 0 if rating: Rating = etree.SubElement(episode, "rating") Rating.text = str(rating) if getattr(myEp, 'director', None): director = etree.SubElement(episode, "director") director.text = myEp['director'] if getattr(myEp, 'writer', None): writer = etree.SubElement(episode, "credits") writer.text = myEp['writer'] if getattr(myShow, '_actors', None) or getattr( myEp, 'gueststars', None): cast = etree.SubElement(episode, "cast") if getattr(myEp, 'gueststars', None) and isinstance( myEp['gueststars'], basestring): for actor in (x.strip() for x in myEp['gueststars'].split('|') if x.strip()): cur_actor = etree.SubElement(cast, "actor") cur_actor.text = actor if getattr(myShow, '_actors', None): for actor in myShow['_actors']: if 'name' in actor and actor['name'].strip(): cur_actor = etree.SubElement(cast, "actor") cur_actor.text = actor['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 helpers.indentXML(rootNode) data = etree.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 lINDEXER_API_PARMS = sickbeard.indexerApi( show_obj.indexer).api_params.copy() lINDEXER_API_PARMS['actors'] = True if indexer_lang and not indexer_lang == 'en': lINDEXER_API_PARMS['language'] = indexer_lang if show_obj.dvdorder != 0: lINDEXER_API_PARMS['dvdorder'] = True t = sickbeard.indexerApi( show_obj.indexer).indexer(**lINDEXER_API_PARMS) rootNode = etree.Element("details") tv_node = etree.SubElement(rootNode, "movie") tv_node.attrib["isExtra"] = "false" tv_node.attrib["isSet"] = "false" tv_node.attrib["isTV"] = "true" try: myShow = t[int(show_obj.indexerid)] except sickbeard.indexer_shownotfound: logger.log( u"Unable to find show with id " + str(show_obj.indexerid) + " on tvdb, skipping it", logger.ERROR) raise except sickbeard.indexer_error: logger.log(u"TVDB is down, can't use its data to make the NFO", logger.ERROR) raise # check for title and id try: if myShow['seriesname'] == None or myShow[ 'seriesname'] == "" or myShow['id'] == None or myShow[ 'id'] == "": logger.log( u"Incomplete info for show with id " + str(show_obj.indexerid) + " on tvdb, skipping it", logger.ERROR) return False except sickbeard.indexer_attributenotfound: logger.log( u"Incomplete info for show with id " + str(show_obj.indexerid) + " on tvdb, skipping it", logger.ERROR) return False SeriesName = etree.SubElement(tv_node, "title") if myShow['seriesname'] != None: SeriesName.text = myShow['seriesname'] else: SeriesName.text = "" Genres = etree.SubElement(tv_node, "genres") if myShow["genre"] != None: for genre in myShow['genre'].split('|'): if genre and genre.strip(): cur_genre = etree.SubElement(Genres, "Genre") cur_genre.text = genre.strip() FirstAired = etree.SubElement(tv_node, "premiered") if myShow['firstaired'] != None: FirstAired.text = myShow['firstaired'] year = etree.SubElement(tv_node, "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 if myShow['rating'] != None: try: rating = int((float(myShow['rating']) * 10)) except ValueError: rating = 0 Rating = etree.SubElement(tv_node, "rating") rating_text = str(rating) if rating_text != None: Rating.text = rating_text Status = etree.SubElement(tv_node, "status") if myShow['status'] != None: Status.text = myShow['status'] mpaa = etree.SubElement(tv_node, "mpaa") if myShow["contentrating"] != None: mpaa.text = myShow["contentrating"] IMDB_ID = etree.SubElement(tv_node, "id") if myShow['imdb_id'] != None: IMDB_ID.attrib["moviedb"] = "imdb" IMDB_ID.text = myShow['imdb_id'] indexerid = etree.SubElement(tv_node, "indexerid") if myShow['id'] != None: indexerid.text = myShow['id'] Runtime = etree.SubElement(tv_node, "runtime") if myShow['runtime'] != None: Runtime.text = myShow['runtime'] cast = etree.SubElement(tv_node, "cast") if getattr(myShow, '_actors', None) is not None: for actor in myShow['_actors']: cur_actor_name_text = actor['name'] if cur_actor_name_text != None and cur_actor_name_text.strip(): cur_actor = etree.SubElement(cast, "actor") cur_actor.text = cur_actor_name_text.strip() helpers.indentXML(rootNode) data = etree.ElementTree(rootNode) return data
def _show_data(self, show_obj): """ Creates an elementTree XML structure for a Mede8er-style Series.xml returns the resulting data object. show_obj: a TVShow instance to create the XML-NFO for """ logger.log("Mede8er: Starting Mede8er _show_data method", logger.MESSAGE) tvdb_lang = show_obj.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 t = tvdb_api.Tvdb(actors=True, **ltvdb_api_parms) rootNode = etree.Element("details") tv_node = etree.SubElement(rootNode, "movie") # tv_node = etree.Element("movie") tv_node.attrib["isExtra"] = "false" tv_node.attrib["isSet"] = "false" tv_node.attrib["isTV"] = "true" for ns in XML_NSMAP.keys(): tv_node.set(ns, XML_NSMAP[ns]) try: myShow = t[int(show_obj.tvdbid)] except tvdb_exceptions.tvdb_shownotfound: logger.log( "Mede8er: Unable to find show with id " + str(show_obj.tvdbid) + " on tvdb, skipping it", logger.ERROR ) raise except tvdb_exceptions.tvdb_error: logger.log("Mede8er: TVDB is down, can't use its data to make the XML-NFO", logger.ERROR) raise # check for title and id try: if myShow["seriesname"] == None or myShow["seriesname"] == "" or myShow["id"] == None or myShow["id"] == "": logger.log( "Mede8er: Incomplete info for show with id " + str(show_obj.tvdbid) + " on tvdb, skipping it", logger.ERROR, ) return False except tvdb_exceptions.tvdb_attributenotfound: logger.log( "Mede8er: Incomplete info for show with id " + str(show_obj.tvdbid) + " on tvdb, skipping it", logger.ERROR, ) return False title = etree.SubElement(tv_node, "title") if myShow["seriesname"] != None: title.text = myShow["seriesname"] tvdbid = etree.SubElement(tv_node, "tvdbid") if myShow["id"] != None: tvdbid.text = myShow["id"] seriesID = etree.SubElement(tv_node, "seriesID") if myShow["seriesid"] != None: seriesID.text = myShow["seriesid"] imdbid = etree.SubElement(tv_node, "imdbid") if myShow["imdb_id"] != None: imdbid.text = myShow["imdb_id"] zap2id = etree.SubElement(tv_node, "zap2itid") if myShow["zap2it_id"] != None: zap2id.text = myShow["zap2it_id"] premiered = etree.SubElement(tv_node, "releasedate") if myShow["firstaired"] != None: premiered.text = myShow["firstaired"] rating = etree.SubElement(tv_node, "rating") if myShow["rating"] != None: rating.text = myShow["rating"] ratingcount = etree.SubElement(tv_node, "ratingcount") if myShow["ratingcount"] != None: ratingcount.text = myShow["ratingcount"] network = etree.SubElement(tv_node, "network") if myShow["network"] != None: network.text = myShow["network"] Runtime = etree.SubElement(tv_node, "runtime") if myShow["runtime"] != None: Runtime.text = myShow["runtime"] genre = etree.SubElement(tv_node, "genre") if myShow["genre"] != None: genre.text = myShow["genre"] # tmpNode = etree.SubElement(tv_node, "myShow") # tmpNode.text = str(vars(myShow)) # logger.log("Printing myShow info: " + str(vars(myShow)), logger.MESSAGE) # Actors = etree.SubElement(tv_node, "Actors") # if myShow["actors"] != None: # Actors.text = myShow["actors"] rating = etree.SubElement(tv_node, "certification") if myShow["contentrating"] != None: rating.text = myShow["contentrating"] Overview = etree.SubElement(tv_node, "plot") if myShow["overview"] != None: Overview.text = myShow["overview"] cast = etree.SubElement(tv_node, "cast") for actor in myShow["_actors"]: cast_actor = etree.SubElement(cast, "actor") cast_actor.text = actor["name"] rating = etree.SubElement(tv_node, "Status") if myShow["status"] != None: rating.text = myShow["status"] cover = etree.SubElement(tv_node, "cover") poster = etree.SubElement(cover, "name") if myShow["poster"] != None: poster.text = myShow["poster"] backdrop = etree.SubElement(tv_node, "backdrop") fanart = etree.SubElement(backdrop, "name") if myShow["fanart"] != None: fanart.text = myShow["fanart"] helpers.indentXML(tv_node) data = etree.ElementTree(tv_node) 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 = {'indexer': show_obj.indexer} lINDEXER_API_PARMS['actors'] = True if indexer_lang and not indexer_lang == 'en': lINDEXER_API_PARMS['language'] = indexer_lang if show_obj.dvdorder != 0: lINDEXER_API_PARMS['dvdorder'] = True t = indexer_api.indexerApi(**lINDEXER_API_PARMS) tv_node = etree.Element("Series") try: myShow = t[int(show_obj.indexerid)] except indexer_exceptions.indexer_shownotfound: logger.log(u"Unable to find show with id " + str(show_obj.indexerid) + " on " + show_obj.indexer + ", skipping it", logger.ERROR) raise except indexer_exceptions.indexer_error: logger.log(u"" + show_obj.indexer + " is down, can't use its data to make the NFO", logger.ERROR) raise # check for title and id if getattr(myShow, 'seriesname', None) is None or getattr(myShow, 'id', None) is None: logger.log(u"Incomplete info for show with id " + str(show_obj.indexerid) + " on " + show_obj.indexer + ", skipping it", logger.ERROR) return False indexerid = etree.SubElement(tv_node, "id") if getattr(myShow, 'id', None) is not None: indexerid.text = myShow['id'] indexer = etree.SubElement(tv_node, "indexer") if show_obj.indexer != None: indexer.text = show_obj.indexer SeriesName = etree.SubElement(tv_node, "SeriesName") if getattr(myShow, 'seriesname', None) is not None: SeriesName.text = myShow['seriesname'] Status = etree.SubElement(tv_node, "Status") if getattr(myShow, 'status', None) is not None: Status.text = myShow['status'] Network = etree.SubElement(tv_node, "Network") if getattr(myShow, 'network', None) is not None: Network.text = myShow['network'] Airs_Time = etree.SubElement(tv_node, "Airs_Time") if getattr(myShow, 'airs_time', None) is not None: Airs_Time.text = myShow['airs_time'] Airs_DayOfWeek = etree.SubElement(tv_node, "Airs_DayOfWeek") if getattr(myShow, 'airs_dayofweek', None) is not None: Airs_DayOfWeek.text = myShow['airs_dayofweek'] FirstAired = etree.SubElement(tv_node, "FirstAired") if getattr(myShow, 'firstaired', None) is not None: FirstAired.text = myShow['firstaired'] ContentRating = etree.SubElement(tv_node, "ContentRating") MPAARating = etree.SubElement(tv_node, "MPAARating") certification = etree.SubElement(tv_node, "certification") if getattr(myShow, 'contentrating', None) is not None: ContentRating.text = myShow['contentrating'] MPAARating.text = myShow['contentrating'] certification.text = myShow['contentrating'] MetadataType = etree.SubElement(tv_node, "Type") MetadataType.text = "Series" Overview = etree.SubElement(tv_node, "Overview") if getattr(myShow, 'overview', None) is not None: Overview.text = myShow['overview'] PremiereDate = etree.SubElement(tv_node, "PremiereDate") if getattr(myShow, 'firstaired', None) is not None: PremiereDate.text = myShow['firstaired'] Rating = etree.SubElement(tv_node, "Rating") if getattr(myShow, 'rating', None) is not None: Rating.text = myShow['rating'] ProductionYear = etree.SubElement(tv_node, "ProductionYear") if getattr(myShow, 'firstaired', None) is not None: try: year_text = str(datetime.datetime.strptime(myShow['firstaired'], '%Y-%m-%d').year) if year_text: ProductionYear.text = year_text except: pass RunningTime = etree.SubElement(tv_node, "RunningTime") Runtime = etree.SubElement(tv_node, "Runtime") if getattr(myShow, 'runtime', None) is not None: RunningTime.text = myShow['runtime'] Runtime.text = myShow['runtime'] IMDB_ID = etree.SubElement(tv_node, "IMDB_ID") IMDB = etree.SubElement(tv_node, "IMDB") IMDbId = etree.SubElement(tv_node, "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'] Zap2ItId = etree.SubElement(tv_node, "Zap2ItId") if getattr(myShow, 'zap2it_id', None) is not None: Zap2ItId.text = myShow['zap2it_id'] Genres = etree.SubElement(tv_node, "Genres") for genre in myShow['genre'].split('|'): if genre: cur_genre = etree.SubElement(Genres, "Genre") cur_genre.text = genre Genre = etree.SubElement(tv_node, "Genre") if getattr(myShow, 'genre', None) is not None: Genre.text = "|".join([x for x in myShow["genre"].split('|') if x]) Studios = etree.SubElement(tv_node, "Studios") Studio = etree.SubElement(Studios, "Studio") if getattr(myShow, 'network', None) is not None: Studio.text = myShow['network'] Persons = etree.SubElement(tv_node, "Persons") if getattr(myShow, 'actors', None) is not None: for actor in myShow['_actors']: cur_actor = etree.SubElement(Persons, "Person") cur_actor_name = etree.SubElement(cur_actor, "Name") cur_actor_name.text = actor['name'].strip() cur_actor_type = etree.SubElement(cur_actor, "Type") cur_actor_type.text = "Actor" 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 helpers.indentXML(tv_node) data = etree.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 = {} 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 _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 """ tvdb_lang = show_obj.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 t = tvdb_api.Tvdb(actors=True, **ltvdb_api_parms) rootNode = etree.Element("details") tv_node = etree.SubElement(rootNode, "movie") tv_node.attrib["isExtra"] = "false" tv_node.attrib["isSet"] = "false" tv_node.attrib["isTV"] = "true" try: myShow = t[int(show_obj.tvdbid)] except tvdb_exceptions.tvdb_shownotfound: logger.log(u"Unable to find show with id " + str(show_obj.tvdbid) + " on tvdb, skipping it", logger.ERROR) raise except tvdb_exceptions.tvdb_error: logger.log(u"TVDB is down, can't use its data to make the NFO", logger.ERROR) raise # check for title and id try: if myShow['seriesname'] == None or myShow['seriesname'] == "" or myShow['id'] == None or myShow['id'] == "": logger.log(u"Incomplete info for show with id " + str(show_obj.tvdbid) + " on tvdb, skipping it", logger.ERROR) return False except tvdb_exceptions.tvdb_attributenotfound: logger.log(u"Incomplete info for show with id " + str(show_obj.tvdbid) + " on tvdb, skipping it", logger.ERROR) return False SeriesName = etree.SubElement(tv_node, "title") if myShow['seriesname'] != None: SeriesName.text = myShow['seriesname'] else: SeriesName.text = "" Genres = etree.SubElement(tv_node, "genres") if myShow["genre"] != None: for genre in myShow['genre'].split('|'): if genre and genre.strip(): cur_genre = etree.SubElement(Genres, "Genre") cur_genre.text = genre.strip() FirstAired = etree.SubElement(tv_node, "premiered") if myShow['firstaired'] != None: FirstAired.text = myShow['firstaired'] year = etree.SubElement(tv_node, "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 if myShow['rating'] != None: try: rating = int((float(myShow['rating']) * 10)) except ValueError: rating = 0 Rating = etree.SubElement(tv_node, "rating") rating_text = str(rating) if rating_text != None: Rating.text = rating_text Status = etree.SubElement(tv_node, "status") if myShow['status'] != None: Status.text = myShow['status'] mpaa = etree.SubElement(tv_node, "mpaa") if myShow["contentrating"] != None: mpaa.text = myShow["contentrating"] IMDB_ID = etree.SubElement(tv_node, "id") if myShow['imdb_id'] != None: IMDB_ID.attrib["moviedb"] = "imdb" IMDB_ID.text = myShow['imdb_id'] tvdbid = etree.SubElement(tv_node, "tvdbid") if myShow['id'] != None: tvdbid.text = myShow['id'] Runtime = etree.SubElement(tv_node, "runtime") if myShow['runtime'] != None: Runtime.text = myShow['runtime'] cast = etree.SubElement(tv_node, "cast") if myShow["_actors"] != None: for actor in myShow['_actors']: cur_actor_name_text = actor['name'] if cur_actor_name_text != None and cur_actor_name_text.strip(): cur_actor = etree.SubElement(cast, "actor") cur_actor.text = cur_actor_name_text.strip() helpers.indentXML(rootNode) data = etree.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 """ tv_node = etree.Element("tvshow") myShow = sickchill.indexer.series(show_obj) if not myShow: logger.log("Unable to find show with id {} on {}, skipping it".format( show_obj.indexerid, show_obj.idxr.name)) return False # check for title and id if not (getattr(myShow, 'seriesName', None) and getattr(myShow, 'id', None)): logger.log("Incomplete info for show with id {} on {}, skipping it".format( show_obj.indexerid, show_obj.idxr.name)) return False title = etree.SubElement(tv_node, "title") title.text = myShow.seriesName if getattr(myShow, 'rating', None): mpaa = etree.SubElement(tv_node, "mpaa") mpaa.text = str(myShow.rating) if getattr(myShow, 'siteRating', None): rating = etree.SubElement(tv_node, "rating") rating.text = str(myShow.siteRating) if getattr(myShow, 'firstAired', None): try: year_text = str(datetime.datetime.strptime(myShow.firstAired, dateFormat).year) if year_text: year = etree.SubElement(tv_node, "year") year.text = year_text except Exception: pass if getattr(myShow, 'overview', None): plot = etree.SubElement(tv_node, "plot") plot.text = myShow.overview if getattr(myShow, 'id', None): episodeguide = etree.SubElement(tv_node, "episodeguide") episodeguideurl = etree.SubElement(episodeguide, "url") episodeguideurl.attrib = {'post': 'yes', 'cache': 'auth.json'} episodeguideurl.text = show_obj.idxr.episode_guide_url(show_obj) indexerid = etree.SubElement(tv_node, "id") indexerid.text = str(myShow.id) indexerid = etree.SubElement(tv_node, "tvdbid") indexerid.text = str(myShow.id) if getattr(myShow, 'genre', None) and isinstance(myShow.genre, list): for genre in myShow.genre: cur_genre = etree.SubElement(tv_node, "genre") cur_genre.text = genre if show_obj.imdb_info.get('country_codes'): for country in self._split_info(show_obj.imdb_info['country_codes']): try: cur_country_name = Country(country.upper()).name.title() except Exception: continue cur_country = etree.SubElement(tv_node, "country") cur_country.text = cur_country_name if getattr(myShow, 'firstAired', None): premiered = etree.SubElement(tv_node, "premiered") premiered.text = myShow.firstAired if getattr(myShow, 'network', None): studio = etree.SubElement(tv_node, "studio") studio.text = myShow.network.strip() data = show_obj.idxr.actors(myShow) if data: for actor in data: cur_actor = etree.SubElement(tv_node, "actor") if 'name' in actor and actor['name'].strip(): cur_actor_name = etree.SubElement(cur_actor, "name") cur_actor_name.text = actor['name'].strip() else: continue if 'role' in actor and actor['role'].strip(): cur_actor_role = etree.SubElement(cur_actor, "role") cur_actor_role.text = actor['role'].strip() if 'image' in actor and actor['image'].strip(): cur_actor_thumb = etree.SubElement(cur_actor, "thumb") cur_actor_thumb.text = show_obj.idxr.complete_image_url(actor['image']) # Make it purdy helpers.indentXML(tv_node) data = etree.ElementTree(tv_node) 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 = sickbeard.indexerApi(show_obj.indexer).api_params.copy() lINDEXER_API_PARMS['actors'] = True if indexer_lang and not indexer_lang == sickbeard.INDEXER_DEFAULT_LANGUAGE: lINDEXER_API_PARMS['language'] = indexer_lang if show_obj.dvdorder != 0: lINDEXER_API_PARMS['dvdorder'] = True t = sickbeard.indexerApi(show_obj.indexer).indexer(**lINDEXER_API_PARMS) tv_node = etree.Element("tvshow") try: myShow = t[int(show_ID)] except sickbeard.indexer_shownotfound: logger.log(u"Unable to find show with id " + str(show_ID) + " on " + sickbeard.indexerApi( show_obj.indexer).name + ", skipping it", logger.ERROR) raise except sickbeard.indexer_error: logger.log( u"" + sickbeard.indexerApi(show_obj.indexer).name + " is down, can't use its data to add this show", logger.ERROR) raise # check for title and id if getattr(myShow, 'seriesname', None) is None or getattr(myShow, 'id', None) is None: logger.log(u"Incomplete info for show with id " + str(show_ID) + " on " + sickbeard.indexerApi( show_obj.indexer).name + ", skipping it", logger.ERROR) return False title = etree.SubElement(tv_node, "title") if getattr(myShow, 'seriesname', None) is not None: title.text = myShow["seriesname"] rating = etree.SubElement(tv_node, "rating") if getattr(myShow, 'rating', None) is not None: rating.text = myShow["rating"] year = etree.SubElement(tv_node, "year") if getattr(myShow, 'firstaired', None) is not None: try: year_text = str(datetime.datetime.strptime(myShow["firstaired"], dateFormat).year) if year_text: year.text = year_text except: pass plot = etree.SubElement(tv_node, "plot") if getattr(myShow, 'overview', None) is not None: plot.text = myShow["overview"] episodeguide = etree.SubElement(tv_node, "episodeguide") episodeguideurl = etree.SubElement(episodeguide, "url") if getattr(myShow, 'id', None) is not None: episodeguideurl.text = sickbeard.indexerApi(show_obj.indexer).config['base_url'] + str(myShow["id"]) + '/all/en.zip' mpaa = etree.SubElement(tv_node, "mpaa") if getattr(myShow, 'contentrating', None) is not None: mpaa.text = myShow["contentrating"] indexerid = etree.SubElement(tv_node, "id") if getattr(myShow, 'id', None) is not None: indexerid.text = str(myShow["id"]) genre = etree.SubElement(tv_node, "genre") if getattr(myShow, 'genre', None) is not None: if isinstance(myShow["genre"], basestring): genre.text = " / ".join(x.strip() for x in myShow["genre"].split('|') if x.strip()) premiered = etree.SubElement(tv_node, "premiered") if getattr(myShow, 'firstaired', None) is not None: premiered.text = myShow["firstaired"] studio = etree.SubElement(tv_node, "studio") if getattr(myShow, 'network', None) is not None: studio.text = myShow["network"] if getattr(myShow, '_actors', None) is not None: for actor in myShow['_actors']: cur_actor = etree.SubElement(tv_node, "actor") cur_actor_name = etree.SubElement(cur_actor, "name") if getattr(actor, 'name', None) is not None: cur_actor_name.text = actor['name'].strip() cur_actor_role = etree.SubElement(cur_actor, "role") if getattr(actor, 'role', None) is not None: cur_actor_role.text = actor['role'] cur_actor_thumb = etree.SubElement(cur_actor, "thumb") if getattr(actor, 'image', None) is not None: cur_actor_thumb.text = actor['image'] # Make it purdy helpers.indentXML(tv_node) data = etree.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 myShow = ep_obj.idxr.series_from_episode(ep_obj) if not myShow: logger.log("Unable to find {} on {} while creating meta files, skipping".format( ep_obj.show.indexerid, ep_obj.idxr.name), logger.INFO) return if len(eps_to_write) > 1: rootNode = etree.Element("kodimultiepisode") else: rootNode = etree.Element("episodedetails") # write an NFO containing info for all matching episodes for curEpToWrite in eps_to_write: myEp = curEpToWrite.idxr.episode(curEpToWrite) if not myEp: logger.log("Metadata writer is unable to find episode {0:d}x{1:d} of {2} on {3}..." "has it been removed? Should I delete from db?".format( curEpToWrite.season, curEpToWrite.episode, curEpToWrite.show.name, ep_obj.idxr.name)) return None if str(ep_obj.airdate) != str(datetime.date.fromordinal(1)) and not myEp.get('firstAired'): myEp["firstAired"] = str(ep_obj.airdate) if not myEp.get('episodeName'): logger.log("Not generating nfo because the ep has no title", logger.DEBUG) return None if not myEp.get('firstAired'): logger.log("Not generating nfo because the ep has no airdate", logger.DEBUG) return None logger.log("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 if myEp.get('episodeName'): title = etree.SubElement(episode, "title") title.text = myEp['episodeName'] if getattr(myShow, 'seriesName', None): showtitle = etree.SubElement(episode, "showtitle") showtitle.text = myShow.seriesName season = etree.SubElement(episode, "season") season.text = str(curEpToWrite.season) episodenum = etree.SubElement(episode, "episode") episodenum.text = str(curEpToWrite.episode) if myEp.get('id'): uniqueid = etree.SubElement(episode, "uniqueid") uniqueid.text = str(myEp['id']) if curEpToWrite.airdate != datetime.date.fromordinal(1): aired = etree.SubElement(episode, "aired") aired.text = str(curEpToWrite.airdate) if myEp.get('overview'): plot = etree.SubElement(episode, "plot") plot.text = myEp['overview'] if curEpToWrite.season and getattr(myShow, 'runtime', None): runtime = etree.SubElement(episode, "runtime") runtime.text = myShow.runtime if myEp.get('airedSeason'): displayseason = etree.SubElement(episode, "displayseason") displayseason.text = str(myEp['airedSeason']) if myEp.get('airedEpisodeNumber'): displayepisode = etree.SubElement(episode, "displayepisode") displayepisode.text = str(myEp['airedEpisodeNumber']) if myEp.get('filename'): thumb = etree.SubElement(episode, "thumb") thumb.text = ep_obj.idxr.complete_image_url(myEp['filename']) if myEp.get('rating') is not None: rating = etree.SubElement(episode, "rating") rating.text = str(myEp['rating']) if myEp.get('writers') and isinstance(myEp['writers'], list): for writer in myEp['writers']: cur_writer = etree.SubElement(episode, "credits") cur_writer.text = writer if myEp.get('directors') and isinstance(myEp['directors'], list): for director in myEp['directors']: cur_director = etree.SubElement(episode, "director") cur_director.text = director if myEp.get('guestStars') and isinstance(myEp['guestStars'], list): for actor in myEp['guestStars']: cur_actor = etree.SubElement(episode, "actor") cur_actor_name = etree.SubElement(cur_actor, "name") cur_actor_name.text = actor for actor in ep_obj.idxr.actors(myShow): cur_actor = etree.SubElement(episode, "actor") if 'name' in actor and actor['name'].strip(): cur_actor_name = etree.SubElement(cur_actor, "name") cur_actor_name.text = actor['name'].strip() else: continue if 'role' in actor and actor['role'].strip(): cur_actor_role = etree.SubElement(cur_actor, "role") cur_actor_role.text = actor['role'].strip() if 'image' in actor and actor['image'].strip(): cur_actor_thumb = etree.SubElement(cur_actor, "thumb") cur_actor_thumb.text = ep_obj.idxr.complete_image_url(actor['image']) # Make it purdy helpers.indentXML(rootNode) return etree.ElementTree(rootNode)
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() lINDEXER_API_PARMS['language'] = indexer_lang or sickbeard.INDEXER_DEFAULT_LANGUAGE if ep_obj.show.dvdorder: 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 ShowNotFoundException(e.message) except sickbeard.indexer_error as e: logger.log("Unable to connect to TVDB while creating meta files - skipping - " + ex(e), logger.ERROR) return False 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 (sickbeard.indexer_episodenotfound, sickbeard.indexer_seasonnotfound): logger.log("Metadata writer is unable to find episode {0:d}x{1:d} of {2} on {3}..." "has it been removed? Should I delete from db?".format( curEpToWrite.season, curEpToWrite.episode, curEpToWrite.show.name, sickbeard.indexerApi(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['firstaired'] = str(datetime.date.fromordinal(1)) if not (getattr(myEp, 'episodename', None) and getattr(myEp, 'firstaired', None)): return None episode = movie if curEpToWrite.name: EpisodeName = etree.SubElement(episode, "title") EpisodeName.text = curEpToWrite.name SeasonNumber = etree.SubElement(episode, "season") SeasonNumber.text = str(curEpToWrite.season) EpisodeNumber = etree.SubElement(episode, "episode") EpisodeNumber.text = str(curEpToWrite.episode) if getattr(myShow, "firstaired", None): try: year_text = str(datetime.datetime.strptime(myShow["firstaired"], dateFormat).year) if year_text: year = etree.SubElement(episode, "year") year.text = year_text except Exception: pass if getattr(myShow, "overview", None): plot = etree.SubElement(episode, "plot") plot.text = myShow["overview"] if curEpToWrite.description: Overview = etree.SubElement(episode, "episodeplot") Overview.text = curEpToWrite.description if getattr(myShow, 'contentrating', None): mpaa = etree.SubElement(episode, "mpaa") mpaa.text = myShow["contentrating"] if not ep_obj.relatedEps and getattr(myEp, "rating", None): try: rating = int((float(myEp['rating']) * 10)) except ValueError: rating = 0 if rating: Rating = etree.SubElement(episode, "rating") Rating.text = str(rating) if getattr(myEp, 'director', None): director = etree.SubElement(episode, "director") director.text = myEp['director'] if getattr(myEp, 'writer', None): writer = etree.SubElement(episode, "credits") writer.text = myEp['writer'] if getattr(myShow, '_actors', None) or getattr(myEp, 'gueststars', None): cast = etree.SubElement(episode, "cast") if getattr(myEp, 'gueststars', None) and isinstance(myEp['gueststars'], six.string_types): for actor in (x.strip() for x in myEp['gueststars'].split('|') if x.strip()): cur_actor = etree.SubElement(cast, "actor") cur_actor.text = actor if getattr(myShow, '_actors', None): for actor in myShow['_actors']: if 'name' in actor and actor['name'].strip(): cur_actor = etree.SubElement(cast, "actor") cur_actor.text = actor['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 helpers.indentXML(rootNode) data = etree.ElementTree(rootNode) 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 = sickbeard.indexerApi( ep_obj.show.indexer).api_params.copy() lINDEXER_API_PARMS['actors'] = True lINDEXER_API_PARMS[ 'language'] = indexer_lang or sickbeard.INDEXER_DEFAULT_LANGUAGE if ep_obj.show.dvdorder: 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 ShowNotFoundException(e.message) except sickbeard.indexer_error as e: logger.log( "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("kodimultiepisode") 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( "Metadata writer is unable to find episode {0:d}x{1:d} of {2} on {3}..." "has it been removed? Should I delete from db?".format( curEpToWrite.season, curEpToWrite.episode, curEpToWrite.show.name, sickbeard.indexerApi(ep_obj.show.indexer).name)) return None if not getattr(myEp, 'firstaired', None): myEp["firstaired"] = str(datetime.date.fromordinal(1)) if not getattr(myEp, 'episodename', None): logger.log("Not generating nfo because the ep has no title", logger.DEBUG) return None logger.log( "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 if getattr(myEp, 'episodename', None): title = etree.SubElement(episode, "title") title.text = myEp['episodename'] if getattr(myShow, 'seriesname', None): showtitle = etree.SubElement(episode, "showtitle") showtitle.text = myShow['seriesname'] 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) if curEpToWrite.airdate != datetime.date.fromordinal(1): aired = etree.SubElement(episode, "aired") aired.text = str(curEpToWrite.airdate) if getattr(myEp, 'overview', None): plot = etree.SubElement(episode, "plot") plot.text = myEp['overview'] if curEpToWrite.season and getattr(myShow, 'runtime', None): runtime = etree.SubElement(episode, "runtime") runtime.text = myShow["runtime"] if getattr(myEp, 'airsbefore_season', None): displayseason = etree.SubElement(episode, "displayseason") displayseason.text = myEp['airsbefore_season'] if getattr(myEp, 'airsbefore_episode', None): displayepisode = etree.SubElement(episode, "displayepisode") displayepisode.text = myEp['airsbefore_episode'] if getattr(myEp, 'filename', None): thumb = etree.SubElement(episode, "thumb") thumb.text = myEp['filename'].strip() # watched = etree.SubElement(episode, "watched") # watched.text = 'false' if getattr(myEp, 'rating', None): rating = etree.SubElement(episode, "rating") rating.text = myEp['rating'] if getattr(myEp, 'writer', None) and isinstance( myEp['writer'], six.string_types): for writer in self._split_info(myEp['writer']): cur_writer = etree.SubElement(episode, "credits") cur_writer.text = writer if getattr(myEp, 'director', None) and isinstance( myEp['director'], six.string_types): for director in self._split_info(myEp['director']): cur_director = etree.SubElement(episode, "director") cur_director.text = director if getattr(myEp, 'gueststars', None) and isinstance( myEp['gueststars'], six.string_types): for actor in self._split_info(myEp['gueststars']): cur_actor = etree.SubElement(episode, "actor") cur_actor_name = etree.SubElement(cur_actor, "name") cur_actor_name.text = actor if getattr(myShow, '_actors', None): for actor in myShow['_actors']: cur_actor = etree.SubElement(episode, "actor") if 'name' in actor and actor['name'].strip(): cur_actor_name = etree.SubElement(cur_actor, "name") cur_actor_name.text = actor['name'].strip() else: continue if 'role' in actor and actor['role'].strip(): cur_actor_role = etree.SubElement(cur_actor, "role") cur_actor_role.text = actor['role'].strip() if 'image' in actor and actor['image'].strip(): cur_actor_thumb = etree.SubElement(cur_actor, "thumb") cur_actor_thumb.text = actor['image'].strip() # Make it purdy helpers.indentXML(rootNode) data = etree.ElementTree(rootNode) 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 = sickbeard.indexerApi(ep_obj.show.indexer).api_params.copy() lINDEXER_API_PARMS['actors'] = True 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 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 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("kodimultiepisode") 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 %dx%d on %s... has it been removed? Should I delete from db?" % (curEpToWrite.season, curEpToWrite.episode, sickbeard.indexerApi(ep_obj.show.indexer).name)) return None if not getattr(myEp, 'firstaired', None): myEp["firstaired"] = str(datetime.date.fromordinal(1)) if not getattr(myEp, 'episodename', 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 if getattr(myEp, 'episodename', None): title = etree.SubElement(episode, "title") title.text = myEp['episodename'] if getattr(myShow, 'seriesname', None): showtitle = etree.SubElement(episode, "showtitle") showtitle.text = myShow['seriesname'] 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) if curEpToWrite.airdate != datetime.date.fromordinal(1): aired = etree.SubElement(episode, "aired") aired.text = str(curEpToWrite.airdate) if getattr(myEp, 'overview', None): plot = etree.SubElement(episode, "plot") plot.text = myEp['overview'] if curEpToWrite.season and getattr(myShow, 'runtime', None): runtime = etree.SubElement(episode, "runtime") runtime.text = myShow["runtime"] if getattr(myEp, 'airsbefore_season', None): displayseason = etree.SubElement(episode, "displayseason") displayseason.text = myEp['airsbefore_season'] if getattr(myEp, 'airsbefore_episode', None): displayepisode = etree.SubElement(episode, "displayepisode") displayepisode.text = myEp['airsbefore_episode'] if getattr(myEp, 'filename', None): thumb = etree.SubElement(episode, "thumb") thumb.text = myEp['filename'].strip() # watched = etree.SubElement(episode, "watched") # watched.text = 'false' if getattr(myEp, 'rating', None): rating = etree.SubElement(episode, "rating") rating.text = myEp['rating'] if getattr(myEp, 'writer', None) and isinstance(myEp['writer'], basestring): for writer in self._split_info(myEp['writer']): cur_writer = etree.SubElement(episode, "credits") cur_writer.text = writer if getattr(myEp, 'director', None) and isinstance(myEp['director'], basestring): for director in self._split_info(myEp['director']): cur_director = etree.SubElement(episode, "director") cur_director.text = director if getattr(myEp, 'gueststars', None) and isinstance(myEp['gueststars'], basestring): for actor in self._split_info(myEp['gueststars']): cur_actor = etree.SubElement(episode, "actor") cur_actor_name = etree.SubElement(cur_actor, "name") cur_actor_name.text = actor if getattr(myShow, '_actors', None): for actor in myShow['_actors']: cur_actor = etree.SubElement(episode, "actor") if 'name' in actor and actor['name'].strip(): cur_actor_name = etree.SubElement(cur_actor, "name") cur_actor_name.text = actor['name'].strip() else: continue if 'role' in actor and actor['role'].strip(): cur_actor_role = etree.SubElement(cur_actor, "role") cur_actor_role.text = actor['role'].strip() if 'image' in actor and actor['image'].strip(): cur_actor_thumb = etree.SubElement(cur_actor, "thumb") cur_actor_thumb.text = actor['image'].strip() # Make it purdy helpers.indentXML(rootNode) data = etree.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 = sickbeard.indexerApi( show_obj.indexer).api_params.copy() lINDEXER_API_PARMS[b'actors'] = True if indexer_lang and not indexer_lang == sickbeard.INDEXER_DEFAULT_LANGUAGE: lINDEXER_API_PARMS[b'language'] = indexer_lang if show_obj.dvdorder != 0: lINDEXER_API_PARMS[b'dvdorder'] = True t = sickbeard.indexerApi( show_obj.indexer).indexer(**lINDEXER_API_PARMS) tv_node = etree.Element("Series") try: myShow = t[int(show_obj.indexerid)] except sickbeard.indexer_shownotfound: logging.error("Unable to find show with id " + str(show_obj.indexerid) + " on " + sickbeard.indexerApi(show_obj.indexer).name + ", skipping it") raise except sickbeard.indexer_error: logging.error("" + sickbeard.indexerApi(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)): logging.info("Incomplete info for show with id " + str(show_obj.indexerid) + " on " + sickbeard.indexerApi(show_obj.indexer).name + ", skipping it") return False if getattr(myShow, 'id', None): indexerid = etree.SubElement(tv_node, "id") indexerid.text = str(myShow[b'id']) if getattr(myShow, 'seriesname', None): SeriesName = etree.SubElement(tv_node, "SeriesName") SeriesName.text = myShow[b'seriesname'] if getattr(myShow, 'status', None): Status = etree.SubElement(tv_node, "Status") Status.text = myShow[b'status'] if getattr(myShow, 'network', None): Network = etree.SubElement(tv_node, "Network") Network.text = myShow[b'network'] if getattr(myShow, 'airs_time', None): Airs_Time = etree.SubElement(tv_node, "Airs_Time") Airs_Time.text = myShow[b'airs_time'] if getattr(myShow, 'airs_dayofweek', None): Airs_DayOfWeek = etree.SubElement(tv_node, "Airs_DayOfWeek") Airs_DayOfWeek.text = myShow[b'airs_dayofweek'] FirstAired = etree.SubElement(tv_node, "FirstAired") if getattr(myShow, 'firstaired', None): FirstAired.text = myShow[b'firstaired'] if getattr(myShow, 'contentrating', None): ContentRating = etree.SubElement(tv_node, "ContentRating") ContentRating.text = myShow[b'contentrating'] MPAARating = etree.SubElement(tv_node, "MPAARating") MPAARating.text = myShow[b'contentrating'] certification = etree.SubElement(tv_node, "certification") certification.text = myShow[b'contentrating'] MetadataType = etree.SubElement(tv_node, "Type") MetadataType.text = "Series" if getattr(myShow, 'overview', None): Overview = etree.SubElement(tv_node, "Overview") Overview.text = myShow[b'overview'] if getattr(myShow, 'firstaired', None): PremiereDate = etree.SubElement(tv_node, "PremiereDate") PremiereDate.text = myShow[b'firstaired'] if getattr(myShow, 'rating', None): Rating = etree.SubElement(tv_node, "Rating") Rating.text = myShow[b'rating'] if getattr(myShow, 'firstaired', None): try: year_text = str( datetime.datetime.strptime(myShow[b'firstaired'], dateFormat).year) if year_text: ProductionYear = etree.SubElement(tv_node, "ProductionYear") ProductionYear.text = year_text except Exception: pass if getattr(myShow, 'runtime', None): RunningTime = etree.SubElement(tv_node, "RunningTime") RunningTime.text = myShow[b'runtime'] Runtime = etree.SubElement(tv_node, "Runtime") Runtime.text = myShow[b'runtime'] if getattr(myShow, 'imdb_id', None): imdb_id = etree.SubElement(tv_node, "IMDB_ID") imdb_id.text = myShow[b'imdb_id'] imdb_id = etree.SubElement(tv_node, "IMDB") imdb_id.text = myShow[b'imdb_id'] imdb_id = etree.SubElement(tv_node, "IMDbId") imdb_id.text = myShow[b'imdb_id'] if getattr(myShow, 'zap2it_id', None): Zap2ItId = etree.SubElement(tv_node, "Zap2ItId") Zap2ItId.text = myShow[b'zap2it_id'] if getattr(myShow, 'genre', None) and isinstance( myShow[b"genre"], basestring): Genres = etree.SubElement(tv_node, "Genres") for genre in myShow[b'genre'].split('|'): if genre.strip(): cur_genre = etree.SubElement(Genres, "Genre") cur_genre.text = genre.strip() Genre = etree.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 = etree.SubElement(tv_node, "Studios") Studio = etree.SubElement(Studios, "Studio") Studio.text = myShow[b'network'] if getattr(myShow, '_actors', None): Persons = etree.SubElement(tv_node, "Persons") for actor in myShow[b'_actors']: if not ('name' in actor and actor[b'name'].strip()): continue cur_actor = etree.SubElement(Persons, "Person") cur_actor_name = etree.SubElement(cur_actor, "Name") cur_actor_name.text = actor[b'name'].strip() cur_actor_type = etree.SubElement(cur_actor, "Type") cur_actor_type.text = "Actor" if 'role' in actor and actor[b'role'].strip(): cur_actor_role = etree.SubElement(cur_actor, "Role") cur_actor_role.text = actor[b'role'].strip() helpers.indentXML(tv_node) data = etree.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 = sickbeard.indexerApi(ep_obj.show.indexer).api_params.copy() lINDEXER_API_PARMS['actors'] = True lINDEXER_API_PARMS['language'] = indexer_lang or sickbeard.INDEXER_DEFAULT_LANGUAGE if ep_obj.show.dvdorder: 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 ShowNotFoundException(e.message) except sickbeard.indexer_error as e: logger.log("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("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 (sickbeard.indexer_episodenotfound, sickbeard.indexer_seasonnotfound): logger.log("Metadata writer is unable to find episode {0:d}x{1:d} of {2} on {3}..." "has it been removed? Should I delete from db?".format( curEpToWrite.season, curEpToWrite.episode, curEpToWrite.show.name, sickbeard.indexerApi(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['firstaired'] = str(datetime.date.fromordinal(1)) if not (getattr(myEp, 'episodename', None) and getattr(myEp, 'firstaired', None)): return None episode = rootNode if curEpToWrite.name: EpisodeName = etree.SubElement(episode, "EpisodeName") EpisodeName.text = curEpToWrite.name 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 and getattr(myEp, 'absolute_number', None): absolute_number = etree.SubElement(episode, "absolute_number") absolute_number.text = str(myEp['absolute_number']) if curEpToWrite.airdate != datetime.date.fromordinal(1): FirstAired = etree.SubElement(episode, "FirstAired") FirstAired.text = str(curEpToWrite.airdate) MetadataType = etree.SubElement(episode, "Type") MetadataType.text = "Episode" if curEpToWrite.description: Overview = etree.SubElement(episode, "Overview") Overview.text = curEpToWrite.description if not ep_obj.relatedEps: if getattr(myEp, 'rating', None): Rating = etree.SubElement(episode, "Rating") Rating.text = myEp['rating'] if getattr(myShow, 'imdb_id', None): IMDB_ID = etree.SubElement(episode, "IMDB_ID") IMDB_ID.text = myShow['imdb_id'] IMDB = etree.SubElement(episode, "IMDB") IMDB.text = myShow['imdb_id'] IMDbId = etree.SubElement(episode, "IMDbId") IMDbId.text = myShow['imdb_id'] indexerid = etree.SubElement(episode, "id") indexerid.text = str(curEpToWrite.indexerid) Persons = etree.SubElement(episode, "Persons") if getattr(myShow, '_actors', None): for actor in myShow['_actors']: if not ('name' in actor and actor['name'].strip()): continue cur_actor = etree.SubElement(Persons, "Person") cur_actor_name = etree.SubElement(cur_actor, "Name") cur_actor_name.text = actor['name'].strip() cur_actor_type = etree.SubElement(cur_actor, "Type") cur_actor_type.text = "Actor" if 'role' in actor and actor['role'].strip(): cur_actor_role = etree.SubElement(cur_actor, "Role") cur_actor_role.text = actor['role'].strip() Language = etree.SubElement(episode, "Language") try: Language.text = myEp['language'] except Exception: Language.text = sickbeard.INDEXER_DEFAULT_LANGUAGE # 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): persons_dict['Director'] += [x.strip() for x in myEp['director'].split('|') if x.strip()] if getattr(myEp, 'gueststars', None): persons_dict['GuestStar'] += [x.strip() for x in myEp['gueststars'].split('|') if x.strip()] if getattr(myEp, 'writer', None): persons_dict['Writer'] += [x.strip() for x in myEp['writer'].split('|') if x.strip()] # fill in Persons section with collected directors, guest starts and writers for person_type, names in six.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 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 = sickbeard.indexerApi( ep_obj.show.indexer).api_params.copy() lINDEXER_API_PARMS[b'actors'] = True if indexer_lang and not indexer_lang == sickbeard.INDEXER_DEFAULT_LANGUAGE: lINDEXER_API_PARMS[b'language'] = indexer_lang if ep_obj.show.dvdorder != 0: lINDEXER_API_PARMS[b'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 ShowNotFoundException(e.message) except sickbeard.indexer_error as e: logging.error( "Unable to connect to " + sickbeard.indexerApi(ep_obj.show.indexer).name + " while creating meta files - skipping - {}".format(ex(e))) return False 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 (sickbeard.indexer_episodenotfound, sickbeard.indexer_seasonnotfound): logging.info( "Unable to find episode %dx%d on %s... has it been removed? Should I delete from db?" % (curEpToWrite.season, curEpToWrite.episode, sickbeard.indexerApi(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(datetime.date.fromordinal(1)) if not (getattr(myEp, 'episodename', None) and getattr(myEp, 'firstaired', None)): return None episode = rootNode if curEpToWrite.name: EpisodeName = etree.SubElement(episode, "EpisodeName") EpisodeName.text = curEpToWrite.name 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 and getattr(myEp, 'absolute_number', None): absolute_number = etree.SubElement(episode, "absolute_number") absolute_number.text = str(myEp[b'absolute_number']) if curEpToWrite.airdate != datetime.date.fromordinal(1): FirstAired = etree.SubElement(episode, "FirstAired") FirstAired.text = str(curEpToWrite.airdate) MetadataType = etree.SubElement(episode, "Type") MetadataType.text = "Episode" if curEpToWrite.description: Overview = etree.SubElement(episode, "Overview") Overview.text = curEpToWrite.description if not ep_obj.relatedEps: if getattr(myEp, 'rating', None): Rating = etree.SubElement(episode, "Rating") Rating.text = myEp[b'rating'] if getattr(myShow, 'imdb_id', None): IMDB_ID = etree.SubElement(episode, "IMDB_ID") IMDB_ID.text = myShow[b'imdb_id'] IMDB = etree.SubElement(episode, "IMDB") IMDB.text = myShow[b'imdb_id'] IMDbId = etree.SubElement(episode, "IMDbId") IMDbId.text = myShow[b'imdb_id'] indexerid = etree.SubElement(episode, "id") indexerid.text = str(curEpToWrite.indexerid) Persons = etree.SubElement(episode, "Persons") if getattr(myShow, '_actors', None): for actor in myShow[b'_actors']: if not ('name' in actor and actor[b'name'].strip()): continue cur_actor = etree.SubElement(Persons, "Person") cur_actor_name = etree.SubElement(cur_actor, "Name") cur_actor_name.text = actor[b'name'].strip() cur_actor_type = etree.SubElement(cur_actor, "Type") cur_actor_type.text = "Actor" if 'role' in actor and actor[b'role'].strip(): cur_actor_role = etree.SubElement( cur_actor, "Role") cur_actor_role.text = actor[b'role'].strip() Language = etree.SubElement(episode, "Language") try: Language.text = myEp[b'language'] except Exception: Language.text = sickbeard.INDEXER_DEFAULT_LANGUAGE # 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): 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() ] # fill in Persons section with collected directors, guest starts and writers for person_type, names in persons_dict.iteritems(): # 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
Writer.text = Writer_text SeasonNumber = etree.SubElement(episode, "SeasonNumber") SeasonNumber.text = str(curEpToWrite.season) absolute_number = etree.SubElement(episode, "absolute_number") absolute_number.text = myEp['absolute_number'] seasonid = etree.SubElement(episode, "seasonid") seasonid.text = myEp['seasonid'] seriesid = etree.SubElement(episode, "seriesid") seriesid.text = str(curEpToWrite.show.tvdbid) thumb = etree.SubElement(episode, "filename") # 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 # Make it purdy helpers.indentXML(rootNode) data = etree.ElementTree(rootNode) return data # present a standard "interface" metadata_class = MediaBrowserMetadata
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 """ tvdb_lang = show_obj.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 t = tvdb_api.Tvdb(actors=True, **ltvdb_api_parms) tv_node = etree.Element("Series") for ns in XML_NSMAP.keys(): tv_node.set(ns, XML_NSMAP[ns]) try: myShow = t[int(show_obj.tvdbid)] except tvdb_exceptions.tvdb_shownotfound: logger.log( "Unable to find show with id " + str(show_obj.tvdbid) + " on tvdb, skipping it", logger.ERROR) raise except tvdb_exceptions.tvdb_error: logger.log("TVDB is down, can't use its data to make the NFO", logger.ERROR) raise # check for title and id try: if myShow["seriesname"] == None or myShow[ "seriesname"] == "" or myShow["id"] == None or myShow[ "id"] == "": logger.log( "Incomplete info for show with id " + str(show_obj.tvdbid) + " on tvdb, skipping it", logger.ERROR) return False except tvdb_exceptions.tvdb_attributenotfound: logger.log( "Incomplete info for show with id " + str(show_obj.tvdbid) + " on tvdb, skipping it", logger.ERROR) return False tvdbid = etree.SubElement(tv_node, "id") if myShow["id"] != None: tvdbid.text = myShow["id"] Actors = etree.SubElement(tv_node, "Actors") if myShow["actors"] != None: Actors.text = myShow["actors"] ContentRating = etree.SubElement(tv_node, "ContentRating") if myShow["contentrating"] != None: ContentRating.text = myShow["contentrating"] premiered = etree.SubElement(tv_node, "FirstAired") if myShow["firstaired"] != None: premiered.text = myShow["firstaired"] genre = etree.SubElement(tv_node, "genre") if myShow["genre"] != None: genre.text = myShow["genre"] IMDBId = etree.SubElement(tv_node, "IMDBId") if myShow["imdb_id"] != None: IMDBId.text = myShow["imdb_id"] IMDB_ID = etree.SubElement(tv_node, "IMDB_ID") if myShow["imdb_id"] != None: IMDB_ID.text = myShow["imdb_id"] Overview = etree.SubElement(tv_node, "Overview") if myShow["overview"] != None: Overview.text = myShow["overview"] Network = etree.SubElement(tv_node, "Network") if myShow["network"] != None: Network.text = myShow["network"] Runtime = etree.SubElement(tv_node, "Runtime") if myShow["runtime"] != None: Runtime.text = myShow["runtime"] Rating = etree.SubElement(tv_node, "Rating") if myShow["rating"] != None: Rating.text = myShow["rating"] SeriesID = etree.SubElement(tv_node, "SeriesID") if myShow["seriesid"] != None: SeriesID.text = myShow["seriesid"] SeriesName = etree.SubElement(tv_node, "SeriesName") if myShow["seriesname"] != None: SeriesName.text = myShow["seriesname"] rating = etree.SubElement(tv_node, "Status") if myShow["status"] != None: rating.text = myShow["status"] helpers.indentXML(tv_node) data = etree.ElementTree(tv_node) 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 = sickbeard.indexerApi(show_obj.indexer).api_params.copy() lINDEXER_API_PARMS['actors'] = True if indexer_lang and not indexer_lang == sickbeard.INDEXER_DEFAULT_LANGUAGE: lINDEXER_API_PARMS['language'] = indexer_lang if show_obj.dvdorder != 0: lINDEXER_API_PARMS['dvdorder'] = True t = sickbeard.indexerApi(show_obj.indexer).indexer(**lINDEXER_API_PARMS) tv_node = etree.Element("tvshow") try: myShow = t[int(show_ID)] except sickbeard.indexer_shownotfound: logger.log(u"Unable to find show with id " + str(show_ID) + " on " + sickbeard.indexerApi( show_obj.indexer).name + ", skipping it", logger.ERROR) raise except sickbeard.indexer_error: logger.log( u"" + sickbeard.indexerApi(show_obj.indexer).name + " is down, can't use its data to add this show", logger.ERROR) raise # check for title and id if not (getattr(myShow, 'seriesname', None) and getattr(myShow, 'id', None)): logger.log(u"Incomplete info for show with id " + str(show_ID) + " on " + sickbeard.indexerApi( show_obj.indexer).name + ", skipping it") return False title = etree.SubElement(tv_node, "title") title.text = myShow["seriesname"] if getattr(myShow, 'rating', None): rating = etree.SubElement(tv_node, "rating") rating.text = myShow["rating"] if getattr(myShow, 'firstaired', None): try: year_text = str(datetime.datetime.strptime(myShow["firstaired"], dateFormat).year) if year_text: year = etree.SubElement(tv_node, "year") year.text = year_text except Exception: pass if getattr(myShow, 'overview', None): plot = etree.SubElement(tv_node, "plot") plot.text = myShow["overview"] if getattr(myShow, 'id', None): episodeguide = etree.SubElement(tv_node, "episodeguide") episodeguideurl = etree.SubElement(episodeguide, "url") episodeguideurl.text = sickbeard.indexerApi(show_obj.indexer).config['base_url'] + str(myShow["id"]) + '/all/en.zip' if getattr(myShow, 'contentrating', None): mpaa = etree.SubElement(tv_node, "mpaa") mpaa.text = myShow["contentrating"] if getattr(myShow, 'id', None): indexerid = etree.SubElement(tv_node, "id") indexerid.text = str(myShow["id"]) if getattr(myShow, 'genre', None) and isinstance(myShow["genre"], basestring): for genre in self._split_info(myShow["genre"]): cur_genre = etree.SubElement(tv_node, "genre") cur_genre.text = genre if 'country_codes' in show_obj.imdb_info: for country in self._split_info(show_obj.imdb_info['country_codes']): try: cur_country_name = Country(country.upper()).name.title() except Exception: continue cur_country = etree.SubElement(tv_node, "country") cur_country.text = cur_country_name if getattr(myShow, 'firstaired', None): premiered = etree.SubElement(tv_node, "premiered") premiered.text = myShow["firstaired"] if getattr(myShow, 'network', None): studio = etree.SubElement(tv_node, "studio") studio.text = myShow["network"].strip() if getattr(myShow, 'writer', None) and isinstance(myShow['writer'], basestring): for writer in self._split_info(myShow['writer']): cur_writer = etree.SubElement(tv_node, "credits") cur_writer.text = writer if getattr(myShow, 'director', None) and isinstance(myShow['director'], basestring): for director in self._split_info(myShow['director']): cur_director = etree.SubElement(tv_node, "director") cur_director.text = director if getattr(myShow, '_actors', None): for actor in myShow['_actors']: cur_actor = etree.SubElement(tv_node, "actor") if 'name' in actor and actor['name'].strip(): cur_actor_name = etree.SubElement(cur_actor, "name") cur_actor_name.text = actor['name'].strip() else: continue if 'role' in actor and actor['role'].strip(): cur_actor_role = etree.SubElement(cur_actor, "role") cur_actor_role.text = actor['role'].strip() if 'image' in actor and actor['image'].strip(): cur_actor_thumb = etree.SubElement(cur_actor, "thumb") cur_actor_thumb.text = actor['image'].strip() # Make it purdy helpers.indentXML(tv_node) data = etree.ElementTree(tv_node) 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 """ tv_node = etree.Element("Series") myShow = sickchill.indexer.series(show_obj) if not myShow: logger.log( "Unable to find show with id {} on {}, skipping it".format( show_obj.indexerid, show_obj.indexer_name), logger.ERROR) return False # check for title and id if not (getattr(myShow, 'seriesName', None) and getattr(myShow, 'id', None)): logger.log( "Incomplete info for show with id {} on {}, skipping it". format(show_obj.indexerid, show_obj.indexer_name)) return False data = getattr(myShow, 'id', None) if data: indexerid = etree.SubElement(tv_node, "id") indexerid.text = str(data) data = getattr(myShow, 'seriesName', None) if data: SeriesName = etree.SubElement(tv_node, "SeriesName") SeriesName.text = data data = getattr(myShow, 'status', None) if data: Status = etree.SubElement(tv_node, "Status") Status.text = data data = getattr(myShow, 'network', None) if data: Network = etree.SubElement(tv_node, "Network") Network.text = data Studios = etree.SubElement(tv_node, "Studios") Studio = etree.SubElement(Studios, "Studio") Studio.text = data data = getattr(myShow, 'airsTime', None) if data: airsTime = etree.SubElement(tv_node, "Airs_Time") airsTime.text = data data = getattr(myShow, 'airsDayOfWeek', None) if data: airsDayOfWeek = etree.SubElement(tv_node, "Airs_DayOfWeek") airsDayOfWeek.text = data data = getattr(myShow, 'firstAired', None) if data: FirstAired = etree.SubElement(tv_node, "FirstAired") FirstAired.text = data PremiereDate = etree.SubElement(tv_node, "PremiereDate") PremiereDate.text = data try: year_text = str( datetime.datetime.strptime(data, dateFormat).year) if year_text: ProductionYear = etree.SubElement(tv_node, "ProductionYear") ProductionYear.text = year_text except Exception: pass data = getattr(myShow, 'rating', None) if data: ContentRating = etree.SubElement(tv_node, "ContentRating") ContentRating.text = data MPAARating = etree.SubElement(tv_node, "MPAARating") MPAARating.text = data certification = etree.SubElement(tv_node, "certification") certification.text = data Rating = etree.SubElement(tv_node, "Rating") Rating.text = data MetadataType = etree.SubElement(tv_node, "Type") MetadataType.text = "Series" data = getattr(myShow, 'overview', None) if data: Overview = etree.SubElement(tv_node, "Overview") Overview.text = data data = getattr(myShow, 'runtime', None) if data: RunningTime = etree.SubElement(tv_node, "RunningTime") RunningTime.text = data Runtime = etree.SubElement(tv_node, "Runtime") Runtime.text = data data = getattr(myShow, 'imdbId', None) if data: imdb_id = etree.SubElement(tv_node, "IMDB_ID") imdb_id.text = data imdb_id = etree.SubElement(tv_node, "IMDB") imdb_id.text = data imdb_id = etree.SubElement(tv_node, "IMDbId") imdb_id.text = data data = getattr(myShow, 'zap2itId', None) if data: Zap2ItId = etree.SubElement(tv_node, "Zap2ItId") Zap2ItId.text = data if getattr(myShow, 'genre', []) and isinstance(myShow.genre, list): Genres = etree.SubElement(tv_node, "Genres") for genre in myShow.genre: if genre.strip(): cur_genre = etree.SubElement(Genres, "Genre") cur_genre.text = genre.strip() Genre = etree.SubElement(tv_node, "Genre") Genre.text = "|".join(myShow.genre) helpers.indentXML(tv_node) return etree.ElementTree(tv_node)
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 = sickbeard.indexerApi(show_obj.indexer).api_params.copy() lINDEXER_API_PARMS["actors"] = True if indexer_lang and not indexer_lang == sickbeard.INDEXER_DEFAULT_LANGUAGE: lINDEXER_API_PARMS["language"] = indexer_lang if show_obj.dvdorder != 0: lINDEXER_API_PARMS["dvdorder"] = True t = sickbeard.indexerApi(show_obj.indexer).indexer(**lINDEXER_API_PARMS) tv_node = etree.Element("tvshow") try: myShow = t[int(show_ID)] except sickbeard.indexer_shownotfound: logger.log( u"Unable to find show with id " + str(show_ID) + " on " + sickbeard.indexerApi(show_obj.indexer).name + ", skipping it", logger.ERROR, ) raise except sickbeard.indexer_error: logger.log( u"" + sickbeard.indexerApi(show_obj.indexer).name + " is down, can't use its data to add this show", logger.ERROR, ) raise # check for title and id if not (getattr(myShow, "seriesname", None) and getattr(myShow, "id", None)): logger.log( u"Incomplete info for show with id " + str(show_ID) + " on " + sickbeard.indexerApi(show_obj.indexer).name + ", skipping it" ) return False title = etree.SubElement(tv_node, "title") title.text = myShow["seriesname"] if getattr(myShow, "rating", None): rating = etree.SubElement(tv_node, "rating") rating.text = myShow["rating"] if getattr(myShow, "firstaired", None): try: year_text = str(datetime.datetime.strptime(myShow["firstaired"], dateFormat).year) if year_text: year = etree.SubElement(tv_node, "year") year.text = year_text except Exception: pass if getattr(myShow, "overview", None): plot = etree.SubElement(tv_node, "plot") plot.text = myShow["overview"] if getattr(myShow, "id", None): episodeguide = etree.SubElement(tv_node, "episodeguide") episodeguideurl = etree.SubElement(episodeguide, "url") episodeguideurl.text = ( sickbeard.indexerApi(show_obj.indexer).config["base_url"] + str(myShow["id"]) + "/all/en.zip" ) if getattr(myShow, "contentrating", None): mpaa = etree.SubElement(tv_node, "mpaa") mpaa.text = myShow["contentrating"] if getattr(myShow, "id", None): indexerid = etree.SubElement(tv_node, "id") indexerid.text = str(myShow["id"]) if getattr(myShow, "genre", None) and isinstance(myShow["genre"], basestring): genre = etree.SubElement(tv_node, "genre") genre.text = " / ".join(x.strip() for x in myShow["genre"].split("|") if x.strip()) if getattr(myShow, "firstaired", None): premiered = etree.SubElement(tv_node, "premiered") premiered.text = myShow["firstaired"] if getattr(myShow, "network", None): studio = etree.SubElement(tv_node, "studio") studio.text = myShow["network"].strip() if getattr(myShow, "_actors", None): for actor in myShow["_actors"]: cur_actor = etree.SubElement(tv_node, "actor") if "name" in actor and actor["name"].strip(): cur_actor_name = etree.SubElement(cur_actor, "name") cur_actor_name.text = actor["name"].strip() else: continue if "role" in actor and actor["role"].strip(): cur_actor_role = etree.SubElement(cur_actor, "role") cur_actor_role.text = actor["role"].strip() if "image" in actor and actor["image"].strip(): cur_actor_thumb = etree.SubElement(cur_actor, "thumb") cur_actor_thumb.text = actor["image"].strip() # Make it purdy helpers.indentXML(tv_node) data = etree.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': []} myShow = ep_obj.idxr.series_from_episode(ep_obj) if not myShow: logger.log( "Unable to connect to {} while creating meta files - skipping". format(ep_obj.idxr.name)) return False rootNode = etree.Element("Item") # write an MediaBrowser XML containing info for all matching episodes for curEpToWrite in eps_to_write: myEp = curEpToWrite.idxr.episode(curEpToWrite) if not myEp: continue if curEpToWrite == ep_obj: # root (or single) episode # default to today's date for specials if firstAired is not set if ep_obj.airdate != datetime.date.min and myEp.get( 'firstAired'): myEp['firstAired'] = str(ep_obj.airdate) if ep_obj.season == 0 and not myEp.get('firstAired'): if ep_obj.show and ep_obj.show.startyear: myEp['firstAired'] = str( datetime.date.min.replace( year=ep_obj.show.startyear)) else: myEp['firstAired'] = str(datetime.date.today()) if not (myEp.get('episodeName') and myEp.get('firstAired')): return None episode = rootNode if curEpToWrite.name: EpisodeName = etree.SubElement(episode, "EpisodeName") EpisodeName.text = curEpToWrite.name EpisodeNumber = etree.SubElement(episode, "EpisodeNumber") EpisodeNumber.text = str(ep_obj.episode) if ep_obj.relatedEps: try: max_episode = max(e.episode for e in ep_obj.relatedEps if e) except (AttributeError, TypeError): max_episode = curEpToWrite.episode EpisodeNumberEnd = etree.SubElement( episode, "EpisodeNumberEnd") EpisodeNumberEnd.text = str(max_episode) SeasonNumber = etree.SubElement(episode, "SeasonNumber") SeasonNumber.text = str(curEpToWrite.season) if myEp.get('absoluteNumber') and not ep_obj.relatedEps: absolute_number = etree.SubElement(episode, "absolute_number") absolute_number.text = str(myEp['absoluteNumber']) if curEpToWrite.airdate != datetime.date.min: FirstAired = etree.SubElement(episode, "FirstAired") FirstAired.text = str(curEpToWrite.airdate) MetadataType = etree.SubElement(episode, "Type") MetadataType.text = "Episode" if curEpToWrite.description: Overview = etree.SubElement(episode, "Overview") Overview.text = curEpToWrite.description elif myEp.get("overview"): Overview = etree.SubElement(episode, "Overview") Overview.text = myEp["overview"] if not ep_obj.relatedEps: if myEp.get('rating'): Rating = etree.SubElement(episode, "Rating") Rating.text = myEp['siteRating'] if myEp.get('imdbId'): IMDB_ID = etree.SubElement(episode, "IMDB_ID") IMDB_ID.text = myEp['imdbId'] IMDB = etree.SubElement(episode, "IMDB") IMDB.text = myEp['imdbId'] IMDbId = etree.SubElement(episode, "IMDbId") IMDbId.text = myEp['imdbId'] if myEp.get('id'): indexerid = etree.SubElement(episode, "id") indexerid.text = str(myEp['id']) Persons = etree.SubElement(episode, "Persons") for actor in ep_obj.idxr.actors(myShow): if not ('name' in actor and actor['name'].strip()): continue cur_actor = etree.SubElement(Persons, "Person") cur_actor_name = etree.SubElement(cur_actor, "Name") cur_actor_name.text = actor['name'].strip() cur_actor_type = etree.SubElement(cur_actor, "Type") cur_actor_type.text = "Actor" if 'role' in actor and actor['role'].strip(): cur_actor_role = etree.SubElement(cur_actor, "Role") cur_actor_role.text = actor['role'].strip() if myEp.get('language'): language = myEp.get('language')['overview'] else: language = sickbeard.INDEXER_DEFAULT_LANGUAGE Language = etree.SubElement(episode, "Language") Language.text = language if myEp.get('filename'): thumb = etree.SubElement(episode, "filename") thumb.text = curEpToWrite.idxr.complete_image_url( myEp['filename']) 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 # collect all directors, guest stars and writers if myEp.get('directors'): persons_dict['Director'] += myEp['directors'] if myEp.get('guestStars'): persons_dict['GuestStar'] += myEp['guestStars'] if myEp.get('writers'): persons_dict['Writer'] += myEp['writers'] # fill in Persons section with collected directors, guest starts and writers for person_type, names in six.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) return etree.ElementTree(rootNode)
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 if not self._valid_show(myShow, ep_obj.show): return 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 (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 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 for actor in getattr(myShow, 'actors', []): cur_actor = etree.SubElement(episode, 'actor') cur_actor_name = etree.SubElement(cur_actor, 'name') cur_actor_name.text = actor['person']['name'] cur_actor_role = etree.SubElement(cur_actor, 'role') cur_actor_role_text = actor['character']['name'] if cur_actor_role_text: 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
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 """ show_id = show_obj.indexerid indexer_lang = show_obj.lang l_indexer_api_params = sickbeard.indexerApi(show_obj.indexer).api_params.copy() l_indexer_api_params['actors'] = True if indexer_lang and not indexer_lang == sickbeard.INDEXER_DEFAULT_LANGUAGE: l_indexer_api_params['language'] = indexer_lang if show_obj.dvdorder != 0: l_indexer_api_params['dvdorder'] = True t = sickbeard.indexerApi(show_obj.indexer).indexer(**l_indexer_api_params) root_node = etree.Element('details') tv_node = etree.SubElement(root_node, 'movie') tv_node.attrib['isExtra'] = 'false' tv_node.attrib['isSet'] = 'false' tv_node.attrib['isTV'] = 'true' try: my_show = t[int(show_id)] except sickbeard.indexer_shownotfound: logger.log(u'Unable to find {indexer} show {id}, skipping it'.format (indexer=sickbeard.indexerApi(show_obj.indexer).name, id=show_id), logger.ERROR) raise except sickbeard.indexer_error: logger.log(u'{indexer} is down, can\'t use its data to add this show'.format (indexer=sickbeard.indexerApi(show_obj.indexer).name), logger.ERROR) raise # check for title and id if not (getattr(my_show, 'seriesname', None) and getattr(my_show, 'id', None)): logger.log(u'Incomplete info for {indexer} show {id}, skipping it'.format (indexer=sickbeard.indexerApi(show_obj.indexer).name, id=show_id), logger.ERROR) return False title = etree.SubElement(tv_node, 'title') title.text = my_show['seriesname'] if getattr(my_show, 'genre', None): genres = etree.SubElement(tv_node, 'genres') for genre in my_show['genre'].split('|'): if genre and genre.strip(): cur_genre = etree.SubElement(genres, 'Genre') cur_genre.text = genre.strip() if getattr(my_show, 'firstaired', None): first_aired = etree.SubElement(tv_node, 'premiered') first_aired.text = my_show['firstaired'] try: year_text = str(datetime.datetime.strptime(my_show['firstaired'], dateFormat).year) if year_text: year = etree.SubElement(tv_node, 'year') year.text = year_text except Exception: pass if getattr(my_show, 'overview', None): plot = etree.SubElement(tv_node, 'plot') plot.text = my_show['overview'] if getattr(my_show, 'rating', None): try: rating = int(float(my_show['rating']) * 10) except ValueError: rating = 0 if rating: rating = etree.SubElement(tv_node, 'rating') rating.text = str(rating) if getattr(my_show, 'status', None): status = etree.SubElement(tv_node, 'status') status.text = my_show['status'] if getattr(my_show, 'contentrating', None): mpaa = etree.SubElement(tv_node, 'mpaa') mpaa.text = my_show['contentrating'] if getattr(my_show, 'imdb_id', None): imdb_id = etree.SubElement(tv_node, 'id') imdb_id.attrib['moviedb'] = 'imdb' imdb_id.text = my_show['imdb_id'] if getattr(my_show, 'id', None): indexer_id = etree.SubElement(tv_node, 'indexerid') indexer_id.text = my_show['id'] if getattr(my_show, 'runtime', None): runtime = etree.SubElement(tv_node, 'runtime') runtime.text = my_show['runtime'] if getattr(my_show, '_actors', None): cast = etree.SubElement(tv_node, 'cast') for actor in my_show['_actors']: if 'name' in actor and actor['name'].strip(): cur_actor = etree.SubElement(cast, 'actor') cur_actor.text = actor['name'].strip() helpers.indentXML(root_node) data = etree.ElementTree(root_node) 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 lINDEXER_API_PARMS = sickbeard.indexerApi(show_obj.indexer).api_params.copy() lINDEXER_API_PARMS['actors'] = True if indexer_lang and not indexer_lang == 'en': lINDEXER_API_PARMS['language'] = indexer_lang if show_obj.dvdorder != 0: lINDEXER_API_PARMS['dvdorder'] = True t = sickbeard.indexerApi(show_obj.indexer).indexer(**lINDEXER_API_PARMS) rootNode = etree.Element("details") tv_node = etree.SubElement(rootNode, "movie") tv_node.attrib["isExtra"] = "false" tv_node.attrib["isSet"] = "false" tv_node.attrib["isTV"] = "true" try: myShow = t[int(show_obj.indexerid)] except sickbeard.indexer_shownotfound: logger.log(u"Unable to find show with id " + str(show_obj.indexerid) + " on tvdb, skipping it", logger.ERROR) raise except sickbeard.indexer_error: logger.log(u"TVDB is down, can't use its data to make the NFO", logger.ERROR) raise # check for title and id try: if getattr(myShow, 'seriesname', None) == None or getattr(myShow, 'seriesname', "") == "" or getattr(myShow, 'id', None) == None or getattr(myShow, 'id', "") == "": logger.log(u"Incomplete info for show with id " + str(show_obj.indexerid) + " on tvdb, skipping it", logger.ERROR) return False except sickbeard.indexer_attributenotfound: logger.log(u"Incomplete info for show with id " + str(show_obj.indexerid) + " on tvdb, skipping it", logger.ERROR) return False SeriesName = etree.SubElement(tv_node, "title") SeriesName.text = myShow['seriesname'] Genres = etree.SubElement(tv_node, "genres") if getattr(myShow, "genre", None) != None: for genre in myShow['genre'].split('|'): if genre and genre.strip(): cur_genre = etree.SubElement(Genres, "Genre") cur_genre.text = genre.strip() FirstAired = etree.SubElement(tv_node, "premiered") if getattr(myShow, 'firstaired', None) != None: FirstAired.text = myShow['firstaired'] year = etree.SubElement(tv_node, "year") if getattr(myShow, "firstaired", None) != 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(tv_node, "plot") if getattr(myShow, 'overview', None) is not None: plot.text = myShow["overview"] if getattr(myShow, 'rating', None) != None: try: rating = int((float(myShow['rating']) * 10)) except ValueError: rating = 0 Rating = etree.SubElement(tv_node, "rating") rating_text = str(rating) if rating_text != None: Rating.text = rating_text Status = etree.SubElement(tv_node, "status") if getattr(myShow, 'status', None) != None: Status.text = myShow['status'] mpaa = etree.SubElement(tv_node, "mpaa") if getattr(myShow, "contentrating", None) != None: mpaa.text = myShow["contentrating"] IMDB_ID = etree.SubElement(tv_node, "id") if getattr(myShow, 'imdb_id', None) != None: IMDB_ID.attrib["moviedb"] = "imdb" IMDB_ID.text = myShow['imdb_id'] indexerid = etree.SubElement(tv_node, "indexerid") if getattr(myShow, 'id', None) != None: indexerid.text = myShow['id'] Runtime = etree.SubElement(tv_node, "runtime") if getattr(myShow, 'runtime', None) != None: Runtime.text = myShow['runtime'] cast = etree.SubElement(tv_node, "cast") if getattr(myShow, '_actors', None) is not None: for actor in myShow['_actors']: cur_actor_name_text = getattr(actor, 'name', None) if cur_actor_name_text != None and cur_actor_name_text.strip(): cur_actor = etree.SubElement(cast, "actor") cur_actor.text = cur_actor_name_text.strip() 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 lINDEXER_API_PARMS['language'] = indexer_lang or sickbeard.INDEXER_DEFAULT_LANGUAGE if ep_obj.show.dvdorder: 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 ShowNotFoundException(e.message) except sickbeard.indexer_error as e: logger.log("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("Metadata writer is unable to find episode {0:d}x{1:d} of {2} on {3}..." "has it been removed? Should I delete from db?".format( curEpToWrite.season, curEpToWrite.episode, curEpToWrite.show.name, sickbeard.indexerApi(ep_obj.show.indexer).name)) return None if ep_obj.season == 0 and not getattr(myEp, 'firstaired', None): myEp["firstaired"] = str(datetime.date.fromordinal(1)) if not (getattr(myEp, 'episodename', None) and getattr(myEp, 'firstaired', 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.pretty_name() if getattr(myShow, 'seriesname', None): seriesName = etree.SubElement(episode, "series_name") seriesName.text = myShow["seriesname"] if curEpToWrite.name: episodeName = etree.SubElement(episode, "episode_name") 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) if getattr(myShow, 'firstaired', None): try: year_text = str(datetime.datetime.strptime(myShow["firstaired"], dateFormat).year) if year_text: year = etree.SubElement(episode, "year") year.text = year_text except Exception: pass if curEpToWrite.season != 0 and getattr(myShow, 'runtime', None): runtime = etree.SubElement(episode, "runtime") runtime.text = myShow["runtime"] if getattr(myShow, 'genre', None): genre = etree.SubElement(episode, "genre") genre.text = " / ".join([x.strip() for x in myShow["genre"].split('|') if x.strip()]) if getattr(myEp, 'director', None): director = etree.SubElement(episode, "director") director.text = myEp['director'] if getattr(myShow, '_actors', None): for actor in myShow['_actors']: if not ('name' in actor and actor['name'].strip()): continue cur_actor = etree.SubElement(episode, "actor") cur_actor_name = etree.SubElement(cur_actor, "name") cur_actor_name.text = actor['name'] if 'role' in actor and actor['role'].strip(): cur_actor_role = etree.SubElement(cur_actor, "role") cur_actor_role.text = actor['role'].strip() if curEpToWrite.description: overview = etree.SubElement(episode, "overview") overview.text = curEpToWrite.description # 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 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 # There's gotta be a better way of doing this but we don't wanna # change the language value elsewhere l_indexer_api_params = sickbeard.indexerApi(ep_obj.show.indexer).api_params.copy() if indexer_lang and not indexer_lang == sickbeard.INDEXER_DEFAULT_LANGUAGE: l_indexer_api_params[b'language'] = indexer_lang if ep_obj.show.dvdorder != 0: l_indexer_api_params[b'dvdorder'] = True try: t = sickbeard.indexerApi(ep_obj.show.indexer).indexer(**l_indexer_api_params) my_show = t[ep_obj.show.indexerid] except sickbeard.indexer_shownotfound as e: raise ShowNotFoundException(e.message) except sickbeard.indexer_error: logger.log(u'Unable to connect to {indexer} while creating meta files - skipping it.'.format (indexer=sickbeard.indexerApi(ep_obj.show.indexer).name), logger.WARNING) return root_node = etree.Element('details') movie = etree.SubElement(root_node, 'movie') movie.attrib['isExtra'] = 'false' movie.attrib['isSet'] = 'false' movie.attrib['isTV'] = 'true' # write an MediaBrowser XML containing info for all matching episodes for ep_to_write in eps_to_write: try: my_ep = my_show[ep_to_write.season][ep_to_write.episode] except (sickbeard.indexer_episodenotfound, sickbeard.indexer_seasonnotfound): logger.log(u'Unable to find episode {ep_num} on {indexer}... ' u'has it been removed? Should I delete from db?'.format (ep_num=episode_num(ep_to_write.season, ep_to_write.episode), indexer=sickbeard.indexerApi(ep_obj.show.indexer).name)) return None if ep_to_write == ep_obj: # root (or single) episode # default to today's date for specials if firstaired is not set if ep_to_write.season == 0 and not getattr(my_ep, 'firstaired', None): my_ep['firstaired'] = str(datetime.date.fromordinal(1)) if not (getattr(my_ep, 'episodename', None) and getattr(my_ep, 'firstaired', None)): return None episode = movie if ep_to_write.name: episode_name = etree.SubElement(episode, 'title') episode_name.text = ep_to_write.name season_number = etree.SubElement(episode, 'season') season_number.text = str(ep_to_write.season) episode_number = etree.SubElement(episode, 'episode') episode_number.text = str(ep_to_write.episode) if getattr(my_show, 'firstaired', None): try: year_text = str(datetime.datetime.strptime(my_show['firstaired'], dateFormat).year) if year_text: year = etree.SubElement(episode, 'year') year.text = year_text except Exception: pass if getattr(my_show, 'overview', None): plot = etree.SubElement(episode, 'plot') plot.text = my_show['overview'] if ep_to_write.description: overview = etree.SubElement(episode, 'episodeplot') overview.text = ep_to_write.description if getattr(my_show, 'contentrating', None): mpaa = etree.SubElement(episode, 'mpaa') mpaa.text = my_show['contentrating'] if not ep_obj.relatedEps and getattr(my_ep, 'rating', None): try: rating = int((float(my_ep['rating']) * 10)) except ValueError: rating = 0 if rating: rating = etree.SubElement(episode, 'rating') rating.text = str(rating) if getattr(my_ep, 'director', None): director = etree.SubElement(episode, 'director') director.text = my_ep['director'] if getattr(my_ep, 'writer', None): writer = etree.SubElement(episode, 'credits') writer.text = my_ep['writer'] if getattr(my_show, '_actors', None) or getattr(my_ep, 'gueststars', None): cast = etree.SubElement(episode, 'cast') if getattr(my_ep, 'gueststars', None) and isinstance(my_ep['gueststars'], basestring): for actor in (x.strip() for x in my_ep['gueststars'].split('|') if x.strip()): cur_actor = etree.SubElement(cast, 'actor') cur_actor.text = actor if getattr(my_show, '_actors', None): for actor in my_show['_actors']: if 'name' in actor and actor['name'].strip(): cur_actor = etree.SubElement(cast, 'actor') cur_actor.text = actor['name'].strip() else: # append data from (if any) related episodes if ep_to_write.name: if not episode_name.text: episode_name.text = ep_to_write.name else: episode_name.text = u', '.join([episode_name.text, ep_to_write.name]) if ep_to_write.description: if not overview.text: overview.text = ep_to_write.description else: overview.text = u'\r'.join([overview.text, ep_to_write.description]) # Make it purdy helpers.indentXML(root_node) data = etree.ElementTree(root_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 myShow = ep_obj.idxr.series_from_episode(ep_obj) rootNode = etree.Element("details") # write an WDTV XML containing info for all matching episodes for curEpToWrite in eps_to_write: myEp = curEpToWrite.idxr.episode(curEpToWrite) if not myEp: logger.log( "Metadata writer is unable to find episode {0:d}x{1:d} of {2} on {3}..." "has it been removed? Should I delete from db?".format( curEpToWrite.season, curEpToWrite.episode, curEpToWrite.show.name, ep_obj.idxr.name)) return None if ep_obj.airdate != datetime.date.min and not myEp.get( 'firstAired'): myEp["firstAired"] = str(ep_obj.airdate) if not (myEp.get('episodeName') and myEp.get('firstAired')): return None if len(eps_to_write) > 1: episode = etree.SubElement(rootNode, "details") else: episode = rootNode if myEp.get('id'): episodeID = etree.SubElement(episode, "id") episodeID.text = str(myEp['id']) title = etree.SubElement(episode, "title") title.text = ep_obj.pretty_name() if getattr(myShow, 'seriesName', None): seriesName = etree.SubElement(episode, "series_name") seriesName.text = myShow.seriesName if curEpToWrite.name: episodeName = etree.SubElement(episode, "episode_name") 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.min: firstAired.text = str(curEpToWrite.airdate) if getattr(myShow, 'firstAired', None): try: year_text = str( datetime.datetime.strptime(myShow.firstAired, dateFormat).year) if year_text: year = etree.SubElement(episode, "year") year.text = year_text except Exception: pass if curEpToWrite.season != 0 and getattr(myShow, 'runtime', None): runtime = etree.SubElement(episode, "runtime") runtime.text = myShow.runtime if getattr(myShow, 'genre', None): genre = etree.SubElement(episode, "genre") genre.text = " / ".join(myShow.genre) if myEp.get('directors') and isinstance(myEp['directors'], list): for director in myEp['directors']: director_element = etree.SubElement(episode, "director") director_element.text = director data = ep_obj.idxr.actors(myShow) for actor in data: if not ('name' in actor and actor['name'].strip()): continue cur_actor = etree.SubElement(episode, "actor") cur_actor_name = etree.SubElement(cur_actor, "name") cur_actor_name.text = actor['name'] if 'role' in actor and actor['role'].strip(): cur_actor_role = etree.SubElement(cur_actor, "role") cur_actor_role.text = actor['role'].strip() if curEpToWrite.description: overview = etree.SubElement(episode, "overview") overview.text = curEpToWrite.description # Make it purdy helpers.indentXML(rootNode) data = etree.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 """ tvdb_lang = show_obj.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 t = tvdb_api.Tvdb(actors=True, **ltvdb_api_parms) tv_node = etree.Element("Series") try: myShow = t[int(show_obj.tvdbid)] except tvdb_exceptions.tvdb_shownotfound: logger.log(u"Unable to find show with id " + str(show_obj.tvdbid) + " on tvdb, skipping it", logger.ERROR) raise except tvdb_exceptions.tvdb_error: logger.log(u"TVDB is down, can't use its data to make the NFO", logger.ERROR) raise # check for title and id try: if myShow['seriesname'] == None or myShow['seriesname'] == "" or myShow['id'] == None or myShow['id'] == "": logger.log(u"Incomplete info for show with id " + str(show_obj.tvdbid) + " on tvdb, skipping it", logger.ERROR) return False except tvdb_exceptions.tvdb_attributenotfound: logger.log(u"Incomplete info for show with id " + str(show_obj.tvdbid) + " on tvdb, skipping it", logger.ERROR) return False tvdbid = etree.SubElement(tv_node, "id") if myShow['id'] != None: tvdbid.text = myShow['id'] SeriesName = etree.SubElement(tv_node, "SeriesName") if myShow['seriesname'] != None: SeriesName.text = myShow['seriesname'] Status = etree.SubElement(tv_node, "Status") if myShow['status'] != None: Status.text = myShow['status'] Network = etree.SubElement(tv_node, "Network") if myShow['network'] != None: Network.text = myShow['network'] Airs_Time = etree.SubElement(tv_node, "Airs_Time") if myShow['airs_time'] != None: Airs_Time.text = myShow['airs_time'] Airs_DayOfWeek = etree.SubElement(tv_node, "Airs_DayOfWeek") if myShow['airs_dayofweek'] != None: Airs_DayOfWeek.text = myShow['airs_dayofweek'] FirstAired = etree.SubElement(tv_node, "FirstAired") if myShow['firstaired'] != None: FirstAired.text = myShow['firstaired'] ContentRating = etree.SubElement(tv_node, "ContentRating") MPAARating = etree.SubElement(tv_node, "MPAARating") certification = etree.SubElement(tv_node, "certification") if myShow['contentrating'] != None: ContentRating.text = myShow['contentrating'] MPAARating.text = myShow['contentrating'] certification.text = myShow['contentrating'] MetadataType = etree.SubElement(tv_node, "Type") MetadataType.text = "Series" Overview = etree.SubElement(tv_node, "Overview") if myShow['overview'] != None: Overview.text = myShow['overview'] PremiereDate = etree.SubElement(tv_node, "PremiereDate") if myShow['firstaired'] != None: PremiereDate.text = myShow['firstaired'] Rating = etree.SubElement(tv_node, "Rating") if myShow['rating'] != None: Rating.text = myShow['rating'] ProductionYear = etree.SubElement(tv_node, "ProductionYear") if myShow['firstaired'] != None: try: year_text = str(datetime.datetime.strptime(myShow['firstaired'], '%Y-%m-%d').year) if year_text: ProductionYear.text = year_text except: pass RunningTime = etree.SubElement(tv_node, "RunningTime") Runtime = etree.SubElement(tv_node, "Runtime") if myShow['runtime'] != None: RunningTime.text = myShow['runtime'] Runtime.text = myShow['runtime'] IMDB_ID = etree.SubElement(tv_node, "IMDB_ID") IMDB = etree.SubElement(tv_node, "IMDB") IMDbId = etree.SubElement(tv_node, "IMDbId") if myShow['imdb_id'] != None: IMDB_ID.text = myShow['imdb_id'] IMDB.text = myShow['imdb_id'] IMDbId.text = myShow['imdb_id'] Zap2ItId = etree.SubElement(tv_node, "Zap2ItId") if myShow['zap2it_id'] != None: Zap2ItId.text = myShow['zap2it_id'] Genres = etree.SubElement(tv_node, "Genres") if myShow["genre"] != None: for genre in myShow['genre'].split('|'): if genre and genre.strip(): cur_genre = etree.SubElement(Genres, "Genre") cur_genre.text = genre.strip() Genre = etree.SubElement(tv_node, "Genre") if myShow["genre"] != None: Genre.text = "|".join([x.strip() for x in myShow["genre"].split('|') if x and x.strip()]) Studios = etree.SubElement(tv_node, "Studios") Studio = etree.SubElement(Studios, "Studio") if myShow["network"] != None: Studio.text = myShow['network'] Persons = etree.SubElement(tv_node, "Persons") if myShow["_actors"] != None: for actor in myShow["_actors"]: cur_actor_name_text = actor['name'] if cur_actor_name_text != None and cur_actor_name_text.strip(): cur_actor = etree.SubElement(Persons, "Person") cur_actor_name = etree.SubElement(cur_actor, "Name") cur_actor_name.text = cur_actor_name_text.strip() cur_actor_type = etree.SubElement(cur_actor, "Type") cur_actor_type.text = "Actor" 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 helpers.indentXML(tv_node) data = etree.ElementTree(tv_node) return data
def _show_data(self, show_obj): """ Creates an elementTree XML structure for a Mede8er-style Series.xml returns the resulting data object. show_obj: a TVShow instance to create the XML-NFO for """ logger.log("Mede8er: Starting Mede8er _show_data method", logger.MESSAGE) tvdb_lang = show_obj.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 t = tvdb_api.Tvdb(actors=True, **ltvdb_api_parms) rootNode = etree.Element("details") tv_node = etree.SubElement(rootNode, "movie") #tv_node = etree.Element("movie") tv_node.attrib["isExtra"] = "false" tv_node.attrib["isSet"] = "false" tv_node.attrib["isTV"] = "true" for ns in XML_NSMAP.keys(): tv_node.set(ns, XML_NSMAP[ns]) try: myShow = t[int(show_obj.tvdbid)] except tvdb_exceptions.tvdb_shownotfound: logger.log( "Mede8er: Unable to find show with id " + str(show_obj.tvdbid) + " on tvdb, skipping it", logger.ERROR) raise except tvdb_exceptions.tvdb_error: logger.log( "Mede8er: TVDB is down, can't use its data to make the XML-NFO", logger.ERROR) raise # check for title and id try: if myShow["seriesname"] == None or myShow[ "seriesname"] == "" or myShow["id"] == None or myShow[ "id"] == "": logger.log( "Mede8er: Incomplete info for show with id " + str(show_obj.tvdbid) + " on tvdb, skipping it", logger.ERROR) return False except tvdb_exceptions.tvdb_attributenotfound: logger.log( "Mede8er: Incomplete info for show with id " + str(show_obj.tvdbid) + " on tvdb, skipping it", logger.ERROR) return False title = etree.SubElement(tv_node, "title") if myShow["seriesname"] != None: title.text = myShow["seriesname"] tvdbid = etree.SubElement(tv_node, "tvdbid") if myShow["id"] != None: tvdbid.text = myShow["id"] seriesID = etree.SubElement(tv_node, "seriesID") if myShow["seriesid"] != None: seriesID.text = myShow["seriesid"] imdbid = etree.SubElement(tv_node, "imdbid") if myShow["imdb_id"] != None: imdbid.text = myShow["imdb_id"] zap2id = etree.SubElement(tv_node, "zap2itid") if myShow["zap2it_id"] != None: zap2id.text = myShow["zap2it_id"] premiered = etree.SubElement(tv_node, "releasedate") if myShow["firstaired"] != None: premiered.text = myShow["firstaired"] rating = etree.SubElement(tv_node, "rating") if myShow["rating"] != None: rating.text = myShow["rating"] ratingcount = etree.SubElement(tv_node, "ratingcount") if myShow["ratingcount"] != None: ratingcount.text = myShow["ratingcount"] network = etree.SubElement(tv_node, "network") if myShow["network"] != None: network.text = myShow["network"] Runtime = etree.SubElement(tv_node, "runtime") if myShow["runtime"] != None: Runtime.text = myShow["runtime"] genre = etree.SubElement(tv_node, "genre") if myShow["genre"] != None: genre.text = myShow["genre"] #tmpNode = etree.SubElement(tv_node, "myShow") #tmpNode.text = str(vars(myShow)) #logger.log("Printing myShow info: " + str(vars(myShow)), logger.MESSAGE) #Actors = etree.SubElement(tv_node, "Actors") #if myShow["actors"] != None: # Actors.text = myShow["actors"] rating = etree.SubElement(tv_node, "certification") if myShow["contentrating"] != None: rating.text = myShow["contentrating"] Overview = etree.SubElement(tv_node, "plot") if myShow["overview"] != None: Overview.text = myShow["overview"] cast = etree.SubElement(tv_node, "cast") for actor in myShow['_actors']: cast_actor = etree.SubElement(cast, "actor") cast_actor.text = actor['name'] rating = etree.SubElement(tv_node, "Status") if myShow["status"] != None: rating.text = myShow["status"] cover = etree.SubElement(tv_node, "cover") poster = etree.SubElement(cover, "name") if myShow["poster"] != None: poster.text = myShow["poster"] backdrop = etree.SubElement(tv_node, "backdrop") fanart = etree.SubElement(backdrop, "name") if myShow["fanart"] != None: fanart.text = myShow["fanart"] helpers.indentXML(tv_node) data = etree.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 l_indexer_api_params = sickbeard.indexerApi(ep_obj.show.indexer).api_params.copy() l_indexer_api_params[b'actors'] = True if indexer_lang and not indexer_lang == sickbeard.INDEXER_DEFAULT_LANGUAGE: l_indexer_api_params[b'language'] = indexer_lang if ep_obj.show.dvdorder != 0: l_indexer_api_params[b'dvdorder'] = True try: t = sickbeard.indexerApi(ep_obj.show.indexer).indexer(**l_indexer_api_params) my_show = t[ep_obj.show.indexerid] except sickbeard.indexer_shownotfound as e: raise ShowNotFoundException(e.message) except sickbeard.indexer_error: logger.log(u'Unable to connect to {indexer} while creating meta files - skipping it.'.format (indexer=sickbeard.indexerApi(ep_obj.show.indexer).name), logger.WARNING) return False root_node = etree.Element('details') # write an WDTV XML containing info for all matching episodes for ep_to_write in eps_to_write: try: my_ep = my_show[ep_to_write.season][ep_to_write.episode] except (sickbeard.indexer_episodenotfound, sickbeard.indexer_seasonnotfound): logger.log(u'Unable to find episode {ep_num} on {indexer}... ' u'has it been removed? Should I delete from db?'.format (ep_num=episode_num(ep_to_write.season, ep_to_write.episode), indexer=sickbeard.indexerApi(ep_obj.show.indexer).name)) return None if ep_obj.season == 0 and not getattr(my_ep, 'firstaired', None): my_ep['firstaired'] = str(datetime.date.fromordinal(1)) if not (getattr(my_ep, 'episodename', None) and getattr(my_ep, 'firstaired', None)): return None if len(eps_to_write) > 1: episode = etree.SubElement(root_node, 'details') else: episode = root_node # TODO: get right EpisodeID episode_id = etree.SubElement(episode, 'id') episode_id.text = str(ep_to_write.indexerid) title = etree.SubElement(episode, 'title') title.text = ep_obj.prettyName() if getattr(my_show, 'seriesname', None): series_name = etree.SubElement(episode, 'series_name') series_name.text = my_show['seriesname'] if ep_to_write.name: episode_name = etree.SubElement(episode, 'episode_name') episode_name.text = ep_to_write.name season_number = etree.SubElement(episode, 'season_number') season_number.text = str(ep_to_write.season) episode_num = etree.SubElement(episode, 'episode_number') episode_num.text = str(ep_to_write.episode) first_aired = etree.SubElement(episode, 'firstaired') if ep_to_write.airdate != datetime.date.fromordinal(1): first_aired.text = str(ep_to_write.airdate) if getattr(my_show, 'firstaired', None): try: year_text = str(datetime.datetime.strptime(my_show['firstaired'], dateFormat).year) if year_text: year = etree.SubElement(episode, 'year') year.text = year_text except Exception: pass if ep_to_write.season != 0 and getattr(my_show, 'runtime', None): runtime = etree.SubElement(episode, 'runtime') runtime.text = my_show['runtime'] if getattr(my_show, 'genre', None): genre = etree.SubElement(episode, 'genre') genre.text = ' / '.join([x.strip() for x in my_show['genre'].split('|') if x.strip()]) if getattr(my_ep, 'director', None): director = etree.SubElement(episode, 'director') director.text = my_ep['director'] if getattr(my_show, '_actors', None): for actor in my_show['_actors']: if not ('name' in actor and actor['name'].strip()): continue cur_actor = etree.SubElement(episode, 'actor') cur_actor_name = etree.SubElement(cur_actor, 'name') cur_actor_name.text = actor['name'] if 'role' in actor and actor['role'].strip(): cur_actor_role = etree.SubElement(cur_actor, 'role') cur_actor_role.text = actor['role'].strip() if ep_to_write.description: overview = etree.SubElement(episode, 'overview') overview.text = ep_to_write.description # Make it purdy helpers.indentXML(root_node) data = etree.ElementTree(root_node) 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 lINDEXER_API_PARMS = sickbeard.indexerApi( show_obj.indexer).api_params.copy() lINDEXER_API_PARMS['actors'] = True if indexer_lang and not indexer_lang == sickbeard.INDEXER_DEFAULT_LANGUAGE: lINDEXER_API_PARMS['language'] = indexer_lang if show_obj.dvdorder != 0: lINDEXER_API_PARMS['dvdorder'] = True t = sickbeard.indexerApi( show_obj.indexer).indexer(**lINDEXER_API_PARMS) rootNode = etree.Element("details") tv_node = etree.SubElement(rootNode, "movie") tv_node.attrib["isExtra"] = "false" tv_node.attrib["isSet"] = "false" tv_node.attrib["isTV"] = "true" try: myShow = t[int(show_obj.indexerid)] except sickbeard.indexer_shownotfound: logger.log( u"Unable to find show with id " + str(show_obj.indexerid) + " on tvdb, skipping it", logger.ERROR) raise except sickbeard.indexer_error: logger.log(u"TVDB is down, can't use its data to make the NFO", logger.ERROR) raise # check for title and id if not (getattr(myShow, 'seriesname', None) and getattr(myShow, 'id', None)): logger.log( u"Incomplete info for show with id " + str(show_obj.indexerid) + " on " + sickbeard.indexerApi(show_obj.indexer).name + ", skipping it", logger.ERROR) return False SeriesName = etree.SubElement(tv_node, "title") SeriesName.text = myShow['seriesname'] if getattr(myShow, "genre", None): Genres = etree.SubElement(tv_node, "genres") for genre in myShow['genre'].split('|'): if genre and genre.strip(): cur_genre = etree.SubElement(Genres, "Genre") cur_genre.text = genre.strip() if getattr(myShow, 'firstaired', None): FirstAired = etree.SubElement(tv_node, "premiered") FirstAired.text = myShow['firstaired'] if getattr(myShow, "firstaired", None): try: year_text = str( datetime.datetime.strptime(myShow["firstaired"], dateFormat).year) if year_text: year = etree.SubElement(tv_node, "year") year.text = year_text except Exception: pass if getattr(myShow, 'overview', None): plot = etree.SubElement(tv_node, "plot") plot.text = myShow["overview"] if getattr(myShow, 'rating', None): try: rating = int(float(myShow['rating']) * 10) except ValueError: rating = 0 if rating: Rating = etree.SubElement(tv_node, "rating") Rating.text = str(rating) if getattr(myShow, 'status', None): Status = etree.SubElement(tv_node, "status") Status.text = myShow['status'] if getattr(myShow, "contentrating", None): mpaa = etree.SubElement(tv_node, "mpaa") mpaa.text = myShow["contentrating"] if getattr(myShow, 'imdb_id', None): imdb_id = etree.SubElement(tv_node, "id") imdb_id.attrib["moviedb"] = "imdb" imdb_id.text = myShow['imdb_id'] if getattr(myShow, 'id', None): indexerid = etree.SubElement(tv_node, "indexerid") indexerid.text = myShow['id'] if getattr(myShow, 'runtime', None): Runtime = etree.SubElement(tv_node, "runtime") Runtime.text = myShow['runtime'] if getattr(myShow, '_actors', None): cast = etree.SubElement(tv_node, "cast") for actor in myShow['_actors']: if 'name' in actor and actor['name'].strip(): cur_actor = etree.SubElement(cast, "actor") cur_actor.text = actor['name'].strip() helpers.indentXML(rootNode) data = etree.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 lINDEXER_API_PARMS = sickbeard.indexerApi(show_obj.indexer).api_params.copy() lINDEXER_API_PARMS['actors'] = True lINDEXER_API_PARMS['language'] = indexer_lang or sickbeard.INDEXER_DEFAULT_LANGUAGE if show_obj.dvdorder: lINDEXER_API_PARMS['dvdorder'] = True t = sickbeard.indexerApi(show_obj.indexer).indexer(**lINDEXER_API_PARMS) rootNode = etree.Element("details") tv_node = etree.SubElement(rootNode, "movie") tv_node.attrib["isExtra"] = "false" tv_node.attrib["isSet"] = "false" tv_node.attrib["isTV"] = "true" try: myShow = t[int(show_obj.indexerid)] except sickbeard.indexer_shownotfound: logger.log("Unable to find show with id " + str(show_obj.indexerid) + " on tvdb, skipping it", logger.ERROR) raise except sickbeard.indexer_error: logger.log("TVDB is down, can't use its data to make the NFO", logger.ERROR) raise # check for title and id if not (getattr(myShow, 'seriesname', None) and getattr(myShow, 'id', None)): logger.log("Incomplete info for show with id " + str(show_obj.indexerid) + " on " + sickbeard.indexerApi( show_obj.indexer).name + ", skipping it") return False SeriesName = etree.SubElement(tv_node, "title") SeriesName.text = myShow['seriesname'] if getattr(myShow, "genre", None): Genres = etree.SubElement(tv_node, "genres") for genre in myShow['genre'].split('|'): if genre and genre.strip(): cur_genre = etree.SubElement(Genres, "Genre") cur_genre.text = genre.strip() if getattr(myShow, 'firstaired', None): FirstAired = etree.SubElement(tv_node, "premiered") FirstAired.text = myShow['firstaired'] if getattr(myShow, "firstaired", None): try: year_text = str(datetime.datetime.strptime(myShow["firstaired"], dateFormat).year) if year_text: year = etree.SubElement(tv_node, "year") year.text = year_text except Exception: pass if getattr(myShow, 'overview', None): plot = etree.SubElement(tv_node, "plot") plot.text = myShow["overview"] if getattr(myShow, 'rating', None): try: rating = int(float(myShow['rating']) * 10) except ValueError: rating = 0 if rating: Rating = etree.SubElement(tv_node, "rating") Rating.text = str(rating) if getattr(myShow, 'status', None): Status = etree.SubElement(tv_node, "status") Status.text = myShow['status'] if getattr(myShow, "contentrating", None): mpaa = etree.SubElement(tv_node, "mpaa") mpaa.text = myShow["contentrating"] if getattr(myShow, 'imdb_id', None): imdb_id = etree.SubElement(tv_node, "id") imdb_id.attrib["moviedb"] = "imdb" imdb_id.text = myShow['imdb_id'] if getattr(myShow, 'id', None): indexerid = etree.SubElement(tv_node, "indexerid") indexerid.text = myShow['id'] if getattr(myShow, 'runtime', None): Runtime = etree.SubElement(tv_node, "runtime") Runtime.text = myShow['runtime'] if getattr(myShow, '_actors', None): cast = etree.SubElement(tv_node, "cast") for actor in myShow['_actors']: if 'name' in actor and actor['name'].strip(): cur_actor = etree.SubElement(cast, "actor") cur_actor.text = actor['name'].strip() helpers.indentXML(rootNode) data = etree.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 = sickbeard.indexerApi( show_obj.indexer).api_params.copy() lINDEXER_API_PARMS['actors'] = True if indexer_lang and not indexer_lang == sickbeard.INDEXER_DEFAULT_LANGUAGE: lINDEXER_API_PARMS['language'] = indexer_lang if show_obj.dvdorder != 0: lINDEXER_API_PARMS['dvdorder'] = True t = sickbeard.indexerApi( show_obj.indexer).indexer(**lINDEXER_API_PARMS) tv_node = etree.Element("tvshow") try: myShow = t[int(show_ID)] except sickbeard.indexer_shownotfound: logger.log( u"Unable to find show with id " + str(show_ID) + " on " + sickbeard.indexerApi(show_obj.indexer).name + ", skipping it", logger.ERROR) raise except sickbeard.indexer_error: logger.log( u"" + sickbeard.indexerApi(show_obj.indexer).name + " is down, can't use its data to add this show", logger.ERROR) raise # check for title and id if getattr(myShow, 'seriesname', None) is None or getattr( myShow, 'id', None) is None: logger.log( u"Incomplete info for show with id " + str(show_ID) + " on " + sickbeard.indexerApi(show_obj.indexer).name + ", skipping it", logger.ERROR) return False title = etree.SubElement(tv_node, "title") if getattr(myShow, 'seriesname', None) is not None: title.text = myShow["seriesname"] rating = etree.SubElement(tv_node, "rating") if getattr(myShow, 'rating', None) is not None: rating.text = myShow["rating"] year = etree.SubElement(tv_node, "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 plot = etree.SubElement(tv_node, "plot") if getattr(myShow, 'overview', None) is not None: plot.text = myShow["overview"] episodeguide = etree.SubElement(tv_node, "episodeguide") episodeguideurl = etree.SubElement(episodeguide, "url") if getattr(myShow, 'id', None) is not None: episodeguideurl.text = sickbeard.indexerApi( show_obj.indexer).config['base_url'] + str( myShow["id"]) + '/all/en.zip' mpaa = etree.SubElement(tv_node, "mpaa") if getattr(myShow, 'contentrating', None) is not None: mpaa.text = myShow["contentrating"] indexerid = etree.SubElement(tv_node, "id") if getattr(myShow, 'id', None) is not None: indexerid.text = str(myShow["id"]) genre = etree.SubElement(tv_node, "genre") if getattr(myShow, 'genre', None) is not None: if isinstance(myShow["genre"], basestring): genre.text = " / ".join(x.strip() for x in myShow["genre"].split('|') if x.strip()) premiered = etree.SubElement(tv_node, "premiered") if getattr(myShow, 'firstaired', None) is not None: premiered.text = myShow["firstaired"] studio = etree.SubElement(tv_node, "studio") if getattr(myShow, 'network', None) is not None: studio.text = myShow["network"] if getattr(myShow, '_actors', None) is not None: for actor in myShow['_actors']: cur_actor = etree.SubElement(tv_node, "actor") cur_actor_name = etree.SubElement(cur_actor, "name") if getattr(actor, 'name', None) is not None: cur_actor_name.text = actor['name'].strip() cur_actor_role = etree.SubElement(cur_actor, "role") if getattr(actor, 'role', None) is not None: cur_actor_role.text = actor['role'] cur_actor_thumb = etree.SubElement(cur_actor, "thumb") if getattr(actor, 'image', None) is not None: cur_actor_thumb.text = actor['image'] # Make it purdy helpers.indentXML(tv_node) data = etree.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.related_episodes persons_dict = { 'Director': [], 'GuestStar': [], 'Writer': [] } indexer_lang = ep_obj.show.lang l_indexer_api_params = sickbeard.indexerApi(ep_obj.show.indexer).api_params.copy() l_indexer_api_params[b'actors'] = True if indexer_lang and not indexer_lang == sickbeard.INDEXER_DEFAULT_LANGUAGE: l_indexer_api_params[b'language'] = indexer_lang if ep_obj.show.dvdorder != 0: l_indexer_api_params[b'dvdorder'] = True try: t = sickbeard.indexerApi(ep_obj.show.indexer).indexer(**l_indexer_api_params) my_show = t[ep_obj.show.indexerid] except sickbeard.indexer_shownotfound as e: raise ShowNotFoundException(e.message) except sickbeard.indexer_error: logger.log(u'Unable to connect to {indexer} while creating meta files - skipping it.'.format (indexer=sickbeard.indexerApi(ep_obj.show.indexer).name), logger.WARNING) return root_node = etree.Element('Item') # write an MediaBrowser XML containing info for all matching episodes for ep_to_write in eps_to_write: try: my_ep = my_show[ep_to_write.season][ep_to_write.episode] except (sickbeard.indexer_episodenotfound, sickbeard.indexer_seasonnotfound): logger.log(u'Unable to find episode {ep_num} on {indexer}... ' u'has it been removed? Should I delete from db?'.format (ep_num=episode_num(ep_to_write.season, ep_to_write.episode), indexer=sickbeard.indexerApi(ep_obj.show.indexer).name)) return None if ep_to_write == ep_obj: # root (or single) episode # default to today's date for specials if firstaired is not set if ep_to_write.season == 0 and not getattr(my_ep, 'firstaired', None): my_ep['firstaired'] = str(datetime.date.fromordinal(1)) if not (getattr(my_ep, 'episodename', None) and getattr(my_ep, 'firstaired', None)): return None episode = root_node if ep_to_write.name: episode_name = etree.SubElement(episode, 'EpisodeName') episode_name.text = ep_to_write.name episode_number = etree.SubElement(episode, 'EpisodeNumber') episode_number.text = str(ep_obj.episode) if ep_obj.related_episodes: episode_number_end = etree.SubElement(episode, 'EpisodeNumberEnd') episode_number_end.text = str(ep_to_write.episode) season_number = etree.SubElement(episode, 'SeasonNumber') season_number.text = str(ep_to_write.season) if not ep_obj.related_episodes and getattr(my_ep, 'absolute_number', None): absolute_number = etree.SubElement(episode, 'absolute_number') absolute_number.text = str(my_ep['absolute_number']) if ep_to_write.airdate != datetime.date.fromordinal(1): first_aired = etree.SubElement(episode, 'FirstAired') first_aired.text = str(ep_to_write.airdate) metadata_type = etree.SubElement(episode, 'Type') metadata_type.text = 'Episode' if ep_to_write.description: overview = etree.SubElement(episode, 'Overview') overview.text = ep_to_write.description if not ep_obj.related_episodes: if getattr(my_ep, 'rating', None): rating = etree.SubElement(episode, 'Rating') rating.text = my_ep['rating'] if getattr(my_show, 'imdb_id', None): IMDB_ID = etree.SubElement(episode, 'IMDB_ID') IMDB_ID.text = my_show['imdb_id'] IMDB = etree.SubElement(episode, 'IMDB') IMDB.text = my_show['imdb_id'] IMDbId = etree.SubElement(episode, 'IMDbId') IMDbId.text = my_show['imdb_id'] indexer_id = etree.SubElement(episode, 'id') indexer_id.text = str(ep_to_write.indexerid) persons = etree.SubElement(episode, 'Persons') if getattr(my_show, '_actors', None): for actor in my_show['_actors']: if not ('name' in actor and actor['name'].strip()): continue cur_actor = etree.SubElement(persons, 'Person') cur_actor_name = etree.SubElement(cur_actor, 'Name') cur_actor_name.text = actor['name'].strip() cur_actor_type = etree.SubElement(cur_actor, 'Type') cur_actor_type.text = 'Actor' if 'role' in actor and actor['role'].strip(): cur_actor_role = etree.SubElement(cur_actor, 'Role') cur_actor_role.text = actor['role'].strip() language = etree.SubElement(episode, 'Language') try: language.text = my_ep['language'] except Exception: language.text = sickbeard.INDEXER_DEFAULT_LANGUAGE # 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 episode_number_end.text = str(ep_to_write.episode) if ep_to_write.name: if not episode_name.text: episode_name.text = ep_to_write.name else: episode_name.text = u', '.join([episode_name.text, ep_to_write.name]) if ep_to_write.description: if not overview.text: overview.text = ep_to_write.description else: overview.text = u'\r'.join([overview.text, ep_to_write.description]) # collect all directors, guest stars and writers if getattr(my_ep, 'director', None): persons_dict['Director'] += [x.strip() for x in my_ep['director'].split('|') if x.strip()] if getattr(my_ep, 'gueststars', None): persons_dict['GuestStar'] += [x.strip() for x in my_ep['gueststars'].split('|') if x.strip()] if getattr(my_ep, 'writer', None): persons_dict['Writer'] += [x.strip() for x in my_ep['writer'].split('|') if x.strip()] # 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 # Make it purdy helpers.indentXML(root_node) data = etree.ElementTree(root_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 myShow = ep_obj.idxr.series_from_episode(ep_obj) if not myShow: logger.log( "Unable to connect to {} while creating meta files - skipping". format(ep_obj.idxr.name)) return False 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: myEp = curEpToWrite.idxr.episode(curEpToWrite) if not myEp: logger.log( "Metadata writer is unable to find episode {0:d}x{1:d} of {2} on {3}..." "has it been removed? Should I delete from db?".format( curEpToWrite.season, curEpToWrite.episode, curEpToWrite.show.name, ep_obj.idxr.name)) return None if curEpToWrite == ep_obj: # root (or single) episode if str(ep_obj.airdate) != str(datetime.date.fromordinal( 1)) and not myEp.get('firstAired'): myEp['firstAired'] = str(ep_obj.airdate) if not (myEp.get('episodeName') and myEp.get('firstAired')): return None episode = movie if curEpToWrite.name: EpisodeName = etree.SubElement(episode, "title") EpisodeName.text = curEpToWrite.name SeasonNumber = etree.SubElement(episode, "season") SeasonNumber.text = str(curEpToWrite.season) EpisodeNumber = etree.SubElement(episode, "episode") EpisodeNumber.text = str(curEpToWrite.episode) if getattr(myShow, "firstAired", None): try: year_text = str( datetime.datetime.strptime(myShow.firstAired, dateFormat).year) if year_text: year = etree.SubElement(episode, "year") year.text = year_text except Exception: pass if getattr(myShow, "overview", None): plot = etree.SubElement(episode, "plot") plot.text = myShow.overview if curEpToWrite.description: Overview = etree.SubElement(episode, "episodeplot") Overview.text = curEpToWrite.description if getattr(myShow, 'contentRating', None): mpaa = etree.SubElement(episode, "mpaa") mpaa.text = myShow.rating if not ep_obj.relatedEps and myEp.get("rating"): try: rating = int((float(myEp.siteRating) * 10)) except ValueError: rating = 0 if rating: Rating = etree.SubElement(episode, "rating") Rating.text = str(rating) if myEp.get('directors') and isinstance( myEp['directors'], list): for director in myEp['directors']: cur_director = etree.SubElement(episode, "director") cur_director.text = director if myEp.get('writers') and isinstance(myEp['writers'], list): for writer in myEp['writers']: cur_writer = etree.SubElement(episode, "credits") cur_writer.text = writer if myEp.get('guestStars') and isinstance( myEp['guestStars'], list): cast = etree.SubElement(episode, "cast") for actor in myEp['guestStars']: cur_actor = etree.SubElement(cast, "actor") cur_actor.text = actor 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 _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 """ rootNode = etree.Element("details") tv_node = etree.SubElement(rootNode, "movie") tv_node.attrib["isExtra"] = "false" tv_node.attrib["isSet"] = "false" tv_node.attrib["isTV"] = "true" myShow = sickchill.indexer.series(show_obj) if not myShow: logger.log( "Unable to find show with id {} on {}, skipping it".format( show_obj.indexerid, show_obj.idxr.name)) return False # check for title and id if not (getattr(myShow, 'seriesName', None) and getattr(myShow, 'id', None)): logger.log( "Incomplete info for show with id {} on {}, skipping it". format(show_obj.indexerid, show_obj.idxr.name)) return False SeriesName = etree.SubElement(tv_node, "title") SeriesName.text = myShow.seriesName if getattr(myShow, "genre", None): Genres = etree.SubElement(tv_node, "genres") for genre in myShow.genre: if genre and genre.strip(): cur_genre = etree.SubElement(Genres, "Genre") cur_genre.text = genre.strip() if getattr(myShow, 'firstAired', None): FirstAired = etree.SubElement(tv_node, "premiered") FirstAired.text = myShow.firstAired if getattr(myShow, "firstAired", None): try: year_text = str( datetime.datetime.strptime(myShow.firstAired, dateFormat).year) if year_text: year = etree.SubElement(tv_node, "year") year.text = year_text except Exception: pass if getattr(myShow, 'overview', None): plot = etree.SubElement(tv_node, "plot") plot.text = myShow.overview if getattr(myShow, 'rating', None): try: rating = int(float(myShow.siteRating) * 10) except ValueError: rating = 0 if rating: Rating = etree.SubElement(tv_node, "rating") Rating.text = str(rating) if getattr(myShow, 'status', None): Status = etree.SubElement(tv_node, "status") Status.text = myShow.status if getattr(myShow, "contentRating", None): mpaa = etree.SubElement(tv_node, "mpaa") mpaa.text = myShow.rating if getattr(myShow, 'imdb_id', None): imdb_id = etree.SubElement(tv_node, "id") imdb_id.attrib["moviedb"] = "imdb" imdb_id.text = myShow.imdbId if getattr(myShow, 'id', None): indexerid = etree.SubElement(tv_node, "indexerid") indexerid.text = str(myShow.id) if getattr(myShow, 'runtime', None): Runtime = etree.SubElement(tv_node, "runtime") Runtime.text = myShow.runtime actors = show_obj.idxr.actors(myShow) if actors: cast = etree.SubElement(tv_node, "cast") for actor in actors: if 'name' in actor and actor['name'].strip(): cur_actor = etree.SubElement(cast, "actor") cur_actor.text = actor['name'].strip() helpers.indentXML(rootNode) data = etree.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 = sickbeard.indexerApi(show_obj.indexer).api_params.copy() lINDEXER_API_PARMS['actors'] = True lINDEXER_API_PARMS['language'] = indexer_lang or sickbeard.INDEXER_DEFAULT_LANGUAGE if show_obj.dvdorder: lINDEXER_API_PARMS['dvdorder'] = True t = sickbeard.indexerApi(show_obj.indexer).indexer(**lINDEXER_API_PARMS) tv_node = etree.Element("Series") try: myShow = t[int(show_obj.indexerid)] except sickbeard.indexer_shownotfound: logger.log("Unable to find show with id " + str(show_obj.indexerid) + " on " + sickbeard.indexerApi( show_obj.indexer).name + ", skipping it", logger.ERROR) raise except sickbeard.indexer_error: logger.log( "" + sickbeard.indexerApi(show_obj.indexer).name + " is down, can't use its data to make the NFO", logger.ERROR) raise # check for title and id if not (getattr(myShow, 'seriesname', None) and getattr(myShow, 'id', None)): logger.log("Incomplete info for show with id " + str(show_obj.indexerid) + " on " + sickbeard.indexerApi( show_obj.indexer).name + ", skipping it") return False if getattr(myShow, 'id', None): indexerid = etree.SubElement(tv_node, "id") indexerid.text = str(myShow['id']) if getattr(myShow, 'seriesname', None): SeriesName = etree.SubElement(tv_node, "SeriesName") SeriesName.text = myShow['seriesname'] if getattr(myShow, 'status', None): Status = etree.SubElement(tv_node, "Status") Status.text = myShow['status'] if getattr(myShow, 'network', None): Network = etree.SubElement(tv_node, "Network") Network.text = myShow['network'] if getattr(myShow, 'airs_time', None): Airs_Time = etree.SubElement(tv_node, "Airs_Time") Airs_Time.text = myShow['airs_time'] if getattr(myShow, 'airs_dayofweek', None): Airs_DayOfWeek = etree.SubElement(tv_node, "Airs_DayOfWeek") Airs_DayOfWeek.text = myShow['airs_dayofweek'] FirstAired = etree.SubElement(tv_node, "FirstAired") if getattr(myShow, 'firstaired', None): FirstAired.text = myShow['firstaired'] if getattr(myShow, 'contentrating', None): ContentRating = etree.SubElement(tv_node, "ContentRating") ContentRating.text = myShow['contentrating'] MPAARating = etree.SubElement(tv_node, "MPAARating") MPAARating.text = myShow['contentrating'] certification = etree.SubElement(tv_node, "certification") certification.text = myShow['contentrating'] MetadataType = etree.SubElement(tv_node, "Type") MetadataType.text = "Series" if getattr(myShow, 'overview', None): Overview = etree.SubElement(tv_node, "Overview") Overview.text = myShow['overview'] if getattr(myShow, 'firstaired', None): PremiereDate = etree.SubElement(tv_node, "PremiereDate") PremiereDate.text = myShow['firstaired'] if getattr(myShow, 'rating', None): Rating = etree.SubElement(tv_node, "Rating") Rating.text = myShow['rating'] if getattr(myShow, 'firstaired', None): try: year_text = str(datetime.datetime.strptime(myShow['firstaired'], dateFormat).year) if year_text: ProductionYear = etree.SubElement(tv_node, "ProductionYear") ProductionYear.text = year_text except Exception: pass if getattr(myShow, 'runtime', None): RunningTime = etree.SubElement(tv_node, "RunningTime") RunningTime.text = myShow['runtime'] Runtime = etree.SubElement(tv_node, "Runtime") Runtime.text = myShow['runtime'] if getattr(myShow, 'imdb_id', None): imdb_id = etree.SubElement(tv_node, "IMDB_ID") imdb_id.text = myShow['imdb_id'] imdb_id = etree.SubElement(tv_node, "IMDB") imdb_id.text = myShow['imdb_id'] imdb_id = etree.SubElement(tv_node, "IMDbId") imdb_id.text = myShow['imdb_id'] if getattr(myShow, 'zap2it_id', None): Zap2ItId = etree.SubElement(tv_node, "Zap2ItId") Zap2ItId.text = myShow['zap2it_id'] if getattr(myShow, 'genre', None) and isinstance(myShow["genre"], six.string_types): Genres = etree.SubElement(tv_node, "Genres") for genre in myShow['genre'].split('|'): if genre.strip(): cur_genre = etree.SubElement(Genres, "Genre") cur_genre.text = genre.strip() Genre = etree.SubElement(tv_node, "Genre") Genre.text = "|".join([x.strip() for x in myShow["genre"].split('|') if x.strip()]) if getattr(myShow, 'network', None): Studios = etree.SubElement(tv_node, "Studios") Studio = etree.SubElement(Studios, "Studio") Studio.text = myShow['network'] if getattr(myShow, '_actors', None): Persons = etree.SubElement(tv_node, "Persons") for actor in myShow['_actors']: if not ('name' in actor and actor['name'].strip()): continue cur_actor = etree.SubElement(Persons, "Person") cur_actor_name = etree.SubElement(cur_actor, "Name") cur_actor_name.text = actor['name'].strip() cur_actor_type = etree.SubElement(cur_actor, "Type") cur_actor_type.text = "Actor" if 'role' in actor and actor['role'].strip(): cur_actor_role = etree.SubElement(cur_actor, "Role") cur_actor_role.text = actor['role'].strip() helpers.indentXML(tv_node) data = etree.ElementTree(tv_node) 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 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 (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: 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 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 _show_data(self, show_obj): """ Creates an elementTree XML structure for a 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 = sickbeard.indexerApi(show_obj.indexer).api_params.copy() lINDEXER_API_PARMS['actors'] = True if indexer_lang and not indexer_lang == 'en': lINDEXER_API_PARMS['language'] = indexer_lang if show_obj.dvdorder != 0: lINDEXER_API_PARMS['dvdorder'] = True t = sickbeard.indexerApi(show_obj.indexer).indexer(**lINDEXER_API_PARMS) tv_node = etree.Element('tvshow') try: myShow = t[int(show_ID)] except sickbeard.indexer_shownotfound: logger.log(u'Unable to find show with id ' + str(show_ID) + ' on ' + sickbeard.indexerApi( show_obj.indexer).name + ', skipping it', logger.ERROR) raise except sickbeard.indexer_error: logger.log( u'' + sickbeard.indexerApi(show_obj.indexer).name + ' is down, can\'t use its data to add this show', logger.ERROR) raise if not self._valid_show(myShow, show_obj): return # check for title and id if getattr(myShow, 'seriesname', None) is None or getattr(myShow, 'id', None) is None: logger.log(u'Incomplete info for show with id ' + str(show_ID) + ' on ' + sickbeard.indexerApi( show_obj.indexer).name + ', skipping it', logger.ERROR) return False title = etree.SubElement(tv_node, 'title') if getattr(myShow, 'seriesname', None) is not None: title.text = myShow['seriesname'] rating = etree.SubElement(tv_node, 'rating') if getattr(myShow, 'rating', None) is not None: rating.text = myShow['rating'] year = etree.SubElement(tv_node, '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 plot = etree.SubElement(tv_node, 'plot') if getattr(myShow, 'overview', None) is not None: plot.text = myShow['overview'] episodeguide = etree.SubElement(tv_node, 'episodeguide') episodeguideurl = etree.SubElement(episodeguide, 'url') episodeguideurl2 = etree.SubElement(tv_node, 'episodeguideurl') if getattr(myShow, 'id', None) is not None: showurl = sickbeard.indexerApi(show_obj.indexer).config['base_url'] + str(myShow['id']) + '/all/en.zip' episodeguideurl.text = showurl episodeguideurl2.text = showurl mpaa = etree.SubElement(tv_node, 'mpaa') if getattr(myShow, 'contentrating', None) is not None: mpaa.text = myShow['contentrating'] indexerid = etree.SubElement(tv_node, 'id') if getattr(myShow, 'id', None) is not None: indexerid.text = str(myShow['id']) indexer = etree.SubElement(tv_node, 'indexer') if show_obj.indexer is not None: indexer.text = str(show_obj.indexer) genre = etree.SubElement(tv_node, 'genre') if getattr(myShow, 'genre', None) is not None: if isinstance(myShow['genre'], basestring): genre.text = ' / '.join(x.strip() for x in myShow['genre'].split('|') if x.strip()) premiered = etree.SubElement(tv_node, 'premiered') if getattr(myShow, 'firstaired', None) is not None: premiered.text = myShow['firstaired'] studio = etree.SubElement(tv_node, 'studio') if getattr(myShow, 'network', None) is not None: studio.text = myShow['network'] if getattr(myShow, '_actors', None) is not None: for actor in myShow['_actors']: cur_actor = etree.SubElement(tv_node, '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(tv_node) data = etree.ElementTree(tv_node) 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 = sickbeard.indexerApi( show_obj.indexer).api_params.copy() lINDEXER_API_PARMS['actors'] = True if indexer_lang and not indexer_lang == 'en': lINDEXER_API_PARMS['language'] = indexer_lang if show_obj.dvdorder != 0: lINDEXER_API_PARMS['dvdorder'] = True t = sickbeard.indexerApi( show_obj.indexer).indexer(**lINDEXER_API_PARMS) tv_node = etree.Element("Series") try: myShow = t[int(show_obj.indexerid)] except sickbeard.indexer_shownotfound: logger.log( u"Unable to find show with id " + str(show_obj.indexerid) + " on " + sickbeard.indexerApi(show_obj.indexer).name + ", skipping it", logger.ERROR) raise except sickbeard.indexer_error: logger.log( u"" + sickbeard.indexerApi(show_obj.indexer).name + " is down, can't use its data to make the NFO", logger.ERROR) raise # check for title and id if getattr(myShow, 'seriesname', None) is None or getattr( myShow, 'id', None) is None: logger.log( u"Incomplete info for show with id " + str(show_obj.indexerid) + " on " + sickbeard.indexerApi(show_obj.indexer).name + ", skipping it", logger.ERROR) return False indexerid = etree.SubElement(tv_node, "id") if getattr(myShow, 'id', None) is not None: indexerid.text = str(myShow['id']) indexer = etree.SubElement(tv_node, "indexer") if show_obj.indexer != None: indexer.text = str(show_obj.indexer) SeriesName = etree.SubElement(tv_node, "SeriesName") if getattr(myShow, 'seriesname', None) is not None: SeriesName.text = myShow['seriesname'] Status = etree.SubElement(tv_node, "Status") if getattr(myShow, 'status', None) is not None: Status.text = myShow['status'] Network = etree.SubElement(tv_node, "Network") if getattr(myShow, 'network', None) is not None: Network.text = myShow['network'] Airs_Time = etree.SubElement(tv_node, "Airs_Time") if getattr(myShow, 'airs_time', None) is not None: Airs_Time.text = myShow['airs_time'] Airs_DayOfWeek = etree.SubElement(tv_node, "Airs_DayOfWeek") if getattr(myShow, 'airs_dayofweek', None) is not None: Airs_DayOfWeek.text = myShow['airs_dayofweek'] FirstAired = etree.SubElement(tv_node, "FirstAired") if getattr(myShow, 'firstaired', None) is not None: FirstAired.text = myShow['firstaired'] ContentRating = etree.SubElement(tv_node, "ContentRating") MPAARating = etree.SubElement(tv_node, "MPAARating") certification = etree.SubElement(tv_node, "certification") if getattr(myShow, 'contentrating', None) is not None: ContentRating.text = myShow['contentrating'] MPAARating.text = myShow['contentrating'] certification.text = myShow['contentrating'] MetadataType = etree.SubElement(tv_node, "Type") MetadataType.text = "Series" Overview = etree.SubElement(tv_node, "Overview") if getattr(myShow, 'overview', None) is not None: Overview.text = myShow['overview'] PremiereDate = etree.SubElement(tv_node, "PremiereDate") if getattr(myShow, 'firstaired', None) is not None: PremiereDate.text = myShow['firstaired'] Rating = etree.SubElement(tv_node, "Rating") if getattr(myShow, 'rating', None) is not None: Rating.text = myShow['rating'] ProductionYear = etree.SubElement(tv_node, "ProductionYear") if getattr(myShow, 'firstaired', None) is not None: try: year_text = str( datetime.datetime.strptime(myShow['firstaired'], '%Y-%m-%d').year) if year_text: ProductionYear.text = year_text except: pass RunningTime = etree.SubElement(tv_node, "RunningTime") Runtime = etree.SubElement(tv_node, "Runtime") if getattr(myShow, 'runtime', None) is not None: RunningTime.text = myShow['runtime'] Runtime.text = myShow['runtime'] IMDB_ID = etree.SubElement(tv_node, "IMDB_ID") IMDB = etree.SubElement(tv_node, "IMDB") IMDbId = etree.SubElement(tv_node, "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'] Zap2ItId = etree.SubElement(tv_node, "Zap2ItId") if getattr(myShow, 'zap2it_id', None) is not None: Zap2ItId.text = myShow['zap2it_id'] Genres = etree.SubElement(tv_node, "Genres") for genre in myShow['genre'].split('|'): if genre: cur_genre = etree.SubElement(Genres, "Genre") cur_genre.text = genre Genre = etree.SubElement(tv_node, "Genre") if getattr(myShow, 'genre', None) is not None: Genre.text = "|".join([x for x in myShow["genre"].split('|') if x]) Studios = etree.SubElement(tv_node, "Studios") Studio = etree.SubElement(Studios, "Studio") if getattr(myShow, 'network', None) is not None: Studio.text = myShow['network'] Persons = etree.SubElement(tv_node, "Persons") if getattr(myShow, 'actors', None) is not None: for actor in myShow['_actors']: cur_actor = etree.SubElement(Persons, "Person") cur_actor_name = etree.SubElement(cur_actor, "Name") cur_actor_name.text = actor['name'].strip() cur_actor_type = etree.SubElement(cur_actor, "Type") cur_actor_type.text = "Actor" 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 helpers.indentXML(tv_node) data = etree.ElementTree(tv_node) return data
cur_actor_name.text = actor if getattr(myShow, '_actors', None): for actor in myShow['_actors']: cur_actor = etree.SubElement(episode, "actor") if 'name' in actor and actor['name'].strip(): cur_actor_name = etree.SubElement(cur_actor, "name") cur_actor_name.text = actor['name'].strip() else: continue if 'role' in actor and actor['role'].strip(): cur_actor_role = etree.SubElement(cur_actor, "role") cur_actor_role.text = actor['role'].strip() if 'image' in actor and actor['image'].strip(): cur_actor_thumb = etree.SubElement(cur_actor, "thumb") cur_actor_thumb.text = actor['image'].strip() # Make it purdy helpers.indentXML(rootNode) data = etree.ElementTree(rootNode) return data # present a standard "interface" from the module metadata_class = KODI_12PlusMetadata
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 """ tvdb_lang = show_obj.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 t = tvdb_api.Tvdb(actors=True, **ltvdb_api_parms) tv_node = etree.Element("Series") for ns in XML_NSMAP.keys(): tv_node.set(ns, XML_NSMAP[ns]) try: myShow = t[int(show_obj.tvdbid)] except tvdb_exceptions.tvdb_shownotfound: logger.log("Unable to find show with id " + str(show_obj.tvdbid) + " on tvdb, skipping it", logger.ERROR) raise except tvdb_exceptions.tvdb_error: logger.log("TVDB is down, can't use its data to make the NFO", logger.ERROR) raise # check for title and id try: if myShow["seriesname"] == None or myShow["seriesname"] == "" or myShow["id"] == None or myShow["id"] == "": logger.log("Incomplete info for show with id " + str(show_obj.tvdbid) + " on tvdb, skipping it", logger.ERROR) return False except tvdb_exceptions.tvdb_attributenotfound: logger.log("Incomplete info for show with id " + str(show_obj.tvdbid) + " on tvdb, skipping it", logger.ERROR) return False tvdbid = etree.SubElement(tv_node, "id") if myShow["id"] != None: tvdbid.text = myShow["id"] Actors = etree.SubElement(tv_node, "Actors") if myShow["actors"] != None: Actors.text = myShow["actors"] ContentRating = etree.SubElement(tv_node, "ContentRating") if myShow["contentrating"] != None: ContentRating.text = myShow["contentrating"] premiered = etree.SubElement(tv_node, "FirstAired") if myShow["firstaired"] != None: premiered.text = myShow["firstaired"] genre = etree.SubElement(tv_node, "genre") if myShow["genre"] != None: genre.text = myShow["genre"] IMDBId = etree.SubElement(tv_node, "IMDBId") if myShow["imdb_id"] != None: IMDBId.text = myShow["imdb_id"] IMDB_ID = etree.SubElement(tv_node, "IMDB_ID") if myShow["imdb_id"] != None: IMDB_ID.text = myShow["imdb_id"] Overview = etree.SubElement(tv_node, "Overview") if myShow["overview"] != None: Overview.text = myShow["overview"] Network = etree.SubElement(tv_node, "Network") if myShow["network"] != None: Network.text = myShow["network"] Runtime = etree.SubElement(tv_node, "Runtime") if myShow["runtime"] != None: Runtime.text = myShow["runtime"] Rating = etree.SubElement(tv_node, "Rating") if myShow["rating"] != None: Rating.text = myShow["rating"] SeriesID = etree.SubElement(tv_node, "SeriesID") if myShow["seriesid"] != None: SeriesID.text = myShow["seriesid"] SeriesName = etree.SubElement(tv_node, "SeriesName") if myShow["seriesname"] != None: SeriesName.text = myShow["seriesname"] rating = etree.SubElement(tv_node, "Status") if myShow["status"] != None: rating.text = myShow["status"] helpers.indentXML(tv_node) data = etree.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 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 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 (sickbeard.indexer_episodenotfound, sickbeard.indexer_seasonnotfound): 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") if getattr(myShow, '_actors', None) is not None: for actor in myShow['_actors']: cur_actor_name_text = actor['name'] if cur_actor_name_text != None and cur_actor_name_text.strip( ): cur_actor = etree.SubElement(cast, "actor") cur_actor.text = cur_actor_name_text.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 helpers.indentXML(rootNode) data = etree.ElementTree(rootNode) return data