示例#1
0
        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);
        }