Source code for seriesmarker.persistence.factory.episode_factory

#==============================================================================
# -*- coding: utf-8 -*-
#
# Copyright (C) 2013 - 2016 Tobias Röttger <toroettg@gmail.com>
#
# This file is part of SeriesMarker.
#
# SeriesMarker is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 3 as
# published by the Free Software Foundation.
#
# SeriesMarker is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with SeriesMarker.  If not, see <http://www.gnu.org/licenses/>.
#==============================================================================

from pytvdbapi.error import TVDBAttributeError
from seriesmarker.persistence.factory.base_factory import BaseFactory
from seriesmarker.persistence.model.director import Director
from seriesmarker.persistence.model.episode import Episode
from seriesmarker.persistence.model.episode_extra import EpisodeExtra
from seriesmarker.persistence.model.guest import Guest
from seriesmarker.persistence.model.writer import Writer
import logging

logger = logging.getLogger(__name__)

[docs]class EpisodeFactory(BaseFactory): """Factory to create episode objects from TheTVDB data."""
[docs] def new_episode(self, pytvdb_episode, update=None): """Creates a persistable episode object from TheTVDB data. This method will create a new :class:`.Episode` instance from a pytvdbapi episode. If a episode object is given, the existing one will be updated with the data instead. :param pytvdb_episode: The data to create the episode from. :type pytvdb_episode: :class:`pytvdbapi.api.Episode` :param update: A episode to update with new data. :type update: :class:`.Episode` :returns: The newly created or updated :class:`.Episode` instance. .. todo:: Episode specials have additional attributes where regular ones do not. The pytvdbapi logs an exception if it is tried to access them on a regular episode. Either check existence beforehand, or see if pytvdbapi changes output. """ if update == None: episode = Episode() episode.id = pytvdb_episode.id episode.extra = EpisodeExtra(watched=False) else: episode = update episode.season_id = pytvdb_episode.seasonid episode.episode_name = pytvdb_episode.EpisodeName episode.episode_number = pytvdb_episode.EpisodeNumber episode.combined_episode_number = -1 if pytvdb_episode.Combined_episodenumber is "" else pytvdb_episode.Combined_episodenumber episode.combined_season = pytvdb_episode.Combined_season episode.language = pytvdb_episode.Language episode.overview = pytvdb_episode.Overview episode.imdb_id = pytvdb_episode.IMDB_ID episode.DVD_season = pytvdb_episode.DVD_season episode.DVD_chapter = pytvdb_episode.DVD_chapter episode.DVD_episode_number = -1 if pytvdb_episode.DVD_episodenumber is "" else pytvdb_episode.DVD_episodenumber episode.DVD_disc_id = pytvdb_episode.DVD_discid episode.ep_img_flag = pytvdb_episode.EpImgFlag episode.production_code = pytvdb_episode.ProductionCode episode.last_updated = pytvdb_episode.lastupdated episode.filename = pytvdb_episode.filename episode.first_aired = None if pytvdb_episode.FirstAired is "" else pytvdb_episode.FirstAired episode.absolute_number = pytvdb_episode.absolute_number episode.rating = -1 if pytvdb_episode.Rating is "" else pytvdb_episode.Rating episode.rating_count = pytvdb_episode.RatingCount # TODO beware of race-conditions - not threadsafe logging.getLogger("pytvdbapi.error").disabled = True logging.getLogger("pytvdbapi.api").disabled = True try: episode.airs_before_season = pytvdb_episode.airsbefore_season episode.airs_before_episode = pytvdb_episode.airsbefore_episode episode.airs_after_season = pytvdb_episode.airsafter_season except TVDBAttributeError: pass # These values exist in series specials only logging.getLogger("pytvdbapi.error").disabled = False logging.getLogger("pytvdbapi.api").disabled = False self._handle_list_attribute(episode.directors, pytvdb_episode.Director, Director) self._handle_list_attribute(episode.writers, pytvdb_episode.Writer, Writer) self._handle_list_attribute(episode.guests, pytvdb_episode.GuestStars, Guest) return episode