diff options
Diffstat (limited to 'MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs')
| -rw-r--r-- | MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs | 136 |
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) |
