MovieNfoParser.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. using System;
  2. using System.IO;
  3. using System.Linq;
  4. using System.Xml;
  5. using MediaBrowser.Common.Configuration;
  6. using MediaBrowser.Controller.Entities;
  7. using MediaBrowser.Controller.Entities.Movies;
  8. using MediaBrowser.Controller.Library;
  9. using MediaBrowser.Controller.Providers;
  10. using MediaBrowser.Model.Entities;
  11. using Microsoft.Extensions.Logging;
  12. namespace MediaBrowser.XbmcMetadata.Parsers
  13. {
  14. /// <summary>
  15. /// Nfo parser for movies.
  16. /// </summary>
  17. public class MovieNfoParser : BaseNfoParser<Video>
  18. {
  19. /// <summary>
  20. /// Initializes a new instance of the <see cref="MovieNfoParser"/> class.
  21. /// </summary>
  22. /// <param name="logger">Instance of the <see cref="ILogger"/> interface.</param>
  23. /// <param name="config">Instance of the <see cref="IConfigurationManager"/> interface.</param>
  24. /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
  25. /// <param name="userManager">Instance of the <see cref="IUserManager"/> interface.</param>
  26. /// <param name="userDataManager">Instance of the <see cref="IUserDataManager"/> interface.</param>
  27. public MovieNfoParser(
  28. ILogger logger,
  29. IConfigurationManager config,
  30. IProviderManager providerManager,
  31. IUserManager userManager,
  32. IUserDataManager userDataManager)
  33. : base(logger, config, providerManager, userManager, userDataManager)
  34. {
  35. }
  36. /// <inheritdoc />
  37. protected override bool SupportsUrlAfterClosingXmlTag => true;
  38. /// <inheritdoc />
  39. protected override void FetchDataFromXmlNode(XmlReader reader, MetadataResult<Video> itemResult)
  40. {
  41. var item = itemResult.Item;
  42. switch (reader.Name)
  43. {
  44. case "id":
  45. {
  46. string? imdbId = reader.GetAttribute("IMDB");
  47. string? tmdbId = reader.GetAttribute("TMDB");
  48. if (string.IsNullOrWhiteSpace(imdbId))
  49. {
  50. imdbId = reader.ReadElementContentAsString();
  51. }
  52. if (!string.IsNullOrWhiteSpace(imdbId))
  53. {
  54. item.SetProviderId(MetadataProvider.Imdb, imdbId);
  55. }
  56. if (!string.IsNullOrWhiteSpace(tmdbId))
  57. {
  58. item.SetProviderId(MetadataProvider.Tmdb, tmdbId);
  59. }
  60. break;
  61. }
  62. case "set":
  63. {
  64. var movie = item as Movie;
  65. var tmdbcolid = reader.GetAttribute("tmdbcolid");
  66. if (!string.IsNullOrWhiteSpace(tmdbcolid) && movie != null)
  67. {
  68. movie.SetProviderId(MetadataProvider.TmdbCollection, tmdbcolid);
  69. }
  70. var val = reader.ReadInnerXml();
  71. if (!string.IsNullOrWhiteSpace(val) && movie != null)
  72. {
  73. // TODO Handle this better later
  74. if (!val.Contains('<', StringComparison.Ordinal))
  75. {
  76. movie.CollectionName = val;
  77. }
  78. else
  79. {
  80. try
  81. {
  82. ParseSetXml(val, movie);
  83. }
  84. catch (Exception ex)
  85. {
  86. Logger.LogError(ex, "Error parsing set node");
  87. }
  88. }
  89. }
  90. break;
  91. }
  92. case "artist":
  93. {
  94. var val = reader.ReadElementContentAsString();
  95. if (!string.IsNullOrWhiteSpace(val) && item is MusicVideo movie)
  96. {
  97. var list = movie.Artists.ToList();
  98. list.Add(val);
  99. movie.Artists = list.ToArray();
  100. }
  101. break;
  102. }
  103. case "album":
  104. {
  105. var val = reader.ReadElementContentAsString();
  106. if (!string.IsNullOrWhiteSpace(val) && item is MusicVideo movie)
  107. {
  108. movie.Album = val;
  109. }
  110. break;
  111. }
  112. default:
  113. base.FetchDataFromXmlNode(reader, itemResult);
  114. break;
  115. }
  116. }
  117. private void ParseSetXml(string xml, Movie movie)
  118. {
  119. // These are not going to be valid xml so no sense in causing the provider to fail and spamming the log with exceptions
  120. try
  121. {
  122. using (var stringReader = new StringReader("<set>" + xml + "</set>"))
  123. using (var reader = XmlReader.Create(stringReader, GetXmlReaderSettings()))
  124. {
  125. reader.MoveToContent();
  126. reader.Read();
  127. // Loop through each element
  128. while (!reader.EOF && reader.ReadState == ReadState.Interactive)
  129. {
  130. if (reader.NodeType == XmlNodeType.Element)
  131. {
  132. switch (reader.Name)
  133. {
  134. case "name":
  135. movie.CollectionName = reader.ReadElementContentAsString();
  136. break;
  137. default:
  138. reader.Skip();
  139. break;
  140. }
  141. }
  142. else
  143. {
  144. reader.Read();
  145. }
  146. }
  147. }
  148. }
  149. catch (XmlException)
  150. {
  151. }
  152. }
  153. }
  154. }