| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623 | 
							- using MediaBrowser.Common.Extensions;
 
- using MediaBrowser.Controller.Entities;
 
- using MediaBrowser.Model.Entities;
 
- using MediaBrowser.Model.Logging;
 
- using System;
 
- using System.Collections.Generic;
 
- using System.Linq;
 
- using System.Threading;
 
- using System.Xml;
 
- namespace MediaBrowser.Controller.Providers
 
- {
 
-     /// <summary>
 
-     /// Provides a base class for parsing metadata xml
 
-     /// </summary>
 
-     /// <typeparam name="T"></typeparam>
 
-     public class BaseItemXmlParser<T>
 
-         where T : BaseItem, new()
 
-     {
 
-         /// <summary>
 
-         /// The logger
 
-         /// </summary>
 
-         protected ILogger Logger { get; private set; }
 
-         /// <summary>
 
-         /// Initializes a new instance of the <see cref="BaseItemXmlParser{T}" /> class.
 
-         /// </summary>
 
-         /// <param name="logger">The logger.</param>
 
-         public BaseItemXmlParser(ILogger logger)
 
-         {
 
-             Logger = logger;
 
-         }
 
-         /// <summary>
 
-         /// Fetches metadata for an item from one xml file
 
-         /// </summary>
 
-         /// <param name="item">The item.</param>
 
-         /// <param name="metadataFile">The metadata file.</param>
 
-         /// <param name="cancellationToken">The cancellation token.</param>
 
-         /// <exception cref="System.ArgumentNullException"></exception>
 
-         public void Fetch(T item, string metadataFile, CancellationToken cancellationToken)
 
-         {
 
-             if (item == null)
 
-             {
 
-                 throw new ArgumentNullException();
 
-             }
 
-             if (string.IsNullOrEmpty(metadataFile))
 
-             {
 
-                 throw new ArgumentNullException();
 
-             }
 
-             // Use XmlReader for best performance
 
-             using (var reader = XmlReader.Create(metadataFile))
 
-             {
 
-                 reader.MoveToContent();
 
-                 // Loop through each element
 
-                 while (reader.Read())
 
-                 {
 
-                     cancellationToken.ThrowIfCancellationRequested();
 
-                     if (reader.NodeType == XmlNodeType.Element)
 
-                     {
 
-                         FetchDataFromXmlNode(reader, item);
 
-                     }
 
-                 }
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// Fetches metadata from one Xml Element
 
-         /// </summary>
 
-         /// <param name="reader">The reader.</param>
 
-         /// <param name="item">The item.</param>
 
-         protected virtual void FetchDataFromXmlNode(XmlReader reader, T item)
 
-         {
 
-             switch (reader.Name)
 
-             {
 
-                 // DateCreated
 
-                 case "Added":
 
-                     DateTime added;
 
-                     if (DateTime.TryParse(reader.ReadElementContentAsString() ?? string.Empty, out added))
 
-                     {
 
-                         item.DateCreated = added.ToUniversalTime();
 
-                     }
 
-                     break;
 
-                 case "LocalTitle":
 
-                     item.Name = reader.ReadElementContentAsString();
 
-                     break;
 
-                 case "Type":
 
-                     {
 
-                         var type = reader.ReadElementContentAsString();
 
-                         if (!string.IsNullOrWhiteSpace(type) && !type.Equals("none",StringComparison.OrdinalIgnoreCase))
 
-                         {
 
-                             item.DisplayMediaType = type;
 
-                         }
 
-                         break;
 
-                     }
 
-                 case "SortTitle":
 
-                     item.ForcedSortName = reader.ReadElementContentAsString();
 
-                     break;
 
-                 case "Overview":
 
-                 case "Description":
 
-                     item.Overview = reader.ReadElementContentAsString();
 
-                     break;
 
-                 case "TagLine":
 
-                     {
 
-                         var tagline = reader.ReadElementContentAsString();
 
-                         if (!string.IsNullOrWhiteSpace(tagline))
 
-                         {
 
-                             item.AddTagline(tagline);
 
-                         }
 
-                         break;
 
-                     }
 
-                 case "TagLines":
 
-                     {
 
-                         FetchFromTaglinesNode(reader.ReadSubtree(), item);
 
-                         break;
 
-                     }
 
-                 case "ContentRating":
 
-                 case "certification":
 
-                 case "MPAARating":
 
-                     {
 
-                         var rating = reader.ReadElementContentAsString();
 
-                         if (!string.IsNullOrWhiteSpace(rating))
 
-                         {
 
-                             item.OfficialRating = rating;
 
-                         }
 
-                         break;
 
-                     }
 
-                 case "CustomRating":
 
-                     {
 
-                         var val = reader.ReadElementContentAsString();
 
-                         if (!string.IsNullOrWhiteSpace(val))
 
-                         {
 
-                             item.CustomRating = val;
 
-                         }
 
-                         break;
 
-                     }
 
-                 case "Runtime":
 
-                 case "RunningTime":
 
-                     {
 
-                         var text = reader.ReadElementContentAsString();
 
-                         if (!string.IsNullOrWhiteSpace(text))
 
-                         {
 
-                             int runtime;
 
-                             if (int.TryParse(text.Split(' ')[0], out runtime))
 
-                             {
 
-                                 item.RunTimeTicks = TimeSpan.FromMinutes(runtime).Ticks;
 
-                             }
 
-                         }
 
-                         break;
 
-                     }
 
-                 case "Genre":
 
-                     {
 
-                         foreach (var name in SplitNames(reader.ReadElementContentAsString()))
 
-                         {
 
-                             if (string.IsNullOrWhiteSpace(name))
 
-                             {
 
-                                 continue;
 
-                             }
 
-                             item.AddGenre(name);
 
-                         }
 
-                         break;
 
-                     }
 
-                 case "AspectRatio":
 
-                     {
 
-                         var val = reader.ReadElementContentAsString();
 
-                         if (!string.IsNullOrWhiteSpace(val))
 
-                         {
 
-                             item.AspectRatio = val;
 
-                         }
 
-                         break;
 
-                     }
 
-                 case "Network":
 
-                     {
 
-                         foreach (var name in SplitNames(reader.ReadElementContentAsString()))
 
-                         {
 
-                             if (string.IsNullOrWhiteSpace(name))
 
-                             {
 
-                                 continue;
 
-                             }
 
-                             item.AddStudio(name);
 
-                         }
 
-                         break;
 
-                     }
 
-                 case "Director":
 
-                     {
 
-                         foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new PersonInfo { Name = v, Type = PersonType.Director }))
 
-                         {
 
-                             if (string.IsNullOrWhiteSpace(p.Name))
 
-                             {
 
-                                 continue;
 
-                             }
 
-                             item.AddPerson(p);
 
-                         }
 
-                         break;
 
-                     }
 
-                 case "Writer":
 
-                     {
 
-                         foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new PersonInfo { Name = v, Type = PersonType.Writer }))
 
-                         {
 
-                             if (string.IsNullOrWhiteSpace(p.Name))
 
-                             {
 
-                                 continue;
 
-                             }
 
-                             item.AddPerson(p);
 
-                         }
 
-                         break;
 
-                     }
 
-                 case "Actors":
 
-                 case "GuestStars":
 
-                     {
 
-                         foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonType.Actor }))
 
-                         {
 
-                             if (string.IsNullOrWhiteSpace(p.Name))
 
-                             {
 
-                                 continue;
 
-                             }
 
-                             item.AddPerson(p);
 
-                         }
 
-                         break;
 
-                     }
 
-                 case "Trailer":
 
-                     {
 
-                         var val = reader.ReadElementContentAsString();
 
-                         if (!string.IsNullOrWhiteSpace(val))
 
-                         {
 
-                             item.AddTrailerUrl(val);
 
-                         }
 
-                         break;
 
-                     }
 
-                 case "ProductionYear":
 
-                     {
 
-                         var val = reader.ReadElementContentAsString();
 
-                         if (!string.IsNullOrWhiteSpace(val))
 
-                         {
 
-                             int ProductionYear;
 
-                             if (int.TryParse(val, out ProductionYear) && ProductionYear > 1850)
 
-                             {
 
-                                 item.ProductionYear = ProductionYear;
 
-                             }
 
-                         }
 
-                         break;
 
-                     }
 
-                 case "Rating":
 
-                 case "IMDBrating":
 
-                     {
 
-                         var rating = reader.ReadElementContentAsString();
 
-                         if (!string.IsNullOrWhiteSpace(rating))
 
-                         {
 
-                             float val;
 
-                             if (float.TryParse(rating, out val))
 
-                             {
 
-                                 item.CommunityRating = val;
 
-                             }
 
-                         }
 
-                         break;
 
-                     }
 
-                 case "FirstAired":
 
-                     {
 
-                         var firstAired = reader.ReadElementContentAsString();
 
-                         if (!string.IsNullOrWhiteSpace(firstAired))
 
-                         {
 
-                             DateTime airDate;
 
-                             if (DateTime.TryParse(firstAired, out airDate) && airDate.Year > 1850)
 
-                             {
 
-                                 item.PremiereDate = airDate.ToUniversalTime();
 
-                                 item.ProductionYear = airDate.Year;
 
-                             }
 
-                         }
 
-                         break;
 
-                     }
 
