public override void Fetch() { string location = Item.Path; metadataFile = XmlLocation; if (location == null || metadataFile == null) return; var series = Item as Series; metadataFileDate = new FileInfo(metadataFile).LastWriteTimeUtc; XmlDocument metadataDoc = new XmlDocument(); metadataDoc.Load(metadataFile); var seriesNode = metadataDoc.SelectSingleNode("//Series"); if (seriesNode == null) { // support for sams metadata scraper seriesNode = metadataDoc.SelectSingleNode("Item"); } // exit if we have no data. if (seriesNode == null) { return; } string id = series.TVDBSeriesId = seriesNode.SafeGetString("id"); var p = seriesNode.SafeGetString("banner"); if (p != null) { string bannerFile = System.IO.Path.Combine(location, System.IO.Path.GetFileName(p)); if (File.Exists(bannerFile)) Item.BannerImagePath = bannerFile; else { // we don't have the banner file! } } Item.Overview = seriesNode.SafeGetString("Overview"); if (Item.Overview != null) Item.Overview = Item.Overview.Replace("\n\n", "\n"); Item.Name = seriesNode.SafeGetString("SeriesName"); //used for extended actor information. will fetch actors with roles stored in <Persons> tag foreach (XmlNode node in seriesNode.SelectNodes("Persons/Person[Type='Actor']")) { try { if (series.Actors == null) series.Actors = new List<Actor>(); var name = node.SelectSingleNode("Name").InnerText; var role = node.SafeGetString("Role", ""); var actor = new Actor() { Name = name, Role = role }; series.Actors.Add(actor); } catch { // fall through i dont care, one less actor } } //used for backwards compatibility. Will fetch actors stored in the <Actors> tag if (series.Actors == null || series.Actors.Count == 0) { string actors = seriesNode.SafeGetString("Actors"); if (actors != null) { if (series.Actors == null) series.Actors = new List<Actor>(); foreach (string n in actors.Trim('|').Split('|')) { series.Actors.Add(new Actor { Name = n }); } } } string genres = seriesNode.SafeGetString("Genre"); if (genres != null) series.Genres = new List<string>(genres.Trim('|').Split('|')); series.MpaaRating = seriesNode.SafeGetString("ContentRating"); string runtimeString = seriesNode.SafeGetString("Runtime"); if (!string.IsNullOrEmpty(runtimeString)) { int runtime; if (int.TryParse(runtimeString.Split(' ')[0], out runtime)) series.RunningTime = runtime; } // this causes a problem on localized windows version with a comma seperator in regional options // http://community.mediabrowser.tv/permalinks/3263/ratings-for-series-aren-t-calculated-properly-with-non-us-regional-settings //string ratingString = seriesNode.SafeGetString("Rating",); //if (ratingString != null) { // float imdbRating; // if (float.TryParse(ratingString, out imdbRating)) { // series.ImdbRating = imdbRating; // } //} //SafeGetSingle only works directly from metadataDoc //temporary fix, should be handled better series.ImdbRating = metadataDoc.SafeGetSingle("Series/Rating", (float)-1, 10); series.Status = seriesNode.SafeGetString("Status"); series.AirDay = seriesNode.SafeGetString("Airs_DayOfWeek"); series.AirTime = seriesNode.SafeGetString("Airs_Time"); string studios = seriesNode.SafeGetString("Network"); if (studios != null) { series.Studios = new List<string>(studios.Split('|')); //series.Studios = new List<Studio>(); //foreach (string n in studios.Split('|')) //{ // series.Studios.Add(new Studio { Name = n }); //} } series.CustomRating = seriesNode.SafeGetString("CustomRating"); series.CustomPIN = seriesNode.SafeGetString("CustomPIN"); // Some XML files may have incorrect series ids so do not try to set the item, // this would really mess up the internet provid }
public override void Fetch() { var movie = Item as IMovie; Debug.Assert(movie != null); string mfile = XmlLocation(); string location = Path.GetDirectoryName(mfile); if (File.Exists(mfile)) { DateTime modTime = new FileInfo(mfile).LastWriteTimeUtc; lastWriteTime = modTime; myMovieFile = mfile; XmlDocument doc = new XmlDocument(); doc.Load(mfile); string s = doc.SafeGetString("Title/LocalTitle"); if ((s == null) || (s == "")) s = doc.SafeGetString("Title/OriginalTitle"); movie.Name = s; movie.SortName = doc.SafeGetString("Title/SortTitle"); movie.Overview = doc.SafeGetString("Title/Description"); if (movie.Overview != null) movie.Overview = movie.Overview.Replace("\n\n", "\n"); movie.TagLine = doc.SafeGetString("Title/TagLine"); movie.Plot = doc.SafeGetString("Title/Plot"); //if added date is in xml override the file/folder date - this isn't gonna work cuz it's already filled in... DateTime added = DateTime.MinValue; DateTime.TryParse(doc.SafeGetString("Title/Added"), out added); if (added > DateTime.MinValue) movie.DateCreated = added; string front = doc.SafeGetString("Title/Covers/Front"); if ((front != null) && (front.Length > 0)) { front = Path.Combine(location, front); if (File.Exists(front)) Item.PrimaryImagePath = front; } if (string.IsNullOrEmpty(movie.DisplayMediaType)) { movie.DisplayMediaType = doc.SafeGetString("Title/Type", ""); switch (movie.DisplayMediaType.ToLower()) { case "blu-ray": movie.DisplayMediaType = MediaType.BluRay.ToString(); break; case "dvd": movie.DisplayMediaType = MediaType.DVD.ToString(); break; case "hd dvd": movie.DisplayMediaType = MediaType.HDDVD.ToString(); break; case "": movie.DisplayMediaType = null; break; } } if (movie.ProductionYear == null) { int y = doc.SafeGetInt32("Title/ProductionYear", 0); if (y > 1850) movie.ProductionYear = y; } if (movie.ImdbRating == null) { float i = doc.SafeGetSingle("Title/IMDBrating", (float)-1, (float)10); if (i >= 0) movie.ImdbRating = i; } if (movie.ImdbID == null) { if (!string.IsNullOrEmpty(doc.SafeGetString("Title/IMDB"))) { movie.ImdbID = doc.SafeGetString("Title/IMDB"); } else { movie.ImdbID = doc.SafeGetString("Title/IMDbId"); } } if (movie.TmdbID == null) { movie.TmdbID = doc.SafeGetString("Title/TMDbId"); } foreach (XmlNode node in doc.SelectNodes("Title/Persons/Person[Type='Actor']")) { try { if (movie.Actors == null) movie.Actors = new List<Actor>(); var name = node.SelectSingleNode("Name").InnerText; var role = node.SafeGetString("Role", ""); var actor = new Actor() { Name = name, Role = role }; movie.Actors.Add(actor); } catch { // fall through i dont care, one less actor } } foreach (XmlNode node in doc.SelectNodes("Title/Persons/Person[Type='Director']")) { try { if (movie.Directors == null) movie.Directors = new List<string>(); movie.Directors.Add(node.SelectSingleNode("Name").InnerText); } catch { // fall through i dont care, one less director } } foreach (XmlNode node in doc.SelectNodes("Title/Genres/Genre")) { try { if (movie.Genres == null) movie.Genres = new List<string>(); movie.Genres.Add(node.InnerText); } catch { // fall through i dont care, one less genre } } foreach (XmlNode node in doc.SelectNodes("Title/Studios/Studio")) { try { if (movie.Studios == null) movie.Studios = new List<string>(); movie.Studios.Add(node.InnerText); //movie.Studios.Add(new Studio { Name = node.InnerText }); } catch { // fall through i dont care, one less actor } } if (movie.TrailerPath == null) movie.TrailerPath = doc.SafeGetString("Title/LocalTrailer/URL"); if (movie.MpaaRating == null) movie.MpaaRating = doc.SafeGetString("Title/MPAARating"); if (movie.MpaaRating == null) { int i = doc.SafeGetInt32("Title/ParentalRating/Value", (int)7); switch (i) { case -1: movie.MpaaRating = "NR"; break; case 0: movie.MpaaRating = "UR"; break; case 1: movie.MpaaRating = "G"; break; case 3: movie.MpaaRating = "PG"; break; case 4: movie.MpaaRating = "PG-13"; break; case 5: movie.MpaaRating = "NC-17"; break; case 6: movie.MpaaRating = "R"; break; default: movie.MpaaRating = null; break; } } //if there is a custom rating - use it (if not rating will be filled with MPAARating) if (movie.CustomRating == null) movie.CustomRating = doc.SafeGetString("Title/CustomRating"); if (movie.CustomPIN == null) movie.CustomPIN = doc.SafeGetString("Title/CustomPIN"); if (movie.AspectRatio == null) movie.AspectRatio = doc.SafeGetString("Title/AspectRatio"); //MetaBrowser Custom MediaInfo Support if (movie.MediaInfo == null) movie.MediaInfo = new MediaInfoData(); //we need to decode metabrowser strings to format and profile string audio = doc.SafeGetString("Title/MediaInfo/Audio/Codec", ""); if (audio != "") { switch (audio.ToLower()) { case "dts-es": case "dts-es matrix": case "dts-es discrete": movie.MediaInfo.OverrideData.AudioFormat = "DTS"; movie.MediaInfo.OverrideData.AudioProfile = "ES"; break; case "dts-hd hra": case "dts-hd high resolution": movie.MediaInfo.OverrideData.AudioFormat = "DTS"; movie.MediaInfo.OverrideData.AudioProfile = "HRA"; break; case "dts-hd ma": case "dts-hd master": movie.MediaInfo.OverrideData.AudioFormat = "DTS"; movie.MediaInfo.OverrideData.AudioProfile = "MA"; break; case "dolby digital": case "dolby digital surround ex": case "dolby surround": movie.MediaInfo.OverrideData.AudioFormat = "AC-3"; break; case "dolby digital plus": movie.MediaInfo.OverrideData.AudioFormat = "E-AC-3"; break; case "dolby truehd": movie.MediaInfo.OverrideData.AudioFormat = "AC-3"; movie.MediaInfo.OverrideData.AudioProfile = "TrueHD"; break; case "mp2": movie.MediaInfo.OverrideData.AudioFormat = "MPEG Audio"; movie.MediaInfo.OverrideData.AudioProfile = "Layer 2"; break; case "other": break; default: movie.MediaInfo.OverrideData.AudioFormat = audio; break; } } movie.MediaInfo.OverrideData.AudioStreamCount = doc.SelectNodes("Title/MediaInfo/Audio/Codec[text() != '']").Count; movie.MediaInfo.OverrideData.AudioChannelCount = doc.SafeGetString("Title/MediaInfo/Audio/Channels", ""); movie.MediaInfo.OverrideData.AudioBitRate = doc.SafeGetInt32("Title/MediaInfo/Audio/BitRate"); string video = doc.SafeGetString("Title/MediaInfo/Video/Codec", ""); if (video != "") { switch (video.ToLower()) { case "sorenson h.263": movie.MediaInfo.OverrideData.VideoCodec = "Sorenson H263"; break; case "h.262": movie.MediaInfo.OverrideData.VideoCodec = "MPEG-2 Video"; break; case "h.264": movie.MediaInfo.OverrideData.VideoCodec = "AVC"; break; default: movie.MediaInfo.OverrideData.VideoCodec = video; break; } } movie.MediaInfo.OverrideData.VideoBitRate = doc.SafeGetInt32("Title/MediaInfo/Video/BitRate"); movie.MediaInfo.OverrideData.Height = doc.SafeGetInt32("Title/MediaInfo/Video/Height"); movie.MediaInfo.OverrideData.Width = doc.SafeGetInt32("Title/MediaInfo/Video/Width"); movie.MediaInfo.OverrideData.ScanType = doc.SafeGetString("Title/MediaInfo/Video/ScanType", ""); movie.MediaInfo.OverrideData.VideoFPS = doc.SafeGetString("Title/MediaInfo/Video/FrameRate", ""); int rt = doc.SafeGetInt32("Title/MediaInfo/Video/Duration", 0); if (rt > 0) movie.MediaInfo.OverrideData.RunTime = rt; else movie.MediaInfo.OverrideData.RunTime = doc.SafeGetInt32("Title/RunningTime", 0); if (movie.MediaInfo.RunTime > 0) movie.RunningTime = movie.MediaInfo.RunTime; XmlNodeList nodes = doc.SelectNodes("Title/MediaInfo/Audio/Language"); List<string> Langs = new List<string>(); foreach (XmlNode node in nodes) { string m = node.InnerText; if (!string.IsNullOrEmpty(m)) Langs.Add(m); } if (Langs.Count > 1) { movie.MediaInfo.OverrideData.AudioLanguages = String.Join(" / ", Langs.ToArray()); } else { movie.MediaInfo.OverrideData.AudioLanguages = doc.SafeGetString("Title/MediaInfo/Audio/Language", ""); } nodes = doc.SelectNodes("Title/MediaInfo/Subtitle/Language"); List<string> Subs = new List<string>(); foreach (XmlNode node in nodes) { string n = node.InnerText; if (!string.IsNullOrEmpty(n)) Subs.Add(n); } if (Subs.Count > 1) { movie.MediaInfo.OverrideData.Subtitles = String.Join(" / ", Subs.ToArray()); } else { movie.MediaInfo.OverrideData.Subtitles = doc.SafeGetString("Title/MediaInfo/Subtitle/Language", ""); } } }
public ActorItemWrapper(Actor actor, FolderModel parent) { this.Actor = actor; this.parent = parent; }