aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs')
-rw-r--r--MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs136
1 files changed, 63 insertions, 73 deletions
diff --git a/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs b/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs
index ad514492d..ac39d9d98 100644
--- a/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs
+++ b/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs
@@ -1,8 +1,8 @@
using MediaBrowser.Common.Configuration;
-using MediaBrowser.Controller.Providers;
-using MediaBrowser.Model.Extensions;
using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Extensions;
using MediaBrowser.Model.Logging;
using MediaBrowser.XbmcMetadata.Configuration;
using MediaBrowser.XbmcMetadata.Savers;
@@ -12,6 +12,7 @@ using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
+using System.Text.RegularExpressions;
using System.Threading;
using System.Xml;
@@ -47,7 +48,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
/// <param name="cancellationToken">The cancellation token.</param>
/// <exception cref="System.ArgumentNullException">
/// </exception>
- public void Fetch(LocalMetadataResult<T> item, string metadataFile, CancellationToken cancellationToken)
+ public void Fetch(MetadataResult<T> item, string metadataFile, CancellationToken cancellationToken)
{
if (item == null)
{
@@ -82,8 +83,10 @@ 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(LocalMetadataResult<T> item, string metadataFile, XmlReaderSettings settings, CancellationToken cancellationToken)
+ private void Fetch(MetadataResult<T> item, string metadataFile, XmlReaderSettings settings, CancellationToken cancellationToken)
{
+ item.ResetPeople();
+
if (!SupportsUrlAfterClosingXmlTag)
{
using (var streamReader = BaseNfoSaver.GetStreamReader(metadataFile))
@@ -115,7 +118,15 @@ namespace MediaBrowser.XbmcMetadata.Parsers
var xml = streamReader.ReadToEnd();
- var index = xml.LastIndexOf('>');
+ // Find last closing Tag
+ // Need to do this in two steps to account for random > characters after the closing xml
+ var index = xml.LastIndexOf(@"</", StringComparison.Ordinal);
+
+ // If closing tag exists, move to end of Tag
+ if (index != -1)
+ {
+ index = xml.IndexOf('>', index);
+ }
if (index != -1)
{
@@ -147,42 +158,48 @@ namespace MediaBrowser.XbmcMetadata.Parsers
ms.Write(bytes, 0, bytes.Length);
ms.Position = 0;
- // Use XmlReader for best performance
- using (var reader = XmlReader.Create(ms, settings))
+ // These are not going to be valid xml so no sense in causing the provider to fail and spamming the log with exceptions
+ try
{
- reader.MoveToContent();
-
- // Loop through each element
- while (reader.Read())
+ // Use XmlReader for best performance
+ using (var reader = XmlReader.Create(ms, settings))
{
- cancellationToken.ThrowIfCancellationRequested();
+ reader.MoveToContent();
- if (reader.NodeType == XmlNodeType.Element)
+ // Loop through each element
+ while (reader.Read())
{
- FetchDataFromXmlNode(reader, item);
+ cancellationToken.ThrowIfCancellationRequested();
+
+ if (reader.NodeType == XmlNodeType.Element)
+ {
+ FetchDataFromXmlNode(reader, item);
+ }
}
}
}
-
+ catch (XmlException)
+ {
+
+ }
}
}
}
private void ParseProviderLinks(T item, string xml)
{
- var imdbId = xml.Split('/')
- .FirstOrDefault(i => i.StartsWith("tt", StringComparison.OrdinalIgnoreCase));
-
- if (!string.IsNullOrWhiteSpace(imdbId))
+ //Look for a match for the Regex pattern "tt" followed by 7 digits
+ Match m = Regex.Match(xml, @"tt([0-9]{7})", RegexOptions.IgnoreCase);
+ if (m.Success)
{
- item.SetProviderId(MetadataProviders.Imdb, imdbId);
+ item.SetProviderId(MetadataProviders.Imdb, m.Value);
}
// TODO: Support Tmdb
// http://www.themoviedb.org/movie/36557
}
- protected virtual void FetchDataFromXmlNode(XmlReader reader, LocalMetadataResult<T> itemResult)
+ protected virtual void FetchDataFromXmlNode(XmlReader reader, MetadataResult<T> itemResult)
{
var item = itemResult.Item;
@@ -574,7 +591,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
continue;
}
- PeopleHelper.AddPerson(itemResult.People, p);
+ itemResult.AddPerson(p);
}
break;
}
@@ -593,7 +610,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
continue;
}
- PeopleHelper.AddPerson(itemResult.People, p);
+ itemResult.AddPerson(p);
}
}
break;
@@ -607,7 +624,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
continue;
}
- PeopleHelper.AddPerson(itemResult.People, p);
+ itemResult.AddPerson(p);
}
break;
}
@@ -618,7 +635,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
var person = GetPersonFromXmlNode(subtree);
- PeopleHelper.AddPerson(itemResult.People, person);
+ itemResult.AddPerson(person);
}
break;
}
@@ -925,17 +942,14 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
var val = reader.ReadElementContentAsString();
- if (!string.IsNullOrWhiteSpace(val))
+ if (!string.IsNullOrWhiteSpace(val) && !string.IsNullOrWhiteSpace(userDataUserId))
{
bool parsedValue;
if (bool.TryParse(val, out parsedValue))
{
- if (!string.IsNullOrWhiteSpace(userDataUserId))
- {
- var userData = GetOrAdd(itemResult.UserDataLIst, userDataUserId);
+ var userData = GetOrAdd(itemResult, userDataUserId);
- userData.Played = parsedValue;
- }
+ userData.Played = parsedValue;
}
}
break;
@@ -945,21 +959,18 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
var val = reader.ReadElementContentAsString();
- if (!string.IsNullOrWhiteSpace(val))
+ if (!string.IsNullOrWhiteSpace(val) && !string.IsNullOrWhiteSpace(userDataUserId))
{
int parsedValue;
if (int.TryParse(val, NumberStyles.Integer, _usCulture, out parsedValue))
{
- if (!string.IsNullOrWhiteSpace(userDataUserId))
- {
- var userData = GetOrAdd(itemResult.UserDataLIst, userDataUserId);
+ var userData = GetOrAdd(itemResult, userDataUserId);
- userData.PlayCount = parsedValue;
+ userData.PlayCount = parsedValue;
- if (parsedValue > 0)
- {
- userData.Played = true;
- }
+ if (parsedValue > 0)
+ {
+ userData.Played = true;
}
}
}
@@ -970,17 +981,14 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
var val = reader.ReadElementContentAsString();
- if (!string.IsNullOrWhiteSpace(val))
+ if (!string.IsNullOrWhiteSpace(val) && !string.IsNullOrWhiteSpace(userDataUserId))
{
DateTime parsedValue;
if (DateTime.TryParseExact(val, "yyyy-MM-dd HH:mm:ss", _usCulture, DateTimeStyles.None, out parsedValue))
{
- if (!string.IsNullOrWhiteSpace(userDataUserId))
- {
- var userData = GetOrAdd(itemResult.UserDataLIst, userDataUserId);
+ var userData = GetOrAdd(itemResult, userDataUserId);
- userData.LastPlayedDate = parsedValue;
- }
+ userData.LastPlayedDate = parsedValue;
}
}
break;
@@ -992,7 +1000,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
if (!string.IsNullOrWhiteSpace(userDataUserId))
{
- var userData = GetOrAdd(itemResult.UserDataLIst, userDataUserId);
+ var userData = GetOrAdd(itemResult, userDataUserId);
FetchFromResumeNode(subtree, item, userData);
}
@@ -1004,17 +1012,14 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
var val = reader.ReadElementContentAsString();
- if (!string.IsNullOrWhiteSpace(val))
+ if (!string.IsNullOrWhiteSpace(val) && !string.IsNullOrWhiteSpace(userDataUserId))
{
bool parsedValue;
if (bool.TryParse(val, out parsedValue))
{
- if (!string.IsNullOrWhiteSpace(userDataUserId))
- {
- var userData = GetOrAdd(itemResult.UserDataLIst, userDataUserId);
+ var userData = GetOrAdd(itemResult, userDataUserId);
- userData.IsFavorite = parsedValue;
- }
+ userData.IsFavorite = parsedValue;
}
}
break;
@@ -1024,17 +1029,14 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
var val = reader.ReadElementContentAsString();
- if (!string.IsNullOrWhiteSpace(val))
+ if (!string.IsNullOrWhiteSpace(val) && !string.IsNullOrWhiteSpace(userDataUserId))
{
double parsedValue;
if (double.TryParse(val, NumberStyles.Any, _usCulture, out parsedValue))
{
- if (!string.IsNullOrWhiteSpace(userDataUserId))
- {
- var userData = GetOrAdd(itemResult.UserDataLIst, userDataUserId);
+ var userData = GetOrAdd(itemResult, userDataUserId);
- userData.Rating = parsedValue;
- }
+ userData.Rating = parsedValue;
}
}
break;
@@ -1046,21 +1048,9 @@ namespace MediaBrowser.XbmcMetadata.Parsers
}
}
- private UserItemData GetOrAdd(List<UserItemData> userDataList, string userId)
+ private UserItemData GetOrAdd(MetadataResult<T> result, string userId)
{
- var userData = userDataList.FirstOrDefault(i => string.Equals(userId, i.UserId.ToString("N"), StringComparison.OrdinalIgnoreCase));
-
- if (userData == null)
- {
- userData = new UserItemData()
- {
- UserId = new Guid(userId)
- };
-
- userDataList.Add(userData);
- }
-
- return userData;
+ return result.GetOrAddUserData(userId);
}
private void FetchFromResumeNode(XmlReader reader, T item, UserItemData userData)