diff --git a/flexget/components/series/db.py b/flexget/components/series/db.py index 452dafd6df..5526d21088 100644 --- a/flexget/components/series/db.py +++ b/flexget/components/series/db.py @@ -38,7 +38,7 @@ ) from flexget.utils.tools import parse_episode_identifier -SCHEMA_VER = 14 +SCHEMA_VER = 15 logger = logger.bind(name='series.db') Base = db_schema.versioned_base('series', SCHEMA_VER) @@ -260,6 +260,7 @@ class Episode(Base): season = Column(Integer) number = Column(Integer) + special = Column(Boolean, default=False) identified_by = Column(String) series_id = Column(Integer, ForeignKey('series.id'), nullable=False) @@ -315,6 +316,10 @@ def is_premiere(self): return 'Season Premiere' return False + @property + def is_special(self): + return self.identified_by == 'special' or self.special + @property def downloaded_releases(self): return [release for release in self.releases if release.downloaded] @@ -407,6 +412,7 @@ def to_dict(self): 'season': self.season, 'identified_by': self.identified_by, 'number': self.number, + 'special': self.special, 'series_id': self.series_id, 'first_seen': self.first_seen, 'premiere': self.is_premiere, @@ -717,6 +723,11 @@ def upgrade(ver, session): # New season_releases table, added by "create_all" logger.info('Adding season_releases table') ver = 14 + if ver == 14: + # New season_releases table, added by "create_all" + logger.info('Adding special column to series_episodes table') + table_add_column('series_episodes', 'special', Boolean, session) + ver = 15 return ver @@ -1464,6 +1475,7 @@ def store_parser(session, parser, series=None, quality=None): elif parser.id_type == 'sequence': episode.season = 0 episode.number = parser.id + ix + episode.special = parser.special series.episodes.append(episode) # pylint:disable=E1103 logger.debug('-> added `{}`', episode) session.flush() diff --git a/flexget/components/series/series.py b/flexget/components/series/series.py index 7a1b0d7d7e..2f81fbcc46 100644 --- a/flexget/components/series/series.py +++ b/flexget/components/series/series.py @@ -696,7 +696,7 @@ def _exclude_season_on_accept( continue # skip special episodes if special handling has been turned off - if not config.get('specials', True) and entity.identified_by == 'special': + if not config.get('specials', True) and entity.is_special: logger.debug('Skipping special episode as support is turned off.') continue diff --git a/flexget/utils/parsers/series.py b/flexget/utils/parsers/series.py index 04f9d5bcf6..ef8999549d 100644 --- a/flexget/utils/parsers/series.py +++ b/flexget/utils/parsers/series.py @@ -335,6 +335,7 @@ def parse(self, data=None, field=None, quality=None): data_parts.remove(part) elif part in self.specials: self.special = True + self.special_title = True data_parts.remove(part) data_stripped = ' '.join(data_parts).strip() @@ -381,6 +382,9 @@ def parse(self, data=None, field=None, quality=None): self.id = (self.season, self.episode) self.id_type = 'ep' self.valid = True + if self.season == 0 and self.episode > 0: + self.special = True + self.special_season = True if not (self.special and self.prefer_specials): return else: