aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MediaBrowser.Controller/Entities/TV/Season.cs24
-rw-r--r--MediaBrowser.Providers/TV/SeriesPostScanTask.cs45
2 files changed, 64 insertions, 5 deletions
diff --git a/MediaBrowser.Controller/Entities/TV/Season.cs b/MediaBrowser.Controller/Entities/TV/Season.cs
index 218c9fa5b..0d9e5ec6d 100644
--- a/MediaBrowser.Controller/Entities/TV/Season.cs
+++ b/MediaBrowser.Controller/Entities/TV/Season.cs
@@ -149,16 +149,34 @@ namespace MediaBrowser.Controller.Entities.TV
return IndexNumber != null ? IndexNumber.Value.ToString("0000") : Name;
}
+ private IEnumerable<Episode> GetEpisodes()
+ {
+ var series = Series;
+
+ if (series != null && series.ContainsEpisodesWithoutSeasonFolders)
+ {
+ var seasonNumber = IndexNumber;
+
+ if (seasonNumber.HasValue)
+ {
+ return series.RecursiveChildren.OfType<Episode>()
+ .Where(i => i.ParentIndexNumber.HasValue && i.ParentIndexNumber.Value == seasonNumber.Value);
+ }
+ }
+
+ return Children.OfType<Episode>();
+ }
+
[IgnoreDataMember]
public bool IsMissingSeason
{
- get { return LocationType == Model.Entities.LocationType.Virtual && Children.OfType<Episode>().All(i => i.IsMissingEpisode); }
+ get { return LocationType == Model.Entities.LocationType.Virtual && GetEpisodes().All(i => i.IsMissingEpisode); }
}
[IgnoreDataMember]
public bool IsUnaired
{
- get { return Children.OfType<Episode>().All(i => i.IsUnaired); }
+ get { return GetEpisodes().All(i => i.IsUnaired); }
}
[IgnoreDataMember]
@@ -170,7 +188,7 @@ namespace MediaBrowser.Controller.Entities.TV
[IgnoreDataMember]
public bool IsMissingOrVirtualUnaired
{
- get { return LocationType == Model.Entities.LocationType.Virtual && Children.OfType<Episode>().All(i => i.IsVirtualUnaired || i.IsMissingEpisode); }
+ get { return LocationType == Model.Entities.LocationType.Virtual && GetEpisodes().All(i => i.IsVirtualUnaired || i.IsMissingEpisode); }
}
[IgnoreDataMember]
diff --git a/MediaBrowser.Providers/TV/SeriesPostScanTask.cs b/MediaBrowser.Providers/TV/SeriesPostScanTask.cs
index 7ad564d0f..055a6c101 100644
--- a/MediaBrowser.Providers/TV/SeriesPostScanTask.cs
+++ b/MediaBrowser.Providers/TV/SeriesPostScanTask.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Common.Extensions;
using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Entities;
@@ -150,6 +151,12 @@ namespace MediaBrowser.Providers.TV
.ConfigureAwait(false);
var hasNewEpisodes = false;
+ var hasNewSeasons = false;
+
+ if (series.ContainsEpisodesWithoutSeasonFolders)
+ {
+ hasNewSeasons = await AddDummySeasonFolders(series, cancellationToken).ConfigureAwait(false);
+ }
if (_config.Configuration.EnableInternetProviders)
{
@@ -157,7 +164,7 @@ namespace MediaBrowser.Providers.TV
.ConfigureAwait(false);
}
- if (hasNewEpisodes || anySeasonsRemoved || anyEpisodesRemoved)
+ if (hasNewSeasons || hasNewEpisodes || anySeasonsRemoved || anyEpisodesRemoved)
{
await series.RefreshMetadata(cancellationToken, true)
.ConfigureAwait(false);
@@ -168,6 +175,40 @@ namespace MediaBrowser.Providers.TV
}
/// <summary>
+ /// For series with episodes directly under the series folder, this adds dummy seasons to enable regular browsing and metadata
+ /// </summary>
+ /// <param name="series"></param>
+ /// <param name="cancellationToken"></param>
+ /// <returns></returns>
+ private async Task<bool> AddDummySeasonFolders(Series series, CancellationToken cancellationToken)
+ {
+ var existingEpisodes = series.RecursiveChildren
+ .OfType<Episode>()
+ .ToList();
+
+ var hasChanges = false;
+
+ // Loop through the unique season numbers
+ foreach (var seasonNumber in existingEpisodes.Select(i => i.ParentIndexNumber ?? -1)
+ .Where(i => i >= 0)
+ .Distinct()
+ .ToList())
+ {
+ var hasSeason = series.Children.OfType<Season>()
+ .Any(i => i.IndexNumber.HasValue && i.IndexNumber.Value == seasonNumber);
+
+ if (!hasSeason)
+ {
+ await AddSeason(series, seasonNumber, cancellationToken).ConfigureAwait(false);
+
+ hasChanges = true;
+ }
+ }
+
+ return hasChanges;
+ }
+
+ /// <summary>
/// Adds the missing episodes.
/// </summary>
/// <param name="series">The series.</param>
@@ -355,7 +396,7 @@ namespace MediaBrowser.Providers.TV
return hasChanges;
}
-
+
/// <summary>
/// Adds the episode.
/// </summary>