diff options
| author | Shadowghost <Ghost_of_Stone@web.de> | 2022-03-28 23:11:21 +0200 |
|---|---|---|
| committer | Shadowghost <Ghost_of_Stone@web.de> | 2022-09-13 17:20:22 +0200 |
| commit | 61fa325ef05daac7c5105623d2de435ec94ef6a7 (patch) | |
| tree | 2e50daa08f4fea57c8e1e07bee3cae1db0d0eace /MediaBrowser.Providers/Music | |
| parent | 0246ba1fb4c3b01fa1be51a57275de7fd2654c31 (diff) | |
Extend music parsing
Diffstat (limited to 'MediaBrowser.Providers/Music')
| -rw-r--r-- | MediaBrowser.Providers/Music/AlbumMetadataService.cs | 152 | ||||
| -rw-r--r-- | MediaBrowser.Providers/Music/AudioMetadataService.cs | 40 |
2 files changed, 182 insertions, 10 deletions
diff --git a/MediaBrowser.Providers/Music/AlbumMetadataService.cs b/MediaBrowser.Providers/Music/AlbumMetadataService.cs index 7743d3b27..b8426f31c 100644 --- a/MediaBrowser.Providers/Music/AlbumMetadataService.cs +++ b/MediaBrowser.Providers/Music/AlbumMetadataService.cs @@ -61,40 +61,61 @@ namespace MediaBrowser.Providers.Music var songs = children.Cast<Audio>().ToArray(); - updateType |= SetAlbumArtistFromSongs(item, songs); updateType |= SetArtistsFromSongs(item, songs); + updateType |= SetAlbumArtistFromSongs(item, songs); + updateType |= SetAlbumFromSongs(item, songs); + updateType |= SetPeople(item); } return updateType; } - private ItemUpdateType SetAlbumArtistFromSongs(MusicAlbum item, IEnumerable<Audio> songs) + private ItemUpdateType SetAlbumArtistFromSongs(MusicAlbum item, IReadOnlyList<Audio> songs) { var updateType = ItemUpdateType.None; - var artists = songs + var albumArtists = songs .SelectMany(i => i.AlbumArtists) - .Distinct(StringComparer.OrdinalIgnoreCase) - .OrderBy(i => i) + .GroupBy(i => i) + .OrderByDescending(g => g.Count()) + .Select(g => g.Key) + .ToArray(); + + var musicbrainzAlbumArtistIds = songs + .Select(i => i.GetProviderId(MetadataProvider.MusicBrainzAlbumArtist)) + .GroupBy(i => i) + .OrderByDescending(g => g.Count()) + .Select(g => g.Key) .ToArray(); - if (!item.AlbumArtists.SequenceEqual(artists, StringComparer.OrdinalIgnoreCase)) + var musicbrainzAlbumArtistId = item.GetProviderId(MetadataProvider.MusicBrainzAlbumArtist); + var firstMusicbrainzAlbumArtistId = musicbrainzAlbumArtistIds[0]; + if (!string.IsNullOrEmpty(firstMusicbrainzAlbumArtistId) && + (string.IsNullOrEmpty(musicbrainzAlbumArtistId) + || !musicbrainzAlbumArtistId.Equals(firstMusicbrainzAlbumArtistId, StringComparison.OrdinalIgnoreCase))) + { + item.SetProviderId(MetadataProvider.MusicBrainzAlbumArtist, firstMusicbrainzAlbumArtistId); + updateType |= ItemUpdateType.MetadataEdit; + } + + if (!item.AlbumArtists.SequenceEqual(albumArtists, StringComparer.OrdinalIgnoreCase)) { - item.AlbumArtists = artists; + item.AlbumArtists = albumArtists; updateType |= ItemUpdateType.MetadataEdit; } return updateType; } - private ItemUpdateType SetArtistsFromSongs(MusicAlbum item, IEnumerable<Audio> songs) + private ItemUpdateType SetArtistsFromSongs(MusicAlbum item, IReadOnlyList<Audio> songs) { var updateType = ItemUpdateType.None; var artists = songs .SelectMany(i => i.Artists) - .Distinct(StringComparer.OrdinalIgnoreCase) - .OrderBy(i => i) + .GroupBy(i => i) + .OrderByDescending(g => g.Count()) + .Select(g => g.Key) .ToArray(); if (!item.Artists.SequenceEqual(artists, StringComparer.OrdinalIgnoreCase)) @@ -106,6 +127,78 @@ namespace MediaBrowser.Providers.Music return updateType; } + private ItemUpdateType SetAlbumFromSongs(MusicAlbum item, IReadOnlyList<Audio> songs) + { + var updateType = ItemUpdateType.None; + + var musicbrainzAlbumIds = songs + .Select(i => i.GetProviderId(MetadataProvider.MusicBrainzAlbum)) + .GroupBy(i => i) + .OrderByDescending(g => g.Count()) + .Select(g => g.Key) + .ToArray(); + + var musicbrainzAlbumId = item.GetProviderId(MetadataProvider.MusicBrainzAlbum); + if (!String.IsNullOrEmpty(musicbrainzAlbumIds[0]) + && (String.IsNullOrEmpty(musicbrainzAlbumId) + || !musicbrainzAlbumId.Equals(musicbrainzAlbumIds[0], StringComparison.OrdinalIgnoreCase))) + { + item.SetProviderId(MetadataProvider.MusicBrainzAlbum, musicbrainzAlbumIds[0]!); + updateType |= ItemUpdateType.MetadataEdit; + } + + var musicbrainzReleaseGroupIds = songs + .Select(i => i.GetProviderId(MetadataProvider.MusicBrainzReleaseGroup)) + .GroupBy(i => i) + .OrderByDescending(g => g.Count()) + .Select(g => g.Key) + .ToArray(); + + var musicbrainzReleaseGroupId = item.GetProviderId(MetadataProvider.MusicBrainzReleaseGroup); + if (!String.IsNullOrEmpty(musicbrainzReleaseGroupIds[0]) + && (String.IsNullOrEmpty(musicbrainzReleaseGroupId) + || !musicbrainzReleaseGroupId.Equals(musicbrainzReleaseGroupIds[0], StringComparison.OrdinalIgnoreCase))) + { + item.SetProviderId(MetadataProvider.MusicBrainzReleaseGroup, musicbrainzReleaseGroupIds[0]!); + updateType |= ItemUpdateType.MetadataEdit; + } + + return updateType; + } + + private ItemUpdateType SetPeople(MusicAlbum item) + { + var updateType = ItemUpdateType.None; + + if (item.AlbumArtists.Any() || item.Artists.Any()) + { + var people = new List<PersonInfo>(); + + foreach (var albumArtist in item.AlbumArtists) + { + PeopleHelper.AddPerson(people, new PersonInfo + { + Name = albumArtist, + Type = "AlbumArtist" + }); + } + + foreach (var artist in item.Artists) + { + PeopleHelper.AddPerson(people, new PersonInfo + { + Name = artist, + Type = "Artist" + }); + } + + LibraryManager.UpdatePeople(item, people); + updateType |= ItemUpdateType.MetadataEdit; + } + + return updateType; + } + /// <inheritdoc /> protected override void MergeData( MetadataResult<MusicAlbum> source, @@ -123,6 +216,45 @@ namespace MediaBrowser.Providers.Music { targetItem.Artists = sourceItem.Artists; } + + if (replaceData || string.IsNullOrEmpty(targetItem.GetProviderId(MetadataProvider.MusicBrainzAlbumArtist))) + { + var targetAlbumArtistId = targetItem.GetProviderId(MetadataProvider.MusicBrainzAlbumArtist); + var sourceAlbumArtistId = sourceItem.GetProviderId(MetadataProvider.MusicBrainzAlbumArtist); + + if (!string.IsNullOrEmpty(sourceAlbumArtistId) + && (string.IsNullOrEmpty(targetAlbumArtistId) + || !targetAlbumArtistId.Equals(sourceAlbumArtistId, StringComparison.Ordinal))) + { + targetItem.SetProviderId(MetadataProvider.MusicBrainzAlbumArtist, sourceAlbumArtistId); + } + } + + if (replaceData || string.IsNullOrEmpty(targetItem.GetProviderId(MetadataProvider.MusicBrainzAlbum))) + { + var targetAlbumId = targetItem.GetProviderId(MetadataProvider.MusicBrainzAlbum); + var sourceAlbumId = sourceItem.GetProviderId(MetadataProvider.MusicBrainzAlbum); + + if (!string.IsNullOrEmpty(sourceAlbumId) + && (string.IsNullOrEmpty(targetAlbumId) + || !targetAlbumId.Equals(sourceAlbumId, StringComparison.Ordinal))) + { + targetItem.SetProviderId(MetadataProvider.MusicBrainzAlbum, sourceAlbumId); + } + } + + if (replaceData || string.IsNullOrEmpty(targetItem.GetProviderId(MetadataProvider.MusicBrainzReleaseGroup))) + { + var targetReleaseGroupId = targetItem.GetProviderId(MetadataProvider.MusicBrainzReleaseGroup); + var sourceReleaseGroupId = sourceItem.GetProviderId(MetadataProvider.MusicBrainzReleaseGroup); + + if (!string.IsNullOrEmpty(sourceReleaseGroupId) + && (string.IsNullOrEmpty(targetReleaseGroupId) + || !targetReleaseGroupId.Equals(sourceItem))) + { + targetItem.SetProviderId(MetadataProvider.MusicBrainzReleaseGroup, sourceReleaseGroupId); + } + } } } } diff --git a/MediaBrowser.Providers/Music/AudioMetadataService.cs b/MediaBrowser.Providers/Music/AudioMetadataService.cs index 4577f7745..64f40ef49 100644 --- a/MediaBrowser.Providers/Music/AudioMetadataService.cs +++ b/MediaBrowser.Providers/Music/AudioMetadataService.cs @@ -1,5 +1,6 @@ #pragma warning disable CS1591 +using System; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Library; @@ -40,6 +41,45 @@ namespace MediaBrowser.Providers.Music { targetItem.Album = sourceItem.Album; } + + var targetAlbumArtistId = targetItem.GetProviderId(MetadataProvider.MusicBrainzAlbumArtist); + if (replaceData || string.IsNullOrEmpty(targetAlbumArtistId)) + { + var sourceAlbumArtistId = sourceItem.GetProviderId(MetadataProvider.MusicBrainzAlbumArtist); + + if (!string.IsNullOrEmpty(sourceAlbumArtistId) + && (string.IsNullOrEmpty(targetAlbumArtistId) + || !targetAlbumArtistId.Equals(sourceAlbumArtistId, StringComparison.Ordinal))) + { + targetItem.SetProviderId(MetadataProvider.MusicBrainzAlbumArtist, sourceAlbumArtistId); + } + } + + var targetAlbumId = targetItem.GetProviderId(MetadataProvider.MusicBrainzAlbum); + if (replaceData || string.IsNullOrEmpty(targetAlbumId)) + { + var sourceAlbumId = sourceItem.GetProviderId(MetadataProvider.MusicBrainzAlbum); + + if (!string.IsNullOrEmpty(sourceAlbumId) + && (string.IsNullOrEmpty(targetAlbumId) + || !targetAlbumId.Equals(sourceAlbumId, StringComparison.Ordinal))) + { + targetItem.SetProviderId(MetadataProvider.MusicBrainzAlbum, sourceAlbumId); + } + } + + var targetReleaseGroupId = targetItem.GetProviderId(MetadataProvider.MusicBrainzReleaseGroup); + if (replaceData || string.IsNullOrEmpty(targetReleaseGroupId)) + { + var sourceReleaseGroupId = sourceItem.GetProviderId(MetadataProvider.MusicBrainzReleaseGroup); + + if (!string.IsNullOrEmpty(sourceReleaseGroupId) + && (string.IsNullOrEmpty(targetReleaseGroupId) + || !targetReleaseGroupId.Equals(sourceReleaseGroupId, StringComparison.Ordinal))) + { + targetItem.SetProviderId(MetadataProvider.MusicBrainzReleaseGroup, sourceReleaseGroupId); + } + } } } } |
