AlbumMetadataService.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using MediaBrowser.Controller.Configuration;
  5. using MediaBrowser.Controller.Entities;
  6. using MediaBrowser.Controller.Entities.Audio;
  7. using MediaBrowser.Controller.Library;
  8. using MediaBrowser.Controller.Providers;
  9. using MediaBrowser.Model.Entities;
  10. using MediaBrowser.Model.IO;
  11. using MediaBrowser.Providers.Manager;
  12. using Microsoft.Extensions.Logging;
  13. namespace MediaBrowser.Providers.Music
  14. {
  15. public class AlbumMetadataService : MetadataService<MusicAlbum, AlbumInfo>
  16. {
  17. protected override IList<BaseItem> GetChildrenForMetadataUpdates(MusicAlbum item)
  18. {
  19. return item.GetRecursiveChildren(i => i is Audio)
  20. .ToList();
  21. }
  22. protected override ItemUpdateType UpdateMetadataFromChildren(MusicAlbum item, IList<BaseItem> children, bool isFullRefresh, ItemUpdateType currentUpdateType)
  23. {
  24. var updateType = base.UpdateMetadataFromChildren(item, children, isFullRefresh, currentUpdateType);
  25. if (isFullRefresh || currentUpdateType > ItemUpdateType.None)
  26. {
  27. if (!item.LockedFields.Contains(MetadataFields.Name))
  28. {
  29. var name = children.Select(i => i.Album).FirstOrDefault(i => !string.IsNullOrEmpty(i));
  30. if (!string.IsNullOrEmpty(name))
  31. {
  32. if (!string.Equals(item.Name, name, StringComparison.Ordinal))
  33. {
  34. item.Name = name;
  35. updateType = updateType | ItemUpdateType.MetadataEdit;
  36. }
  37. }
  38. }
  39. var songs = children.Cast<Audio>().ToArray();
  40. updateType = updateType | SetAlbumArtistFromSongs(item, songs);
  41. updateType = updateType | SetArtistsFromSongs(item, songs);
  42. }
  43. return updateType;
  44. }
  45. protected override bool EnableUpdatingPremiereDateFromChildren => true;
  46. protected override bool EnableUpdatingGenresFromChildren => true;
  47. protected override bool EnableUpdatingStudiosFromChildren => true;
  48. private ItemUpdateType SetAlbumArtistFromSongs(MusicAlbum item, IEnumerable<Audio> songs)
  49. {
  50. var updateType = ItemUpdateType.None;
  51. var artists = songs
  52. .SelectMany(i => i.AlbumArtists)
  53. .Distinct(StringComparer.OrdinalIgnoreCase)
  54. .OrderBy(i => i)
  55. .ToArray();
  56. if (!item.AlbumArtists.SequenceEqual(artists, StringComparer.OrdinalIgnoreCase))
  57. {
  58. item.AlbumArtists = artists;
  59. updateType = updateType | ItemUpdateType.MetadataEdit;
  60. }
  61. return updateType;
  62. }
  63. private ItemUpdateType SetArtistsFromSongs(MusicAlbum item, IEnumerable<Audio> songs)
  64. {
  65. var updateType = ItemUpdateType.None;
  66. var artists = songs
  67. .SelectMany(i => i.Artists)
  68. .Distinct(StringComparer.OrdinalIgnoreCase)
  69. .OrderBy(i => i)
  70. .ToArray();
  71. if (!item.Artists.SequenceEqual(artists, StringComparer.OrdinalIgnoreCase))
  72. {
  73. item.Artists = artists;
  74. updateType = updateType | ItemUpdateType.MetadataEdit;
  75. }
  76. return updateType;
  77. }
  78. protected override void MergeData(MetadataResult<MusicAlbum> source, MetadataResult<MusicAlbum> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
  79. {
  80. ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
  81. var sourceItem = source.Item;
  82. var targetItem = target.Item;
  83. if (replaceData || targetItem.Artists.Length == 0)
  84. {
  85. targetItem.Artists = sourceItem.Artists;
  86. }
  87. }
  88. public AlbumMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
  89. {
  90. }
  91. }
  92. }