public OMLSDKTitle LoadTitle(XPathNavigator dvdNavigator, bool lookForDiskInfo) { OMLSDKTitle title = new OMLSDKTitle(); OMLSDKVideoFormat videoFormat = OMLSDKVideoFormat.DVD; string notes = string.Empty; var discs = new Dictionary<string, string>(); // The key is on the form "1a", "10b", etc - the value is the description foreach (XPathNavigator dvdElement in dvdNavigator.SelectChildren(XPathNodeType.Element)) { switch (dvdElement.Name) { case "ID": title.MetadataSourceID = dvdElement.Value; break; case "MediaTypes": videoFormat = HandleMediaTypes(dvdElement); break; case "UPC": title.UPC = dvdElement.Value; break; case "Title": title.Name = dvdElement.Value; break; case "OriginalTitle": title.OriginalName = dvdElement.Value; break; case "SortTitle": title.SortName = dvdElement.Value; break; case "CountryOfOrigin": title.CountryOfOrigin = dvdElement.Value; break; /*case "ProductionYear": // Set to January first in the appropriate year in lack of better... int releaseYear; if (TryReadItemInt(dvdElement, out releaseYear)) { title.ReleaseDate = new DateTime(releaseYear, 1, 1); } break;*/ // Fix from DVDJunkie // http://www.ornskov.dk/forum/index.php?topic=1605.msg12171#msg12171 case "ProductionYear": string ryear = dvdElement.Value; try { if (!string.IsNullOrEmpty(ryear)) title.ProductionYear = Convert.ToInt32(ryear); } catch (FormatException) { } break; case "Released": string rdate = dvdElement.Value; try { if (!string.IsNullOrEmpty(rdate)) title.ReleaseDate = DateTime.Parse(rdate); } catch (ArgumentException) { } catch (FormatException) { } break; case "RunningTime": int runningTime; if (TryReadItemInt(dvdElement, out runningTime)) title.Runtime = runningTime; break; case "Rating": title.ParentalRating = dvdElement.Value; break; case "RatingDetails": title.ParentalRatingReason = dvdElement.Value; break; case "Genres": foreach (XPathNavigator genreNavigator in dvdElement.Select("Genre[. != '']")) { title.AddGenre(genreNavigator.Value); } break; case "Format": HandleFormat(title, dvdElement); break; case "Studios": var studioNavigator = dvdElement.SelectSingleNode("Studio[. != '']"); if (studioNavigator != null) title.Studio = studioNavigator.Value; break; case "Audio": HandleAudio(title, dvdElement); break; case "Subtitles": foreach (XPathNavigator subtitleNavigator in dvdElement.SelectChildren("Subtitle", string.Empty)) { title.AddSubtitle(subtitleNavigator.Value); } break; case "Actors": HandleActors(title, dvdElement); break; case "Credits": HandleCredits(title, dvdElement); break; case "Review": ReadFilmReview(title, dvdElement); break; case "Overview": string synopsis = removeFormattingRegex.Replace(dvdElement.Value, string.Empty); title.Synopsis = removeExtraLinebreaksRegex.Replace(synopsis, "\r\n").Trim(); break; case "Discs": discs = HandleDiscs(dvdElement); break; case "Notes": notes = dvdElement.Value; break; case "PurchaseInfo": HandlePurchaseInfo(title, dvdElement); break; } } if (lookForDiskInfo) MergeDiscInfo(title, videoFormat, discs, notes); ApplyTags(title, dvdNavigator); return title; }
private void loadDataFromNavigatorToTitle(ref XPathNavigator navigator, ref OMLSDKTitle newTitle) { SDKUtilities.DebugLine("[MyMoviesImporter] Loading data for a new title"); newTitle.MetadataSourceID = GetChildNodesValue(navigator, "WebServiceID"); #region covers SDKUtilities.DebugLine("[MyMoviesImporter] Scanning for {0} node", "Covers"); if (navigator.MoveToChild("Covers", "")) { SDKUtilities.DebugLine("[MyMoviesImporter] Covers found, processing"); SDKUtilities.DebugLine("[MyMoviesImporter] Scanning for {0} node", "Front"); if (navigator.MoveToChild("Front", "")) { string imagePath = navigator.Value; string finalImagePath = FindFinalImagePath(imagePath); SDKUtilities.DebugLine("[MyMoviesImporter] Final image path is: {0}", finalImagePath); if (File.Exists(finalImagePath)) { SDKUtilities.DebugLine("[MyMoviesImporter] This file appears to be valid, we'll set it on the title"); newTitle.FrontCoverPath = finalImagePath; } navigator.MoveToParent(); } SDKUtilities.DebugLine("[MyMoviesImporter] Scanning for {0} node", "Back"); if (navigator.MoveToChild("Back", "")) { string imagePath = navigator.Value; if (File.Exists(imagePath)) { SDKUtilities.DebugLine("[MyMoviesImporter] Found Back cover image"); newTitle.BackCoverPath = imagePath; } navigator.MoveToParent(); } navigator.MoveToParent(); } #endregion newTitle.Synopsis = GetChildNodesValue(navigator, "Description"); #region production year if (navigator.MoveToChild("ProductionYear", "")) { SDKUtilities.DebugLine("[MyMoviesImporter] Found production year, I hope the format is something we can read"); try { string year = navigator.Value; if (!string.IsNullOrEmpty(year)) { DateTime rls_date = new DateTime(int.Parse(year), 1, 1); if (rls_date != null) { SDKUtilities.DebugLine("[MyMoviesImporter] Got it, loading the production year"); newTitle.ReleaseDate = rls_date; } } navigator.MoveToParent(); } catch (Exception e) { navigator.MoveToParent(); SDKUtilities.DebugLine("[MyMoviesImporter] error reading ProductionYear: " + e.Message); } } #endregion #region parental rating (mpaa rating) if (navigator.MoveToChild("ParentalRating", "")) { SDKUtilities.DebugLine("[MyMoviesImporter] Scanning for the ParentalRating"); if (navigator.HasChildren) { string ratingId = GetChildNodesValue(navigator, "Value"); if (!string.IsNullOrEmpty(ratingId)) { int mmRatingId; if (int.TryParse(ratingId, out mmRatingId)) switch (mmRatingId) { case 0: SDKUtilities.DebugLine("[MyMoviesImporter] This appears to be unrated"); newTitle.ParentalRating = "Unrated"; break; case 1: SDKUtilities.DebugLine("[MyMoviesImporter] This appears to be rated G"); newTitle.ParentalRating = "G"; break; case 2: SDKUtilities.DebugLine("[MyMoviesImporter] I have no idea what rating this is"); break; case 3: SDKUtilities.DebugLine("[MyMoviesImporter] This appears to be rated PG"); newTitle.ParentalRating = "PG"; break; case 4: SDKUtilities.DebugLine("[MyMoviesImporter] This appears to be rated PG13"); newTitle.ParentalRating = "PG13"; break; case 5: SDKUtilities.DebugLine("[MyMoviesImporter] I have NO idea what rating this is"); break; case 6: SDKUtilities.DebugLine("[MyMoviesImporter] This appears to be rated R"); newTitle.ParentalRating = "R"; break; } else SDKUtilities.DebugLine("[MyMoviesImporter] Error parsing rating: {0} not a number", ratingId); } string ratingReason = GetChildNodesValue(navigator, "Description"); if (!string.IsNullOrEmpty(ratingReason)) newTitle.ParentalRatingReason = ratingReason; } navigator.MoveToParent(); } #endregion newTitle.Runtime = Int32.Parse(GetChildNodesValue(navigator, "RunningTime")); #region persons if (navigator.MoveToChild("Persons", "")) { SDKUtilities.DebugLine("[MyMoviesImporter] Beginning the long, painful process of scanning people"); if (navigator.HasChildren) { XPathNodeIterator nIter = navigator.SelectChildren("Person", ""); if (navigator.MoveToFirstChild()) { XPathNavigator localNav = navigator.CreateNavigator(); navigator.MoveToParent(); for (int i = 0; i < nIter.Count; i++) { string name = GetChildNodesValue(localNav, "Name"); string role = GetChildNodesValue(localNav, "Role"); string type = GetChildNodesValue(localNav, "Type"); if (!string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(type)) { switch (type) { case "Actor": SDKUtilities.DebugLine("[MyMoviesImporter] actor {0}, {1}", name, role); newTitle.AddActingRole(name, role); break; case "Director": SDKUtilities.DebugLine("[MyMoviesImporter] director {0}", name); newTitle.AddDirector(new OMLSDKPerson(name)); break; default: break; } } localNav.MoveToNext("Person", ""); } } } navigator.MoveToParent(); } #endregion #region studio (s) if (navigator.MoveToChild("Studios", "")) { SDKUtilities.DebugLine("[MyMoviesImporter] Ahh... Studios (pssst.. we only copy the last entry from here... dont tell anyone)"); if (navigator.HasChildren) { XPathNodeIterator nIter = navigator.SelectChildren("Studio", ""); if (navigator.MoveToFirstChild()) { XPathNavigator localNav = navigator.CreateNavigator(); navigator.MoveToParent(); for (int i = 0; i < nIter.Count; i++) { newTitle.Studio = localNav.Value; } } } navigator.MoveToParent(); } #endregion newTitle.CountryOfOrigin = GetChildNodesValue(navigator, "Country"); newTitle.AspectRatio = GetChildNodesValue(navigator, "AspectRatio"); newTitle.VideoStandard = GetChildNodesValue(navigator, "VideoStandard"); newTitle.OriginalName = GetChildNodesValue(navigator, "OriginalTitle"); newTitle.SortName = GetChildNodesValue(navigator, "SortTitle"); #region genres if (navigator.MoveToChild("Genres", "")) { SDKUtilities.DebugLine("[MyMoviesImporter] Genres... good old genres"); XPathNodeIterator nIter = navigator.SelectChildren("Genre", ""); if (navigator.MoveToFirstChild()) { XPathNavigator localNav = navigator.CreateNavigator(); navigator.MoveToParent(); for (int i = 0; i < nIter.Count; i++) { newTitle.AddGenre(localNav.Value); localNav.MoveToNext("Genre", ""); } } navigator.MoveToParent(); } #endregion #region audio tracks if (navigator.MoveToChild("AudioTracks", "")) { SDKUtilities.DebugLine("[MyMoviesImporter] AudioTracks.. yeah, like you can even change them anyway"); XPathNodeIterator nIter = navigator.SelectChildren("AudioTrack", ""); if (navigator.MoveToFirstChild()) { XPathNavigator localNav = navigator.CreateNavigator(); navigator.MoveToParent(); for (int i = 0; i < nIter.Count; i++) { string audioLanguage = localNav.GetAttribute("Language", ""); string audioType = localNav.GetAttribute("Type", ""); string audioChannels = localNav.GetAttribute("Channels", ""); if (!string.IsNullOrEmpty(audioLanguage)) { string audioTrackString = audioLanguage; if (!string.IsNullOrEmpty(audioType)) audioTrackString += string.Format(", {0}", audioType); if (!string.IsNullOrEmpty(audioChannels)) audioTrackString += string.Format(", {0}", audioChannels); SDKUtilities.DebugLine("[MyMoviesImporter] Got one: {0}, {1}, {2}", audioLanguage, audioType, audioChannels); newTitle.AddAudioTrack(audioTrackString); } localNav.MoveToNext("AudioTrack", ""); } } navigator.MoveToParent(); } #endregion #region watched status (Submitted by yodine from our forums) if (navigator.MoveToChild("Watched", "")) { navigator.MoveToParent(); // move back, we just wanted to know this field existed. SDKUtilities.DebugLine("[MyMoviesImporter] Found Watched status. Trying to decode"); string watched = GetChildNodesValue(navigator, "Watched"); if (!string.IsNullOrEmpty(watched)) { if (Boolean.Parse(watched)) newTitle.WatchedCount++; } } #endregion #region subtitles if (navigator.MoveToChild("Subtitles", "")) { SDKUtilities.DebugLine("[MyMoviesImporter] Subtitles here we come!"); if (navigator.GetAttribute("NotPresent", "").CompareTo("False") == 0) { XPathNodeIterator nIter = navigator.SelectChildren("Subtitle", ""); if (navigator.MoveToFirstChild()) { XPathNavigator localNav = navigator.CreateNavigator(); navigator.MoveToParent(); for (int i = 0; i < nIter.Count; i++) { string subtitleLanguage = localNav.GetAttribute("Language", ""); if (!string.IsNullOrEmpty(subtitleLanguage)) { SDKUtilities.DebugLine("[MyMoviesImporter] Subtitle {0}", subtitleLanguage); newTitle.AddSubtitle(subtitleLanguage); } localNav.MoveToNext("Subtitle", ""); } } } navigator.MoveToParent(); } #endregion #region discs if (navigator.MoveToChild("Discs", "")) { SDKUtilities.DebugLine("[MyMoviesImporter] Discs... ok here is the good one, we'll passing this off to some other method to handle."); XPathNodeIterator nIter = navigator.SelectChildren("Disc", ""); if (navigator.MoveToFirstChild()) { XPathNavigator localNav = navigator.CreateNavigator(); extractDisksFromXML(nIter, localNav, newTitle); navigator.MoveToParent(); } navigator.MoveToParent(); } #endregion }
public override void ProcessFile(string file) { XmlDocument xDoc = new XmlDocument(); xDoc.Load(file); XmlNodeList nodeList = xDoc.SelectNodes("//movielist/movie"); foreach (XmlNode movieNode in nodeList) { OMLSDKTitle newTitle = new OMLSDKTitle(); XPathNavigator nav = movieNode.CreateNavigator(); newTitle.MetadataSourceID = GetChildNodesValue(nav, "id"); if (nav.MoveToChild("coverfront", "")) { newTitle.FrontCoverPath = nav.Value; nav.MoveToParent(); } if (nav.MoveToChild("coverback", "")) { newTitle.BackCoverPath = nav.Value; nav.MoveToParent(); } if (nav.MoveToChild("country", "")) { if (nav.MoveToChild("displayname", "")) { newTitle.CountryOfOrigin = nav.Value; nav.MoveToParent(); } nav.MoveToParent(); } if (nav.MoveToChild("title", "")) { newTitle.Name = nav.Value; nav.MoveToParent(); } /*if (nav.MoveToChild("plot", "")) { newTitle.Synopsis = nav.Value; nav.MoveToParent(); }*/ // Fix from DVDJunkie // http://www.ornskov.dk/forum/index.php?topic=1605.msg12171#msg12171 if (nav.MoveToChild("plot", "")) { string plot = nav.Value; plot = plot.Replace("<B>", ""); plot = plot.Replace("<b>", ""); plot = plot.Replace("</B>", ""); plot = plot.Replace("</b>", ""); plot = plot.Replace("<I>", ""); plot = plot.Replace("<i>", ""); plot = plot.Replace("</I>", ""); plot = plot.Replace("</i>", ""); newTitle.Synopsis = plot; nav.MoveToParent(); } /*if (nav.MoveToChild("releasedate", "")) { XPathNavigator localNav = nav.CreateNavigator(); //XmlNode rdYear = nav.SelectSingleNode("year"); //XmlNode rdMonth = nav.SelectSingleNode("month"); //XmlNode rdDay = nav.SelectSingleNode("day"); //if (rdYear != null && rdMonth != null && rdDay != null) //{ // DateTime rd = new DateTime(Int32.Parse(rdYear.InnerText), // Int32.Parse(rdMonth.InnerText), // Int32.Parse(rdDay.InnerText)); // if (rd != null) // newTitle.ReleaseDate = rd; //} nav.MoveToParent(); }*/ // Fix from DVDJunkie // http://www.ornskov.dk/forum/index.php?topic=1605.msg12171#msg12171 //hwh 12-7-09 if (nav.MoveToChild("releasedate", "")) { XPathNavigator localNav = nav.CreateNavigator(); string rdate = GetChildNodesValue(localNav, "date"); try { if (!string.IsNullOrEmpty(rdate)) newTitle.ProductionYear = Convert.ToInt32(rdate); } catch (FormatException) { } nav.MoveToParent(); } //hwh 12-7-09 if (nav.MoveToChild("dvdreleasedate", "")) { XPathNavigator localNav = nav.CreateNavigator(); string rdate = GetChildNodesValue(localNav, "date"); try { if (!string.IsNullOrEmpty(rdate)) newTitle.ReleaseDate = DateTime.Parse(rdate); } catch (ArgumentException) { } catch (FormatException) { } nav.MoveToParent(); } if (nav.MoveToChild("mpaarating", "")) { newTitle.ParentalRating = GetChildNodesValue(nav, "displayname"); nav.MoveToParent(); } if (nav.MoveToChild("upc", "")) { newTitle.UPC = nav.Value; nav.MoveToParent(); } if (nav.MoveToChild("runtimeminutes", "")) { //newTitle.Runtime = nav.ValueAsInt; newTitle.Runtime = ConvertStringToInt(nav.Value); nav.MoveToParent(); } if (nav.MoveToChild("genres", "")) { XPathNodeIterator genreIter = nav.SelectChildren("genre", ""); if (nav.MoveToFirstChild()) { XPathNavigator localNav = nav.CreateNavigator(); nav.MoveToParent(); for (int i = 0; i < genreIter.Count; i++) { newTitle.AddGenre(GetChildNodesValue(localNav, "displayname")); localNav.MoveToNext("genre", ""); } } nav.MoveToParent(); } if (nav.MoveToChild("cast", "")) { XPathNodeIterator starIter = nav.SelectChildren("star", ""); if (nav.MoveToFirstChild()) { XPathNavigator localNav = nav.CreateNavigator(); nav.MoveToParent(); for (int i = 0; i < starIter.Count; i++) { string role = GetChildNodesValue(localNav, "role"); XPathNavigator personNav = localNav.SelectSingleNode("person"); if (personNav != null) { string name = GetChildNodesValue(personNav, "displayname"); if (!string.IsNullOrEmpty(role) && !string.IsNullOrEmpty(name)) { newTitle.AddActingRole(name, role); } } localNav.MoveToNext("star", ""); } } nav.MoveToParent(); } if (nav.MoveToChild("crew", "")) { XPathNodeIterator crewMemberIter = nav.SelectChildren("crewmember", ""); if (nav.MoveToFirstChild()) { XPathNavigator localNav = nav.CreateNavigator(); nav.MoveToParent(); for (int i = 0; i < crewMemberIter.Count; i++) { string role = GetChildNodesValue(localNav, "role"); XPathNavigator cmNav = localNav.SelectSingleNode("person"); if (cmNav != null) { string name = GetChildNodesValue(cmNav, "displayname"); if (!string.IsNullOrEmpty(role) && !string.IsNullOrEmpty(name)) { switch (role.ToLower()) { case "director": newTitle.AddDirector(new OMLSDKPerson(name)); break; case "writer": newTitle.AddWriter(new OMLSDKPerson(name)); break; default: break; } } } localNav.MoveToNext("crewmember", ""); } } nav.MoveToParent(); } if (nav.MoveToChild("subtitles", "")) { XPathNodeIterator subtitleIter = nav.SelectChildren("subtitle", ""); if (nav.MoveToFirstChild()) { XPathNavigator localNav = nav.CreateNavigator(); nav.MoveToParent(); for (int i = 0; i < subtitleIter.Count; i++) { newTitle.AddSubtitle(GetChildNodesValue(localNav, "displayname")); localNav.MoveToNext("subtitle", ""); } } nav.MoveToParent(); } if (nav.MoveToChild("audios", "")) { XPathNodeIterator audioIter = nav.SelectChildren("audio", ""); if (nav.MoveToFirstChild()) { XPathNavigator localNav = nav.CreateNavigator(); nav.MoveToParent(); for (int i = 0; i < audioIter.Count; i++) { newTitle.AddAudioTrack(GetChildNodesValue(localNav, "displayname")); localNav.MoveToNext("audio", ""); } } nav.MoveToParent(); } if (nav.MoveToChild("studios", "")) { XPathNodeIterator studioIter = nav.SelectChildren("studio", ""); if (nav.MoveToFirstChild()) { XPathNavigator localNav = nav.CreateNavigator(); nav.MoveToParent(); for (int i = 0; i < studioIter.Count; i++) { newTitle.Studio = GetChildNodesValue(localNav, "displayname"); localNav.MoveToNext("studio", ""); } } nav.MoveToParent(); } if (nav.MoveToChild("links", "")) { XPathNodeIterator linkIter = nav.SelectChildren("link", ""); if (nav.MoveToFirstChild()) { XPathNavigator localNav = nav.CreateNavigator(); nav.MoveToParent(); for (int i = 0; i < linkIter.Count; i++) { string type = GetChildNodesValue(localNav, "urltype"); if (!string.IsNullOrEmpty(type)) { if (type.ToUpper().CompareTo("MOVIE") == 0) { string path = GetChildNodesValue(localNav, "url"); if (!string.IsNullOrEmpty(path)) { try { FileInfo fi = new FileInfo(path); if (fi.Exists) { string ext = fi.Extension.Substring(1); if (!string.IsNullOrEmpty(ext)) { if (IsSupportedFormat(ext)) { OMLSDKDisk disk = new OMLSDKDisk(); disk.Format = (OMLSDKVideoFormat)Enum.Parse(typeof(OMLSDKVideoFormat), ext, true); disk.Path = path; disk.Name = GetChildNodesValue(localNav, "description"); newTitle.AddDisk(disk); } } } } catch (Exception ex) { SDKUtilities.DebugLine("MovieCollectorzPlugin: {0}", ex); } } } } localNav.MoveToNext("link", ""); } } } if (ValidateTitle(newTitle)) { try { AddTitle(newTitle); } catch (Exception e) { SDKUtilities.DebugLine("[MovieCollectorzPlugin] Error adding row: " + e.Message); } } else SDKUtilities.DebugLine("[MovieCollectorzPlugin] Error saving row"); } }