|
@@ -27,94 +27,94 @@ namespace MediaBrowser.Controller.Library
|
|
|
/// <summary>
|
|
|
/// A season folder must contain one of these somewhere in the name
|
|
|
/// </summary>
|
|
|
- private static readonly string[] SeasonFolderNames = new[]
|
|
|
- {
|
|
|
- "season",
|
|
|
- "sæson",
|
|
|
- "temporada",
|
|
|
- "saison",
|
|
|
- "staffel",
|
|
|
- "series",
|
|
|
- "сезон"
|
|
|
- };
|
|
|
+ private static readonly string[] SeasonFolderNames =
|
|
|
+ {
|
|
|
+ "season",
|
|
|
+ "sæson",
|
|
|
+ "temporada",
|
|
|
+ "saison",
|
|
|
+ "staffel",
|
|
|
+ "series",
|
|
|
+ "сезон"
|
|
|
+ };
|
|
|
|
|
|
/// <summary>
|
|
|
/// Used to detect paths that represent episodes, need to make sure they don't also
|
|
|
/// match movie titles like "2001 A Space..."
|
|
|
/// Currently we limit the numbers here to 2 digits to try and avoid this
|
|
|
/// </summary>
|
|
|
- private static readonly Regex[] EpisodeExpressions = new[]
|
|
|
- {
|
|
|
- new Regex(
|
|
|
- @".*(\\|\/)[sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3})[^\\\/]*$",
|
|
|
- RegexOptions.Compiled),
|
|
|
- new Regex(
|
|
|
- @".*(\\|\/)[sS](?<seasonnumber>\d{1,4})[x,X]?[eE](?<epnumber>\d{1,3})[^\\\/]*$",
|
|
|
- RegexOptions.Compiled),
|
|
|
- new Regex(
|
|
|
- @".*(\\|\/)(?<seriesname>((?![sS]?\d{1,4}[xX]\d{1,3})[^\\\/])*)?([sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3}))[^\\\/]*$",
|
|
|
- RegexOptions.Compiled),
|
|
|
- new Regex(
|
|
|
- @".*(\\|\/)(?<seriesname>[^\\\/]*)[sS](?<seasonnumber>\d{1,4})[xX\.]?[eE](?<epnumber>\d{1,3})[^\\\/]*$",
|
|
|
- RegexOptions.Compiled)
|
|
|
- };
|
|
|
- private static readonly Regex[] MultipleEpisodeExpressions = new[]
|
|
|
- {
|
|
|
- new Regex(
|
|
|
- @".*(\\|\/)[sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3})((-| - )\d{1,4}[eExX](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
|
|
|
- RegexOptions.Compiled),
|
|
|
- new Regex(
|
|
|
- @".*(\\|\/)[sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3})((-| - )\d{1,4}[xX][eE](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
|
|
|
- RegexOptions.Compiled),
|
|
|
- new Regex(
|
|
|
- @".*(\\|\/)[sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3})((-| - )?[xXeE](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
|
|
|
- RegexOptions.Compiled),
|
|
|
- new Regex(
|
|
|
- @".*(\\|\/)[sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3})(-[xE]?[eE]?(?<endingepnumber>\d{1,3}))+[^\\\/]*$",
|
|
|
- RegexOptions.Compiled),
|
|
|
- new Regex(
|
|
|
- @".*(\\|\/)(?<seriesname>((?![sS]?\d{1,4}[xX]\d{1,3})[^\\\/])*)?([sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3}))((-| - )\d{1,4}[xXeE](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
|
|
|
- RegexOptions.Compiled),
|
|
|
- new Regex(
|
|
|
- @".*(\\|\/)(?<seriesname>((?![sS]?\d{1,4}[xX]\d{1,3})[^\\\/])*)?([sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3}))((-| - )\d{1,4}[xX][eE](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
|
|
|
- RegexOptions.Compiled),
|
|
|
- new Regex(
|
|
|
- @".*(\\|\/)(?<seriesname>((?![sS]?\d{1,4}[xX]\d{1,3})[^\\\/])*)?([sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3}))((-| - )?[xXeE](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
|
|
|
- RegexOptions.Compiled),
|
|
|
- new Regex(
|
|
|
- @".*(\\|\/)(?<seriesname>((?![sS]?\d{1,4}[xX]\d{1,3})[^\\\/])*)?([sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3}))(-[xX]?[eE]?(?<endingepnumber>\d{1,3}))+[^\\\/]*$",
|
|
|
- RegexOptions.Compiled),
|
|
|
- new Regex(
|
|
|
- @".*(\\|\/)(?<seriesname>[^\\\/]*)[sS](?<seasonnumber>\d{1,4})[xX\.]?[eE](?<epnumber>\d{1,3})((-| - )?[xXeE](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
|
|
|
- RegexOptions.Compiled),
|
|
|
- new Regex(
|
|
|
- @".*(\\|\/)(?<seriesname>[^\\\/]*)[sS](?<seasonnumber>\d{1,4})[xX\.]?[eE](?<epnumber>\d{1,3})(-[xX]?[eE]?(?<endingepnumber>\d{1,3}))+[^\\\/]*$",
|
|
|
- RegexOptions.Compiled)
|
|
|
- };
|
|
|
+ private static readonly Regex[] EpisodeExpressions =
|
|
|
+ {
|
|
|
+ new Regex(
|
|
|
+ @".*(\\|\/)[sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3})[^\\\/]*$",
|
|
|
+ RegexOptions.Compiled),
|
|
|
+ new Regex(
|
|
|
+ @".*(\\|\/)[sS](?<seasonnumber>\d{1,4})[x,X]?[eE](?<epnumber>\d{1,3})[^\\\/]*$",
|
|
|
+ RegexOptions.Compiled),
|
|
|
+ new Regex(
|
|
|
+ @".*(\\|\/)(?<seriesname>((?![sS]?\d{1,4}[xX]\d{1,3})[^\\\/])*)?([sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3}))[^\\\/]*$",
|
|
|
+ RegexOptions.Compiled),
|
|
|
+ new Regex(
|
|
|
+ @".*(\\|\/)(?<seriesname>[^\\\/]*)[sS](?<seasonnumber>\d{1,4})[xX\.]?[eE](?<epnumber>\d{1,3})[^\\\/]*$",
|
|
|
+ RegexOptions.Compiled)
|
|
|
+ };
|
|
|
+ private static readonly Regex[] MultipleEpisodeExpressions =
|
|
|
+ {
|
|
|
+ new Regex(
|
|
|
+ @".*(\\|\/)[sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3})((-| - )\d{1,4}[eExX](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
|
|
|
+ RegexOptions.Compiled),
|
|
|
+ new Regex(
|
|
|
+ @".*(\\|\/)[sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3})((-| - )\d{1,4}[xX][eE](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
|
|
|
+ RegexOptions.Compiled),
|
|
|
+ new Regex(
|
|
|
+ @".*(\\|\/)[sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3})((-| - )?[xXeE](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
|
|
|
+ RegexOptions.Compiled),
|
|
|
+ new Regex(
|
|
|
+ @".*(\\|\/)[sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3})(-[xE]?[eE]?(?<endingepnumber>\d{1,3}))+[^\\\/]*$",
|
|
|
+ RegexOptions.Compiled),
|
|
|
+ new Regex(
|
|
|
+ @".*(\\|\/)(?<seriesname>((?![sS]?\d{1,4}[xX]\d{1,3})[^\\\/])*)?([sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3}))((-| - )\d{1,4}[xXeE](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
|
|
|
+ RegexOptions.Compiled),
|
|
|
+ new Regex(
|
|
|
+ @".*(\\|\/)(?<seriesname>((?![sS]?\d{1,4}[xX]\d{1,3})[^\\\/])*)?([sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3}))((-| - )\d{1,4}[xX][eE](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
|
|
|
+ RegexOptions.Compiled),
|
|
|
+ new Regex(
|
|
|
+ @".*(\\|\/)(?<seriesname>((?![sS]?\d{1,4}[xX]\d{1,3})[^\\\/])*)?([sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3}))((-| - )?[xXeE](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
|
|
|
+ RegexOptions.Compiled),
|
|
|
+ new Regex(
|
|
|
+ @".*(\\|\/)(?<seriesname>((?![sS]?\d{1,4}[xX]\d{1,3})[^\\\/])*)?([sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3}))(-[xX]?[eE]?(?<endingepnumber>\d{1,3}))+[^\\\/]*$",
|
|
|
+ RegexOptions.Compiled),
|
|
|
+ new Regex(
|
|
|
+ @".*(\\|\/)(?<seriesname>[^\\\/]*)[sS](?<seasonnumber>\d{1,4})[xX\.]?[eE](?<epnumber>\d{1,3})((-| - )?[xXeE](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
|
|
|
+ RegexOptions.Compiled),
|
|
|
+ new Regex(
|
|
|
+ @".*(\\|\/)(?<seriesname>[^\\\/]*)[sS](?<seasonnumber>\d{1,4})[xX\.]?[eE](?<epnumber>\d{1,3})(-[xX]?[eE]?(?<endingepnumber>\d{1,3}))+[^\\\/]*$",
|
|
|
+ RegexOptions.Compiled)
|
|
|
+ };
|
|
|
|
|
|
/// <summary>
|
|
|
/// To avoid the following matching movies they are only valid when contained in a folder which has been matched as a being season
|
|
|
/// </summary>
|
|
|
- private static readonly Regex[] EpisodeExpressionsInASeasonFolder = new[]
|
|
|
- {
|
|
|
- new Regex(
|
|
|
- @".*(\\|\/)(?<epnumber>\d{1,2})\s?-\s?[^\\\/]*$",
|
|
|
- RegexOptions.Compiled),
|
|
|
- // 01 - blah.avi, 01-blah.avi
|
|
|
- new Regex(
|
|
|
- @".*(\\|\/)(?<epnumber>\d{1,2})[^\d\\]*[^\\\/]*$",
|
|
|
- RegexOptions.Compiled),
|
|
|
- // 01.avi, 01.blah.avi "01 - 22 blah.avi"
|
|
|
- new Regex(
|
|
|
- @".*(\\|\/)(?<seasonnumber>\d)(?<epnumber>\d{1,2})[^\d\\]+[^\\\/]*$",
|
|
|
- RegexOptions.Compiled),
|
|
|
- // 01.avi, 01.blah.avi
|
|
|
- new Regex(
|
|
|
- @".*(\\|\/)\D*\d+(?<epnumber>\d{2})",
|
|
|
- RegexOptions.Compiled)
|
|
|
- // hell0 - 101 - hello.avi
|
|
|
-
|
|
|
- };
|
|
|
+ private static readonly Regex[] EpisodeExpressionsInASeasonFolder =
|
|
|
+ {
|
|
|
+ new Regex(
|
|
|
+ @".*(\\|\/)(?<epnumber>\d{1,2})\s?-\s?[^\\\/]*$",
|
|
|
+ RegexOptions.Compiled),
|
|
|
+ // 01 - blah.avi, 01-blah.avi
|
|
|
+ new Regex(
|
|
|
+ @".*(\\|\/)(?<epnumber>\d{1,2})[^\d\\]*[^\\\/]*$",
|
|
|
+ RegexOptions.Compiled),
|
|
|
+ // 01.avi, 01.blah.avi "01 - 22 blah.avi"
|
|
|
+ new Regex(
|
|
|
+ @".*(\\|\/)(?<seasonnumber>\d)(?<epnumber>\d{1,2})[^\d\\]+[^\\\/]*$",
|
|
|
+ RegexOptions.Compiled),
|
|
|
+ // 01.avi, 01.blah.avi
|
|
|
+ new Regex(
|
|
|
+ @".*(\\|\/)\D*\d+(?<epnumber>\d{2})",
|
|
|
+ RegexOptions.Compiled)
|
|
|
+ // hell0 - 101 - hello.avi
|
|
|
+
|
|
|
+ };
|
|
|
|
|
|
/// <summary>
|
|
|
/// Gets the season number from path.
|
|
@@ -151,8 +151,8 @@ namespace MediaBrowser.Controller.Library
|
|
|
/// <returns>System.Nullable{System.Int32}.</returns>
|
|
|
private static int? GetSeasonNumberFromPathSubstring(string path)
|
|
|
{
|
|
|
- int numericStart = -1;
|
|
|
- int length = 0;
|
|
|
+ var numericStart = -1;
|
|
|
+ var length = 0;
|
|
|
|
|
|
// Find out where the numbers start, and then keep going until they end
|
|
|
for (var i = 0; i < path.Length; i++)
|