|
|
@ -19,8 +19,6 @@ namespace MediaBrowser.Controller.Entities.TV
|
|
|
|
{
|
|
|
|
{
|
|
|
|
public List<Guid> SpecialFeatureIds { get; set; }
|
|
|
|
public List<Guid> SpecialFeatureIds { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
public string OriginalTitle { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public int? AnimeSeriesIndex { get; set; }
|
|
|
|
public int? AnimeSeriesIndex { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
public Series()
|
|
|
|
public Series()
|
|
|
@ -93,25 +91,33 @@ namespace MediaBrowser.Controller.Entities.TV
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[IgnoreDataMember]
|
|
|
|
|
|
|
|
public override string PresentationUniqueKey
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
get { return GetUserDataKeys().First(); }
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// <summary>
|
|
|
|
/// Gets the user data key.
|
|
|
|
/// Gets the user data key.
|
|
|
|
/// </summary>
|
|
|
|
/// </summary>
|
|
|
|
/// <returns>System.String.</returns>
|
|
|
|
/// <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>
|
|
|
|
/// <summary>
|
|
|
@ -185,8 +191,28 @@ namespace MediaBrowser.Controller.Entities.TV
|
|
|
|
|
|
|
|
|
|
|
|
public IEnumerable<Season> GetSeasons(User user, bool includeMissingSeasons, bool includeVirtualUnaired)
|
|
|
|
public IEnumerable<Season> GetSeasons(User user, bool includeMissingSeasons, bool includeVirtualUnaired)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var seasons = base.GetChildren(user, true)
|
|
|
|
var seriesIds = LibraryManager.GetItemIds(new InternalItemsQuery(user)
|
|
|
|
.OfType<Season>();
|
|
|
|
{
|
|
|
|
|
|
|
|
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)
|
|
|
|
if (!includeMissingSeasons && !includeVirtualUnaired)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -204,9 +230,7 @@ namespace MediaBrowser.Controller.Entities.TV
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return LibraryManager
|
|
|
|
return seasons;
|
|
|
|
.Sort(seasons, user, new[] { ItemSortBy.SortName }, SortOrder.Ascending)
|
|
|
|
|
|
|
|
.Cast<Season>();
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public IEnumerable<Episode> GetEpisodes(User user)
|
|
|
|
public IEnumerable<Episode> GetEpisodes(User user)
|
|
|
@ -257,7 +281,7 @@ namespace MediaBrowser.Controller.Entities.TV
|
|
|
|
// Refresh current item
|
|
|
|
// Refresh current item
|
|
|
|
await RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
|
|
|
|
await RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
|
|
// Refresh TV
|
|
|
|
// Refresh seasons
|
|
|
|
foreach (var item in seasons)
|
|
|
|
foreach (var item in seasons)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
cancellationToken.ThrowIfCancellationRequested();
|
|
|
|
cancellationToken.ThrowIfCancellationRequested();
|
|
|
@ -270,12 +294,30 @@ namespace MediaBrowser.Controller.Entities.TV
|
|
|
|
progress.Report(percent * 100);
|
|
|
|
progress.Report(percent * 100);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Refresh all non-songs
|
|
|
|
// Refresh episodes and other children
|
|
|
|
foreach (var item in otherItems)
|
|
|
|
foreach (var item in otherItems)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
cancellationToken.ThrowIfCancellationRequested();
|
|
|
|
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++;
|
|
|
|
numComplete++;
|
|
|
|
double percent = 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)
|
|
|
|
public IEnumerable<Episode> GetEpisodes(User user, int seasonNumber, bool includeMissingEpisodes, bool includeVirtualUnairedEpisodes)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return GetEpisodes(user, seasonNumber, includeMissingEpisodes, includeVirtualUnairedEpisodes,
|
|
|
|
var seriesIds = LibraryManager.GetItemIds(new InternalItemsQuery(user)
|
|
|
|
new List<Episode>());
|
|
|
|
{
|
|
|
|
}
|
|
|
|
PresentationUniqueKey = PresentationUniqueKey,
|
|
|
|
|
|
|
|
IncludeItemTypes = new[] { typeof(Series).Name }
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
internal IEnumerable<Episode> GetEpisodes(User user, int seasonNumber, bool includeMissingEpisodes, bool includeVirtualUnairedEpisodes, IEnumerable<Episode> additionalEpisodes)
|
|
|
|
IEnumerable<Episode> episodes;
|
|
|
|
{
|
|
|
|
|
|
|
|
var episodes = GetRecursiveChildren(user, i => i is Episode)
|
|
|
|
|
|
|
|
.Cast<Episode>();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
if (!includeMissingEpisodes)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -336,7 +391,7 @@ namespace MediaBrowser.Controller.Entities.TV
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (!includeSpecials || seasonNumber < 1)
|
|
|
|
if (!includeSpecials || seasonNumber < 1)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return episodes.Where(i => (i.PhysicalSeasonNumber ?? -1) == seasonNumber);
|
|
|
|
return episodes.Where(i => (i.ParentIndexNumber ?? -1) == seasonNumber);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return episodes.Where(i =>
|
|
|
|
return episodes.Where(i =>
|
|
|
|