public static XmlElement LoadShow(this XmlDocument doc, string guidName, HdConnectProgram program) { Console.WriteLine("Loading Program: " + program.Title); //Create the entry for the program var eleProgram = doc.CreateElement(string.Empty, "programme", string.Empty); eleProgram.SetAttribute("start", Time.UnixTimeStampToDateTime(program.StartTime).ToLocalTime().ToString(DateFormat) + " " + Time.GetOffset()); eleProgram.SetAttribute("stop", Time.UnixTimeStampToDateTime(program.EndTime).ToLocalTime().ToString(DateFormat) + " " + Time.GetOffset()); eleProgram.SetAttribute("channel", guidName); //Add the title var eleTitle = doc.CreateElement(string.Empty, "title", string.Empty); eleTitle.SetAttribute("lang", "en"); var eleTitleText = doc.CreateTextNode(program.Title); eleTitle.AppendChild(eleTitleText); eleProgram.AppendChild(eleTitle); //Add a sub-title var eleEpisodeTitle = doc.CreateElement(string.Empty, "sub-title", string.Empty); eleEpisodeTitle.SetAttribute("lang", "en"); var eleEpisodeTitleText = doc.CreateTextNode(program.EpisodeTitle); eleEpisodeTitle.AppendChild(eleEpisodeTitleText); eleProgram.AppendChild(eleEpisodeTitle); //Add a Description var eleDesc = doc.CreateElement(string.Empty, "desc", string.Empty); eleDesc.SetAttribute("lang", "en"); var eleDescText = doc.CreateTextNode(program.Synopsis); eleDesc.AppendChild(eleDescText); eleProgram.AppendChild(eleDesc); //Hd home run doesn't provide credits, put an empty xml entry there. var eleCredits = doc.CreateElement(string.Empty, "credits", string.Empty); eleProgram.AppendChild(eleCredits); /*We need to provide the episode information in xmltv_ns for Plex to recognize it as a series, * but HdHomeRun doesn't provide it, so we need to derive if from there * Friendly version. */ bool addedEpisode = false; if (!string.IsNullOrEmpty(program.EpisodeNumber)) { var eleEpisodeNumber = doc.CreateElement(string.Empty, "episode-num", string.Empty); eleEpisodeNumber.SetAttribute("system", "onscreen"); var eleEpisodeNumberText = doc.CreateTextNode(program.EpisodeNumber); eleEpisodeNumber.AppendChild(eleEpisodeNumberText); eleProgram.AppendChild(eleEpisodeNumber); var parts = program.EpisodeNumber.Split('E'); string season = parts[0].Substring(1); string episode = parts[1]; string v = season + " . " + episode + " . 0/1"; var eleEpisodeNumber1 = doc.CreateElement(string.Empty, "episode-num", string.Empty); eleEpisodeNumber1.SetAttribute("system", "xmltv_ns"); var eleEpisodeNumberText1 = doc.CreateTextNode(v); eleEpisodeNumber1.AppendChild(eleEpisodeNumberText1); eleProgram.AppendChild(eleEpisodeNumber1); //Add a category of series. var eleSeries = doc.CreateElement(string.Empty, "category", string.Empty); eleSeries.SetAttribute("lang", "en"); var eleSeriesText = doc.CreateTextNode("series"); eleSeries.AppendChild(eleSeriesText); eleProgram.AppendChild(eleSeries); addedEpisode = true; } if (program.OriginalAirdate > 0) { //Add when it was previously shown var prevShown = doc.CreateElement(string.Empty, "previously-shown", string.Empty); prevShown.SetAttribute("start", Time.UnixTimeStampToDateTime(program.OriginalAirdate + 86400).ToString(DateFormat) + " " + Time.GetOffset()); eleProgram.AppendChild(prevShown); } //What image to show for the thumbnail var elePosterUrl = doc.CreateElement(string.Empty, "icon", string.Empty); elePosterUrl.SetAttribute("src", program.ImageURL); eleProgram.AppendChild(elePosterUrl); //Just put stereo, HdHomeRun doesn't provide this info var eleAudio = doc.CreateElement(string.Empty, "audio", string.Empty); var eleAudioChild = doc.CreateElement(string.Empty, "stereo", string.Empty); var eleAudioChildText = doc.CreateTextNode("stereo"); eleAudioChild.AppendChild(eleAudioChildText); eleAudio.AppendChild(eleAudioChild); eleProgram.AppendChild(eleAudio); //Just put normal subtitles, HdHomeRun doesn't provide this information var eleSubTitles = doc.CreateElement(string.Empty, "subtitles", string.Empty); eleSubTitles.SetAttribute("type", "teletext"); eleProgram.AppendChild(eleSubTitles); if (program.Filter == null) { return(eleProgram); } bool foundMovieCategory = false; foreach (string filter in program.Filter) { if (filter.Equals("movies")) { foundMovieCategory = true; } } //If it is not a Movie... then give it a series so that it doesn't show up in the movie listing... if (!foundMovieCategory && !addedEpisode) { var eleFE = doc.CreateElement(string.Empty, "episode-num", string.Empty); eleFE.SetAttribute("xmltv_ns", DateTimeToEpisode()); eleProgram.AppendChild(eleFE); var eleFE1 = doc.CreateElement(string.Empty, "episode-num", string.Empty); eleFE1.SetAttribute("onscreen", DatetimeToEpisodeFriendly()); eleProgram.AppendChild(eleFE1); var eleCategory1 = doc.CreateElement(string.Empty, "category", string.Empty); eleCategory1.SetAttribute("lang", "en"); var eleCategoryText1 = doc.CreateTextNode("series"); eleCategory1.AppendChild(eleCategoryText1); eleProgram.AppendChild(eleCategory1); } //For each entry in filter, add it as a category foreach (string filter in program.Filter) { var eleCategory = doc.CreateElement(string.Empty, "category", string.Empty); eleCategory.SetAttribute("lang", "en"); var eleCategoryText = doc.CreateTextNode(filter.ToLower()); eleCategory.AppendChild(eleCategoryText); eleProgram.AppendChild(eleCategory); } return(eleProgram); }
public static XmlElement LoadShow(this XmlDocument doc, string guidName, HdConnectProgram program) { Console.WriteLine("Processing Show: " + program.Title); //Create the entry for the program var eleProgram = doc.CreateElement(string.Empty, "programme", string.Empty); eleProgram.SetAttribute("start", Time.UnixTimeStampToDateTime(program.StartTime).ToLocalTime().ToString(DateFormat) + " " + Time.GetOffset()); eleProgram.SetAttribute("stop", Time.UnixTimeStampToDateTime(program.EndTime).ToLocalTime().ToString(DateFormat) + " " + Time.GetOffset()); eleProgram.SetAttribute("channel", guidName); //Add the title eleProgram.AppendChild(CreateElement(doc, "title", program.Title)); //Add a sub-title eleProgram.AppendChild(CreateElement(doc, "sub-title", program.EpisodeTitle)); //Add a Description eleProgram.AppendChild(CreateElement(doc, "desc", program.Synopsis)); eleProgram.AppendChild(CreateElement(doc, "credits", "")); //What image to show for the thumbnail eleProgram.AppendChild(CreateElement(doc, "credits", "")); eleProgram.AppendChild(CreateElement(doc, "icon", "", "src", program.ImageURL)); //Just put normal subtitles, HdHomeRun doesn't provide this information eleProgram.AppendChild(CreateElement(doc, "subtitles", "", "type", "teletext")); //Just put stereo, HdHomeRun doesn't provide this info var eleAudio = doc.CreateElement(string.Empty, "audio", string.Empty); var eleAudioChild = doc.CreateElement(string.Empty, "stereo", string.Empty); var eleAudioChildText = doc.CreateTextNode("stereo"); eleAudioChild.AppendChild(eleAudioChildText); eleAudio.AppendChild(eleAudioChild); eleProgram.AppendChild(eleAudio); bool invalidPreviousShown = false; string programRating = string.Empty; List <string> filtersToAdd = new List <string>(); var imdbData = Program.FindTitle(program.Title); if (imdbData != null) { filtersToAdd.Add(imdbData.TitleType); foreach (string word in imdbData.Genres) { if (!word.Equals("\\N", StringComparison.InvariantCultureIgnoreCase)) { if (!filtersToAdd.Contains(word.ToLower().Trim())) { filtersToAdd.Add(word.ToLower().Trim()); } } } if (!filtersToAdd.Contains(imdbData.TitleType.ToLower())) { filtersToAdd.Add(imdbData.TitleType.ToLower()); } programRating = Program.FindRating(imdbData.TitleID); } if (program.Filter != null && program.Filter.Count > 0) { foreach (string filter in program.Filter) { string filterstringLower = filter.ToLower().Trim(); if (filtersToAdd.Contains(filterstringLower)) { continue; } if (filterstringLower.Equals("news", StringComparison.InvariantCultureIgnoreCase)) { invalidPreviousShown = true; } //# Does HdHomeRun think it is a movie? if (filterstringLower.Equals("movies", StringComparison.InvariantCultureIgnoreCase) || filterstringLower.Equals("movie", StringComparison.InvariantCultureIgnoreCase)) { Console.WriteLine("---------------------- MOVIE TAG IN HdHomeRun FILTER"); //# Does the movie not exist in the IMDB database? //#if (imdbData == 0 ): //# print ("HdHomeRun ------------------------> Is Movie!!!!!") //# No, so lets just trust HdHomeRun if (string.IsNullOrEmpty(program.EpisodeNumber)) { if (!filtersToAdd.Contains("movie")) { filtersToAdd.Add("movie"); } } continue; } if (!filtersToAdd.Contains(filterstringLower)) { filtersToAdd.Add(filterstringLower); } } } List <string> words = GetWords(program.Title.ToLower()); if (words.Contains("news")) { eleProgram.AppendChild(CreateElement(doc, "category", "news")); invalidPreviousShown = true; } else { if (words.Contains("sports") || words.Contains("football") || words.Contains("soccer") || words.Contains("baseball") || words.Contains("dance") || words.Contains("dancing") || words.Contains("olympics") || words.Contains("cycling") || words.Contains("billiards") || words.Contains("basketball") || words.Contains("athletics") || words.Contains("boxing") || words.Contains("cricket") || words.Contains("fencing")) { filtersToAdd.Add("sports"); } } bool foundMovie = false; if (string.IsNullOrEmpty(program.EpisodeNumber)) { if (filtersToAdd.Any(filter => filter.Equals("movie", StringComparison.InvariantCultureIgnoreCase) || filter.Equals("movies", StringComparison.InvariantCultureIgnoreCase))) { Console.WriteLine("-------------------------->Found MOVIE"); foundMovie = true; eleProgram.AppendChild(CreateElement(doc, "category", "movie")); } } foreach (string filter in filtersToAdd) { if (filter.Equals("series", StringComparison.InvariantCultureIgnoreCase) || filter.Equals("movie", StringComparison.InvariantCultureIgnoreCase)) { continue; } eleProgram.AppendChild(CreateElement(doc, "category", filter.ToLower().Trim())); } if (!string.IsNullOrEmpty(program.EpisodeNumber)) { eleProgram.AppendChild(CreateElement(doc, "episode-num", program.EpisodeNumber, "system", "onscreen")); var parts = program.EpisodeNumber.Split('E'); string season = (int.Parse(parts[0].Substring(1).Trim()) - 1).ToString(); string episode = (int.Parse(parts[1].Trim()) - 1).ToString(); string v = season + "." + episode + ". 0/1"; eleProgram.AppendChild(CreateElement(doc, "episode-num", v, "system", "xmltv_ns")); //Add a category of series. eleProgram.AppendChild(CreateElement(doc, "category", "series")); } else { if (!foundMovie) { eleProgram.AppendChild(CreateElement(doc, "episode-num", DatetimeToEpisodeFriendly(program.StartTime), "system", "onscreen")); eleProgram.AppendChild(CreateElement(doc, "episode-num", DateTimeToEpisode(program.StartTime), "system", "xmltv_ns")); eleProgram.AppendChild(CreateElement(doc, "category", "series")); } } //Something is funny with previously shown, it appears to have info into the future //I think it has to do w/ some of the feeds being west coast and me //being on the east coast. //So just to fix this, if the previous shown > the air date we just don't include it. if (program.OriginalAirdate <= 0 || invalidPreviousShown) { return(eleProgram); } if (Time.UnixTimeStampToDateTime(program.OriginalAirdate).ToLocalTime().AddDays(1) < Time.UnixTimeStampToDateTime(program.StartTime).ToLocalTime()) { //Add when it was previously shown var prevShown = doc.CreateElement(string.Empty, "previously-shown", string.Empty); prevShown.SetAttribute("start", Time.UnixTimeStampToDateTime(program.OriginalAirdate).ToLocalTime().AddDays(1).ToString(DateFormat) + " " + Time.GetOffset()); eleProgram.AppendChild(prevShown); } else { Console.WriteLine("Previous Shown in FUTURE.... Watch out Marty McFly!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); } if (!string.IsNullOrEmpty(programRating)) { var eleRating = doc.CreateElement(string.Empty, "rating", string.Empty); eleRating.SetAttribute("system", "IMDB"); var eleRatingChild = doc.CreateElement(string.Empty, "value", string.Empty); var eleRatingChildText = doc.CreateTextNode(programRating); eleRatingChild.AppendChild(eleRatingChildText); eleRating.AppendChild(eleRatingChild); eleProgram.AppendChild(eleRating); } return(eleProgram); }