MovieNfoParser.cs 5.9 KB

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