-                 case "TMDbId":
 
-                     var tmdb = reader.ReadElementContentAsString();
 
-                     if (!string.IsNullOrWhiteSpace(tmdb))
 
-                     {
 
-                         item.SetProviderId(MetadataProviders.Tmdb, tmdb);
 
-                     }
 
-                     break;
 
-                 case "TVcomId":
 
-                     var TVcomId = reader.ReadElementContentAsString();
 
-                     if (!string.IsNullOrWhiteSpace(TVcomId))
 
-                     {
 
-                         item.SetProviderId(MetadataProviders.Tvcom, TVcomId);
 
-                     }
 
-                     break;
 
-                 case "IMDB_ID":
 
-                 case "IMDB":
 
-                 case "IMDbId":
 
-                     var IMDbId = reader.ReadElementContentAsString();
 
-                     if (!string.IsNullOrWhiteSpace(IMDbId))
 
-                     {
 
-                         item.SetProviderId(MetadataProviders.Imdb, IMDbId);
 
-                     }
 
-                     break;
 
-                 case "Genres":
 
-                     FetchFromGenresNode(reader.ReadSubtree(), item);
 
-                     break;
 
-                 case "Persons":
 
-                     FetchDataFromPersonsNode(reader.ReadSubtree(), item);
 
-                     break;
 
-                 case "ParentalRating":
 
-                     FetchFromParentalRatingNode(reader.ReadSubtree(), item);
 
-                     break;
 
-                 case "Studios":
 
-                     FetchFromStudiosNode(reader.ReadSubtree(), item);
 
-                     break;
 
-                 default:
 
-                     reader.Skip();
 
-                     break;
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// Fetches from taglines node.
 
-         /// </summary>
 
-         /// <param name="reader">The reader.</param>
 
-         /// <param name="item">The item.</param>
 
-         private void FetchFromTaglinesNode(XmlReader reader, T item)
 
