aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Providers/Music
diff options
context:
space:
mode:
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 7743d3b27b..b8426f31c1 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 4577f77456..64f40ef49f 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);
+ }
+ }
}
}
}