|  | @@ -1,15 +1,21 @@
 | 
	
		
			
				|  |  | -#pragma warning disable CS1591
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  using System;
 | 
	
		
			
				|  |  |  using System.Linq;
 | 
	
		
			
				|  |  |  using System.Text.RegularExpressions;
 | 
	
		
			
				|  |  |  using Emby.Naming.Video;
 | 
	
		
			
				|  |  |  using MediaBrowser.Model.Entities;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// ReSharper disable StringLiteralTypo
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  namespace Emby.Naming.Common
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | +    /// <summary>
 | 
	
		
			
				|  |  | +    /// Big ugly class containing lot of different naming options that should be split and injected instead of passes everywhere.
 | 
	
		
			
				|  |  | +    /// </summary>
 | 
	
		
			
				|  |  |      public class NamingOptions
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Initializes a new instance of the <see cref="NamingOptions"/> class.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  |          public NamingOptions()
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              VideoFileExtensions = new[]
 | 
	
	
		
			
				|  | @@ -75,63 +81,52 @@ namespace Emby.Naming.Common
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              StubTypes = new[]
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                new StubTypeRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    StubType = "dvd",
 | 
	
		
			
				|  |  | -                    Token = "dvd"
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new StubTypeRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    StubType = "hddvd",
 | 
	
		
			
				|  |  | -                    Token = "hddvd"
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new StubTypeRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    StubType = "bluray",
 | 
	
		
			
				|  |  | -                    Token = "bluray"
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new StubTypeRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    StubType = "bluray",
 | 
	
		
			
				|  |  | -                    Token = "brrip"
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new StubTypeRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    StubType = "bluray",
 | 
	
		
			
				|  |  | -                    Token = "bd25"
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new StubTypeRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    StubType = "bluray",
 | 
	
		
			
				|  |  | -                    Token = "bd50"
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new StubTypeRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    StubType = "vhs",
 | 
	
		
			
				|  |  | -                    Token = "vhs"
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new StubTypeRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    StubType = "tv",
 | 
	
		
			
				|  |  | -                    Token = "HDTV"
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new StubTypeRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    StubType = "tv",
 | 
	
		
			
				|  |  | -                    Token = "PDTV"
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new StubTypeRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    StubType = "tv",
 | 
	
		
			
				|  |  | -                    Token = "DSR"
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | +                new StubTypeRule(
 | 
	
		
			
				|  |  | +                    stubType: "dvd",
 | 
	
		
			
				|  |  | +                    token: "dvd"),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new StubTypeRule(
 | 
	
		
			
				|  |  | +                    stubType: "hddvd",
 | 
	
		
			
				|  |  | +                    token: "hddvd"),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new StubTypeRule(
 | 
	
		
			
				|  |  | +                    stubType: "bluray",
 | 
	
		
			
				|  |  | +                    token: "bluray"),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new StubTypeRule(
 | 
	
		
			
				|  |  | +                    stubType: "bluray",
 | 
	
		
			
				|  |  | +                    token: "brrip"),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new StubTypeRule(
 | 
	
		
			
				|  |  | +                    stubType: "bluray",
 | 
	
		
			
				|  |  | +                    token: "bd25"),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new StubTypeRule(
 | 
	
		
			
				|  |  | +                    stubType: "bluray",
 | 
	
		
			
				|  |  | +                    token: "bd50"),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new StubTypeRule(
 | 
	
		
			
				|  |  | +                    stubType: "vhs",
 | 
	
		
			
				|  |  | +                    token: "vhs"),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new StubTypeRule(
 | 
	
		
			
				|  |  | +                    stubType: "tv",
 | 
	
		
			
				|  |  | +                    token: "HDTV"),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new StubTypeRule(
 | 
	
		
			
				|  |  | +                    stubType: "tv",
 | 
	
		
			
				|  |  | +                    token: "PDTV"),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new StubTypeRule(
 | 
	
		
			
				|  |  | +                    stubType: "tv",
 | 
	
		
			
				|  |  | +                    token: "DSR")
 | 
	
		
			
				|  |  |              };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              VideoFileStackingExpressions = new[]
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                "(.*?)([ _.-]*(?:cd|dvd|p(?:ar)?t|dis[ck])[ _.-]*[0-9]+)(.*?)(\\.[^.]+)$",
 | 
	
		
			
				|  |  | -                "(.*?)([ _.-]*(?:cd|dvd|p(?:ar)?t|dis[ck])[ _.-]*[a-d])(.*?)(\\.[^.]+)$",
 | 
	
		
			
				|  |  | -                "(.*?)([ ._-]*[a-d])(.*?)(\\.[^.]+)$"
 | 
	
		
			
				|  |  | +                "(?<title>.*?)(?<volume>[ _.-]*(?:cd|dvd|p(?:ar)?t|dis[ck])[ _.-]*[0-9]+)(?<ignore>.*?)(?<extension>\\.[^.]+)$",
 | 
	
		
			
				|  |  | +                "(?<title>.*?)(?<volume>[ _.-]*(?:cd|dvd|p(?:ar)?t|dis[ck])[ _.-]*[a-d])(?<ignore>.*?)(?<extension>\\.[^.]+)$",
 | 
	
		
			
				|  |  | +                "(?<title>.*?)(?<volume>[ ._-]*[a-d])(?<ignore>.*?)(?<extension>\\.[^.]+)$"
 | 
	
		
			
				|  |  |              };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              CleanDateTimes = new[]
 | 
	
	
		
			
				|  | @@ -142,7 +137,7 @@ namespace Emby.Naming.Common
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              CleanStrings = new[]
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                @"[ _\,\.\(\)\[\]\-](3d|sbs|tab|hsbs|htab|mvc|HDR|HDC|UHD|UltraHD|4k|ac3|dts|custom|dc|divx|divx5|dsr|dsrip|dutch|dvd|dvdrip|dvdscr|dvdscreener|screener|dvdivx|cam|fragment|fs|hdtv|hdrip|hdtvrip|internal|limited|multisubs|ntsc|ogg|ogm|pal|pdtv|proper|repack|rerip|retail|cd[1-9]|r3|r5|bd5|bd|se|svcd|swedish|german|read.nfo|nfofix|unrated|ws|telesync|ts|telecine|tc|brrip|bdrip|480p|480i|576p|576i|720p|720i|1080p|1080i|2160p|hrhd|hrhdtv|hddvd|bluray|x264|h264|xvid|xvidvd|xxx|www.www|\[.*\])([ _\,\.\(\)\[\]\-]|$)",
 | 
	
		
			
				|  |  | +                @"[ _\,\.\(\)\[\]\-](3d|sbs|tab|hsbs|htab|mvc|HDR|HDC|UHD|UltraHD|4k|ac3|dts|custom|dc|divx|divx5|dsr|dsrip|dutch|dvd|dvdrip|dvdscr|dvdscreener|screener|dvdivx|cam|fragment|fs|hdtv|hdrip|hdtvrip|internal|limited|multisubs|ntsc|ogg|ogm|pal|pdtv|proper|repack|rerip|retail|cd[1-9]|r3|r5|bd5|bd|se|svcd|swedish|german|read.nfo|nfofix|unrated|ws|telesync|ts|telecine|tc|brrip|bdrip|480p|480i|576p|576i|720p|720i|1080p|1080i|2160p|hrhd|hrhdtv|hddvd|bluray|blu-ray|x264|x265|h264|xvid|xvidvd|xxx|www.www|AAC|DTS|\[.*\])([ _\,\.\(\)\[\]\-]|$)",
 | 
	
		
			
				|  |  |                  @"(\[.*\])"
 | 
	
		
			
				|  |  |              };
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -255,7 +250,7 @@ namespace Emby.Naming.Common
 | 
	
		
			
				|  |  |                  },
 | 
	
		
			
				|  |  |                  // <!-- foo.ep01, foo.EP_01 -->
 | 
	
		
			
				|  |  |                  new EpisodeExpression(@"[\._ -]()[Ee][Pp]_?([0-9]+)([^\\/]*)$"),
 | 
	
		
			
				|  |  | -                new EpisodeExpression("([0-9]{4})[\\.-]([0-9]{2})[\\.-]([0-9]{2})", true)
 | 
	
		
			
				|  |  | +                new EpisodeExpression("(?<year>[0-9]{4})[\\.-](?<month>[0-9]{2})[\\.-](?<day>[0-9]{2})", true)
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  |                      DateTimeFormats = new[]
 | 
	
		
			
				|  |  |                      {
 | 
	
	
		
			
				|  | @@ -264,7 +259,7 @@ namespace Emby.Naming.Common
 | 
	
		
			
				|  |  |                          "yyyy_MM_dd"
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                  },
 | 
	
		
			
				|  |  | -                new EpisodeExpression("([0-9]{2})[\\.-]([0-9]{2})[\\.-]([0-9]{4})", true)
 | 
	
		
			
				|  |  | +                new EpisodeExpression(@"(?<day>[0-9]{2})[.-](?<month>[0-9]{2})[.-](?<year>[0-9]{4})", true)
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  |                      DateTimeFormats = new[]
 | 
	
		
			
				|  |  |                      {
 | 
	
	
		
			
				|  | @@ -286,7 +281,12 @@ namespace Emby.Naming.Common
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  |                      SupportsAbsoluteEpisodeNumbers = true
 | 
	
		
			
				|  |  |                  },
 | 
	
		
			
				|  |  | -                new EpisodeExpression(@"[\\\\/\\._ -](?<seriesname>(?![0-9]+[0-9][0-9])([^\\\/])*)[\\\\/\\._ -](?<seasonnumber>[0-9]+)(?<epnumber>[0-9][0-9](?:(?:[a-i]|\\.[1-9])(?![0-9]))?)([\\._ -][^\\\\/]*)$")
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                // Case Closed (1996-2007)/Case Closed - 317.mkv
 | 
	
		
			
				|  |  | +                // /server/anything_102.mp4
 | 
	
		
			
				|  |  | +                // /server/james.corden.2017.04.20.anne.hathaway.720p.hdtv.x264-crooks.mkv
 | 
	
		
			
				|  |  | +                // /server/anything_1996.11.14.mp4
 | 
	
		
			
				|  |  | +                new EpisodeExpression(@"[\\/._ -](?<seriesname>(?![0-9]+[0-9][0-9])([^\\\/_])*)[\\\/._ -](?<seasonnumber>[0-9]+)(?<epnumber>[0-9][0-9](?:(?:[a-i]|\.[1-9])(?![0-9]))?)([._ -][^\\\/]*)$")
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  |                      IsOptimistic = true,
 | 
	
		
			
				|  |  |                      IsNamed = true,
 | 
	
	
		
			
				|  | @@ -381,247 +381,193 @@ namespace Emby.Naming.Common
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              VideoExtraRules = new[]
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                new ExtraRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    ExtraType = ExtraType.Trailer,
 | 
	
		
			
				|  |  | -                    RuleType = ExtraRuleType.Filename,
 | 
	
		
			
				|  |  | -                    Token = "trailer",
 | 
	
		
			
				|  |  | -                    MediaType = MediaType.Video
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new ExtraRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    ExtraType = ExtraType.Trailer,
 | 
	
		
			
				|  |  | -                    RuleType = ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | -                    Token = "-trailer",
 | 
	
		
			
				|  |  | -                    MediaType = MediaType.Video
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new ExtraRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    ExtraType = ExtraType.Trailer,
 | 
	
		
			
				|  |  | -                    RuleType = ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | -                    Token = ".trailer",
 | 
	
		
			
				|  |  | -                    MediaType = MediaType.Video
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new ExtraRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    ExtraType = ExtraType.Trailer,
 | 
	
		
			
				|  |  | -                    RuleType = ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | -                    Token = "_trailer",
 | 
	
		
			
				|  |  | -                    MediaType = MediaType.Video
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new ExtraRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    ExtraType = ExtraType.Trailer,
 | 
	
		
			
				|  |  | -                    RuleType = ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | -                    Token = " trailer",
 | 
	
		
			
				|  |  | -                    MediaType = MediaType.Video
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new ExtraRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    ExtraType = ExtraType.Sample,
 | 
	
		
			
				|  |  | -                    RuleType = ExtraRuleType.Filename,
 | 
	
		
			
				|  |  | -                    Token = "sample",
 | 
	
		
			
				|  |  | -                    MediaType = MediaType.Video
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new ExtraRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    ExtraType = ExtraType.Sample,
 | 
	
		
			
				|  |  | -                    RuleType = ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | -                    Token = "-sample",
 | 
	
		
			
				|  |  | -                    MediaType = MediaType.Video
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new ExtraRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    ExtraType = ExtraType.Sample,
 | 
	
		
			
				|  |  | -                    RuleType = ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | -                    Token = ".sample",
 | 
	
		
			
				|  |  | -                    MediaType = MediaType.Video
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new ExtraRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    ExtraType = ExtraType.Sample,
 | 
	
		
			
				|  |  | -                    RuleType = ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | -                    Token = "_sample",
 | 
	
		
			
				|  |  | -                    MediaType = MediaType.Video
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new ExtraRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    ExtraType = ExtraType.Sample,
 | 
	
		
			
				|  |  | -                    RuleType = ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | -                    Token = " sample",
 | 
	
		
			
				|  |  | -                    MediaType = MediaType.Video
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new ExtraRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    ExtraType = ExtraType.ThemeSong,
 | 
	
		
			
				|  |  | -                    RuleType = ExtraRuleType.Filename,
 | 
	
		
			
				|  |  | -                    Token = "theme",
 | 
	
		
			
				|  |  | -                    MediaType = MediaType.Audio
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new ExtraRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    ExtraType = ExtraType.Scene,
 | 
	
		
			
				|  |  | -                    RuleType = ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | -                    Token = "-scene",
 | 
	
		
			
				|  |  | -                    MediaType = MediaType.Video
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new ExtraRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    ExtraType = ExtraType.Clip,
 | 
	
		
			
				|  |  | -                    RuleType = ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | -                    Token = "-clip",
 | 
	
		
			
				|  |  | -                    MediaType = MediaType.Video
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new ExtraRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    ExtraType = ExtraType.Interview,
 | 
	
		
			
				|  |  | -                    RuleType = ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | -                    Token = "-interview",
 | 
	
		
			
				|  |  | -                    MediaType = MediaType.Video
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new ExtraRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    ExtraType = ExtraType.BehindTheScenes,
 | 
	
		
			
				|  |  | -                    RuleType = ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | -                    Token = "-behindthescenes",
 | 
	
		
			
				|  |  | -                    MediaType = MediaType.Video
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new ExtraRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    ExtraType = ExtraType.DeletedScene,
 | 
	
		
			
				|  |  | -                    RuleType = ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | -                    Token = "-deleted",
 | 
	
		
			
				|  |  | -                    MediaType = MediaType.Video
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new ExtraRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    ExtraType = ExtraType.Clip,
 | 
	
		
			
				|  |  | -                    RuleType = ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | -                    Token = "-featurette",
 | 
	
		
			
				|  |  | -                    MediaType = MediaType.Video
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new ExtraRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    ExtraType = ExtraType.Clip,
 | 
	
		
			
				|  |  | -                    RuleType = ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | -                    Token = "-short",
 | 
	
		
			
				|  |  | -                    MediaType = MediaType.Video
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new ExtraRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    ExtraType = ExtraType.BehindTheScenes,
 | 
	
		
			
				|  |  | -                    RuleType = ExtraRuleType.DirectoryName,
 | 
	
		
			
				|  |  | -                    Token = "behind the scenes",
 | 
	
		
			
				|  |  | -                    MediaType = MediaType.Video,
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new ExtraRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    ExtraType = ExtraType.DeletedScene,
 | 
	
		
			
				|  |  | -                    RuleType = ExtraRuleType.DirectoryName,
 | 
	
		
			
				|  |  | -                    Token = "deleted scenes",
 | 
	
		
			
				|  |  | -                    MediaType = MediaType.Video,
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new ExtraRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    ExtraType = ExtraType.Interview,
 | 
	
		
			
				|  |  | -                    RuleType = ExtraRuleType.DirectoryName,
 | 
	
		
			
				|  |  | -                    Token = "interviews",
 | 
	
		
			
				|  |  | -                    MediaType = MediaType.Video,
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new ExtraRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    ExtraType = ExtraType.Scene,
 | 
	
		
			
				|  |  | -                    RuleType = ExtraRuleType.DirectoryName,
 | 
	
		
			
				|  |  | -                    Token = "scenes",
 | 
	
		
			
				|  |  | -                    MediaType = MediaType.Video,
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new ExtraRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    ExtraType = ExtraType.Sample,
 | 
	
		
			
				|  |  | -                    RuleType = ExtraRuleType.DirectoryName,
 | 
	
		
			
				|  |  | -                    Token = "samples",
 | 
	
		
			
				|  |  | -                    MediaType = MediaType.Video,
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new ExtraRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    ExtraType = ExtraType.Clip,
 | 
	
		
			
				|  |  | -                    RuleType = ExtraRuleType.DirectoryName,
 | 
	
		
			
				|  |  | -                    Token = "shorts",
 | 
	
		
			
				|  |  | -                    MediaType = MediaType.Video,
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new ExtraRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    ExtraType = ExtraType.Clip,
 | 
	
		
			
				|  |  | -                    RuleType = ExtraRuleType.DirectoryName,
 | 
	
		
			
				|  |  | -                    Token = "featurettes",
 | 
	
		
			
				|  |  | -                    MediaType = MediaType.Video,
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new ExtraRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    ExtraType = ExtraType.Unknown,
 | 
	
		
			
				|  |  | -                    RuleType = ExtraRuleType.DirectoryName,
 | 
	
		
			
				|  |  | -                    Token = "extras",
 | 
	
		
			
				|  |  | -                    MediaType = MediaType.Video,
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | +                new ExtraRule(
 | 
	
		
			
				|  |  | +                    ExtraType.Trailer,
 | 
	
		
			
				|  |  | +                    ExtraRuleType.Filename,
 | 
	
		
			
				|  |  | +                    "trailer",
 | 
	
		
			
				|  |  | +                    MediaType.Video),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new ExtraRule(
 | 
	
		
			
				|  |  | +                    ExtraType.Trailer,
 | 
	
		
			
				|  |  | +                    ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | +                    "-trailer",
 | 
	
		
			
				|  |  | +                    MediaType.Video),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new ExtraRule(
 | 
	
		
			
				|  |  | +                    ExtraType.Trailer,
 | 
	
		
			
				|  |  | +                    ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | +                    ".trailer",
 | 
	
		
			
				|  |  | +                    MediaType.Video),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new ExtraRule(
 | 
	
		
			
				|  |  | +                    ExtraType.Trailer,
 | 
	
		
			
				|  |  | +                    ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | +                    "_trailer",
 | 
	
		
			
				|  |  | +                    MediaType.Video),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new ExtraRule(
 | 
	
		
			
				|  |  | +                    ExtraType.Trailer,
 | 
	
		
			
				|  |  | +                    ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | +                    " trailer",
 | 
	
		
			
				|  |  | +                    MediaType.Video),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new ExtraRule(
 | 
	
		
			
				|  |  | +                    ExtraType.Sample,
 | 
	
		
			
				|  |  | +                    ExtraRuleType.Filename,
 | 
	
		
			
				|  |  | +                    "sample",
 | 
	
		
			
				|  |  | +                    MediaType.Video),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new ExtraRule(
 | 
	
		
			
				|  |  | +                    ExtraType.Sample,
 | 
	
		
			
				|  |  | +                    ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | +                    "-sample",
 | 
	
		
			
				|  |  | +                    MediaType.Video),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new ExtraRule(
 | 
	
		
			
				|  |  | +                    ExtraType.Sample,
 | 
	
		
			
				|  |  | +                    ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | +                    ".sample",
 | 
	
		
			
				|  |  | +                    MediaType.Video),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new ExtraRule(
 | 
	
		
			
				|  |  | +                    ExtraType.Sample,
 | 
	
		
			
				|  |  | +                    ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | +                    "_sample",
 | 
	
		
			
				|  |  | +                    MediaType.Video),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new ExtraRule(
 | 
	
		
			
				|  |  | +                    ExtraType.Sample,
 | 
	
		
			
				|  |  | +                    ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | +                    " sample",
 | 
	
		
			
				|  |  | +                    MediaType.Video),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new ExtraRule(
 | 
	
		
			
				|  |  | +                    ExtraType.ThemeSong,
 | 
	
		
			
				|  |  | +                    ExtraRuleType.Filename,
 | 
	
		
			
				|  |  | +                    "theme",
 | 
	
		
			
				|  |  | +                    MediaType.Audio),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new ExtraRule(
 | 
	
		
			
				|  |  | +                    ExtraType.Scene,
 | 
	
		
			
				|  |  | +                    ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | +                    "-scene",
 | 
	
		
			
				|  |  | +                    MediaType.Video),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new ExtraRule(
 | 
	
		
			
				|  |  | +                    ExtraType.Clip,
 | 
	
		
			
				|  |  | +                    ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | +                    "-clip",
 | 
	
		
			
				|  |  | +                    MediaType.Video),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new ExtraRule(
 | 
	
		
			
				|  |  | +                    ExtraType.Interview,
 | 
	
		
			
				|  |  | +                    ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | +                    "-interview",
 | 
	
		
			
				|  |  | +                    MediaType.Video),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new ExtraRule(
 | 
	
		
			
				|  |  | +                    ExtraType.BehindTheScenes,
 | 
	
		
			
				|  |  | +                    ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | +                    "-behindthescenes",
 | 
	
		
			
				|  |  | +                    MediaType.Video),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new ExtraRule(
 | 
	
		
			
				|  |  | +                    ExtraType.DeletedScene,
 | 
	
		
			
				|  |  | +                    ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | +                    "-deleted",
 | 
	
		
			
				|  |  | +                    MediaType.Video),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new ExtraRule(
 | 
	
		
			
				|  |  | +                    ExtraType.Clip,
 | 
	
		
			
				|  |  | +                    ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | +                    "-featurette",
 | 
	
		
			
				|  |  | +                    MediaType.Video),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new ExtraRule(
 | 
	
		
			
				|  |  | +                    ExtraType.Clip,
 | 
	
		
			
				|  |  | +                    ExtraRuleType.Suffix,
 | 
	
		
			
				|  |  | +                    "-short",
 | 
	
		
			
				|  |  | +                    MediaType.Video),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new ExtraRule(
 | 
	
		
			
				|  |  | +                    ExtraType.BehindTheScenes,
 | 
	
		
			
				|  |  | +                    ExtraRuleType.DirectoryName,
 | 
	
		
			
				|  |  | +                    "behind the scenes",
 | 
	
		
			
				|  |  | +                    MediaType.Video),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new ExtraRule(
 | 
	
		
			
				|  |  | +                    ExtraType.DeletedScene,
 | 
	
		
			
				|  |  | +                    ExtraRuleType.DirectoryName,
 | 
	
		
			
				|  |  | +                    "deleted scenes",
 | 
	
		
			
				|  |  | +                    MediaType.Video),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new ExtraRule(
 | 
	
		
			
				|  |  | +                    ExtraType.Interview,
 | 
	
		
			
				|  |  | +                    ExtraRuleType.DirectoryName,
 | 
	
		
			
				|  |  | +                    "interviews",
 | 
	
		
			
				|  |  | +                    MediaType.Video),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new ExtraRule(
 | 
	
		
			
				|  |  | +                    ExtraType.Scene,
 | 
	
		
			
				|  |  | +                    ExtraRuleType.DirectoryName,
 | 
	
		
			
				|  |  | +                    "scenes",
 | 
	
		
			
				|  |  | +                    MediaType.Video),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new ExtraRule(
 | 
	
		
			
				|  |  | +                    ExtraType.Sample,
 | 
	
		
			
				|  |  | +                    ExtraRuleType.DirectoryName,
 | 
	
		
			
				|  |  | +                    "samples",
 | 
	
		
			
				|  |  | +                    MediaType.Video),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new ExtraRule(
 | 
	
		
			
				|  |  | +                    ExtraType.Clip,
 | 
	
		
			
				|  |  | +                    ExtraRuleType.DirectoryName,
 | 
	
		
			
				|  |  | +                    "shorts",
 | 
	
		
			
				|  |  | +                    MediaType.Video),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new ExtraRule(
 | 
	
		
			
				|  |  | +                    ExtraType.Clip,
 | 
	
		
			
				|  |  | +                    ExtraRuleType.DirectoryName,
 | 
	
		
			
				|  |  | +                    "featurettes",
 | 
	
		
			
				|  |  | +                    MediaType.Video),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new ExtraRule(
 | 
	
		
			
				|  |  | +                    ExtraType.Unknown,
 | 
	
		
			
				|  |  | +                    ExtraRuleType.DirectoryName,
 | 
	
		
			
				|  |  | +                    "extras",
 | 
	
		
			
				|  |  | +                    MediaType.Video),
 | 
	
		
			
				|  |  |              };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              Format3DRules = new[]
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  // Kodi rules:
 | 
	
		
			
				|  |  | -                new Format3DRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    PreceedingToken = "3d",
 | 
	
		
			
				|  |  | -                    Token = "hsbs"
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new Format3DRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    PreceedingToken = "3d",
 | 
	
		
			
				|  |  | -                    Token = "sbs"
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new Format3DRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    PreceedingToken = "3d",
 | 
	
		
			
				|  |  | -                    Token = "htab"
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new Format3DRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    PreceedingToken = "3d",
 | 
	
		
			
				|  |  | -                    Token = "tab"
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                                 // Media Browser rules:
 | 
	
		
			
				|  |  | -                new Format3DRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    Token = "fsbs"
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new Format3DRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    Token = "hsbs"
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new Format3DRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    Token = "sbs"
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new Format3DRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    Token = "ftab"
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new Format3DRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    Token = "htab"
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new Format3DRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    Token = "tab"
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new Format3DRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    Token = "sbs3d"
 | 
	
		
			
				|  |  | -                },
 | 
	
		
			
				|  |  | -                new Format3DRule
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    Token = "mvc"
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | +                new Format3DRule(
 | 
	
		
			
				|  |  | +                    precedingToken: "3d",
 | 
	
		
			
				|  |  | +                    token: "hsbs"),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new Format3DRule(
 | 
	
		
			
				|  |  | +                    precedingToken: "3d",
 | 
	
		
			
				|  |  | +                    token: "sbs"),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new Format3DRule(
 | 
	
		
			
				|  |  | +                    precedingToken: "3d",
 | 
	
		
			
				|  |  | +                    token: "htab"),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                new Format3DRule(
 | 
	
		
			
				|  |  | +                    precedingToken: "3d",
 | 
	
		
			
				|  |  | +                    token: "tab"),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                 // Media Browser rules:
 | 
	
		
			
				|  |  | +                new Format3DRule("fsbs"),
 | 
	
		
			
				|  |  | +                new Format3DRule("hsbs"),
 | 
	
		
			
				|  |  | +                new Format3DRule("sbs"),
 | 
	
		
			
				|  |  | +                new Format3DRule("ftab"),
 | 
	
		
			
				|  |  | +                new Format3DRule("htab"),
 | 
	
		
			
				|  |  | +                new Format3DRule("tab"),
 | 
	
		
			
				|  |  | +                new Format3DRule("sbs3d"),
 | 
	
		
			
				|  |  | +                new Format3DRule("mvc")
 | 
	
		
			
				|  |  |              };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              AudioBookPartsExpressions = new[]
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  // Detect specified chapters, like CH 01
 | 
	
	
		
			
				|  | @@ -631,13 +577,20 @@ namespace Emby.Naming.Common
 | 
	
		
			
				|  |  |                  // Chapter is often beginning of filename
 | 
	
		
			
				|  |  |                  "^(?<chapter>[0-9]+)",
 | 
	
		
			
				|  |  |                  // Part if often ending of filename
 | 
	
		
			
				|  |  | -                "(?<part>[0-9]+)$",
 | 
	
		
			
				|  |  | +                @"(?<!ch(?:apter) )(?<part>[0-9]+)$",
 | 
	
		
			
				|  |  |                  // Sometimes named as 0001_005 (chapter_part)
 | 
	
		
			
				|  |  |                  "(?<chapter>[0-9]+)_(?<part>[0-9]+)",
 | 
	
		
			
				|  |  |                  // Some audiobooks are ripped from cd's, and will be named by disk number.
 | 
	
		
			
				|  |  |                  @"dis(?:c|k)[\s_-]?(?<chapter>[0-9]+)"
 | 
	
		
			
				|  |  |              };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +            AudioBookNamesExpressions = new[]
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                // Detect year usually in brackets after name Batman (2020)
 | 
	
		
			
				|  |  | +                @"^(?<name>.+?)\s*\(\s*(?<year>\d{4})\s*\)\s*$",
 | 
	
		
			
				|  |  | +                @"^\s*(?<name>[^ ].*?)\s*$"
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              var extensions = VideoFileExtensions.ToList();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              extensions.AddRange(new[]
 | 
	
	
		
			
				|  | @@ -673,7 +626,7 @@ namespace Emby.Naming.Common
 | 
	
		
			
				|  |  |                  ".mxf"
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            MultipleEpisodeExpressions = new string[]
 | 
	
		
			
				|  |  | +            MultipleEpisodeExpressions = new[]
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  @".*(\\|\/)[sS]?(?<seasonnumber>[0-9]{1,4})[xX](?<epnumber>[0-9]{1,3})((-| - )[0-9]{1,4}[eExX](?<endingepnumber>[0-9]{1,3}))+[^\\\/]*$",
 | 
	
		
			
				|  |  |                  @".*(\\|\/)[sS]?(?<seasonnumber>[0-9]{1,4})[xX](?<epnumber>[0-9]{1,3})((-| - )[0-9]{1,4}[xX][eE](?<endingepnumber>[0-9]{1,3}))+[^\\\/]*$",
 | 
	
	
		
			
				|  | @@ -697,56 +650,139 @@ namespace Emby.Naming.Common
 | 
	
		
			
				|  |  |              Compile();
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Gets or sets list of audio file extensions.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  |          public string[] AudioFileExtensions { get; set; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Gets or sets list of album stacking prefixes.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  |          public string[] AlbumStackingPrefixes { get; set; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Gets or sets list of subtitle file extensions.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  |          public string[] SubtitleFileExtensions { get; set; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Gets or sets list of subtitles flag delimiters.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  |          public char[] SubtitleFlagDelimiters { get; set; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Gets or sets list of subtitle forced flags.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  |          public string[] SubtitleForcedFlags { get; set; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Gets or sets list of subtitle default flags.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  |          public string[] SubtitleDefaultFlags { get; set; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Gets or sets list of episode regular expressions.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  |          public EpisodeExpression[] EpisodeExpressions { get; set; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Gets or sets list of raw episode without season regular expressions strings.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  |          public string[] EpisodeWithoutSeasonExpressions { get; set; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Gets or sets list of raw multi-part episodes regular expressions strings.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  |          public string[] EpisodeMultiPartExpressions { get; set; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Gets or sets list of video file extensions.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  |          public string[] VideoFileExtensions { get; set; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Gets or sets list of video stub file extensions.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  |          public string[] StubFileExtensions { get; set; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Gets or sets list of raw audiobook parts regular expressions strings.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  |          public string[] AudioBookPartsExpressions { get; set; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Gets or sets list of raw audiobook names regular expressions strings.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  | +        public string[] AudioBookNamesExpressions { get; set; }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Gets or sets list of stub type rules.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  |          public StubTypeRule[] StubTypes { get; set; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Gets or sets list of video flag delimiters.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  |          public char[] VideoFlagDelimiters { get; set; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Gets or sets list of 3D Format rules.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  |          public Format3DRule[] Format3DRules { get; set; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Gets or sets list of raw video file-stacking expressions strings.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  |          public string[] VideoFileStackingExpressions { get; set; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Gets or sets list of raw clean DateTimes regular expressions strings.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  |          public string[] CleanDateTimes { get; set; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Gets or sets list of raw clean strings regular expressions strings.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  |          public string[] CleanStrings { get; set; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Gets or sets list of multi-episode regular expressions.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  |          public EpisodeExpression[] MultipleEpisodeExpressions { get; set; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Gets or sets list of extra rules for videos.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  |          public ExtraRule[] VideoExtraRules { get; set; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        public Regex[] VideoFileStackingRegexes { get; private set; }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        public Regex[] CleanDateTimeRegexes { get; private set; }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        public Regex[] CleanStringRegexes { get; private set; }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        public Regex[] EpisodeWithoutSeasonRegexes { get; private set; }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        public Regex[] EpisodeMultiPartRegexes { get; private set; }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Gets list of video file-stack regular expressions.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  | +        public Regex[] VideoFileStackingRegexes { get; private set; } = Array.Empty<Regex>();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Gets list of clean datetime regular expressions.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  | +        public Regex[] CleanDateTimeRegexes { get; private set; } = Array.Empty<Regex>();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Gets list of clean string regular expressions.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  | +        public Regex[] CleanStringRegexes { get; private set; } = Array.Empty<Regex>();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Gets list of episode without season regular expressions.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  | +        public Regex[] EpisodeWithoutSeasonRegexes { get; private set; } = Array.Empty<Regex>();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Gets list of multi-part episode regular expressions.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  | +        public Regex[] EpisodeMultiPartRegexes { get; private set; } = Array.Empty<Regex>();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Compiles raw regex strings into regexes.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  |          public void Compile()
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              VideoFileStackingRegexes = VideoFileStackingExpressions.Select(Compile).ToArray();
 |