flexget.utils.parsers.series module#

class flexget.utils.parsers.series.SeriesParser(name=None, alternate_names=None, identified_by='auto', name_regexps=None, ep_regexps=None, date_regexps=None, sequence_regexps=None, id_regexps=None, strict_name=False, allow_groups=None, allow_seasonless=True, date_dayfirst=None, date_yearfirst=None, special_ids=None, prefer_specials=False, assume_special=False)[source]#

Bases: TitleParser

Parse series.

Name:

series name

Data:

data to parse

Expect_ep:

expect series to be in season, ep format (ep_regexps)

Expect_id:

expect series to be in id format (id_regexps)

_reset()[source]#
guess_name()[source]#

Attempt to guess a series name based on the provided data.

parse(data=None, field=None, quality=None)[source]#
parse_date(data)[source]#

Parse :data: for a date identifier.

If found, returns the date and regexp match object If no date is found returns False

parse_episode(data)[source]#

Parse :data: for an episode identifier.

If found, returns a dict with keys for season, episode, end_episode and the regexp match object If no episode id is found returns False

parse_season_packs(data)[source]#

Parse data for season packs. Return True if the data contains a hit.

parse_unwanted(data)[source]#

Parse data for an unwanted hits. Return True if the data contains unwanted hits.

parse_unwanted_sequence(data)[source]#

Parse data for an unwanted id hits.

Return True if the data contains unwanted hits.

remove_dirt(data)[source]#

Replace some characters with spaces.

roman_to_int(roman)[source]#

Convert roman numerals up to 39 to integers.

clean_regexps = [re.compile('\\[.*?\\]', re.IGNORECASE), re.compile('\\(.*?\\)', re.IGNORECASE)]#
date_regexps = [re.compile('(?<![^\\W_])(\\d{2,4})[/ -](\\d{1,2})[/ -](\\d{1,2})(?![^\\W_])', re.IGNORECASE), re.compile('(?<![^\\W_])(\\d{1,2})[/ -](\\d{1,2})[/ -](\\d{2,4})(?![^\\W_])', re.IGNORECASE), re.compile('(?<![^\\W_])(\\d{4})x(\\d{1,2})[/ -](\\d{1,2})(?![^\\W_])', re.IGNORECASE), re.compile('(?<![^\\W_])(\\d{1,2})(?:st|nd|rd|th)?[/ -]([a-z]{3,10})[/ -](\\d{4})(?![^\\W_])', re.IGNORECASE)]#
english_numbers = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten']#
ep_regexps = [re.compile('(?<![^\\W_])(?:series|season|s)\\s?(\\d{1,4})(?:\\s(?:.*\\s)?)?(?:episode|ep|e|part|pt)\\s?(\\d{1,3}|X{0,3}(?:IX|XI{0,4}|VI{0,4}|IV|V|I{1,4}))(?:\\s?e?(\\d{1,2}))?(?![^\\W_])', re.IGNORECASE), re.compile('(?<![^\\W_])(?:series|season)\\s?(\\d{1,4})\\s(\\d{1,3})\\s?of\\s?(?:\\d{1,3})(?![^\\W_])', re.IGNORECASE), re.compile('(?<![^\\W_])(\\d{1,2})\\s?x\\s?(\\d+)(?:\\s(\\d{1,2}))?(?![^\\W_])', re.IGNORECASE), re.compile('(?<![^\\W_])(\\d{1,3})\\s?of\\s?(?:\\d{1,3})(?![^\\W_])', re.IGNORECASE), re.compile('(?<![^\\W_])(?:episode|e|ep|part|pt)\\s?(\\d{1,3}|X{0,3}(?:IX|XI{0,4}|VI{0,4}|IV|V|I{1,4}))(?![^\\W_])', re.IGNORECASE), re.compile('(?<![^\\W_])part\\s(one|two|three|four|five|six|seven|eight|nine|ten)(?![^\\W_])', re.IGNORECASE)]#
id_regexps = []#
ignore_prefixes = ['(?:\\[[^\\[\\]]*\\])', '(?:HD.720p?:)', '(?:HD.1080p?:)', '(?:HD.2160p?:)']#
roman_numeral_re = 'X{0,3}(?:IX|XI{0,4}|VI{0,4}|IV|V|I{1,4})'#
season_pack_regexps = [re.compile('(?:season\\s?|s)(\\d{1,}\\b)(?!(?:(?:.*?\\s)?(?:episode|e|ep|part|pt)\\s?(?:\\d{1,3}|X{0,3}(?:IX|XI{0,4}|VI{0,4}|IV|V|I{1,4}))|(?:\\d{1,3})\\s?of\\s?(?:\\d{1,3})))', re.IGNORECASE), re.compile('(\\d{1,3})\\s?x\\s?all', re.IGNORECASE)]#
separators = '[/ -]'#
sequence_regexps = [re.compile('(?<![^\\W_])(\\d{1,3})(?:v(?P<version>\\d))?(?![^\\W_])', re.IGNORECASE), re.compile('(?<![^\\W_])(?:pt|part)\\s?(\\d+|X{0,3}(?:IX|XI{0,4}|VI{0,4}|IV|V|I{1,4}))(?![^\\W_])', re.IGNORECASE)]#
unwanted_regexps = [re.compile('(\\d{1,3})\\s?x\\s?(0+)[^1-9]', re.IGNORECASE), re.compile('S(\\d{1,3})D(\\d{1,3})', re.IGNORECASE), re.compile('(?:s|series|\\b)\\s?\\d\\s?(?:&\\s?\\d)?[\\s-]*(?:complete|full)', re.IGNORECASE), re.compile('disc\\s\\d', re.IGNORECASE)]#
unwanted_sequence_regexps = [re.compile('seasons?\\s?\\d{1,2}', re.IGNORECASE)]#