Exemple #1
0
    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
Exemple #2
0
    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,
                )
Exemple #3
0
    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)
Exemple #4
0
    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
Exemple #5
0
    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
Exemple #6
0
    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
Exemple #7
0
    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
Exemple #8
0
    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
Exemple #9
0
    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
Exemple #10
0
    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
Exemple #11
0
    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
Exemple #12
0
    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
Exemple #13
0
    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
Exemple #16
0
    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
Exemple #17
0
    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
Exemple #18
0
    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
Exemple #19
0
    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
Exemple #20
0
    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)
Exemple #21
0
    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
Exemple #22
0
    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
Exemple #23
0
    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
Exemple #24
0
    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
Exemple #25
0
    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
Exemple #26
0
    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
Exemple #27
0
                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
Exemple #29
0
    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
Exemple #30
0
    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)
Exemple #31
0
    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
Exemple #32
0
    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)
Exemple #33
0
    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
Exemple #34
0
    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
Exemple #35
0
    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
Exemple #36
0
    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
Exemple #37
0
    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
Exemple #38
0
    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
Exemple #39
0
    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
Exemple #40
0
    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
Exemple #41
0
    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
Exemple #42
0
    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
Exemple #43
0
    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
Exemple #44
0
    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
Exemple #45
0
    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
Exemple #46
0
    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
Exemple #47
0
    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
Exemple #48
0
    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
Exemple #49
0
    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
Exemple #50
0
    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
Exemple #51
0
    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
Exemple #52
0
    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
Exemple #53
0
    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
Exemple #54
0
                    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
Exemple #55
0
    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
Exemple #56
0
    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