aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Providers/Music
diff options
context:
space:
mode:
authorShadowghost <Ghost_of_Stone@web.de>2022-03-28 23:11:21 +0200
committerShadowghost <Ghost_of_Stone@web.de>2022-09-13 17:20:22 +0200
commit61fa325ef05daac7c5105623d2de435ec94ef6a7 (patch)
tree2e50daa08f4fea57c8e1e07bee3cae1db0d0eace /MediaBrowser.Providers/Music
parent0246ba1fb4c3b01fa1be51a57275de7fd2654c31 (diff)
Extend music parsing
Diffstat (limited to 'MediaBrowser.Providers/Music')
-rw-r--r--MediaBrowser.Providers/Music/AlbumMetadataService.cs152
-rw-r--r--MediaBrowser.Providers/Music/AudioMetadataService.cs40
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);
+ }
+ }
}
}
}