aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2017-06-12 03:02:09 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2017-06-12 03:02:09 -0400
commit099c422a853bd2266e54fa6bd1f06f224d749dae (patch)
tree772df3ef2f4713c1e15320e2a933b1138c804f1c
parentceed0241fd1db8b417e4148f2599368779ba8b14 (diff)
fixes #1255 - [BUG] NFO handler doesn't handle NFOs with multiple episode details
-rw-r--r--MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs4
-rw-r--r--MediaBrowser.XbmcMetadata/Parsers/EpisodeNfoParser.cs61
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>