|
@@ -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);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|