|
@@ -19,8 +19,6 @@ namespace MediaBrowser.Controller.Entities.TV
|
|
|
{
|
|
|
public List<Guid> SpecialFeatureIds { get; set; }
|
|
|
|
|
|
- public string OriginalTitle { get; set; }
|
|
|
-
|
|
|
public int? AnimeSeriesIndex { get; set; }
|
|
|
|
|
|
public Series()
|
|
@@ -93,25 +91,33 @@ namespace MediaBrowser.Controller.Entities.TV
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ [IgnoreDataMember]
|
|
|
+ public override string PresentationUniqueKey
|
|
|
+ {
|
|
|
+ get { return GetUserDataKeys().First(); }
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// Gets the user data key.
|
|
|
/// </summary>
|
|
|
/// <returns>System.String.</returns>
|
|
|
- protected override string CreateUserDataKey()
|
|
|
+ public override List<string> GetUserDataKeys()
|
|
|
{
|
|
|
- var key = this.GetProviderId(MetadataProviders.Tvdb);
|
|
|
+ var list = base.GetUserDataKeys();
|
|
|
|
|
|
- if (string.IsNullOrWhiteSpace(key))
|
|
|
+ var key = this.GetProviderId(MetadataProviders.Imdb);
|
|
|
+ if (!string.IsNullOrWhiteSpace(key))
|
|
|
{
|
|
|
- key = this.GetProviderId(MetadataProviders.Imdb);
|
|
|
+ list.Insert(0, key);
|
|
|
}
|
|
|
|
|
|
- if (string.IsNullOrWhiteSpace(key))
|
|
|
+ key = this.GetProviderId(MetadataProviders.Tvdb);
|
|
|
+ if (!string.IsNullOrWhiteSpace(key))
|
|
|
{
|
|
|
- key = base.CreateUserDataKey();
|
|
|
+ list.Insert(0, key);
|
|
|
}
|
|
|
|
|
|
- return key;
|
|
|
+ return list;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -128,8 +134,8 @@ namespace MediaBrowser.Controller.Entities.TV
|
|
|
// Studio, Genre and Rating will all be the same so makes no sense to index by these
|
|
|
protected override IEnumerable<string> GetIndexByOptions()
|
|
|
{
|
|
|
- return new List<string> {
|
|
|
- {"None"},
|
|
|
+ return new List<string> {
|
|
|
+ {"None"},
|
|
|
{"Performer"},
|
|
|
{"Director"},
|
|
|
{"Year"},
|
|
@@ -185,8 +191,28 @@ namespace MediaBrowser.Controller.Entities.TV
|
|
|
|
|
|
public IEnumerable<Season> GetSeasons(User user, bool includeMissingSeasons, bool includeVirtualUnaired)
|
|
|
{
|
|
|
- var seasons = base.GetChildren(user, true)
|
|
|
- .OfType<Season>();
|
|
|
+ var seriesIds = LibraryManager.GetItemIds(new InternalItemsQuery(user)
|
|
|
+ {
|
|
|
+ PresentationUniqueKey = PresentationUniqueKey,
|
|
|
+ IncludeItemTypes = new[] { typeof(Series).Name }
|
|
|
+ });
|
|
|
+
|
|
|
+ IEnumerable<Season> seasons;
|
|
|
+
|
|
|
+ if (seriesIds.Count > 1)
|
|
|
+ {
|
|
|
+ seasons = LibraryManager.GetItemList(new InternalItemsQuery(user)
|
|
|
+ {
|
|
|
+ AncestorIds = seriesIds.Select(i => i.ToString("N")).ToArray(),
|
|
|
+ IncludeItemTypes = new[] { typeof(Season).Name },
|
|
|
+ SortBy = new[] { ItemSortBy.SortName }
|
|
|
+
|
|
|
+ }).OfType<Season>();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ seasons = base.GetChildren(user, true).OfType<Season>();
|
|
|
+ }
|
|
|
|
|
|
if (!includeMissingSeasons && !includeVirtualUnaired)
|
|
|
{
|
|
@@ -204,9 +230,7 @@ namespace MediaBrowser.Controller.Entities.TV
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return LibraryManager
|
|
|
- .Sort(seasons, user, new[] { ItemSortBy.SortName }, SortOrder.Ascending)
|
|
|
- .Cast<Season>();
|
|
|
+ return seasons;
|
|
|
}
|
|
|
|
|
|
public IEnumerable<Episode> GetEpisodes(User user)
|
|
@@ -257,7 +281,7 @@ namespace MediaBrowser.Controller.Entities.TV
|
|
|
// Refresh current item
|
|
|
await RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
|
- // Refresh TV
|
|
|
+ // Refresh seasons
|
|
|
foreach (var item in seasons)
|
|
|
{
|
|
|
cancellationToken.ThrowIfCancellationRequested();
|
|
@@ -270,12 +294,30 @@ namespace MediaBrowser.Controller.Entities.TV
|
|
|
progress.Report(percent * 100);
|
|
|
}
|
|
|
|
|
|
- // Refresh all non-songs
|
|
|
+ // Refresh episodes and other children
|
|
|
foreach (var item in otherItems)
|
|
|
{
|
|
|
cancellationToken.ThrowIfCancellationRequested();
|
|
|
|
|
|
- await item.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
|
|
|
+ var skipItem = false;
|
|
|
+
|
|
|
+ var episode = item as Episode;
|
|
|
+
|
|
|
+ if (episode != null
|
|
|
+ && refreshOptions.MetadataRefreshMode != MetadataRefreshMode.FullRefresh
|
|
|
+ && !refreshOptions.ReplaceAllMetadata
|
|
|
+ && episode.IsMissingEpisode
|
|
|
+ && episode.LocationType == Model.Entities.LocationType.Virtual
|
|
|
+ && episode.PremiereDate.HasValue
|
|
|
+ && (DateTime.UtcNow - episode.PremiereDate.Value).TotalDays > 30)
|
|
|
+ {
|
|
|
+ skipItem = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!skipItem)
|
|
|
+ {
|
|
|
+ await item.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
|
|
|
+ }
|
|
|
|
|
|
numComplete++;
|
|
|
double percent = numComplete;
|
|
@@ -297,18 +339,31 @@ namespace MediaBrowser.Controller.Entities.TV
|
|
|
|
|
|
public IEnumerable<Episode> GetEpisodes(User user, int seasonNumber, bool includeMissingEpisodes, bool includeVirtualUnairedEpisodes)
|
|
|
{
|
|
|
- return GetEpisodes(user, seasonNumber, includeMissingEpisodes, includeVirtualUnairedEpisodes,
|
|
|
- new List<Episode>());
|
|
|
- }
|
|
|
+ var seriesIds = LibraryManager.GetItemIds(new InternalItemsQuery(user)
|
|
|
+ {
|
|
|
+ PresentationUniqueKey = PresentationUniqueKey,
|
|
|
+ IncludeItemTypes = new[] { typeof(Series).Name }
|
|
|
+ });
|
|
|
|
|
|
- internal IEnumerable<Episode> GetEpisodes(User user, int seasonNumber, bool includeMissingEpisodes, bool includeVirtualUnairedEpisodes, IEnumerable<Episode> additionalEpisodes)
|
|
|
- {
|
|
|
- var episodes = GetRecursiveChildren(user, i => i is Episode)
|
|
|
- .Cast<Episode>();
|
|
|
+ IEnumerable<Episode> episodes;
|
|
|
|
|
|
- episodes = FilterEpisodesBySeason(episodes, seasonNumber, DisplaySpecialsWithSeasons);
|
|
|
+ if (seriesIds.Count > 1)
|
|
|
+ {
|
|
|
+ episodes = LibraryManager.GetItemList(new InternalItemsQuery(user)
|
|
|
+ {
|
|
|
+ AncestorIds = seriesIds.Select(i => i.ToString("N")).ToArray(),
|
|
|
+ IncludeItemTypes = new[] { typeof(Episode).Name },
|
|
|
+ SortBy = new[] { ItemSortBy.SortName }
|
|
|
|
|
|
- episodes = episodes.Concat(additionalEpisodes).Distinct();
|
|
|
+ }).OfType<Episode>();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ episodes = GetRecursiveChildren(user, i => i is Episode)
|
|
|
+ .Cast<Episode>();
|
|
|
+ }
|
|
|
+
|
|
|
+ episodes = FilterEpisodesBySeason(episodes, seasonNumber, DisplaySpecialsWithSeasons);
|
|
|
|
|
|
if (!includeMissingEpisodes)
|
|
|
{
|
|
@@ -336,7 +391,7 @@ namespace MediaBrowser.Controller.Entities.TV
|
|
|
{
|
|
|
if (!includeSpecials || seasonNumber < 1)
|
|
|
{
|
|
|
- return episodes.Where(i => (i.PhysicalSeasonNumber ?? -1) == seasonNumber);
|
|
|
+ return episodes.Where(i => (i.ParentIndexNumber ?? -1) == seasonNumber);
|
|
|
}
|
|
|
|
|
|
return episodes.Where(i =>
|