Fix season handling

This commit is contained in:
Shadowghost 2024-06-09 18:47:21 +02:00
parent b25d6d1e48
commit e4078f984a
4 changed files with 41 additions and 20 deletions

View File

@ -194,7 +194,7 @@ namespace MediaBrowser.Controller.Entities
/// </summary> /// </summary>
/// <param name="item">The item.</param> /// <param name="item">The item.</param>
/// <exception cref="InvalidOperationException">Unable to add + item.Name.</exception> /// <exception cref="InvalidOperationException">Unable to add + item.Name.</exception>
public void AddChild(BaseItem item) public virtual void AddChild(BaseItem item)
{ {
item.SetParent(this); item.SetParent(this);

View File

@ -265,5 +265,20 @@ namespace MediaBrowser.Controller.Entities.TV
return hasChanges; return hasChanges;
} }
/// <inheritdoc />
public override void AddChild(BaseItem item)
{
if (item is Episode episode)
{
episode.SeriesPresentationUniqueKey = SeriesPresentationUniqueKey;
episode.SeriesId = SeriesId;
episode.SeriesName = SeriesName;
episode.SeasonId = Id;
episode.SeasonName = Name;
}
base.AddChild(item);
}
} }
} }

View File

@ -350,17 +350,10 @@ namespace MediaBrowser.Controller.Entities.TV
public List<BaseItem> GetSeasonEpisodes(Season parentSeason, User user, DtoOptions options, bool shouldIncludeMissingEpisodes) public List<BaseItem> GetSeasonEpisodes(Season parentSeason, User user, DtoOptions options, bool shouldIncludeMissingEpisodes)
{ {
var queryFromSeries = ConfigurationManager.Configuration.DisplaySpecialsWithinSeasons;
// add optimization when this setting is not enabled
var seriesKey = queryFromSeries ?
GetUniqueSeriesKey(this) :
GetUniqueSeriesKey(parentSeason);
var query = new InternalItemsQuery(user) var query = new InternalItemsQuery(user)
{ {
AncestorWithPresentationUniqueKey = queryFromSeries ? null : seriesKey, AncestorWithPresentationUniqueKey = null,
SeriesPresentationUniqueKey = queryFromSeries ? seriesKey : null, SeriesPresentationUniqueKey = GetUniqueSeriesKey(this),
IncludeItemTypes = new[] { BaseItemKind.Episode }, IncludeItemTypes = new[] { BaseItemKind.Episode },
OrderBy = new[] { (ItemSortBy.SortName, SortOrder.Ascending) }, OrderBy = new[] { (ItemSortBy.SortName, SortOrder.Ascending) },
DtoOptions = options DtoOptions = options
@ -506,5 +499,18 @@ namespace MediaBrowser.Controller.Entities.TV
return list; return list;
} }
/// <inheritdoc />
public override void AddChild(BaseItem item)
{
if (item is IHasSeries typedItem)
{
typedItem.SeriesId = Id;
typedItem.SeriesName = Name;
typedItem.SeriesPresentationUniqueKey = PresentationUniqueKey;
}
base.AddChild(item);
}
} }
} }

View File

@ -91,7 +91,7 @@ namespace MediaBrowser.Providers.TV
private void RemoveObsoleteSeasons(Series series) private void RemoveObsoleteSeasons(Series series)
{ {
// TODO Legacy. It's not really "physical" seasons as any virtual seasons are always converted to non-virtual in UpdateAndCreateSeasonsAsync. // TODO Legacy. It's not really "physical" seasons as any virtual seasons are always converted to non-virtual in CreateSeasonsAsync.
var physicalSeasonNumbers = new HashSet<int>(); var physicalSeasonNumbers = new HashSet<int>();
var virtualSeasons = new List<Season>(); var virtualSeasons = new List<Season>();
foreach (var existingSeason in series.Children.OfType<Season>()) foreach (var existingSeason in series.Children.OfType<Season>())
@ -203,11 +203,16 @@ namespace MediaBrowser.Providers.TV
foreach (var seasonNumber in uniqueSeasonNumbers) foreach (var seasonNumber in uniqueSeasonNumbers)
{ {
// Null season numbers will have a 'dummy' season created because seasons are always required. // Null season numbers will have a 'dummy' season created because seasons are always required.
if (!seasons.Any(i => i.IndexNumber == seasonNumber)) var existingSeason = seasons.FirstOrDefault(i => i.IndexNumber == seasonNumber);
if (existingSeason is null)
{ {
var seasonName = GetValidSeasonNameForSeries(series, null, seasonNumber); var seasonName = GetValidSeasonNameForSeries(series, null, seasonNumber);
var season = await CreateSeasonAsync(series, seasonName, seasonNumber, cancellationToken).ConfigureAwait(false); await CreateSeasonAsync(series, seasonName, seasonNumber, cancellationToken).ConfigureAwait(false);
series.AddChild(season); }
else if (existingSeason.IsVirtualItem)
{
existingSeason.IsVirtualItem = false;
await existingSeason.UpdateToRepositoryAsync(ItemUpdateType.MetadataEdit, cancellationToken).ConfigureAwait(false);
} }
} }
} }
@ -220,7 +225,7 @@ namespace MediaBrowser.Providers.TV
/// <param name="seasonNumber">The season number.</param> /// <param name="seasonNumber">The season number.</param>
/// <param name="cancellationToken">The cancellation token.</param> /// <param name="cancellationToken">The cancellation token.</param>
/// <returns>The newly created season.</returns> /// <returns>The newly created season.</returns>
private async Task<Season> CreateSeasonAsync( private async Task CreateSeasonAsync(
Series series, Series series,
string? seasonName, string? seasonName,
int? seasonNumber, int? seasonNumber,
@ -236,15 +241,10 @@ namespace MediaBrowser.Providers.TV
series.Id + (seasonNumber ?? -1).ToString(CultureInfo.InvariantCulture) + seasonName, series.Id + (seasonNumber ?? -1).ToString(CultureInfo.InvariantCulture) + seasonName,
typeof(Season)), typeof(Season)),
IsVirtualItem = false, IsVirtualItem = false,
SeriesId = series.Id,
SeriesName = series.Name
}; };
series.AddChild(season); series.AddChild(season);
await season.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(FileSystem)), cancellationToken).ConfigureAwait(false); await season.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(FileSystem)), cancellationToken).ConfigureAwait(false);
return season;
} }
private string GetValidSeasonNameForSeries(Series series, string? seasonName, int? seasonNumber) private string GetValidSeasonNameForSeries(Series series, string? seasonName, int? seasonNumber)