AlbumMetadataService.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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. public AlbumMetadataService(
  18. IServerConfigurationManager serverConfigurationManager,
  19. ILogger logger,
  20. IProviderManager providerManager,
  21. IFileSystem fileSystem,
  22. IUserDataManager userDataManager,
  23. ILibraryManager libraryManager)
  24. : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
  25. {
  26. }
  27. /// <inheritdoc />
  28. protected override bool EnableUpdatingPremiereDateFromChildren => true;
  29. /// <inheritdoc />
  30. protected override bool EnableUpdatingGenresFromChildren => true;
  31. /// <inheritdoc />
  32. protected override bool EnableUpdatingStudiosFromChildren => true;
  33. /// <inheritdoc />
  34. protected override IList<BaseItem> GetChildrenForMetadataUpdates(MusicAlbum item)
  35. {
  36. return item.GetRecursiveChildren(i => i is Audio)
  37. .ToList();
  38. }
  39. /// <inheritdoc />
  40. protected override ItemUpdateType UpdateMetadataFromChildren(MusicAlbum item, IList<BaseItem> children, bool isFullRefresh, ItemUpdateType currentUpdateType)
  41. {
  42. var updateType = base.UpdateMetadataFromChildren(item, children, isFullRefresh, currentUpdateType);
  43. if (isFullRefresh || currentUpdateType > ItemUpdateType.None)
  44. {
  45. if (!item.LockedFields.Contains(MetadataFields.Name))
  46. {
  47. var name = children.Select(i => i.Album).FirstOrDefault(i => !string.IsNullOrEmpty(i));
  48. if (!string.IsNullOrEmpty(name))
  49. {
  50. if (!string.Equals(item.Name, name, StringComparison.Ordinal))
  51. {
  52. item.Name = name;
  53. updateType = updateType | ItemUpdateType.MetadataEdit;
  54. }
  55. }
  56. }
  57. var songs = children.Cast<Audio>().ToArray();
  58. updateType = updateType | SetAlbumArtistFromSongs(item, songs);
  59. updateType = updateType | SetArtistsFromSongs(item, songs);
  60. }
  61. return updateType;
  62. }
  63. private ItemUpdateType SetAlbumArtistFromSongs(MusicAlbum item, IEnumerable<Audio> songs)
  64. {
  65. var updateType = ItemUpdateType.None;
  66. var artists = songs
  67. .SelectMany(i => i.AlbumArtists)
  68. .Distinct(StringComparer.OrdinalIgnoreCase)
  69. .OrderBy(i => i)
  70. .ToArray();
  71. if (!item.AlbumArtists.SequenceEqual(artists, StringComparer.OrdinalIgnoreCase))
  72. {
  73. item.AlbumArtists = artists;
  74. updateType = updateType | ItemUpdateType.MetadataEdit;
  75. }
  76. return updateType;
  77. }
  78. private ItemUpdateType SetArtistsFromSongs(MusicAlbum item, IEnumerable<Audio> songs)
  79. {
  80. var updateType = ItemUpdateType.None;
  81. var artists = songs
  82. .SelectMany(i => i.Artists)
  83. .Distinct(StringComparer.OrdinalIgnoreCase)
  84. .OrderBy(i => i)
  85. .ToArray();
  86. if (!item.Artists.SequenceEqual(artists, StringComparer.OrdinalIgnoreCase))
  87. {
  88. item.Artists = artists;
  89. updateType = updateType | ItemUpdateType.MetadataEdit;
  90. }
  91. return updateType;
  92. }
  93. /// <inheritdoc />
  94. protected override void MergeData(
  95. MetadataResult<MusicAlbum> source,
  96. MetadataResult<MusicAlbum> target,
  97. MetadataFields[] lockedFields,
  98. bool replaceData,
  99. bool mergeMetadataSettings)
  100. {
  101. ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
  102. var sourceItem = source.Item;
  103. var targetItem = target.Item;
  104. if (replaceData || targetItem.Artists.Count == 0)
  105. {
  106. targetItem.Artists = sourceItem.Artists;
  107. }
  108. }
  109. }
  110. }