diff options
Diffstat (limited to 'MediaBrowser.Providers/TV/RemoteSeriesProvider.cs')
| -rw-r--r-- | MediaBrowser.Providers/TV/RemoteSeriesProvider.cs | 101 |
1 files changed, 82 insertions, 19 deletions
diff --git a/MediaBrowser.Providers/TV/RemoteSeriesProvider.cs b/MediaBrowser.Providers/TV/RemoteSeriesProvider.cs index 34be77a9ea..b79e50e205 100644 --- a/MediaBrowser.Providers/TV/RemoteSeriesProvider.cs +++ b/MediaBrowser.Providers/TV/RemoteSeriesProvider.cs @@ -247,10 +247,7 @@ namespace MediaBrowser.Providers.TV if (!series.LockedFields.Contains(MetadataFields.Cast)) { - var actorsDoc = new XmlDocument(); - actorsDoc.Load(actorsXmlPath); - - FetchActors(series, actorsDoc, seriesDoc); + FetchActors(series, actorsXmlPath, cancellationToken); } } } @@ -384,8 +381,11 @@ namespace MediaBrowser.Providers.TV } } } + series.OfficialRating = doc.SafeGetString("//ContentRating"); - if (!series.LockedFields.Contains(MetadataFields.Genres)) + + // Only fill this in if there's no existing genres, because Imdb data from Omdb is preferred + if (!series.LockedFields.Contains(MetadataFields.Genres) && (series.Genres.Count == 0 || !string.Equals(ConfigurationManager.Configuration.PreferredMetadataLanguage, "en", StringComparison.OrdinalIgnoreCase))) { string g = doc.SafeGetString("//Genre"); @@ -429,32 +429,95 @@ namespace MediaBrowser.Providers.TV /// Fetches the actors. /// </summary> /// <param name="series">The series.</param> - /// <param name="actorsDoc">The actors doc.</param> - /// <param name="seriesDoc">The seriesDoc.</param> - /// <returns>Task.</returns> - private void FetchActors(Series series, XmlDocument actorsDoc, XmlDocument seriesDoc) + /// <param name="actorsXmlPath">The actors XML path.</param> + /// <param name="cancellationToken">The cancellation token.</param> + private void FetchActors(Series series, string actorsXmlPath, CancellationToken cancellationToken) { - var xmlNodeList = actorsDoc.SelectNodes("Actors/Actor"); - - if (xmlNodeList != null) + var settings = new XmlReaderSettings { - series.People.Clear(); + CheckCharacters = false, + IgnoreProcessingInstructions = true, + IgnoreComments = true, + ValidationType = ValidationType.None + }; - foreach (XmlNode p in xmlNodeList) + using (var streamReader = new StreamReader(actorsXmlPath, Encoding.UTF8)) + { + // Use XmlReader for best performance + using (var reader = XmlReader.Create(streamReader, settings)) { - string actorName = p.SafeGetString("Name"); - string actorRole = p.SafeGetString("Role"); + reader.MoveToContent(); - if (!string.IsNullOrWhiteSpace(actorName)) + // Loop through each element + while (reader.Read()) { - // Sometimes tvdb actors have leading spaces - series.AddPerson(new PersonInfo { Type = PersonType.Actor, Name = actorName.Trim(), Role = actorRole }); + cancellationToken.ThrowIfCancellationRequested(); + + if (reader.NodeType == XmlNodeType.Element) + { + switch (reader.Name) + { + case "Actor": + { + using (var subtree = reader.ReadSubtree()) + { + FetchDataFromActorNode(series, subtree); + } + break; + } + default: + reader.Skip(); + break; + } + } } } } } /// <summary> + /// Fetches the data from actor node. + /// </summary> + /// <param name="series">The series.</param> + /// <param name="reader">The reader.</param> + private void FetchDataFromActorNode(Series series, XmlReader reader) + { + reader.MoveToContent(); + + var personInfo = new PersonInfo(); + + while (reader.Read()) + { + if (reader.NodeType == XmlNodeType.Element) + { + switch (reader.Name) + { + case "Name": + { + personInfo.Name = (reader.ReadElementContentAsString() ?? string.Empty).Trim(); + break; + } + + case "Role": + { + personInfo.Role = (reader.ReadElementContentAsString() ?? string.Empty).Trim(); + break; + } + + default: + reader.Skip(); + break; + } + } + } + + if (!string.IsNullOrEmpty(personInfo.Name)) + { + series.AddPerson(personInfo); + } + } + + /// <summary> /// The us culture /// </summary> protected readonly CultureInfo UsCulture = new CultureInfo("en-US"); |
