AlbumNfoSaver.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. using MediaBrowser.Common.IO;
  2. using MediaBrowser.Controller.Configuration;
  3. using MediaBrowser.Controller.Entities;
  4. using MediaBrowser.Controller.Entities.Audio;
  5. using MediaBrowser.Controller.Library;
  6. using MediaBrowser.Model.Logging;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Globalization;
  10. using System.IO;
  11. using System.Linq;
  12. using System.Xml;
  13. namespace MediaBrowser.XbmcMetadata.Savers
  14. {
  15. public class AlbumNfoSaver : BaseNfoSaver
  16. {
  17. public AlbumNfoSaver(IFileSystem fileSystem, IServerConfigurationManager configurationManager, ILibraryManager libraryManager, IUserManager userManager, IUserDataManager userDataManager, ILogger logger) : base(fileSystem, configurationManager, libraryManager, userManager, userDataManager, logger)
  18. {
  19. }
  20. public override string GetSavePath(IHasMetadata item)
  21. {
  22. return Path.Combine(item.Path, "album.nfo");
  23. }
  24. protected override string GetRootElementName(IHasMetadata item)
  25. {
  26. return "album";
  27. }
  28. public override bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType)
  29. {
  30. if (!item.SupportsLocalMetadata)
  31. {
  32. return false;
  33. }
  34. return item is MusicAlbum && updateType >= ItemUpdateType.MetadataDownload;
  35. }
  36. protected override void WriteCustomElements(IHasMetadata item, XmlWriter writer)
  37. {
  38. var album = (MusicAlbum)item;
  39. var tracks = album.Tracks
  40. .ToList();
  41. var artists = tracks
  42. .SelectMany(i =>
  43. {
  44. var list = new List<string>();
  45. if (!string.IsNullOrEmpty(i.AlbumArtist))
  46. {
  47. list.Add(i.AlbumArtist);
  48. }
  49. list.AddRange(i.Artists);
  50. return list;
  51. })
  52. .Distinct(StringComparer.OrdinalIgnoreCase);
  53. foreach (var artist in artists)
  54. {
  55. writer.WriteElementString("artist", artist);
  56. }
  57. AddTracks(tracks, writer);
  58. }
  59. private static readonly CultureInfo UsCulture = new CultureInfo("en-US");
  60. private void AddTracks(IEnumerable<Audio> tracks, XmlWriter writer)
  61. {
  62. foreach (var track in tracks.OrderBy(i => i.ParentIndexNumber ?? 0).ThenBy(i => i.IndexNumber ?? 0))
  63. {
  64. writer.WriteStartElement("track");
  65. if (track.IndexNumber.HasValue)
  66. {
  67. writer.WriteElementString("position", track.IndexNumber.Value.ToString(UsCulture));
  68. }
  69. if (!string.IsNullOrEmpty(track.Name))
  70. {
  71. writer.WriteElementString("title", track.Name);
  72. }
  73. if (track.RunTimeTicks.HasValue)
  74. {
  75. var time = TimeSpan.FromTicks(track.RunTimeTicks.Value).ToString(@"mm\:ss");
  76. writer.WriteElementString("duration", time);
  77. }
  78. writer.WriteEndElement();
  79. }
  80. }
  81. protected override List<string> GetTagsUsed()
  82. {
  83. var list = new List<string>
  84. {
  85. "track",
  86. "artist"
  87. };
  88. return list;
  89. }
  90. }
  91. }