aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Providers
diff options
context:
space:
mode:
authorJPVenson <github@jpb.email>2025-02-05 18:32:13 +0000
committerJPVenson <github@jpb.email>2025-02-05 18:32:13 +0000
commitdfdef511a5b855ee4e4f079236ff43cb508958d5 (patch)
treedb2c5d8cfe13817b165c1d24495947d98c25f670 /MediaBrowser.Providers
parent078587d232ccbfdf6e08c6f1a6435e4e397e4bdc (diff)
parent00b66a06eac4d1331d59a6a9b7de3e99088ebaa9 (diff)
Merge remote-tracking branch 'jellyfinorigin/master' into feature/pgsql_provider
Diffstat (limited to 'MediaBrowser.Providers')
-rw-r--r--MediaBrowser.Providers/Manager/ImageSaver.cs1
-rw-r--r--MediaBrowser.Providers/MediaInfo/AudioFileProber.cs6
-rw-r--r--MediaBrowser.Providers/TV/SeriesMetadataService.cs45
3 files changed, 27 insertions, 25 deletions
diff --git a/MediaBrowser.Providers/Manager/ImageSaver.cs b/MediaBrowser.Providers/Manager/ImageSaver.cs
index 9a676cb2e..8f6aa2db3 100644
--- a/MediaBrowser.Providers/Manager/ImageSaver.cs
+++ b/MediaBrowser.Providers/Manager/ImageSaver.cs
@@ -291,6 +291,7 @@ namespace MediaBrowser.Providers.Manager
var fileStreamOptions = AsyncFile.WriteOptions;
fileStreamOptions.Mode = FileMode.Create;
+ fileStreamOptions.Options = FileOptions.WriteThrough;
if (source.CanSeek)
{
fileStreamOptions.PreallocationSize = source.Length;
diff --git a/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs b/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs
index b4e3a860e..05d43acdc 100644
--- a/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs
+++ b/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs
@@ -183,7 +183,7 @@ namespace MediaBrowser.Providers.MediaInfo
if (audio.SupportsPeople && !audio.LockedFields.Contains(MetadataField.Cast))
{
var people = new List<PersonInfo>();
- var albumArtists = string.IsNullOrEmpty(track.AlbumArtist) ? mediaInfo.AlbumArtists : track.AlbumArtist.Split(InternalValueSeparator);
+ var albumArtists = string.IsNullOrEmpty(track.AlbumArtist) ? [] : track.AlbumArtist.Split(InternalValueSeparator);
if (libraryOptions.UseCustomTagDelimiters)
{
@@ -214,7 +214,7 @@ namespace MediaBrowser.Providers.MediaInfo
if (performers is null || performers.Length == 0)
{
- performers = string.IsNullOrEmpty(track.Artist) ? mediaInfo.Artists : track.Artist.Split(InternalValueSeparator);
+ performers = string.IsNullOrEmpty(track.Artist) ? [] : track.Artist.Split(InternalValueSeparator);
}
if (libraryOptions.UseCustomTagDelimiters)
@@ -318,7 +318,7 @@ namespace MediaBrowser.Providers.MediaInfo
if (!audio.LockedFields.Contains(MetadataField.Genres))
{
- var genres = string.IsNullOrEmpty(track.Genre) ? mediaInfo.Genres : track.Genre.Split(InternalValueSeparator).Distinct(StringComparer.OrdinalIgnoreCase).ToArray();
+ var genres = string.IsNullOrEmpty(track.Genre) ? [] : track.Genre.Split(InternalValueSeparator).Distinct(StringComparer.OrdinalIgnoreCase).ToArray();
if (libraryOptions.UseCustomTagDelimiters)
{
diff --git a/MediaBrowser.Providers/TV/SeriesMetadataService.cs b/MediaBrowser.Providers/TV/SeriesMetadataService.cs
index f4aede463..284415dce 100644
--- a/MediaBrowser.Providers/TV/SeriesMetadataService.cs
+++ b/MediaBrowser.Providers/TV/SeriesMetadataService.cs
@@ -140,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);
}
}
}