#
# This file is part of SickGear.
#
# SickGear is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# SickGear 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 SickGear.  If not, see <http://www.gnu.org/licenses/>.

# all regexes are case-insensitive

normal_regexes = [
    ('garbage_name',
     '''
     ^(?!\\bs?\\d+[ex]\\d+\\b)[a-zA-Z0-9]{3,}$
     '''
     ),
    ('standard_repeat',
     # Show.Name.S01E02.S01E03.Source.Quality.Etc-Group
     # Show Name - S01E02 - S01E03 - S01E04 - Ep Name
     r'''
     ^(?P<series_name>.+?)[. _-]+                  (?# Show_Name and separator)
     s(?P<season_num>\d+)[. _-]*                   (?# S01 and optional separator)
     e(?P<ep_num>\d+)                              (?# E02 and separator)
     ([. _-]+s(?P=season_num)[. _-]*               (?# S01 and optional separator)
     e(?P<extra_ep_num>\d+))+                      (?# E03/etc and separator)
     [. _-]*((?P<extra_info>.+?)                   (?# Source_Quality_Etc-)
     ((?<![. _-])(?<!WEB)                          (?# Make sure this is really the release group)
     -(?P<release_group>[^- ]+))?)?$               (?# Group)
     '''
     ),

    ('fov_repeat',
     # Show.Name.1x02.1x03.Source.Quality.Etc-Group
     # Show Name - 1x02 - 1x03 - 1x04 - Ep Name
     r'''
     ^(?P<series_name>.+?)[. _-]+                  (?# Show_Name and separator)
     (?P<season_num>\d+)x                          (?# 1x)
     (?P<ep_num>\d+)                               (?# 02 and separator)
     ([. _-]+(?P=season_num)x                      (?# 1x)
     (?P<extra_ep_num>\d+))+                       (?# 03/etc and separator)
     [. _-]*((?P<extra_info>.+?)                   (?# Source_Quality_Etc-)
     ((?<![. _-])(?<!WEB)                          (?# Make sure this is really the release group)
     -(?P<release_group>[^- ]+))?)?$               (?# Group)
     '''
     ),

    ('non_standard_multi_ep',
     # Show Name - S01E02&03 - My Ep Name
     # Show Name - S01E02and03 - My Ep Name
     r'''
     ^((?P<series_name>.+?)[. _-]+)?               (?# Show_Name and separator)
     s(?P<season_num>\d+)[. _-]*                   (?# S01 and optional separator)
     e(?P<ep_num>\d+)                              (?# E02 and separator)
     (([. _-]*and|&|to)                            (?# linking and/&/to)
     (?P<extra_ep_num>(?!(2160|1080|720|480)[pi])\d+))+ (?# additional E03/etc)
     [. _-]*((?P<extra_info>.+?)                   (?# Source_Quality_Etc-)
     ((?<![. _-])(?<!WEB)                          (?# Make sure this is really the release group)
     -(?P<release_group>[^- ]+))?)?$               (?# Group)
     '''
     ),

    ('standard',
     # Show.Name.S01E02.Source.Quality.Etc-Group
     # Show Name - S01E02 - My Ep Name
     # Show.Name.S01.E03.My.Ep.Name
     # Show.Name.S01E02E03.Source.Quality.Etc-Group
     # Show Name - S01E02-03 - My Ep Name
     # Show.Name.S01.E02.E03
     r'''
     ^((?P<series_name>.+?)[. _-]+)?               (?# Show_Name and separator)
     s(?P<season_num>\d+)[. _-]*                   (?# S01 and optional separator)
     e(?P<ep_num>\d+)                              (?# E02 and separator)
     (([. _-]*e|-)                                 (?# linking e/- char)
     (?P<extra_ep_num>(?!(2160|1080|720|480)[pi])\d+))* (?# additional E03/etc)
     [. _-]*((?P<extra_info>.+?)                   (?# Source_Quality_Etc-)
     ((?<![. _-])(?<!WEB)                          (?# Make sure this is really the release group)
     -(?P<release_group>[^- ]+))?)?$               (?# Group)
     '''
     ),

    ('fov_non_standard_multi_ep',
     # Show Name - 1x02and03and04 - My Ep Name
     r'''
     ^((?P<series_name>.+?)[\[. _-]+)?             (?# Show_Name and separator)
     (?P<season_num>\d+)x                          (?# 1x)
     (?P<ep_num>\d+)                               (?# 02 and separator)
     (([. _-]*and|&|to)                            (?# linking x/- char)
     (?P<extra_ep_num>
     (?!(2160|1080|720|480)[pi])(?!(?<=x)264)      (?# ignore obviously wrong multi-eps)
     \d+))+                                        (?# additional x03/etc)
     [\]. _-]*((?P<extra_info>.+?)                 (?# Source_Quality_Etc-)
     ((?<![. _-])(?<!WEB)                          (?# Make sure this is really the release group)
     -(?P<release_group>[^- ]+))?)?$               (?# Group)
     '''
     ),

    ('fov',
     # Show_Name.1x02.Source_Quality_Etc-Group
     # Show Name - 1x02 - My Ep Name
     # Show_Name.1x02x03x04.Source_Quality_Etc-Group
     # Show Name - 1x02-03-04 - My Ep Name
     r'''
     ^((?P<series_name>.+?)[\[. _-]+)?             (?# Show_Name and separator)
     (?P<season_num>\d+)x                          (?# 1x)
     (?P<ep_num>\d+)                               (?# 02 and separator)
     (([. _-]*x|-)                                 (?# linking x/- char)
     (?P<extra_ep_num>
     (?!(2160|1080|720|480)[pi])(?!(?<=x)264)      (?# ignore obviously wrong multi-eps)
     \d+))*                                        (?# additional x03/etc)
     [\]. _-]*((?P<extra_info>.+?)                 (?# Source_Quality_Etc-)
     ((?<![. _-])(?<!WEB)                          (?# Make sure this is really the release group)
     -(?P<release_group>[^- ]+))?)?$               (?# Group)
     '''
     ),

    ('scene_date_format',
     # Show.Name.2010.11.23.Source.Quality.Etc-Group
     # Show Name - 2010-11-23 - Ep Name
     r'''
     ^((?P<series_name>.+?)[. _-]+)?               (?# Show_Name and separator)
     (?P<air_year>\d{4})[. _-]+                    (?# 2010 and separator)
     (?P<air_month>\d{2})[. _-]+                   (?# 11 and separator)
     (?P<air_day>\d{2})                            (?# 23 and separator)
     [. _-]*((?P<extra_info>.+?)                   (?# Source_Quality_Etc-)
     ((?<![. _-])(?<!WEB)                          (?# Make sure this is really the release group)
     -(?P<release_group>[^- ]+))?)?$               (?# Group)
     '''
     ),

    ('uk_date_format',
     # Show.Name.23.11.2010.Source.Quality.Etc-Group
     # Show Name - 23-11-2010 - Ep Name
     # Show Name - 14-08-17 - Ep Name
     # Show Name - 14 Jan 17 - Ep Name
     r'''
     ^((?P<series_name>.+?)[. _-]+)?               (?# Show_Name and separator)
     \(?(?P<air_day>\d{2})[. _-]+                  (?# 23 and separator)
     (?P<air_month>(?:\d{2}|(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\w*))[. _-]+ (?# 11 and separator)
     (?P<air_year>(?:19|20)?\d{2})\)?              (?# 2010 and separator)
     [. _-]*((?P<extra_info>.+?)                   (?# Source_Quality_Etc-)
     ((?<![. _-])(?<!WEB)                          (?# Make sure this is really the release group)
     -(?P<release_group>[^- ]+))?)?$               (?# Group)
     '''
     ),

    ('stupid',
     # tpz-abc102
     r'''
     (?P<release_group>.+?)-\w+?[\. ]?             (?# tpz-abc)
     (?!264)                                       (?# don't count x264)
     (?P<season_num>\d{1,2})                       (?# 1)
     (?P<ep_num>\d{2})$                            (?# 02)
     '''
     ),

    ('verbose',
     # Show Name Season 1 Episode 2 Ep Name
     r'''
     ^(?P<series_name>.+?)[. _-]+                  (?# Show Name and separator)
     season[. _-]+                                 (?# season and separator)
     (?P<season_num>\d+)[. _-]+                    (?# 1)
     episode[. _-]+                                (?# episode and separator)
     (?P<ep_num>\d+)[. _-]+                        (?# 02 and separator)
     (?P<extra_info>.+)$                           (?# Source_Quality_Etc-)
     '''
     ),

    ('season_only',
     # Show.Name.S01.Source.Quality.Etc-Group
     r'''
     ^((?P<series_name>.+?)[. _-]+)?               (?# Show_Name and separator)
     s(eason[. _-])?                               (?# S01/Season 01)
     (?P<season_num>\d+)[. _-]*                    (?# S01 and optional separator)
     [. _-]*((?P<extra_info>.+?)                   (?# Source_Quality_Etc-)
     ((?<![. _-])(?<!WEB)                          (?# Make sure this is really the release group)
     -(?P<release_group>[^- ]+))?)?$               (?# Group)
     '''
     ),

    ('no_season_multi_ep',
     # Show.Name.E02-03
     # Show.Name.E02.2010
     r'''
     ^((?P<series_name>.+?)[. _-]+)?               (?# Show_Name and separator)
     (e(p(isode)?)?|part|pt)[. _-]?                (?# e, ep, episode, or part)
     (?P<ep_num>(\d+|[ivx]+))                      (?# first ep num)
     ((([. _-]+(and|&|to)[. _-]+)|-)               (?# and/&/to joiner)
     (?P<extra_ep_num>(?!(2160|1080|720|480)[pi])(\d+|[ivx]+))[. _-])            (?# second ep num)
     ([. _-]*(?P<extra_info>.+?)                   (?# Source_Quality_Etc-)
     ((?<![. _-])(?<!WEB)                          (?# Make sure this is really the release group)
     -(?P<release_group>[^- ]+))?)?$               (?# Group)
     '''
     ),

    ('no_season_general',
     # Show.Name.E23.Test
     # Show.Name.Part.3.Source.Quality.Etc-Group
     # Show.Name.Part.1.and.Part.2.Blah-Group
     r'''
     ^((?P<series_name>.+?)[. _-]+)?               (?# Show_Name and separator)
     (e(p(isode)?)?|part|pt)[. _-]?                (?# e, ep, episode, or part)
     (?P<ep_num>(\d+|([ivx]+(?=[. _-]))))          (?# first ep num)
     ([. _-]+((and|&|to)[. _-]+)?                  (?# and/&/to joiner)
     ((e(p(isode)?)?|part|pt)[. _-]?)              (?# e, ep, episode, or part)
     (?P<extra_ep_num>(?!(2160|1080|720|480)[pi])
     (\d+|([ivx]+(?=[. _-]))))[. _-])*             (?# second ep num)
     ([. _-]*(?P<extra_info>.+?)                   (?# Source_Quality_Etc-)
     ((?<![. _-])(?<!WEB)                          (?# Make sure this is really the release group)
     -(?P<release_group>[^- ]+))?)?$               (?# Group)
     '''
     ),

    ('bare',
     # Show.Name.102.Source.Quality.Etc-Group
     r'''
     ^(?P<series_name>.+?)[. _-]+                  (?# Show_Name and separator)
     (?P<season_num>\d{1,2})                       (?# 1)
     (?P<ep_num>\d{2})                             (?# 02 and separator)
     ([. _-]+(?P<extra_info>(?!\d{3}[. _-]+)[^-]+) (?# Source_Quality_Etc-)
     (-(?P<release_group>.+))?)?$                  (?# Group)
     '''
     ),

    ('no_season',
     # Show Name - 01 - Ep Name
     # 01 - Ep Name
     r'''
     ^((?P<series_name>.+?)(?:[. _-]{2,}|[. _]))?  (?# Show_Name and separator)
     (?P<ep_num>\d{1,3}(?!\d))                     (?# 01)
     (?:-(?P<extra_ep_num>\d{1,3}(?!\d)))*         (?# 02)
     (\s*(?:of)?\s*\d{1,3})?                       (?# of num eps)
     [. _-]+((?P<extra_info>.+?)                   (?# Source_Quality_Etc-)
     ((?<![. _-])(?<!WEB)                          (?# Make sure this is really the release group)
     -(?P<release_group>[^- ]+))?)?$               (?# Group)
     '''
     ),
]

