aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Providers/TV
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Providers/TV')
-rw-r--r--MediaBrowser.Providers/TV/EpisodeMetadataService.cs18
-rw-r--r--MediaBrowser.Providers/TV/SeasonMetadataService.cs19
-rw-r--r--MediaBrowser.Providers/TV/SeriesMetadataService.cs60
3 files changed, 66 insertions, 31 deletions
diff --git a/MediaBrowser.Providers/TV/EpisodeMetadataService.cs b/MediaBrowser.Providers/TV/EpisodeMetadataService.cs
index d8855ec935..9b4793ee6c 100644
--- a/MediaBrowser.Providers/TV/EpisodeMetadataService.cs
+++ b/MediaBrowser.Providers/TV/EpisodeMetadataService.cs
@@ -1,5 +1,3 @@
-#pragma warning disable CS1591
-
using System;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities.TV;
@@ -12,8 +10,19 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.Providers.TV
{
+ /// <summary>
+ /// Service to manage episode metadata.
+ /// </summary>
public class EpisodeMetadataService : MetadataService<Episode, EpisodeInfo>
{
+ /// <summary>
+ /// Initializes a new instance of the <see cref="EpisodeMetadataService"/> class.
+ /// </summary>
+ /// <param name="serverConfigurationManager">Instance of the <see cref="IServerConfigurationManager"/> interface.</param>
+ /// <param name="logger">Instance of the <see cref="ILogger{SeasonMetadataService}"/> interface.</param>
+ /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
+ /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
+ /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
public EpisodeMetadataService(
IServerConfigurationManager serverConfigurationManager,
ILogger<EpisodeMetadataService> logger,
@@ -94,6 +103,11 @@ namespace MediaBrowser.Providers.TV
{
targetItem.IndexNumberEnd = sourceItem.IndexNumberEnd;
}
+
+ if (replaceData || !targetItem.ParentIndexNumber.HasValue)
+ {
+ targetItem.ParentIndexNumber = sourceItem.ParentIndexNumber;
+ }
}
}
}
diff --git a/MediaBrowser.Providers/TV/SeasonMetadataService.cs b/MediaBrowser.Providers/TV/SeasonMetadataService.cs
index 54dcee41ec..b27ccaa6a3 100644
--- a/MediaBrowser.Providers/TV/SeasonMetadataService.cs
+++ b/MediaBrowser.Providers/TV/SeasonMetadataService.cs
@@ -1,5 +1,3 @@
-#pragma warning disable CS1591
-
using System;
using System.Collections.Generic;
using System.Linq;
@@ -15,8 +13,19 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.Providers.TV
{
+ /// <summary>
+ /// Service to manage season metadata.
+ /// </summary>
public class SeasonMetadataService : MetadataService<Season, SeasonInfo>
{
+ /// <summary>
+ /// Initializes a new instance of the <see cref="SeasonMetadataService"/> class.
+ /// </summary>
+ /// <param name="serverConfigurationManager">Instance of the <see cref="IServerConfigurationManager"/> interface.</param>
+ /// <param name="logger">Instance of the <see cref="ILogger{SeasonMetadataService}"/> interface.</param>
+ /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
+ /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
+ /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
public SeasonMetadataService(
IServerConfigurationManager serverConfigurationManager,
ILogger<SeasonMetadataService> logger,
@@ -71,11 +80,11 @@ namespace MediaBrowser.Providers.TV
}
/// <inheritdoc />
- protected override IList<BaseItem> GetChildrenForMetadataUpdates(Season item)
+ protected override IReadOnlyList<BaseItem> GetChildrenForMetadataUpdates(Season item)
=> item.GetEpisodes();
/// <inheritdoc />
- protected override ItemUpdateType UpdateMetadataFromChildren(Season item, IList<BaseItem> children, bool isFullRefresh, ItemUpdateType currentUpdateType)
+ protected override ItemUpdateType UpdateMetadataFromChildren(Season item, IReadOnlyList<BaseItem> children, bool isFullRefresh, ItemUpdateType currentUpdateType)
{
var updateType = base.UpdateMetadataFromChildren(item, children, isFullRefresh, currentUpdateType);
@@ -87,7 +96,7 @@ namespace MediaBrowser.Providers.TV
return updateType;
}
- private ItemUpdateType SaveIsVirtualItem(Season item, IList<BaseItem> episodes)
+ private ItemUpdateType SaveIsVirtualItem(Season item, IReadOnlyList<BaseItem> episodes)
{
var isVirtualItem = item.LocationType == LocationType.Virtual && (episodes.Count == 0 || episodes.All(i => i.LocationType == LocationType.Virtual));
diff --git a/MediaBrowser.Providers/TV/SeriesMetadataService.cs b/MediaBrowser.Providers/TV/SeriesMetadataService.cs
index 80c56351c1..284415dce6 100644
--- a/MediaBrowser.Providers/TV/SeriesMetadataService.cs
+++ b/MediaBrowser.Providers/TV/SeriesMetadataService.cs
@@ -1,5 +1,3 @@
-#pragma warning disable CS1591
-
using System;
using System.Collections.Generic;
using System.Globalization;
@@ -20,10 +18,22 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.Providers.TV
{
+ /// <summary>
+ /// Service to manage series metadata.
+ /// </summary>
public class SeriesMetadataService : MetadataService<Series, SeriesInfo>
{
private readonly ILocalizationManager _localizationManager;
+ /// <summary>
+ /// Initializes a new instance of the <see cref="SeriesMetadataService"/> class.
+ /// </summary>
+ /// <param name="serverConfigurationManager">Instance of the <see cref="IServerConfigurationManager"/> interface.</param>
+ /// <param name="logger">Instance of the <see cref="ILogger{SeasonMetadataService}"/> interface.</param>
+ /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
+ /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
+ /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
+ /// <param name="localizationManager">Instance of the <see cref="ILocalizationManager"/> interface.</param>
public SeriesMetadataService(
IServerConfigurationManager serverConfigurationManager,
ILogger<SeriesMetadataService> logger,
@@ -36,6 +46,7 @@ namespace MediaBrowser.Providers.TV
_localizationManager = localizationManager;
}
+ /// <inheritdoc />
public override async Task<ItemUpdateType> RefreshMetadata(BaseItem item, MetadataRefreshOptions refreshOptions, CancellationToken cancellationToken)
{
if (item is Series series)
@@ -129,38 +140,39 @@ namespace MediaBrowser.Providers.TV
private void RemoveObsoleteEpisodes(Series series)
{
- var episodes = series.GetEpisodes(null, new DtoOptions(), true).OfType<Episode>().ToList();
- var numberOfEpisodes = episodes.Count;
- // TODO: O(n^2), but can it be done faster without overcomplicating it?
- for (var i = 0; i < numberOfEpisodes; i++)
+ var episodesBySeason = series.GetEpisodes(null, new DtoOptions(), true)
+ .OfType<Episode>()
+ .GroupBy(e => e.ParentIndexNumber)
+ .ToList();
+
+ foreach (var seasonEpisodes in episodesBySeason)
{
- var currentEpisode = episodes[i];
- // The outer loop only examines virtual episodes
- if (!currentEpisode.IsVirtualItem)
+ List<Episode> nonPhysicalEpisodes = [];
+ List<Episode> physicalEpisodes = [];
+ foreach (var episode in seasonEpisodes)
{
- continue;
- }
+ if (episode.IsVirtualItem || episode.IsMissingEpisode)
+ {
+ nonPhysicalEpisodes.Add(episode);
+ continue;
+ }
- // Virtual episodes without an episode number are practically orphaned and should be deleted
- if (!currentEpisode.IndexNumber.HasValue)
- {
- DeleteEpisode(currentEpisode);
- continue;
+ physicalEpisodes.Add(episode);
}
- for (var j = i + 1; j < numberOfEpisodes; j++)
+ // Only consider non-physical episodes
+ foreach (var episode in nonPhysicalEpisodes)
{
- var comparisonEpisode = episodes[j];
- // The inner loop is only for "physical" episodes
- if (comparisonEpisode.IsVirtualItem
- || currentEpisode.ParentIndexNumber != comparisonEpisode.ParentIndexNumber
- || !comparisonEpisode.ContainsEpisodeNumber(currentEpisode.IndexNumber.Value))
+ // Episodes without an episode number are practically orphaned and should be deleted
+ // Episodes with a physical equivalent should be deleted (they are no longer missing)
+ var shouldKeep = episode.IndexNumber.HasValue && !physicalEpisodes.Any(e => e.ContainsEpisodeNumber(episode.IndexNumber.Value));
+
+ if (shouldKeep)
{
continue;
}
- DeleteEpisode(currentEpisode);
- break;
+ DeleteEpisode(episode);
}
}
}