-         {
 
-             reader.MoveToContent();
 
-             while (reader.Read())
 
-             {
 
-                 if (reader.NodeType == XmlNodeType.Element)
 
-                 {
 
-                     switch (reader.Name)
 
-                     {
 
-                         case "Tagline":
 
-                             {
 
-                                 var val = reader.ReadElementContentAsString();
 
-                                 if (!string.IsNullOrWhiteSpace(val))
 
-                                 {
 
-                                     item.AddTagline(val);
 
-                                 }
 
-                                 break;
 
-                             }
 
-                         default:
 
-                             reader.Skip();
 
-                             break;
 
-                     }
 
-                 }
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// Fetches from genres node.
 
-         /// </summary>
 
-         /// <param name="reader">The reader.</param>
 
-         /// <param name="item">The item.</param>
 
-         private void FetchFromGenresNode(XmlReader reader, T item)
 
-         {
 
-             reader.MoveToContent();
 
-             while (reader.Read())
 
-             {
 
-                 if (reader.NodeType == XmlNodeType.Element)
 
-                 {
 
-                     switch (reader.Name)
 
-                     {
 
-                         case "Genre":
 
-                             {
 
-                                 var genre = reader.ReadElementContentAsString();
 
-                                 if (!string.IsNullOrWhiteSpace(genre))
 
-                                 {
 
-                                     item.AddGenre(genre);
 
-                                 }
 
-                                 break;
 
-                             }
 
-                         default:
 
-                             reader.Skip();
 
-                             break;
 
-                     }
 
-                 }
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// Fetches the data from persons node.
 
-         /// </summary>
 
-         /// <param name="reader">The reader.</param>
 
-         /// <param name="item">The item.</param>
 
-         private void FetchDataFromPersonsNode(XmlReader reader, T item)
 
-         {
 
-             reader.MoveToContent();
 
-             while (reader.Read())
 
-             {
 
-                 if (reader.NodeType == XmlNodeType.Element)
 
-                 {
 
-                     switch (reader.Name)
 
-                     {
 
-                         case "Person":
 
-                             {
 
-                                 item.AddPeople(GetPersonsFromXmlNode(reader.ReadSubtree()));
 
-                                 break;
 
-                             }
 
-                         default:
 
-                             reader.Skip();
 
-                             break;
 
-                     }
 
-                 }
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// Fetches from studios node.
 
-         /// </summary>
 
-         /// <param name="reader">The reader.</param>
 
-         /// <param name="item">The item.</param>
 
-         private void FetchFromStudiosNode(XmlReader reader, T item)
 
-         {
 
-             reader.MoveToContent();
 
-             while (reader.Read())
 
-             {
 
-                 if (reader.NodeType == XmlNodeType.Element)
 
-                 {
 
-                     switch (reader.Name)
 
-                     {
 
-                         case "Studio":
 
-                             {
 
-                                 var studio = reader.ReadElementContentAsString();
 
-                                 if (!string.IsNullOrWhiteSpace(studio))
 
-                                 {
 
-                                     item.AddStudio(studio);
 
-                                 }
 
-                                 break;
 
-                             }
 
-                         default:
 
-                             reader.Skip();
 
-                             break;
 
-                     }
 
-                 }
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// Fetches from parental rating node.
 
-         /// </summary>
 
-         /// <param name="reader">The reader.</param>
 
-         /// <param name="item">The item.</param>
 
-         private void FetchFromParentalRatingNode(XmlReader reader, T item)
 
-         {
 
-             reader.MoveToContent();
 
-             while (reader.Read())
 
-             {
 
-                 if (reader.NodeType == XmlNodeType.Element)
 
-                 {
 
-                     switch (reader.Name)
 
-                     {
 
-                         case "Value":
 
-                             {
 
-                                 var ratingString = reader.ReadElementContentAsString();
 
-                                 int rating = 7;
 
-                                 if (!string.IsNullOrWhiteSpace(ratingString))
 
-                                 {
 
-                                     int.TryParse(ratingString, out rating);
 
-                                 }
 
-                                 switch (rating)
 
-                                 {
 
-                                     case -1:
 
-                                         item.OfficialRating = "NR";
 
-                                         break;
 
-                                     case 0:
 
-                                         item.OfficialRating = "UR";
 
-                                         break;
 
-                                     case 1:
 
-                                         item.OfficialRating = "G";
 
-                                         break;
 
-                                     case 3:
 
-                                         item.OfficialRating = "PG";
 
-                                         break;
 
-                                     case 4:
 
-                                         item.OfficialRating = "PG-13";
 
-                                         break;
 
-                                     case 5:
 
-                                         item.OfficialRating = "NC-17";
 
-                                         break;
 
-                                     case 6:
 
-                                         item.OfficialRating = "R";
 
-                                         break;
 
-                                 }
 
-                                 break;
 
-                             }
 
-                         default:
 
-                             reader.Skip();
 
-                             break;
 
-                     }
 
-                 }
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// Gets the persons from XML node.
 
-         /// </summary>
 
-         /// <param name="reader">The reader.</param>
 
-         /// <returns>IEnumerable{PersonInfo}.</returns>
 
-         private IEnumerable<PersonInfo> GetPersonsFromXmlNode(XmlReader reader)
 
-         {
 
-             var names = new List<string>();
 
-             var type = string.Empty;
 
-             var role = string.Empty;
 
-             reader.MoveToContent();
 
-             while (reader.Read())
 
-             {
 
-                 if (reader.NodeType == XmlNodeType.Element)
 
-                 {
 
-                     switch (reader.Name)
 
-                     {
 
-                         case "Name":
 
-                             names.AddRange(SplitNames(reader.ReadElementContentAsString()));
 
-                             break;
 
-                         case "Type":
 
-                             {
 
-                                 var val = reader.ReadElementContentAsString();
 
-                                 if (!string.IsNullOrWhiteSpace(val))
 
-                                 {
 
-                                     type = val;
 
-                                 }
 
-                                 break;
 
-                             }
 
-                         case "Role":
 
-                             {
 
-                                 var val = reader.ReadElementContentAsString();
 
-                                 if (!string.IsNullOrWhiteSpace(val))
 
-                                 {
 
-                                     role = val;
 
-                                 }
 
-                                 break;
 
-                             }
 
-                         default:
 
-                             reader.Skip();
 
-                             break;
 
-                     }
 
-                 }
 
-             }
 
-             return names.Select(n => new PersonInfo { Name = n, Role = role, Type = type });
 
-         }
 
-         /// <summary>
 
-         /// Used to split names of comma or pipe delimeted genres and people
 
-         /// </summary>
 
-         /// <param name="value">The value.</param>
 
-         /// <returns>IEnumerable{System.String}.</returns>
 
-         private IEnumerable<string> SplitNames(string value)
 
-         {
 
-             value = value ?? string.Empty;
 
-             // Only split by comma if there is no pipe in the string
 
-             // We have to be careful to not split names like Matthew, Jr.
 
-             var separator = value.IndexOf('|') == -1 ? ',' : '|';
 
-             value = value.Trim().Trim(separator);
 
-             return string.IsNullOrWhiteSpace(value) ? new string[] { } : value.Split(separator, StringSplitOptions.RemoveEmptyEntries);
 
-         }
 
-     }
 
- }
 
 
  |