AlbumMetadataService.cs 4.4 KB

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