diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2017-06-12 03:02:09 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2017-06-12 03:02:09 -0400 |
| commit | 099c422a853bd2266e54fa6bd1f06f224d749dae (patch) | |
| tree | 772df3ef2f4713c1e15320e2a933b1138c804f1c | |
| parent | ceed0241fd1db8b417e4148f2599368779ba8b14 (diff) | |
fixes #1255 - [BUG] NFO handler doesn't handle NFOs with multiple episode details
| -rw-r--r-- | MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs | 4 | ||||
| -rw-r--r-- | MediaBrowser.XbmcMetadata/Parsers/EpisodeNfoParser.cs | 61 |
2 files changed, 63 insertions, 2 deletions
diff --git a/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs b/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs index d424cc0ca..3b642eca2 100644 --- a/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs +++ b/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs @@ -107,7 +107,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers /// <param name="metadataFile">The metadata file.</param> /// <param name="settings">The settings.</param> /// <param name="cancellationToken">The cancellation token.</param> - private void Fetch(MetadataResult<T> item, string metadataFile, XmlReaderSettings settings, CancellationToken cancellationToken) + protected virtual void Fetch(MetadataResult<T> item, string metadataFile, XmlReaderSettings settings, CancellationToken cancellationToken) { if (!SupportsUrlAfterClosingXmlTag) { @@ -233,7 +233,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers get { return "themoviedb.org/movie/"; } } - private void ParseProviderLinks(T item, string xml) + protected void ParseProviderLinks(T item, string xml) { //Look for a match for the Regex pattern "tt" followed by 7 digits Match m = Regex.Match(xml, @"tt([0-9]{7})", RegexOptions.IgnoreCase); diff --git a/MediaBrowser.XbmcMetadata/Parsers/EpisodeNfoParser.cs b/MediaBrowser.XbmcMetadata/Parsers/EpisodeNfoParser.cs index d10a55e07..953b59f46 100644 --- a/MediaBrowser.XbmcMetadata/Parsers/EpisodeNfoParser.cs +++ b/MediaBrowser.XbmcMetadata/Parsers/EpisodeNfoParser.cs @@ -9,6 +9,8 @@ using System.Threading; using System.Xml; using MediaBrowser.Model.IO; using MediaBrowser.Model.Xml; +using System.IO; +using System.Text; namespace MediaBrowser.XbmcMetadata.Parsers { @@ -24,6 +26,65 @@ namespace MediaBrowser.XbmcMetadata.Parsers private static readonly CultureInfo UsCulture = new CultureInfo("en-US"); + protected override void Fetch(MetadataResult<Episode> item, string metadataFile, XmlReaderSettings settings, CancellationToken cancellationToken) + { + using (var fileStream = FileSystem.OpenRead(metadataFile)) + { + using (var streamReader = new StreamReader(fileStream, Encoding.UTF8)) + { + item.ResetPeople(); + + var xml = streamReader.ReadToEnd(); + + var srch = "</episodedetails>"; + var index = xml.IndexOf(srch, StringComparison.OrdinalIgnoreCase); + + if (index != -1) + { + xml = xml.Substring(0, index + srch.Length); + } + + using (var ms = new MemoryStream()) + { + var bytes = Encoding.UTF8.GetBytes(xml); + + ms.Write(bytes, 0, bytes.Length); + ms.Position = 0; + + // These are not going to be valid xml so no sense in causing the provider to fail and spamming the log with exceptions + try + { + // Use XmlReader for best performance + using (var reader = XmlReader.Create(ms, settings)) + { + reader.MoveToContent(); + reader.Read(); + + // Loop through each element + while (!reader.EOF && reader.ReadState == ReadState.Interactive) + { + cancellationToken.ThrowIfCancellationRequested(); + + if (reader.NodeType == XmlNodeType.Element) + { + FetchDataFromXmlNode(reader, item); + } + else + { + reader.Read(); + } + } + } + } + catch (XmlException) + { + + } + } + } + } + } + /// <summary> /// Fetches the data from XML node. /// </summary> |
