Source code for seriesmarker.persistence.factory.season_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 seriesmarker.persistence.database import db_remove_episode
from seriesmarker.persistence.factory.banner_factory import BannerFactory
from seriesmarker.persistence.factory.base_factory import BaseFactory
from seriesmarker.persistence.factory.episode_factory import EpisodeFactory
from seriesmarker.persistence.model.season import Season
import logging

logger = logging.getLogger(__name__)

[docs]class SeasonFactory(BaseFactory): """Factory to create season objects from TheTVDB data."""
[docs] def __init__(self): """Creates a new factory instance.""" super().__init__() self._episode_factory = EpisodeFactory()
[docs] def new_season(self, series, pytvdb_season, update=None): """Creates a persistable season object from TheTVDB data. This method will create a new :class:`.Season` instance from pytvdbapi episode objects. If a season object is given, the existing one will be updated with the data instead. In both cases, it also traverses the episodes of a season, using :class:`.EpisodeFactory`, to populate it with data. :param series: The series, the season to create belongs to. :type series: :class:`.Series` :param pytvdb_season: The data to create the season instance from. :type pytvdb_season: :class:`.pytvdbapi.api.Season` :param update: A season to update with new data. :type update: :class:`.Season` :returns: The newly created or updated :class:`.Season` instance. """ if update == None: season = Season() else: season = update original_episode_ids = [episode.id for episode in season.episodes] for episode in season.episodes: # update, remove try: pytvdb_episode = next(pytvdb_episode for pytvdb_episode in pytvdb_season.episodes.values() if pytvdb_episode.id == episode.id) self._episode_factory.new_episode(pytvdb_episode, update=episode) except StopIteration: db_remove_episode(episode) self.removed.append(episode) logger.debug("Removed episode {}x{:02} of series '{}'".format(pytvdb_season.season_number, episode.episode_number, series.series_name)) for pytvdb_episode in pytvdb_season.episodes.values(): # add if pytvdb_episode.id not in original_episode_ids: new_episode = self._episode_factory.new_episode(pytvdb_episode) season.episodes.insert(new_episode.episode_number - 1, new_episode) self.added.append(new_episode) logger.debug("Added episode {}x{:02} of series '{}'".format(pytvdb_season.season_number, new_episode.episode_number, series.series_name)) season.id = season.episodes[0].season_id season.series_id = series.id season.season_number = pytvdb_season.season_number season.banner = BannerFactory.new_banner(banner_type="season", banners=pytvdb_season.show.banner_objects, update=season.banner, season=season.season_number) return season