anime_regexes = [
    ('anime_ultimate',
     r'''
     ^(?:\[(?P<release_group>.+?)\][ ._-]*)
     (?P<series_name>.+?)[ ._-]+
     (?P<ep_ab_num>\d{1,4})
     (-(?P<extra_ab_ep_num>\d{1,4}))?[ ._-]+?
     (?:v(?P<version>[0-9]))?
     (?:[\w\.]*)
     (?:(?:(?:[\[\(])(?P<extra_info>\d{3,4}[xp]?\d{0,4}[\.\w\s-]*)(?:[\]\)]))|(?:\d{3,4}[xp]))
     (?:[ ._]?\[(?P<crc>\w+)\])?
     .*?
     '''
     ),

    ('anime_standard',
     # [Group Name] Show Name.13-14
     # [Group Name] Show Name - 13-14
     # Show Name 13-14
     # [Group Name] Show Name.13
     # [Group Name] Show Name - 13
     # Show Name 13
     r'''
     ^(\[(?P<release_group>.+?)\][ ._-]*)?         (?# Release Group and separator)
     (?P<series_name>.+?)[ ._-]+                   (?# Show_Name and separator)
     (?P<ep_ab_num>\d{1,4})                        (?# E01)
     (-(?P<extra_ab_ep_num>\d{1,4}))?              (?# E02)
     (v(?P<version>[0-9]))?                        (?# version)
     [ ._-]+\[(?P<extra_info>\d{3,4}[xp]?\d{0,4}.+?)\] (?# Source_Quality_Etc-)
     (\[(?P<crc>\w{8})\])?                         (?# CRC)
     .*?                                           (?# Separator and EOL)
     '''
     ),

    ('anime_standard_round',
     # [Stratos-Subs]_Infinite_Stratos_-_12_(1280x720_H.264_AAC)_[379759DB]
     # [ShinBunBu-Subs] Bleach - 02-03 (CX 1280x720 x264 AAC)
     r'''
     ^(\[(?P<release_group>.+?)\][ ._-]*)?         (?# Release Group and separator)
     (?P<series_name>.+?)[ ._-]+                   (?# Show_Name and separator)
     (?P<ep_ab_num>\d{1,4})                        (?# E01)
     (-(?P<extra_ab_ep_num>\d{1,4}))?              (?# E02)
     (v(?P<version>[0-9]))?                        (?# version)
     [ ._-]+\((?P<extra_info>(CX[ ._-]?)?\d{3,4}[xp]?\d{0,4}[\.\w\s-]*)\) (?# Source_Quality_Etc-)
     (\[(?P<crc>\w{8})\])?                         (?# CRC)
     .*?                                           (?# Separator and EOL)
     '''
     ),

    ('anime_ep_quality',
     # Show Name 09 HD
     # Show Name 09 HD1234
     # Show Name 09 SD
     r'''
     ^(\[(?P<release_group>.+?)\][ ._-]*)?         (?# Release Group and separator)
     (?P<series_name>.+?)[ ._-]+                   (?# Show_Name and separator)
     (?P<ep_ab_num>\d{1,4})                        (?# E01)
     (-(?P<extra_ab_ep_num>\d{1,4}))?              (?# E02)
     .*
     (v(?P<version>[0-9]))?                        (?# version)
     [ ._-]+(?P<extra_info>[sh]d\d{0,4}.*?)        (?# Source_Quality_Etc-)
     (\[(?P<crc>\w{8})\])?                         (?# CRC)
     .*?                                           (?# Separator and EOL)
     '''
     ),

    ('anime_quality_ep',
     # Show Name HD 09
     # Show Name HD1234 09
     # Show Name SD 09
     r'''
     ^(\[(?P<release_group>.+?)\][ ._-]*)?         (?# Release Group and separator)
     (?P<series_name>.+?)[ ._-]+                   (?# Show_Name and separator)
     (?P<extra_info>[sh]d\d{0,4}.*?)[ ._-]+        (?# Source_Quality_Etc-)
     (\[(?P<crc>\w{8})\])?                         (?# CRC)
     (?P<ep_ab_num>\d{1,4})                        (?# E01)
     (-(?P<extra_ab_ep_num>\d{1,4}))?              (?# E02)
     .*
     (v(?P<version>[0-9]))?                        (?# version)
     .*?                                           (?# Separator and EOL)
     '''
     ),

    ('anime_slash',
     # [SGKK] Bleach 312v1 [720p/MKV]
     r'''
     ^(\[(?P<release_group>.+?)\][ ._-]*)?         (?# Release Group and separator)
     (?P<series_name>.+?)[ ._-]+                   (?# Show_Name and separator)
     (?P<ep_ab_num>\d{1,4})                        (?# E01)
     (-(?P<extra_ab_ep_num>\d{1,4}))?              (?# E02)
     (v(?P<version>[0-9]))?                        (?# version)
     [ ._-]+\[(?P<extra_info>\d{3,4}p)             (?# Source_Quality_Etc-)
     (\[(?P<crc>\w{8})\])?                         (?# CRC)
     .*?                                           (?# Separator and EOL)
     '''
     ),

    ('anime_standard_codec',
     # [Ayako]_Infinite_Stratos_-_IS_-_07_[H264][720p][EB7838FC]
     # [Ayako] Infinite Stratos - IS - 07v2 [H264][720p][44419534]
     # [Ayako-Shikkaku] Oniichan no Koto Nanka Zenzen Suki Janain Dakara ne - 10 [LQ][h264][720p] [8853B21C]
     r'''
     ^(\[(?P<release_group>.+?)\][ ._-]*)?         (?# Release Group and separator)
     (?P<series_name>.+?)[ ._]*                    (?# Show_Name and separator)
     ([ ._-]+-[ ._-]+[A-Z]+[ ._-]+)?[ ._-]+        (?# this will kick me in the butt one day)
     (?P<ep_ab_num>\d{1,4})                        (?# E01)
     (-(?P<extra_ab_ep_num>\d{1,4}))?              (?# E02)
     (v(?P<version>[0-9]))?                        (?# version)
     ([ ._-](\[\w{1,2}\])?\[[a-z][.]?\w{2,4}\])?   (?# codec)
     [ ._-]*\[(?P<extra_info>(\d{3,4}[xp]?\d{0,4})?[\.\w\s-]*)\] (?# Source_Quality_Etc-)
     (\[(?P<crc>\w{8})\])?                         (?# CRC)
     .*?                                           (?# Separator and EOL)
     '''
     ),

    ('anime_and_normal',
     # Bleach - s16e03-04 - 313-314
     # Bleach.s16e03-04.313-314
     # Bleach s16e03e04 313-314
     r'''
     ^(\[(?P<release_group>.+?)\][ ._-]*)?
     (?P<series_name>.+?)[ ._-]+                   (?# start of string and series name and non optional separator)
     [sS](?P<season_num>\d+)[. _-]*                (?# S01 and optional separator)
     [eE](?P<ep_num>\d+)                           (?# episode E02)
     (([. _-]*e|-)                                 (?# linking e/- char)
     (?P<extra_ep_num>\d+))*                       (?# additional E03/etc)
     ([ ._-]{2,}|[ ._]+)                           (?# if "-" is used to separate at least something else has to be)
                                                   (?# there ->{2,}  "s16e03-04-313-314" wouldn't make sense any way)
     (?<!H.)(?P<ep_ab_num>\d{1,4})(?!0p)           (?# absolute number)
     (-(?P<extra_ab_ep_num>\d{1,4}))*              (?# "-" as separator and additional absolute number, all optional)
     (v(?P<version>[0-9]))?                        (?# the version e.g. "v2")
     .*?
     '''
     ),

    ('anime_and_normal_x',
     # Bleach - s16e03-04 - 313-314
     # Bleach.s16e03-04.313-314
     # Bleach s16e03e04 313-314
     r'''
     ^(?P<series_name>.+?)[ ._-]+                  (?# start of string and series name and non optional separator)
     (?P<season_num>\d+)[. _-]*                    (?# S01 and optional separator)
     [xX](?P<ep_num>\d+)                           (?# episode E02)
     (([. _-]*e|-)                                 (?# linking e/- char)
     (?P<extra_ep_num>\d+))*                       (?# additional E03/etc)
     ([ ._-]{2,}|[ ._]+)                           (?# if "-" is used to separate at least something else has to be)
                                                   (?# there ->{2,} "s16e03-04-313-314" wouldn't make sense any way)
     (?<!H.)(?P<ep_ab_num>\d{1,4})(?!0p)           (?# absolute number)
     (-(?P<extra_ab_ep_num>\d{1,4}))*              (?# "-" as separator and additional absolute number, all optional)
     (v(?P<version>[0-9]))?                        (?# the version e.g. "v2")
     .*?
     '''
     ),

    ('anime_and_normal_reverse',
     # Bleach - 313-314 - s16e03-04
     r'''
     ^(?P<series_name>.+?)[ ._-]+                  (?# start of string and series name and non optional separator)
     (?<!H.)(?P<ep_ab_num>\d{1,4})(?!0p)           (?# absolute number)
     (-(?P<extra_ab_ep_num>\d{1,4}))*              (?# "-" as separator and additional absolute number, all optional)
     (v(?P<version>[0-9]))?                        (?# the version e.g. "v2")
     ([ ._-]{2,}|[ ._]+)                           (?# if "-" is used to separate at least something else has to be)
                                                   (?# there ->{2,} "s16e03-04-313-314" wouldn't make sense any way)
     [sS](?P<season_num>\d+)[. _-]*                (?# S01 and optional separator)
     [eE](?P<ep_num>\d+)                           (?# episode E02)
     (([. _-]*e|-)                                 (?# linking e/- char)
     (?P<extra_ep_num>\d+))*                       (?# additional E03/etc)
     .*?
     '''
     ),

    ('anime_and_normal_front',
     # 165.Naruto Shippuuden.s08e014
     r'''
     ^(?<!H.)(?P<ep_ab_num>\d{1,4})(?!0p)          (?# start of string and absolute number)
     (-(?P<extra_ab_ep_num>\d{1,4}))*              (?# "-" as separator and additional absolute number, all optional)
     (v(?P<version>[0-9]))?[ ._-]+                 (?# the version e.g. "v2")
     (?P<series_name>.+?)[ ._-]+
     [sS](?P<season_num>\d+)[. _-]*                (?# S01 and optional separator)
     [eE](?P<ep_num>\d+)
     (([. _-]*e|-)                                 (?# linking e/- char)
     (?P<extra_ep_num>\d+))*                       (?# additional E03/etc)
     .*?
     '''
     ),

    ('anime_ep_name',
     r'''
     ^(?:\[(?P<release_group>.+?)\][ ._-]*)
     (?P<series_name>.+?)[ ._-]+
     (?<!H.)(?P<ep_ab_num>\d{1,4})(?!0p)
     (-(?P<extra_ab_ep_num>\d{1,4}))*[ ._-]*?
     (?:v(?P<version>[0-9])[ ._-]+?)?
     (?:.+?[ ._-]+?)?
     \[(?P<extra_info>\w+)\][ ._-]?
     (?:\[(?P<crc>\w{8})\])?
     .*?
     '''
     ),

    ('anime_bare_ep',
     # One Piece - 102
     # Show Name 123 - 001
     r'''
     ^(?:\[(?P<release_group>.+?)\][ ._-]*)?
     (?P<series_name>.+?)[ ._-]+[ ._-]{2,}         (?# Show_Name and min 2 char separator)
     (?<!H.)(?P<ep_ab_num>\d{1,4})(?!0p)           (?# 1/001, while avoiding H.264 and 1080p from being matched)
     (-(?P<extra_ab_ep_num>\d{1,4}))*[ ._-]*       (?# 2/002)
     (?:v(?P<version>[0-9]))?                      (?# v2)
     '''
     ),

    ('anime_bare',
     # [ACX]_Wolf's_Spirit_001.mkv
     r'''
     ^(\[(?P<release_group>.+?)\][ ._-]*)?
     (?P<series_name>.+?)[ ._-]+                   (?# Show_Name and separator)
     (?<!H.)(?P<ep_ab_num>\d{3})(?!0p)             (?# E01, while avoiding H.264 and 1080p from being matched)
     (-(?P<extra_ab_ep_num>\d{3}))*                (?# E02)
     (v(?P<version>[0-9]))?                        (?# v2)
     .*?                                           (?# Separator and EOL)
     '''
     ),

    ('standard',
     # Show.Name.S01E02.Source.Quality.Etc-Group
     # Show Name - S01E02 - My Ep Name
     # Show.Name.S01.E03.My.Ep.Name
     # Show.Name.S01E02E03.Source.Quality.Etc-Group
     # Show Name - S01E02-03 - My Ep Name
     # Show.Name.S01.E02.E03
     r'''
     ^((?P<series_name>.+?)[. _-]+)?               (?# Show_Name and separator)
     s(?P<season_num>\d+)[. _-]*                   (?# S01 and optional separator)
     e(?P<ep_num>\d+)                              (?# E02 and separator)
     (([. _-]*e|-)                                 (?# linking e/- char)
     (?P<extra_ep_num>(?!(2160|1080|720|480)[pi])\d+))* (?# additional E03/etc)
     [. _-]*((?P<extra_info>.+?)                   (?# Source_Quality_Etc-)
     ((?<![. _-])(?<!WEB)                          (?# Make sure this is really the release group)
     -(?P<release_group>[^- ]+))?)?$               (?# Group)
     '''
     ),
]