AlbumNfoSaver.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Globalization;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Xml;
  7. using Jellyfin.Extensions;
  8. using MediaBrowser.Controller.Configuration;
  9. using MediaBrowser.Controller.Entities;
  10. using MediaBrowser.Controller.Entities.Audio;
  11. using MediaBrowser.Controller.Library;
  12. using MediaBrowser.Model.IO;
  13. using Microsoft.Extensions.Logging;
  14. namespace MediaBrowser.XbmcMetadata.Savers
  15. {
  16. /// <summary>
  17. /// Nfo saver for albums.
  18. /// </summary>
  19. public class AlbumNfoSaver : BaseNfoSaver
  20. {
  21. /// <summary>
  22. /// Initializes a new instance of the <see cref="AlbumNfoSaver"/> class.
  23. /// </summary>
  24. /// <param name="fileSystem">The file system.</param>
  25. /// <param name="configurationManager">the server configuration manager.</param>
  26. /// <param name="libraryManager">The library manager.</param>
  27. /// <param name="userManager">The user manager.</param>
  28. /// <param name="userDataManager">The user data manager.</param>
  29. /// <param name="logger">The logger.</param>
  30. public AlbumNfoSaver(
  31. IFileSystem fileSystem,
  32. IServerConfigurationManager configurationManager,
  33. ILibraryManager libraryManager,
  34. IUserManager userManager,
  35. IUserDataManager userDataManager,
  36. ILogger<AlbumNfoSaver> logger)
  37. : base(fileSystem, configurationManager, libraryManager, userManager, userDataManager, logger)
  38. {
  39. }
  40. /// <inheritdoc />
  41. protected override string GetLocalSavePath(BaseItem item)
  42. => Path.Combine(item.Path, "album.nfo");
  43. /// <inheritdoc />
  44. protected override string GetRootElementName(BaseItem item)
  45. => "album";
  46. /// <inheritdoc />
  47. public override bool IsEnabledFor(BaseItem item, ItemUpdateType updateType)
  48. => item.SupportsLocalMetadata && item is MusicAlbum && updateType >= MinimumUpdateType;
  49. /// <inheritdoc />
  50. protected override void WriteCustomElements(BaseItem item, XmlWriter writer)
  51. {
  52. var album = (MusicAlbum)item;
  53. foreach (var artist in album.Artists.Trimmed().OrderBy(artist => artist))
  54. {
  55. writer.WriteElementString("artist", artist);
  56. }
  57. foreach (var artist in album.AlbumArtists.Trimmed().OrderBy(artist => artist))
  58. {
  59. writer.WriteElementString("albumartist", artist);
  60. }
  61. AddTracks(album.Tracks, writer);
  62. }
  63. private void AddTracks(IEnumerable<BaseItem> tracks, XmlWriter writer)
  64. {
  65. foreach (var track in tracks
  66. .OrderBy(i => i.ParentIndexNumber ?? 0)
  67. .ThenBy(i => i.IndexNumber ?? 0)
  68. .ThenBy(i => SortNameOrName(i))
  69. .ThenBy(i => i.Name?.Trim()))
  70. {
  71. writer.WriteStartElement("track");
  72. if (track.ParentIndexNumber.HasValue && track.ParentIndexNumber.Value != 0)
  73. {
  74. writer.WriteElementString("disc", track.ParentIndexNumber.Value.ToString(CultureInfo.InvariantCulture));
  75. }
  76. if (track.IndexNumber.HasValue && track.IndexNumber.Value != 0)
  77. {
  78. writer.WriteElementString("position", track.IndexNumber.Value.ToString(CultureInfo.InvariantCulture));
  79. }
  80. if (!string.IsNullOrEmpty(track.Name))
  81. {
  82. writer.WriteElementString("title", track.Name);
  83. }
  84. if (track.RunTimeTicks.HasValue)
  85. {
  86. var time = TimeSpan.FromTicks(track.RunTimeTicks.Value).ToString(@"mm\:ss", CultureInfo.InvariantCulture);
  87. writer.WriteElementString("duration", time);
  88. }
  89. writer.WriteEndElement();
  90. }
  91. }
  92. /// <inheritdoc />
  93. protected override IEnumerable<string> GetTagsUsed(BaseItem item)
  94. {
  95. foreach (var tag in base.GetTagsUsed(item))
  96. {
  97. yield return tag;
  98. }
  99. yield return "track";
  100. yield return "artist";
  101. yield return "albumartist";
  102. }
  103. }
  104. }