Source code for flexget.components.series.series_premiere
from flexget import plugin
from flexget.event import event
from . import db
from . import series as plugin_series
[docs]
class FilterSeriesPremiere(plugin_series.FilterSeriesBase):
"""Accept an entry that appears to be the first episode of any series.
Can be configured with any of the options of series plugin
Examples:
series_premiere: yes
series_premiere:
path: ~/Media/TV/_NEW_/.
quality: 720p
timeframe: 12 hours
NOTE: this plugin only looks in the entry title and expects the title
format to start with the series name followed by the episode info. Use
the manipulate plugin to modify the entry title to match this format, if
necessary.
Todo:
- integrate thetvdb to allow refining by genres, etc.
"""
@property
def schema(self):
settings = self.settings_schema
settings['properties']['allow_seasonless'] = {'type': 'boolean'}
settings['properties']['allow_teasers'] = {'type': 'boolean'}
return {'anyOf': [{'type': 'boolean'}, settings]}
# Run after series and metainfo series plugins
[docs]
@plugin.priority(115)
def on_task_metainfo(self, task, config):
if not config:
# Don't run when we are disabled
return
# Generate the group settings for series plugin
group_settings = {}
allow_seasonless = False
desired_eps = [0, 1]
if isinstance(config, dict):
allow_seasonless = config.pop('allow_seasonless', False)
if not config.pop('allow_teasers', True):
desired_eps = [1]
group_settings = config
group_settings['identified_by'] = 'ep'
# Generate a list of unique series that have premieres
guess_entry = plugin.get('metainfo_series', self).guess_entry
# Make a set of unique series according to series name normalization rules
guessed_series = {}
for entry in task.entries:
if guess_entry(entry, allow_seasonless=allow_seasonless, config=group_settings) and (
not entry['season_pack']
and entry['series_season'] == 1
and entry['series_episode'] in desired_eps
):
normalized_name = plugin_series.normalize_series_name(entry['series_name'])
db_series = (
task.session.query(db.Series).filter(db.Series.name == normalized_name).first()
)
if db_series and db_series.in_tasks:
continue
guessed_series.setdefault(normalized_name, entry['series_name'])
# Reject any further episodes in those series
for entry in task.entries:
for series in guessed_series.values():
if entry.get('series_name') == series and (
entry.get('season_pack')
or not (
entry.get('series_season') == 1
and entry.get('series_episode') in desired_eps
)
):
entry.reject('Non premiere episode or season pack in a premiere series')
# Combine settings and series into series plugin config format
allseries = {
'settings': {'series_premiere': group_settings},
'series_premiere': list(guessed_series.values()),
}
# Merge the our config in to the main series config
self.merge_config(task, allseries)
[docs]
@event('plugin.register')
def register_plugin():
plugin.register(FilterSeriesPremiere, 'series_premiere', api_ver=2)