AlbumNfoSaver.cs 3.8 KB

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