aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller
diff options
context:
space:
mode:
authorLuke <luke.pulverenti@gmail.com>2013-05-23 20:41:50 -0700
committerLuke <luke.pulverenti@gmail.com>2013-05-23 20:41:50 -0700
commit3e656f5a372d81b82521ff488fbe7d4fc678be2d (patch)
treebaea74f2b041ce41ccf1cd2f2ef30b1b2815ca4f /MediaBrowser.Controller
parent7a5565a37b2493a575502192087bc37022214dde (diff)
parent96a4f93e7cb733feb7f563878f30cb9749612a57 (diff)
Merge pull request #303 from lalmanzar/issue_286_phase1
Issue 286 phase1
Diffstat (limited to 'MediaBrowser.Controller')
-rw-r--r--MediaBrowser.Controller/Entities/TV/Episode.cs6
-rw-r--r--MediaBrowser.Controller/Library/TVUtils.cs53
2 files changed, 53 insertions, 6 deletions
diff --git a/MediaBrowser.Controller/Entities/TV/Episode.cs b/MediaBrowser.Controller/Entities/TV/Episode.cs
index dd1434cea..2f1e036e0 100644
--- a/MediaBrowser.Controller/Entities/TV/Episode.cs
+++ b/MediaBrowser.Controller/Entities/TV/Episode.cs
@@ -176,6 +176,12 @@ namespace MediaBrowser.Controller.Entities.TV
}
/// <summary>
+ /// This is the ending episode number for double episodes.
+ /// </summary>
+ /// <value>The index number.</value>
+ public int? IndexNumberEnd { get; set; }
+
+ /// <summary>
/// Creates the name of the sort.
/// </summary>
/// <returns>System.String.</returns>
diff --git a/MediaBrowser.Controller/Library/TVUtils.cs b/MediaBrowser.Controller/Library/TVUtils.cs
index 6a220c6d7..9538e927a 100644
--- a/MediaBrowser.Controller/Library/TVUtils.cs
+++ b/MediaBrowser.Controller/Library/TVUtils.cs
@@ -44,19 +44,48 @@ namespace MediaBrowser.Controller.Library
new Regex(
@".*\\[s|S]?(?<seasonnumber>\d{1,2})[x|X](?<epnumber>\d{1,3})[^\\]*$",
RegexOptions.Compiled),
- // 01x02 blah.avi S01x01 balh.avi
new Regex(
- @".*\\[s|S](?<seasonnumber>\d{1,2})x?[e|E](?<epnumber>\d{1,3})[^\\]*$",
+ @".*\\[s|S](?<seasonnumber>\d{1,2})[x,X]?[e|E](?<epnumber>\d{1,3})[^\\]*$",
RegexOptions.Compiled),
- // S01E02 blah.avi, S01xE01 blah.avi
new Regex(
- @".*\\(?<seriesname>[^\\]*)[s|S]?(?<seasonnumber>\d{1,2})[x|X](?<epnumber>\d{1,3})[^\\]*$",
+ @".*\\(?<seriesname>((?![s|S]?\d{1,2}[x|X]\d{1,3})[^\\])*)?([s|S]?(?<seasonnumber>\d{1,2})[x|X](?<epnumber>\d{1,3}))[^\\]*$",
RegexOptions.Compiled),
- // 01x02 blah.avi S01x01 balh.avi
new Regex(
@".*\\(?<seriesname>[^\\]*)[s|S](?<seasonnumber>\d{1,2})[x|X|\.]?[e|E](?<epnumber>\d{1,3})[^\\]*$",
RegexOptions.Compiled)
- // S01E02 blah.avi, S01xE01 blah.avi
+ };
+ private static readonly Regex[] MultipleEpisodeExpressions = new[]
+ {
+ new Regex(
+ @".*\\[s|S]?(?<seasonnumber>\d{1,2})[x|X](?<epnumber>\d{1,3})([ |-]{1,3}\d{1,2}[e|E|x|X](?<endingepnumber>\d{1,3}))+[^\\]*$",
+ RegexOptions.Compiled),
+ new Regex(
+ @".*\\[s|S]?(?<seasonnumber>\d{1,2})[x|X](?<epnumber>\d{1,3})([ |-]{1,3}\d{1,2}[x|X][e|E](?<endingepnumber>\d{1,3}))+[^\\]*$",
+ RegexOptions.Compiled),
+ new Regex(
+ @".*\\[s|S]?(?<seasonnumber>\d{1,2})[x|X](?<epnumber>\d{1,3})([ |-]{0,3}[x|X|e|E](?<endingepnumber>\d{1,3}))+[^\\]*$",
+ RegexOptions.Compiled),
+ new Regex(
+ @".*\\[s|S]?(?<seasonnumber>\d{1,2})[x|X](?<epnumber>\d{1,3})([ |-]{1,3}[x|E]?[e|E]?(?<endingepnumber>\d{1,3}))+[^\\]*$",
+ RegexOptions.Compiled),
+ new Regex(
+ @".*\\(?<seriesname>((?![s|S]?\d{1,2}[x|X]\d{1,3})[^\\])*)?([s|S]?(?<seasonnumber>\d{1,2})[x|X](?<epnumber>\d{1,3}))([ |-]{1,3}\d{1,2}[x|X|e|E](?<endingepnumber>\d{1,3}))+[^\\]*$",
+ RegexOptions.Compiled),
+ new Regex(
+ @".*\\(?<seriesname>((?![s|S]?\d{1,2}[x|X]\d{1,3})[^\\])*)?([s|S]?(?<seasonnumber>\d{1,2})[x|X](?<epnumber>\d{1,3}))([ |-]{1,3}\d{1,2}[x|X][e|E](?<endingepnumber>\d{1,3}))+[^\\]*$",
+ RegexOptions.Compiled),
+ new Regex(
+ @".*\\(?<seriesname>((?![s|S]?\d{1,2}[x|X]\d{1,3})[^\\])*)?([s|S]?(?<seasonnumber>\d{1,2})[x|X](?<epnumber>\d{1,3}))([ |-]{0,3}[x|X|e|E](?<endingepnumber>\d{1,3}))+[^\\]*$",
+ RegexOptions.Compiled),
+ new Regex(
+ @".*\\(?<seriesname>((?![s|S]?\d{1,2}[x|X]\d{1,3})[^\\])*)?([s|S]?(?<seasonnumber>\d{1,2})[x|X](?<epnumber>\d{1,3}))([ |-]{1,3}[x|X]?[e|E]?(?<endingepnumber>\d{1,3}))+[^\\]*$",
+ RegexOptions.Compiled),
+ new Regex(
+ @".*\\(?<seriesname>[^\\]*)[s|S](?<seasonnumber>\d{1,2})[x|X|\.]?[e|E](?<epnumber>\d{1,3})([ |-]{0,3}[x|X|e|E](?<endingepnumber>\d{1,3}))+[^\\]*$",
+ RegexOptions.Compiled),
+ new Regex(
+ @".*\\(?<seriesname>[^\\]*)[s|S](?<seasonnumber>\d{1,2})[x|X|\.]?[e|E](?<epnumber>\d{1,3})([ |-]{1,3}[x|X]?[e|E]?(?<endingepnumber>\d{1,3}))+[^\\]*$",
+ RegexOptions.Compiled)
};
/// <summary>
@@ -224,6 +253,18 @@ namespace MediaBrowser.Controller.Library
return null;
}
+ public static int? GetEndingEpisodeNumberFromFile(string fullPath)
+ {
+ var fl = fullPath.ToLower();
+ foreach (var r in MultipleEpisodeExpressions)
+ {
+ var m = r.Match(fl);
+ if (m.Success && !string.IsNullOrEmpty(m.Groups["endingepnumber"].Value))
+ return ParseEpisodeNumber(m.Groups["endingepnumber"].Value);
+ }
+ return null;
+ }
+
private static readonly CultureInfo UsCulture = new CultureInfo("en-US");
private static int? ParseEpisodeNumber(string val)