From d1cc56f78c325142d9d2565e436e26efcec24aa5 Mon Sep 17 00:00:00 2001 From: GinoGinocchio Date: Mon, 10 Jul 2023 00:28:06 -0500 Subject: [PATCH 1/9] Fix: "Feature 'replace missing metadata' overwrites existing metadata that does exist" for music --- .../MediaInfo/AudioFileProber.cs | 46 ++++++++++++++----- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs b/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs index d817042274..f8e8bdcb13 100644 --- a/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs +++ b/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs @@ -259,14 +259,19 @@ namespace MediaBrowser.Providers.MediaInfo } _libraryManager.UpdatePeople(audio, people); - audio.Artists = performers; - audio.AlbumArtists = albumArtists; + // audio.Artists = performers; + audio.Artists = audio.Artists != null ? audio.Artists : performers; + // audio.AlbumArtists = albumArtists; + audio.AlbumArtists = audio.AlbumArtists != null ? audio.AlbumArtists : albumArtists; } - audio.Name = tags.Title; - audio.Album = tags.Album; - audio.IndexNumber = Convert.ToInt32(tags.Track); - audio.ParentIndexNumber = Convert.ToInt32(tags.Disc); + audio.Name = string.IsNullOrEmpty(audio.Name.ToString()) ? tags.Title : audio.Name; + // audio.Album = tags.Album; + audio.Album = audio.Album != null ? audio.Album : tags.Album; + // audio.IndexNumber = Convert.ToInt32(tags.Track); + audio.IndexNumber = audio.IndexNumber != null ? audio.IndexNumber : Convert.ToInt32(tags.Track); + // audio.ParentIndexNumber = Convert.ToInt32(tags.Disc); + audio.ParentIndexNumber = audio.ParentIndexNumber != null ? audio.ParentIndexNumber : Convert.ToInt32(tags.Disc); if (tags.Year != 0) { @@ -280,11 +285,30 @@ namespace MediaBrowser.Providers.MediaInfo audio.Genres = tags.Genres.Distinct(StringComparer.OrdinalIgnoreCase).ToArray(); } - audio.SetProviderId(MetadataProvider.MusicBrainzArtist, tags.MusicBrainzArtistId); - audio.SetProviderId(MetadataProvider.MusicBrainzAlbumArtist, tags.MusicBrainzReleaseArtistId); - audio.SetProviderId(MetadataProvider.MusicBrainzAlbum, tags.MusicBrainzReleaseId); - audio.SetProviderId(MetadataProvider.MusicBrainzReleaseGroup, tags.MusicBrainzReleaseGroupId); - audio.SetProviderId(MetadataProvider.MusicBrainzTrack, tags.MusicBrainzTrackId); + if (!audio.ProviderIds.TryGetValue("MusicBrainzArtist", out var artistValue) || artistValue == null) + { + audio.SetProviderId(MetadataProvider.MusicBrainzArtist, tags.MusicBrainzArtistId); + } + + if (!audio.ProviderIds.TryGetValue("MusicBrainzAlbumArtist", out var albumArtistValue) || albumArtistValue == null) + { + audio.SetProviderId(MetadataProvider.MusicBrainzAlbumArtist, tags.MusicBrainzReleaseArtistId); + } + + if (!audio.ProviderIds.TryGetValue("MusicBrainzAlbum", out var albumValue) || albumValue == null) + { + audio.SetProviderId(MetadataProvider.MusicBrainzAlbum, tags.MusicBrainzReleaseId); + } + + if (!audio.ProviderIds.TryGetValue("MusicBrainzReleaseGroup", out var releaseGroupValue) || releaseGroupValue == null) + { + audio.SetProviderId(MetadataProvider.MusicBrainzReleaseGroup, tags.MusicBrainzReleaseGroupId); + } + + if (!audio.ProviderIds.TryGetValue("MusicBrainzTrack", out var trackValue) || trackValue == null) + { + audio.SetProviderId(MetadataProvider.MusicBrainzTrack, tags.MusicBrainzTrackId); + } } } } From 01bbc7d117217c1d08ca86a475f793415701187a Mon Sep 17 00:00:00 2001 From: GinoGinocchio Date: Mon, 10 Jul 2023 00:40:48 -0500 Subject: [PATCH 2/9] Correcting according to the comments provided --- MediaBrowser.Providers/MediaInfo/AudioFileProber.cs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs b/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs index f8e8bdcb13..22dd2d7327 100644 --- a/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs +++ b/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs @@ -259,18 +259,13 @@ namespace MediaBrowser.Providers.MediaInfo } _libraryManager.UpdatePeople(audio, people); - // audio.Artists = performers; audio.Artists = audio.Artists != null ? audio.Artists : performers; - // audio.AlbumArtists = albumArtists; audio.AlbumArtists = audio.AlbumArtists != null ? audio.AlbumArtists : albumArtists; } - audio.Name = string.IsNullOrEmpty(audio.Name.ToString()) ? tags.Title : audio.Name; - // audio.Album = tags.Album; + audio.Name = string.IsNullOrEmpty(audio.Name) ? tags.Title : audio.Name; audio.Album = audio.Album != null ? audio.Album : tags.Album; - // audio.IndexNumber = Convert.ToInt32(tags.Track); audio.IndexNumber = audio.IndexNumber != null ? audio.IndexNumber : Convert.ToInt32(tags.Track); - // audio.ParentIndexNumber = Convert.ToInt32(tags.Disc); audio.ParentIndexNumber = audio.ParentIndexNumber != null ? audio.ParentIndexNumber : Convert.ToInt32(tags.Disc); if (tags.Year != 0) From eb41cd51ea25a9838b8809db6fce3c977976c044 Mon Sep 17 00:00:00 2001 From: GinoGinocchio Date: Mon, 10 Jul 2023 00:52:02 -0500 Subject: [PATCH 3/9] Using TryGetProviderId and adding an empty validation --- MediaBrowser.Providers/MediaInfo/AudioFileProber.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs b/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs index 22dd2d7327..defa7994a4 100644 --- a/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs +++ b/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs @@ -280,27 +280,27 @@ namespace MediaBrowser.Providers.MediaInfo audio.Genres = tags.Genres.Distinct(StringComparer.OrdinalIgnoreCase).ToArray(); } - if (!audio.ProviderIds.TryGetValue("MusicBrainzArtist", out var artistValue) || artistValue == null) + if (!audio.TryGetProviderId("MusicBrainzArtist", out var artistValue) || string.IsNullOrEmpty(artistValue)) { audio.SetProviderId(MetadataProvider.MusicBrainzArtist, tags.MusicBrainzArtistId); } - if (!audio.ProviderIds.TryGetValue("MusicBrainzAlbumArtist", out var albumArtistValue) || albumArtistValue == null) + if (!audio.TryGetProviderId("MusicBrainzAlbumArtist", out var albumArtistValue) || string.IsNullOrEmpty(albumArtistValue)) { audio.SetProviderId(MetadataProvider.MusicBrainzAlbumArtist, tags.MusicBrainzReleaseArtistId); } - if (!audio.ProviderIds.TryGetValue("MusicBrainzAlbum", out var albumValue) || albumValue == null) + if (!audio.TryGetProviderId("MusicBrainzAlbum", out var albumValue) || string.IsNullOrEmpty(albumValue)) { audio.SetProviderId(MetadataProvider.MusicBrainzAlbum, tags.MusicBrainzReleaseId); } - if (!audio.ProviderIds.TryGetValue("MusicBrainzReleaseGroup", out var releaseGroupValue) || releaseGroupValue == null) + if (!audio.TryGetProviderId("MusicBrainzReleaseGroup", out var releaseGroupValue) || string.IsNullOrEmpty(releaseGroupValue)) { audio.SetProviderId(MetadataProvider.MusicBrainzReleaseGroup, tags.MusicBrainzReleaseGroupId); } - if (!audio.ProviderIds.TryGetValue("MusicBrainzTrack", out var trackValue) || trackValue == null) + if (!audio.TryGetProviderId("MusicBrainzTrack", out var trackValue) || string.IsNullOrEmpty(trackValue)) { audio.SetProviderId(MetadataProvider.MusicBrainzTrack, tags.MusicBrainzTrackId); } From 81d642abe33e9839c946bcccdeebf0ca8f8bd81f Mon Sep 17 00:00:00 2001 From: GinoGinocchio Date: Mon, 10 Jul 2023 00:58:47 -0500 Subject: [PATCH 4/9] Removing unnecesary empty and null validations --- MediaBrowser.Providers/MediaInfo/AudioFileProber.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs b/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs index defa7994a4..dd3cecc52d 100644 --- a/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs +++ b/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs @@ -280,27 +280,27 @@ namespace MediaBrowser.Providers.MediaInfo audio.Genres = tags.Genres.Distinct(StringComparer.OrdinalIgnoreCase).ToArray(); } - if (!audio.TryGetProviderId("MusicBrainzArtist", out var artistValue) || string.IsNullOrEmpty(artistValue)) + if (!audio.TryGetProviderId("MusicBrainzArtist", out _)) { audio.SetProviderId(MetadataProvider.MusicBrainzArtist, tags.MusicBrainzArtistId); } - if (!audio.TryGetProviderId("MusicBrainzAlbumArtist", out var albumArtistValue) || string.IsNullOrEmpty(albumArtistValue)) + if (!audio.TryGetProviderId("MusicBrainzAlbumArtist", out _)) { audio.SetProviderId(MetadataProvider.MusicBrainzAlbumArtist, tags.MusicBrainzReleaseArtistId); } - if (!audio.TryGetProviderId("MusicBrainzAlbum", out var albumValue) || string.IsNullOrEmpty(albumValue)) + if (!audio.TryGetProviderId("MusicBrainzAlbum", out _)) { audio.SetProviderId(MetadataProvider.MusicBrainzAlbum, tags.MusicBrainzReleaseId); } - if (!audio.TryGetProviderId("MusicBrainzReleaseGroup", out var releaseGroupValue) || string.IsNullOrEmpty(releaseGroupValue)) + if (!audio.TryGetProviderId("MusicBrainzReleaseGroup", out _)) { audio.SetProviderId(MetadataProvider.MusicBrainzReleaseGroup, tags.MusicBrainzReleaseGroupId); } - if (!audio.TryGetProviderId("MusicBrainzTrack", out var trackValue) || string.IsNullOrEmpty(trackValue)) + if (!audio.TryGetProviderId("MusicBrainzTrack", out _)) { audio.SetProviderId(MetadataProvider.MusicBrainzTrack, tags.MusicBrainzTrackId); } From de91a213a109b4d77e6b2e1c917ae60728139cd7 Mon Sep 17 00:00:00 2001 From: GinoGinocchio <49346360+GinoGinocchio@users.noreply.github.com> Date: Mon, 10 Jul 2023 17:07:22 -0500 Subject: [PATCH 5/9] Update MediaBrowser.Providers/MediaInfo/AudioFileProber.cs Co-authored-by: Cody Robibero --- MediaBrowser.Providers/MediaInfo/AudioFileProber.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs b/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs index dd3cecc52d..986852f5ad 100644 --- a/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs +++ b/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs @@ -259,8 +259,8 @@ namespace MediaBrowser.Providers.MediaInfo } _libraryManager.UpdatePeople(audio, people); - audio.Artists = audio.Artists != null ? audio.Artists : performers; - audio.AlbumArtists = audio.AlbumArtists != null ? audio.AlbumArtists : albumArtists; + audio.Artists ??= performers; + audio.AlbumArtists ??= albumArtists; } audio.Name = string.IsNullOrEmpty(audio.Name) ? tags.Title : audio.Name; From ddcd29f17e19207c1dd4fb2e552415f5f5562645 Mon Sep 17 00:00:00 2001 From: GinoGinocchio <49346360+GinoGinocchio@users.noreply.github.com> Date: Mon, 10 Jul 2023 17:07:30 -0500 Subject: [PATCH 6/9] Update MediaBrowser.Providers/MediaInfo/AudioFileProber.cs Co-authored-by: Cody Robibero --- MediaBrowser.Providers/MediaInfo/AudioFileProber.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs b/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs index 986852f5ad..914f8ca07a 100644 --- a/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs +++ b/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs @@ -264,9 +264,9 @@ namespace MediaBrowser.Providers.MediaInfo } audio.Name = string.IsNullOrEmpty(audio.Name) ? tags.Title : audio.Name; - audio.Album = audio.Album != null ? audio.Album : tags.Album; - audio.IndexNumber = audio.IndexNumber != null ? audio.IndexNumber : Convert.ToInt32(tags.Track); - audio.ParentIndexNumber = audio.ParentIndexNumber != null ? audio.ParentIndexNumber : Convert.ToInt32(tags.Disc); + audio.Album ??= tags.Album; + audio.IndexNumber ??= Convert.ToInt32(tags.Track); + audio.ParentIndexNumber ??= Convert.ToInt32(tags.Disc); if (tags.Year != 0) { From 7f1fec688cc1a6f7f69fa5b059af01cf9c456d3f Mon Sep 17 00:00:00 2001 From: Brian Howe Date: Wed, 6 Dec 2023 23:55:36 -0600 Subject: [PATCH 7/9] check ReplaceAllMetadata option and name field lock --- .../MediaInfo/AudioFileProber.cs | 45 +++++++++++++------ 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs b/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs index 914f8ca07a..5d41542e2c 100644 --- a/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs +++ b/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs @@ -100,7 +100,7 @@ namespace MediaBrowser.Providers.MediaInfo cancellationToken.ThrowIfCancellationRequested(); - Fetch(item, result, cancellationToken); + Fetch(item, result, options, cancellationToken); } var libraryOptions = _libraryManager.GetLibraryOptions(item); @@ -159,8 +159,9 @@ namespace MediaBrowser.Providers.MediaInfo /// /// The . /// The . + /// The . /// The . - protected void Fetch(Audio audio, Model.MediaInfo.MediaInfo mediaInfo, CancellationToken cancellationToken) + protected void Fetch(Audio audio, Model.MediaInfo.MediaInfo mediaInfo, MetadataRefreshOptions options, CancellationToken cancellationToken) { audio.Container = mediaInfo.Container; audio.TotalBitrate = mediaInfo.Bitrate; @@ -170,7 +171,7 @@ namespace MediaBrowser.Providers.MediaInfo if (!audio.IsLocked) { - FetchDataFromTags(audio); + FetchDataFromTags(audio, options); } _itemRepo.SaveMediaStreams(audio.Id, mediaInfo.MediaStreams, cancellationToken); @@ -180,7 +181,8 @@ namespace MediaBrowser.Providers.MediaInfo /// Fetches data from the tags. /// /// The . - private void FetchDataFromTags(Audio audio) + /// The . + private void FetchDataFromTags(Audio audio, MetadataRefreshOptions options) { var file = TagLib.File.Create(audio.Path); var tagTypes = file.TagTypesOnDisk; @@ -263,10 +265,23 @@ namespace MediaBrowser.Providers.MediaInfo audio.AlbumArtists ??= albumArtists; } - audio.Name = string.IsNullOrEmpty(audio.Name) ? tags.Title : audio.Name; - audio.Album ??= tags.Album; - audio.IndexNumber ??= Convert.ToInt32(tags.Track); - audio.ParentIndexNumber ??= Convert.ToInt32(tags.Disc); + if (!audio.LockedFields.Contains(MetadataField.Name)) + { + audio.Name = options.ReplaceAllMetadata || string.IsNullOrEmpty(audio.Name) ? tags.Title : audio.Name; + } + + if (options.ReplaceAllMetadata) + { + audio.Album = tags.Album; + audio.IndexNumber = Convert.ToInt32(tags.Track); + audio.ParentIndexNumber = Convert.ToInt32(tags.Disc); + } + else + { + audio.Album ??= tags.Album; + audio.IndexNumber ??= Convert.ToInt32(tags.Track); + audio.ParentIndexNumber ??= Convert.ToInt32(tags.Disc); + } if (tags.Year != 0) { @@ -277,30 +292,32 @@ namespace MediaBrowser.Providers.MediaInfo if (!audio.LockedFields.Contains(MetadataField.Genres)) { - audio.Genres = tags.Genres.Distinct(StringComparer.OrdinalIgnoreCase).ToArray(); + audio.Genres = options.ReplaceAllMetadata || audio.Genres == null || audio.Genres.Length == 0 + ? tags.Genres.Distinct(StringComparer.OrdinalIgnoreCase).ToArray() + : audio.Genres; } - if (!audio.TryGetProviderId("MusicBrainzArtist", out _)) + if (options.ReplaceAllMetadata || !audio.TryGetProviderId("MusicBrainzArtist", out _)) { audio.SetProviderId(MetadataProvider.MusicBrainzArtist, tags.MusicBrainzArtistId); } - if (!audio.TryGetProviderId("MusicBrainzAlbumArtist", out _)) + if (options.ReplaceAllMetadata || !audio.TryGetProviderId("MusicBrainzAlbumArtist", out _)) { audio.SetProviderId(MetadataProvider.MusicBrainzAlbumArtist, tags.MusicBrainzReleaseArtistId); } - if (!audio.TryGetProviderId("MusicBrainzAlbum", out _)) + if (options.ReplaceAllMetadata || !audio.TryGetProviderId("MusicBrainzAlbum", out _)) { audio.SetProviderId(MetadataProvider.MusicBrainzAlbum, tags.MusicBrainzReleaseId); } - if (!audio.TryGetProviderId("MusicBrainzReleaseGroup", out _)) + if (options.ReplaceAllMetadata || !audio.TryGetProviderId("MusicBrainzReleaseGroup", out _)) { audio.SetProviderId(MetadataProvider.MusicBrainzReleaseGroup, tags.MusicBrainzReleaseGroupId); } - if (!audio.TryGetProviderId("MusicBrainzTrack", out _)) + if (options.ReplaceAllMetadata || !audio.TryGetProviderId("MusicBrainzTrack", out _)) { audio.SetProviderId(MetadataProvider.MusicBrainzTrack, tags.MusicBrainzTrackId); } From ddf8f7d636c49d24f35d24d4b73889bd57fca689 Mon Sep 17 00:00:00 2001 From: Cody Robibero Date: Wed, 28 Feb 2024 17:12:05 -0700 Subject: [PATCH 8/9] Update AudioFileProber.cs --- MediaBrowser.Providers/MediaInfo/AudioFileProber.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs b/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs index e929fd081f..f200e15d01 100644 --- a/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs +++ b/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs @@ -356,27 +356,27 @@ namespace MediaBrowser.Providers.MediaInfo : audio.Genres; } - if (options.ReplaceAllMetadata || !audio.TryGetProviderId("MusicBrainzArtist", out _)) + if (options.ReplaceAllMetadata || !audio.TryGetProviderId(MetadataProvider.MusicBrainzArtist, out _)) { audio.SetProviderId(MetadataProvider.MusicBrainzArtist, tags.MusicBrainzArtistId); } - if (options.ReplaceAllMetadata || !audio.TryGetProviderId("MusicBrainzAlbumArtist", out _)) + if (options.ReplaceAllMetadata || !audio.TryGetProviderId(MetadataProvider.MusicBrainzAlbumArtist, out _)) { audio.SetProviderId(MetadataProvider.MusicBrainzAlbumArtist, tags.MusicBrainzReleaseArtistId); } - if (options.ReplaceAllMetadata || !audio.TryGetProviderId("MusicBrainzAlbum", out _)) + if (options.ReplaceAllMetadata || !audio.TryGetProviderId(MetadataProvider.MusicBrainzAlbum, out _)) { audio.SetProviderId(MetadataProvider.MusicBrainzAlbum, tags.MusicBrainzReleaseId); } - if (options.ReplaceAllMetadata || !audio.TryGetProviderId("MusicBrainzReleaseGroup", out _)) + if (options.ReplaceAllMetadata || !audio.TryGetProviderId(MetadataProvider.MusicBrainzReleaseGroup, out _)) { audio.SetProviderId(MetadataProvider.MusicBrainzReleaseGroup, tags.MusicBrainzReleaseGroupId); } - if (options.ReplaceAllMetadata || !audio.TryGetProviderId("MusicBrainzTrack", out _)) + if (options.ReplaceAllMetadata || !audio.TryGetProviderId(MetadataProvider.MusicBrainzTrack, out _)) { audio.SetProviderId(MetadataProvider.MusicBrainzTrack, tags.MusicBrainzTrackId); } From 5a652360c316173e8e03bb36cd58aeb50edbbc45 Mon Sep 17 00:00:00 2001 From: Cody Robibero Date: Wed, 28 Feb 2024 17:18:52 -0700 Subject: [PATCH 9/9] Update AudioFileProber.cs --- .../MediaInfo/AudioFileProber.cs | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs b/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs index f200e15d01..64acca1e3b 100644 --- a/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs +++ b/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs @@ -320,8 +320,26 @@ namespace MediaBrowser.Providers.MediaInfo } _libraryManager.UpdatePeople(audio, people); - audio.Artists ??= performers; - audio.AlbumArtists ??= albumArtists; + + if (options.ReplaceAllMetadata && performers.Length != 0) + { + audio.Artists = performers; + } + else if (!options.ReplaceAllMetadata + && (audio.Artists is null || audio.Artists.Count == 0)) + { + audio.Artists = performers; + } + + if (options.ReplaceAllMetadata && albumArtists.Length != 0) + { + audio.AlbumArtists = albumArtists; + } + else if (!options.ReplaceAllMetadata + && (audio.AlbumArtists is null || audio.AlbumArtists.Count == 0)) + { + audio.AlbumArtists = albumArtists; + } } if (!audio.LockedFields.Contains(MetadataField.Name))