@ -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 + + )