コード例 #1
0
        public void ProcessStarRating(XmlReader reader, XmlTvProgram result)
        {
            /*
             * <star-rating>
             * <value>3/3</value>
             * </star-rating>
             */

            reader.ReadToDescendant("value");
            if (reader.Name == "value")
            {
                var textValue = reader.ReadElementContentAsString();
                if (textValue.Contains("/"))
                {
                    var components = textValue.Split('/');
                    if (float.TryParse(components[0], out var value))
                    {
                        result.StarRating = value;
                    }
                }
            }
            else
            {
                reader.Skip();
            }
        }
コード例 #2
0
ファイル: XmlTvReader.cs プロジェクト: al-9/Jellyfin.XmlTv
        public void ProcessStarRating(XmlReader reader, XmlTvProgram result)
        {
            /*
             * <star-rating>
             * <value>3/3</value>
             * </star-rating>
             */

            reader.ReadToDescendant("value");
            if (reader.Name == "value")
            {
                var textValue = reader.ReadElementContentAsString();
                int index     = textValue.IndexOf('/', StringComparison.Ordinal);
                if (index != -1)
                {
                    var substring = textValue.Substring(index);
                    if (float.TryParse(substring, out var value))
                    {
                        result.StarRating = value;
                    }
                }
            }
            else
            {
                reader.Skip();
            }
        }
コード例 #3
0
        private ProgramInfo GetProgramInfo(XmlTvProgram p, ListingsProviderInfo info)
        {
            var episodeTitle = p.Episode == null ? null : p.Episode.Title;

            var programInfo = new ProgramInfo
            {
                ChannelId       = p.ChannelId,
                EndDate         = GetDate(p.EndDate),
                EpisodeNumber   = p.Episode == null ? null : p.Episode.Episode,
                EpisodeTitle    = episodeTitle,
                Genres          = p.Categories,
                Id              = String.Format("{0}_{1:O}", p.ChannelId, p.StartDate), // Construct an id from the channel and start date,
                StartDate       = GetDate(p.StartDate),
                Name            = p.Title,
                Overview        = p.Description,
                ProductionYear  = !p.CopyrightDate.HasValue ? (int?)null : p.CopyrightDate.Value.Year,
                SeasonNumber    = p.Episode == null ? null : p.Episode.Series,
                IsSeries        = p.Episode != null,
                IsRepeat        = p.IsPreviouslyShown && !p.IsNew,
                IsPremiere      = p.Premiere != null,
                IsKids          = p.Categories.Any(c => info.KidsCategories.Contains(c, StringComparer.OrdinalIgnoreCase)),
                IsMovie         = p.Categories.Any(c => info.MovieCategories.Contains(c, StringComparer.OrdinalIgnoreCase)),
                IsNews          = p.Categories.Any(c => info.NewsCategories.Contains(c, StringComparer.OrdinalIgnoreCase)),
                IsSports        = p.Categories.Any(c => info.SportsCategories.Contains(c, StringComparer.OrdinalIgnoreCase)),
                ImageUrl        = p.Icon != null && !String.IsNullOrEmpty(p.Icon.Source) ? p.Icon.Source : null,
                HasImage        = p.Icon != null && !String.IsNullOrEmpty(p.Icon.Source),
                OfficialRating  = p.Rating != null && !String.IsNullOrEmpty(p.Rating.Value) ? p.Rating.Value : null,
                CommunityRating = p.StarRating.HasValue ? p.StarRating.Value : (float?)null,
                SeriesId        = p.Episode != null?p.Title.GetMD5().ToString("N") : null
            };

            if (!string.IsNullOrWhiteSpace(p.ProgramId))
            {
                programInfo.ShowId = p.ProgramId;
            }
            else
            {
                var uniqueString = (p.Title ?? string.Empty) + (episodeTitle ?? string.Empty) + (p.IceTvEpisodeNumber ?? string.Empty);

                if (programInfo.SeasonNumber.HasValue)
                {
                    uniqueString = "-" + programInfo.SeasonNumber.Value.ToString(CultureInfo.InvariantCulture);
                }
                if (programInfo.EpisodeNumber.HasValue)
                {
                    uniqueString = "-" + programInfo.EpisodeNumber.Value.ToString(CultureInfo.InvariantCulture);
                }

                programInfo.ShowId = uniqueString.GetMD5().ToString("N");
            }

            if (programInfo.IsMovie)
            {
                programInfo.IsSeries      = false;
                programInfo.EpisodeNumber = null;
                programInfo.EpisodeTitle  = null;
            }

            return(programInfo);
        }
コード例 #4
0
ファイル: XmlTvReader.cs プロジェクト: jimyx17/Emby.XmlTv
        public void ProcessEpisodeNum(XmlReader reader, XmlTvProgram result)
        {
            /*
             * <episode-num system="dd_progid">EP00003026.0666</episode-num>
             * <episode-num system="onscreen">2706</episode-num>
             * <episode-num system="xmltv_ns">.26/0.</episode-num>
             */

            var episodeSystem = reader.GetAttribute("system");

            switch (episodeSystem)
            {
            case "dd_progid":
                ParseEpisodeDataForProgramId(reader, result);
                break;

            case "icetv":
                result.IceTvEpisodeNumber = reader.ReadElementContentAsString();
                break;

            case "xmltv_ns":
                ParseEpisodeDataForXmlTvNs(reader, result);
                break;

            case "onscreen":
                ParseEpisodeDataForOnScreen(reader, result);
                break;

            default:     // Handles empty string and nulls
                reader.Skip();
                break;
            }
        }
コード例 #5
0
        public static string GetProgrammeDetail(this XmlTvProgram programme, XmlTvChannel channel)
        {
            var builder = new StringBuilder();

            builder.AppendFormat("Channel:           {0} - {1}\r\n", channel.Id, channel.DisplayName);
            builder.AppendFormat("Start Date:        {0:G}\r\n", programme.StartDate);
            builder.AppendFormat("End Date:          {0:G}\r\n", programme.EndDate);
            builder.AppendFormat("Name:              {0}\r\n", programme.Title);
            builder.AppendFormat("Episode Detail:    {0}\r\n", programme.Episode);
            builder.AppendFormat("Episode Title:     {0}\r\n", programme.Episode.Title);
            builder.AppendFormat("Description:       {0}\r\n", programme.Description);
            builder.AppendFormat("Categories:        {0}\r\n", string.Join(", ", programme.Categories));
            builder.AppendFormat("Countries:         {0}\r\n", string.Join(", ", programme.Countries));
            builder.AppendFormat("Credits:           {0}\r\n", string.Join(", ", programme.Credits));
            builder.AppendFormat("Rating:            {0}\r\n", programme.Rating);
            builder.AppendFormat("Star Rating:       {0}\r\n", programme.StarRating.HasValue ? programme.StarRating.Value.ToString() : string.Empty);
            builder.AppendFormat("Previously Shown:  {0:G}\r\n", programme.PreviouslyShown);
            builder.AppendFormat("Copyright Date:    {0:G}\r\n", programme.CopyrightDate);
            builder.AppendFormat("Is Repeat:         {0}\r\n", programme.IsPreviouslyShown);

            var icon = programme.Icons.FirstOrDefault();

            builder.AppendFormat("Icon:              {0}\r\n", icon != null ? icon.ToString() : string.Empty);
            builder.AppendLine("-------------------------------------------------------");
            return(builder.ToString());
        }
コード例 #6
0
        public void ParseImdbSystem(XmlReader reader, XmlTvProgram result)
        {
            // <episode-num system="imdb.com">series/tt1837576</episode-num>
            // <episode-num system="imdb.com">episode/tt3288596</episode-num>

            var value = reader.ReadElementContentAsString();

            if (string.IsNullOrWhiteSpace(value))
            {
                return;
            }
            var parts = value.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);

            if (parts.Length != 2)
            {
                return;
            }

            if (string.Equals(parts[0], "series", StringComparison.OrdinalIgnoreCase))
            {
                result.SeriesProviderIds["imdb"] = parts[1];
            }

            else if (string.Equals(parts[0], "episode", StringComparison.OrdinalIgnoreCase))
            {
                result.ProviderIds["imdb"] = parts[1];
            }
        }
コード例 #7
0
        private void PopulateHeader(XmlReader reader, XmlTvProgram result)
        {
            result.ChannelId = reader.GetAttribute("channel");

            var startValue = reader.GetAttribute("start");

            if (string.IsNullOrEmpty(startValue))
            {
                // Log.Error("  programme#{0} doesnt contain a start date", iChannel);
                result.StartDate = DateTimeOffset.MinValue;
            }
            else
            {
                result.StartDate = ParseDate(startValue).GetValueOrDefault();
            }


            var endValue = reader.GetAttribute("stop");

            if (string.IsNullOrEmpty(endValue))
            {
                // Log.Error("  programme#{0} doesnt contain an end date", iChannel);
                result.EndDate = DateTimeOffset.MinValue;
            }
            else
            {
                result.EndDate = ParseDate(endValue).GetValueOrDefault();
            }
        }
コード例 #8
0
 public void ProcessSubTitle(XmlReader reader, XmlTvProgram result)
 {
     /*
      * <sub-title lang="en">Gino&apos;s Italian Escape - Islands in the Sun: Southern Sardinia Celebrate the Sea</sub-title>
      * <sub-title lang="en">8782</sub-title>
      */
     ProcessNode(reader, s => result.Episode.Title = s, _language);
 }
コード例 #9
0
ファイル: XmlTvReader.cs プロジェクト: al-9/Jellyfin.XmlTv
        public void ProcessCountry(XmlReader reader, XmlTvProgram result)
        {
            /*
             * <country>Canadá</country>
             * <country>EE.UU</country>
             */

            ProcessNode(reader, s => result.Countries.Add(s), _language);
        }
コード例 #10
0
ファイル: XmlTvReader.cs プロジェクト: al-9/Jellyfin.XmlTv
 public void ProcessPremiereNode(XmlReader reader, XmlTvProgram result)
 {
     // <title lang="en">Gino&apos;s Italian Escape</title>
     ProcessNode(
         reader,
         s =>
     {
         (result.Premiere ??= new XmlTvPremiere()).Details = s;
     },
コード例 #11
0
        public void ParseEpisodeDataForProgramId(XmlReader reader, XmlTvProgram result)
        {
            var value = reader.ReadElementContentAsString();

            if (!string.IsNullOrWhiteSpace(value))
            {
                result.ProgramId = value;
            }
        }
コード例 #12
0
ファイル: XmlTvReader.cs プロジェクト: al-9/Jellyfin.XmlTv
        public void ProcessCategory(XmlReader reader, XmlTvProgram result)
        {
            /*
             * <category lang="en">News</category>
             */

            ProcessMultipleNodes(reader, s => result.Categories.Add(s), _language);

            // result.Categories.Add(reader.ReadElementContentAsString());
        }
コード例 #13
0
 public void ProcessPremiereNode(XmlReader reader, XmlTvProgram result)
 {
     // <title lang="en">Gino&apos;s Italian Escape</title>
     ProcessNode(
         reader,
         s =>
     {
         result.Premiere = new XmlTvPremiere(s);
     },
         _language);
 }
コード例 #14
0
        public void ProcessEpisodeNum(XmlReader reader, XmlTvProgram result)
        {
            /*
             * <episode-num system="dd_progid">EP00003026.0666</episode-num>
             * <episode-num system="onscreen">2706</episode-num>
             * <episode-num system="xmltv_ns">.26/0.</episode-num>
             */

            var episodeSystem = reader.GetAttribute("system");

            switch (episodeSystem)
            {
            case "dd_progid":
                ParseEpisodeDataForProgramId(reader, result);
                break;

            case "icetv":
                result.ProviderIds["icetv"] = reader.ReadElementContentAsString();
                break;

            case "xmltv_ns":
                ParseEpisodeDataForXmlTvNs(reader, result);
                break;

            case "onscreen":
                ParseEpisodeDataForOnScreen(reader, result);
                break;

            case "thetvdb.com":
                ParseTvdbSystem(reader, result);
                break;

            case "imdb.com":
                ParseImdbSystem(reader, result);
                break;

            case "themoviedb.org":
                ParseMovieDbSystem(reader, result);
                break;

            case "SxxExx":
                // TODO
                // <episode-num system="SxxExx">S03E12</episode-num>
                reader.Skip();
                break;

            default:     // Handles empty string and nulls
                reader.Skip();
                break;
            }
        }
コード例 #15
0
ファイル: XmlTvReader.cs プロジェクト: al-9/Jellyfin.XmlTv
        private void ProcessCopyrightDate(XmlReader xmlProg, XmlTvProgram result)
        {
            var startValue = xmlProg.ReadElementContentAsString();

            if (string.IsNullOrEmpty(startValue))
            {
                result.CopyrightDate = null;
            }
            else
            {
                var copyrightDate = ParseDate(startValue);
                if (copyrightDate != null)
                {
                    result.CopyrightDate = copyrightDate;
                }
            }
        }
コード例 #16
0
        private void ProcessCopyrightDate(XmlReader xmlProg, XmlTvProgram result)
        {
            var startValue = xmlProg.ReadElementContentAsString();

            if (string.IsNullOrEmpty(startValue))
            {
                // Log.Error("  programme#{0} doesnt contain a start date", iChannel);
                result.CopyrightDate = null;
            }
            else
            {
                var copyrightDate = ParseDate(startValue);
                if (copyrightDate != null)
                {
                    result.CopyrightDate = copyrightDate;
                }
            }
        }
コード例 #17
0
        public void ParseMovieDbSystem(XmlReader reader, XmlTvProgram result)
        {
            // <episode-num system="thetvdb.com">series/248841</episode-num>
            // <episode-num system="thetvdb.com">episode/4749206</episode-num>

            var value = reader.ReadElementContentAsString();
            var parts = value.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);

            if (string.Equals(parts[0], "series", StringComparison.OrdinalIgnoreCase))
            {
                result.SeriesProviderIds["tmdb"] = parts[1];
            }

            else if (parts.Length == 1 || string.Equals(parts[0], "episode", StringComparison.OrdinalIgnoreCase))
            {
                result.ProviderIds["tmdb"] = parts.Last();
            }
        }
コード例 #18
0
        public void ParseEpisodeDataForOnScreen(XmlReader reader, XmlTvProgram result)
        {
            _ = reader;
            _ = result;

            // example: 'Episode #FFEE'
            // TODO: This could be textual - how do we populate an Int32

            // var value = reader.ReadElementContentAsString();
            // value = HttpUtility.HtmlDecode(value);
            // value = value.Replace(" ", "");

            // Take everything from the hash to the end.
            // var hashIndex = value.IndexOf('#');
            // if (hashIndex > -1)
            // {
            //     result.EpisodeNumber
            // }
        }
コード例 #19
0
 public void ProcessPremiereNode(XmlReader reader, XmlTvProgram result)
 {
     // <title lang="en">Gino&apos;s Italian Escape</title>
     ProcessNode(reader,
                 s =>
     {
         if (result.Premiere == null)
         {
             result.Premiere = new XmlTvPremiere()
             {
                 Details = s
             };
         }
         else
         {
             result.Premiere.Details = s;
         }
     }, _language);
 }
コード例 #20
0
ファイル: XmlTvReader.cs プロジェクト: jimyx17/Emby.XmlTv
        public void ParseEpisodeDataForXmlTvNs(XmlReader reader, XmlTvProgram result)
        {
            var value = reader.ReadElementContentAsString();

            value = value.Replace(" ", "");

            // Episode details
            var components = value.Split(new[] { "." }, StringSplitOptions.None);

            if (!string.IsNullOrEmpty(components[0]))
            {
                // Handle either "5/12" or "5"
                var seriesComponents = components[0].Split(new[] { "/" }, StringSplitOptions.None);
                result.Episode.Series = int.Parse(seriesComponents[0]) + 1; // handle the zero basing!
                if (seriesComponents.Count() == 2)
                {
                    result.Episode.SeriesCount = int.Parse(seriesComponents[1]);
                }
            }

            if (!string.IsNullOrEmpty(components[1]))
            {
                // Handle either "5/12" or "5"
                var episodeComponents = components[1].Split(new[] { "/" }, StringSplitOptions.None);
                result.Episode.Episode = int.Parse(episodeComponents[0]) + 1; // handle the zero basing!
                if (episodeComponents.Count() == 2)
                {
                    result.Episode.EpisodeCount = int.Parse(episodeComponents[1]);
                }
            }

            if (!string.IsNullOrEmpty(components[2]))
            {
                // Handle either "5/12" or "5"
                var partComponents = components[2].Split(new[] { "/" }, StringSplitOptions.None);
                result.Episode.Part = int.Parse(partComponents[0]) + 1; // handle the zero basing!
                if (partComponents.Count() == 2)
                {
                    result.Episode.PartCount = int.Parse(partComponents[1]);
                }
            }
        }
コード例 #21
0
        public void ProcessPreviouslyShown(XmlReader reader, XmlTvProgram result)
        {
            // <previously-shown start="20070708000000" />
            var value = reader.GetAttribute("start");

            if (!string.IsNullOrEmpty(value))
            {
                // TODO: this may not be correct = validate it
                result.PreviouslyShown = ParseDate(value);
                if (result.PreviouslyShown != result.StartDate)
                {
                    result.IsPreviouslyShown = true;
                }
            }
            else
            {
                result.IsPreviouslyShown = true;
            }

            reader.Skip(); // Move on
        }
コード例 #22
0
ファイル: XmlTvReader.cs プロジェクト: al-9/Jellyfin.XmlTv
        public void ParseSxxExxSystem(XmlReader reader, XmlTvProgram result)
        {
            // <episode-num system="SxxExx">S012E32</episode-num>

            var value = reader.ReadElementContentAsString();
            var res   = Regex.Match(value, "s([0-9]+)e([0-9]+)", RegexOptions.IgnoreCase);

            if (res.Success)
            {
                int parsedInt;

                if (int.TryParse(res.Groups[1].Value, out parsedInt))
                {
                    result.Episode.Series = parsedInt;
                }

                if (int.TryParse(res.Groups[2].Value, out parsedInt))
                {
                    result.Episode.Episode = parsedInt;
                }
            }
        }
コード例 #23
0
        public void ParseEpisodeDataForOnScreen(XmlReader reader, XmlTvProgram result)
        {
            //// example: 'Episode #FFEE'
            //serEpNum = ConvertHTMLToAnsi(nodeEpisodeNum);
            //int num1 = serEpNum.IndexOf("#", 0);
            //if (num1 < 0) num1 = 0;
            //episodeNum = CorrectEpisodeNum(serEpNum.Substring(num1, serEpNum.Length - num1), 0);

            var value = reader.ReadElementContentAsString();

            // value = HttpUtility.HtmlDecode(value);
            value = value.Replace(" ", "");

            var hashIndex = value.IndexOf("#", StringComparison.Ordinal);

            if (hashIndex > -1)
            {
                // Take everything from the hash to the end.
                //TODO: This could be textual - how do we populate an Int32
                // result.EpisodeNumber
            }
        }
コード例 #24
0
        public void ProcessRating(XmlReader reader, XmlTvProgram result)
        {
            /*
             * <rating system="MPAA">
             *  <value>TV-G</value>
             * </rating>
             */

            var system = reader.GetAttribute("system");

            reader.ReadToDescendant("value");
            if (reader.Name == "value")
            {
                result.Rating = new XmlTvRating(reader.ReadElementContentAsString())
                {
                    System = system
                };
            }
            else
            {
                reader.Skip();
            }
        }
コード例 #25
0
        private void PopulateHeader(XmlReader reader, XmlTvProgram result)
        {
            var startValue = reader.GetAttribute("start");

            if (string.IsNullOrEmpty(startValue))
            {
                result.StartDate = DateTimeOffset.MinValue;
            }
            else
            {
                result.StartDate = ParseDate(startValue).GetValueOrDefault();
            }

            var endValue = reader.GetAttribute("stop");

            if (string.IsNullOrEmpty(endValue))
            {
                result.EndDate = DateTimeOffset.MinValue;
            }
            else
            {
                result.EndDate = ParseDate(endValue).GetValueOrDefault();
            }
        }
コード例 #26
0
        public XmlTvProgram GetProgramme(XmlReader reader, string channelNumber, DateTime startDateUtc, DateTime endDateUtc)
        {
            var result = new XmlTvProgram();

            try
            {

                PopulateHeader(reader, result);

                // First up, validate that this is the correct channel, and programme is within the time we are expecting
                if (!string.Equals(result.ChannelId, channelNumber, StringComparison.OrdinalIgnoreCase))
                {
                    return null;
                }

                if (result.EndDate < startDateUtc || result.StartDate >= endDateUtc)
                {
                    return null;
                }

                using (var xmlProg = reader.ReadSubtree())
                {
                    xmlProg.ReadStartElement(); // now, xmlProg is positioned on the first sub-element of <programme>

                    // Read out the data for each node and process individually
                    while (!xmlProg.EOF)
                    {
                        if (xmlProg.NodeType == XmlNodeType.Element)
                        {
                            switch (xmlProg.Name)
                            {
                                case "title":
                                    ProcessTitleNode(xmlProg, result);
                                    break;
                                case "category":
                                    ProcessCategory(xmlProg, result);
                                    break;
                                case "country":
                                    ProcessCountry(xmlProg, result);
                                    break;
                                case "desc":
                                    ProcessDescription(xmlProg, result);
                                    break;
                                case "sub-title":
                                    ProcessSubTitle(xmlProg, result);
                                    break;
                                case "previously-shown":
                                    ProcessPreviouslyShown(xmlProg, result);
                                    break;
                                case "episode-num":
                                    ProcessEpisodeNum(xmlProg, result);
                                    break;
                                case "date": // Copyright date
                                    ProcessCopyrightDate(xmlProg, result);
                                    break;
                                case "star-rating": // Community Rating
                                    ProcessStarRating(xmlProg, result);
                                    break;
                                case "rating": // Certification Rating
                                    ProcessRating(xmlProg, result);
                                    break;
                                case "credits":
                                    ProcessCredits(xmlProg, result);
                                    break;
                                case "icon":
                                    result.Icon = ProcessIconNode(xmlProg);
                                    xmlProg.Skip();
                                    break;
                                case "premiere":
                                    ProcessPremiereNode(xmlProg, result);
                                    xmlProg.Skip();
                                    break;
                                default:
                                    // unknown, skip entire node
                                    xmlProg.Skip();
                                    break;
                            }
                        }
                        else
                        {
                            xmlProg.Read();
                        }
                    }
                }
                return result;
            }
            catch (Exception ex)
            {
                //Logger.ErrorException("Error parsing programme: {0}", ex, result);
                throw;
            }

        }
コード例 #27
0
 public void ProcessDescription(XmlReader reader, XmlTvProgram result)
 {
     ProcessNode(reader, s => result.Description = s, _language);
 }
コード例 #28
0
 private void ProcessCopyrightDate(XmlReader xmlProg, XmlTvProgram result)
 {
     var startValue = xmlProg.ReadElementContentAsString();
     if (string.IsNullOrEmpty(startValue))
     {
         // Log.Error("  programme#{0} doesnt contain a start date", iChannel);
         result.CopyrightDate = null;
     }
     else
     {
         var copyrightDate = ParseDate(startValue);
         if (copyrightDate != null)
         {
             result.CopyrightDate = copyrightDate;
         }
     }
 }
コード例 #29
0
        public void ProcessCredits(XmlReader xmlProg, XmlTvProgram result)
        {
            var creditsXml = xmlProg.ReadSubtree();
            creditsXml.ReadStartElement();

            while (!creditsXml.EOF)
            {
                if (creditsXml.NodeType == XmlNodeType.Element)
                {
                    XmlTvCredit credit = null;
                    switch (xmlProg.Name)
                    {
                        case "director":
                            credit = new XmlTvCredit() { Type = XmlTvCreditType.Director };
                            break;
                        case "actor":
                            credit = new XmlTvCredit() { Type = XmlTvCreditType.Actor };
                            break;
                        case "writer":
                            credit = new XmlTvCredit() { Type = XmlTvCreditType.Writer };
                            break;
                        case "adapter":
                            credit = new XmlTvCredit() { Type = XmlTvCreditType.Adapter };
                            break;
                        case "producer":
                            credit = new XmlTvCredit() { Type = XmlTvCreditType.Producer };
                            break;
                        case "composer":
                            credit = new XmlTvCredit() { Type = XmlTvCreditType.Composer };
                            break;
                        case "editor":
                            credit = new XmlTvCredit() { Type = XmlTvCreditType.Editor };
                            break;
                        case "presenter":
                            credit = new XmlTvCredit() { Type = XmlTvCreditType.Presenter };
                            break;
                        case "commentator":
                            credit = new XmlTvCredit() { Type = XmlTvCreditType.Commentator };
                            break;
                        case "guest":
                            credit = new XmlTvCredit() { Type = XmlTvCreditType.Guest };
                            break;
                    }

                    if (credit != null)
                    {
                        credit.Name = xmlProg.ReadElementContentAsString();
                        result.Credits.Add(credit);
                    }
                    else
                    {
                        creditsXml.Skip();
                    }
                }
                else
                    creditsXml.Read();
            }
        }
コード例 #30
0
        public void ProcessStarRating(XmlReader reader, XmlTvProgram result)
        {
            /*
             <star-rating>
              <value>3/3</value>
            </star-rating>
            */

            reader.ReadToDescendant("value");
            if (reader.Name == "value")
            {
                var textValue = reader.ReadElementContentAsString();
                if (textValue.Contains("/"))
                {
                    var components = textValue.Split('/');
                    float value;
                    if (float.TryParse(components[0], out value))
                    {
                        result.StarRating = value;
                    }
                }
            }
            else
            {
                reader.Skip();
            }
        }
コード例 #31
0
        public void ProcessCountry(XmlReader reader, XmlTvProgram result)
        {
            /*
            <country>Canadá</country>
            <country>EE.UU</country>
            */

            result.Countries = result.Countries ?? new List<string>();
            ProcessNode(reader, s => result.Countries.Add(s), _language);
        }
コード例 #32
0
 public void ProcessNew(XmlReader reader, XmlTvProgram result)
 {
     result.IsNew = true;
     reader.Skip(); // Move on
 }
コード例 #33
0
        public void ParseEpisodeDataForXmlTvNs(XmlReader reader, XmlTvProgram result)
        {
            var value = reader.ReadElementContentAsString();
            value = value.Replace(" ", "");

            // Episode details
            var components = value.Split(new[] { "." }, StringSplitOptions.None);

            if (!string.IsNullOrEmpty(components[0]))
            {
                // Handle either "5/12" or "5"
                var seriesComponents = components[0].Split(new[] { "/" }, StringSplitOptions.None);
                result.Episode.Series = int.Parse(seriesComponents[0]) + 1; // handle the zero basing!
                if (seriesComponents.Count() == 2)
                {
                    result.Episode.SeriesCount = int.Parse(seriesComponents[1]);
                }
            }

            if (!string.IsNullOrEmpty(components[1]))
            {
                // Handle either "5/12" or "5"
                var episodeComponents = components[1].Split(new[] { "/" }, StringSplitOptions.None);
                result.Episode.Episode = int.Parse(episodeComponents[0]) + 1; // handle the zero basing!
                if (episodeComponents.Count() == 2)
                {
                    result.Episode.EpisodeCount = int.Parse(episodeComponents[1]);
                }

            }

            if (!string.IsNullOrEmpty(components[2]))
            {
                // Handle either "5/12" or "5"
                var partComponents = components[2].Split(new[] { "/" }, StringSplitOptions.None);
                result.Episode.Part = int.Parse(partComponents[0]) + 1; // handle the zero basing!
                if (partComponents.Count() == 2)
                {
                    result.Episode.PartCount = int.Parse(partComponents[1]);
                }

            }
        }
コード例 #34
0
 public void ProcessDescription(XmlReader reader, XmlTvProgram result)
 {
     ProcessNode(reader, s => result.Description = s, _language);
 }
コード例 #35
0
        public void ProcessPreviouslyShown(XmlReader reader, XmlTvProgram result)
        {
            // <previously-shown start="20070708000000" />
            var value = reader.GetAttribute("start");
            if (!string.IsNullOrEmpty(value))
            {
                // TODO: this may not be correct = validate it
                result.PreviouslyShown = ParseDate(value);
                if (result.PreviouslyShown != result.StartDate)
                {
                    result.IsRepeat = true;
                }
            }

            reader.Skip(); // Move on
        }
コード例 #36
0
        public void ProcessCategory(XmlReader reader, XmlTvProgram result)
        {
            /*
            <category lang="en">News</category>
            */

            result.Categories = result.Categories ?? new List<string>();
            ProcessMultipleNodes(reader, s => result.Categories.Add(s), _language);

            //result.Categories.Add(reader.ReadElementContentAsString());
        }
コード例 #37
0
ファイル: XmlTvListingsProvider.cs プロジェクト: t-andre/Emby
        private ProgramInfo GetProgramInfo(XmlTvProgram p, ListingsProviderInfo info)
        {
            var programInfo = new ProgramInfo
            {
                ChannelId = p.ChannelId,
                EndDate = GetDate(p.EndDate),
                EpisodeNumber = p.Episode == null ? null : p.Episode.Episode,
                EpisodeTitle = p.Episode == null ? null : p.Episode.Title,
                Genres = p.Categories,
                Id = String.Format("{0}_{1:O}", p.ChannelId, p.StartDate), // Construct an id from the channel and start date,
                StartDate = GetDate(p.StartDate),
                Name = p.Title,
                Overview = p.Description,
                ShortOverview = p.Description,
                ProductionYear = !p.CopyrightDate.HasValue ? (int?)null : p.CopyrightDate.Value.Year,
                SeasonNumber = p.Episode == null ? null : p.Episode.Series,
                IsSeries = p.Episode != null,
                IsRepeat = p.IsRepeat,
                IsPremiere = p.Premiere != null,
                IsKids = p.Categories.Any(c => info.KidsCategories.Contains(c, StringComparer.InvariantCultureIgnoreCase)),
                IsMovie = p.Categories.Any(c => info.MovieCategories.Contains(c, StringComparer.InvariantCultureIgnoreCase)),
                IsNews = p.Categories.Any(c => info.NewsCategories.Contains(c, StringComparer.InvariantCultureIgnoreCase)),
                IsSports = p.Categories.Any(c => info.SportsCategories.Contains(c, StringComparer.InvariantCultureIgnoreCase)),
                ImageUrl = p.Icon != null && !String.IsNullOrEmpty(p.Icon.Source) ? p.Icon.Source : null,
                HasImage = p.Icon != null && !String.IsNullOrEmpty(p.Icon.Source),
                OfficialRating = p.Rating != null && !String.IsNullOrEmpty(p.Rating.Value) ? p.Rating.Value : null,
                CommunityRating = p.StarRating.HasValue ? p.StarRating.Value : (float?)null,
                SeriesId = p.Episode != null ? p.Title.GetMD5().ToString("N") : null
            };

            if (programInfo.IsMovie)
            {
                programInfo.IsSeries = false;
                programInfo.EpisodeNumber = null;
                programInfo.EpisodeTitle = null;
            }

            return programInfo;
        }
コード例 #38
0
 public void ProcessQuality(XmlReader reader, XmlTvProgram result)
 {
     result.Quality = reader.ReadElementContentAsString();
 }
コード例 #39
0
        private void PopulateHeader(XmlReader reader, XmlTvProgram result)
        {
            result.ChannelId = reader.GetAttribute("channel");

            var startValue = reader.GetAttribute("start");
            if (string.IsNullOrEmpty(startValue))
            {
                // Log.Error("  programme#{0} doesnt contain a start date", iChannel);
                result.StartDate = DateTime.MinValue;
            }
            else
            {
                result.StartDate = ParseDate(startValue).GetValueOrDefault();
            }


            var endValue = reader.GetAttribute("stop");
            if (string.IsNullOrEmpty(endValue))
            {
                // Log.Error("  programme#{0} doesnt contain an end date", iChannel);
                result.EndDate = DateTime.MinValue;
            }
            else
            {
                result.EndDate = ParseDate(endValue).GetValueOrDefault();
            }
        }
コード例 #40
0
 public void ProcessTitleNode(XmlReader reader, XmlTvProgram result)
 {
     // <title lang="en">Gino&apos;s Italian Escape</title>
     ProcessNode(reader, s => result.Title = s, _language);
 }
コード例 #41
0
        public void ProcessRating(XmlReader reader, XmlTvProgram result)
        {
            /*
            <rating system="MPAA">
                <value>TV-G</value>
            </rating>
            */

            var system = reader.GetAttribute("system");

            reader.ReadToDescendant("value");
            if (reader.Name == "value")
            {
                result.Rating = new XmlTvRating()
                {
                    System = system,
                    Value = reader.ReadElementContentAsString()
                };
            }
            else
            {
                reader.Skip();
            }
        }
コード例 #42
0
        public void ParseEpisodeDataForOnScreen(XmlReader reader, XmlTvProgram result)
        {
            //// example: 'Episode #FFEE' 
            //serEpNum = ConvertHTMLToAnsi(nodeEpisodeNum);
            //int num1 = serEpNum.IndexOf("#", 0);
            //if (num1 < 0) num1 = 0;
            //episodeNum = CorrectEpisodeNum(serEpNum.Substring(num1, serEpNum.Length - num1), 0);

            var value = reader.ReadElementContentAsString();
            // value = HttpUtility.HtmlDecode(value);
            value = value.Replace(" ", "");

            var hashIndex = value.IndexOf("#", StringComparison.Ordinal);
            if (hashIndex > -1)
            {
                // Take everything from the hash to the end.
                //TODO: This could be textual - how do we populate an Int32
                // result.EpisodeNumber
            }
        }
コード例 #43
0
 public void ProcessSubTitle(XmlReader reader, XmlTvProgram result)
 {
     /*
     <sub-title lang="en">Gino&apos;s Italian Escape - Islands in the Sun: Southern Sardinia Celebrate the Sea</sub-title>
     <sub-title lang="en">8782</sub-title>
     */
     ProcessNode(reader, s => result.Episode.Title = s, _language);
 }
コード例 #44
0
 public void ProcessTitleNode(XmlReader reader, XmlTvProgram result)
 {
     // <title lang="en">Gino&apos;s Italian Escape</title>
     ProcessNode(reader, s => result.Title = s, _language);
 }
コード例 #45
0
        public void ProcessEpisodeNum(XmlReader reader, XmlTvProgram result)
        {
            /*
            <episode-num system="dd_progid">EP00003026.0666</episode-num>
            <episode-num system="onscreen">2706</episode-num>
            <episode-num system="xmltv_ns">.26/0.</episode-num>
            */

            var episodeSystem = reader.GetAttribute("system");
            switch (episodeSystem)
            {
                case "xmltv_ns":
                    ParseEpisodeDataForXmlTvNs(reader, result);
                    break;
                case "onscreen":
                    ParseEpisodeDataForOnScreen(reader, result);
                    break;
                default: // Handles empty string and nulls
                    reader.Skip();
                    break;
            }
        }
コード例 #46
0
        private static ProgramInfo GetProgramInfo(XmlTvProgram program, ListingsProviderInfo info)
        {
            string episodeTitle = program.Episode?.Title;

            var programInfo = new ProgramInfo
            {
                ChannelId       = program.ChannelId,
                EndDate         = program.EndDate.UtcDateTime,
                EpisodeNumber   = program.Episode?.Episode,
                EpisodeTitle    = episodeTitle,
                Genres          = program.Categories,
                StartDate       = program.StartDate.UtcDateTime,
                Name            = program.Title,
                Overview        = program.Description,
                ProductionYear  = program.CopyrightDate?.Year,
                SeasonNumber    = program.Episode?.Series,
                IsSeries        = program.Episode != null,
                IsRepeat        = program.IsPreviouslyShown && !program.IsNew,
                IsPremiere      = program.Premiere != null,
                IsKids          = program.Categories.Any(c => info.KidsCategories.Contains(c, StringComparer.OrdinalIgnoreCase)),
                IsMovie         = program.Categories.Any(c => info.MovieCategories.Contains(c, StringComparer.OrdinalIgnoreCase)),
                IsNews          = program.Categories.Any(c => info.NewsCategories.Contains(c, StringComparer.OrdinalIgnoreCase)),
                IsSports        = program.Categories.Any(c => info.SportsCategories.Contains(c, StringComparer.OrdinalIgnoreCase)),
                ImageUrl        = program.Icon != null && !string.IsNullOrEmpty(program.Icon.Source) ? program.Icon.Source : null,
                HasImage        = program.Icon != null && !string.IsNullOrEmpty(program.Icon.Source),
                OfficialRating  = program.Rating != null && !string.IsNullOrEmpty(program.Rating.Value) ? program.Rating.Value : null,
                CommunityRating = program.StarRating,
                SeriesId        = program.Episode == null ? null : program.Title.GetMD5().ToString("N")
            };

            if (string.IsNullOrWhiteSpace(program.ProgramId))
            {
                string uniqueString = (program.Title ?? string.Empty) + (episodeTitle ?? string.Empty) /*+ (p.IceTvEpisodeNumber ?? string.Empty)*/;

                if (programInfo.SeasonNumber.HasValue)
                {
                    uniqueString = "-" + programInfo.SeasonNumber.Value.ToString(CultureInfo.InvariantCulture);
                }
                if (programInfo.EpisodeNumber.HasValue)
                {
                    uniqueString = "-" + programInfo.EpisodeNumber.Value.ToString(CultureInfo.InvariantCulture);
                }

                programInfo.ShowId = uniqueString.GetMD5().ToString("N");

                // If we don't have valid episode info, assume it's a unique program, otherwise recordings might be skipped
                if (programInfo.IsSeries &&
                    !programInfo.IsRepeat &&
                    (programInfo.EpisodeNumber ?? 0) == 0)
                {
                    programInfo.ShowId = programInfo.ShowId + programInfo.StartDate.Ticks.ToString(CultureInfo.InvariantCulture);
                }
            }
            else
            {
                programInfo.ShowId = program.ProgramId;
            }

            // Construct an id from the channel and start date
            programInfo.Id = string.Format("{0}_{1:O}", program.ChannelId, program.StartDate);

            if (programInfo.IsMovie)
            {
                programInfo.IsSeries      = false;
                programInfo.EpisodeNumber = null;
                programInfo.EpisodeTitle  = null;
            }

            return(programInfo);
        }
コード例 #47
0
 public void ProcessPremiereNode(XmlReader reader, XmlTvProgram result)
 {
     // <title lang="en">Gino&apos;s Italian Escape</title>
     ProcessNode(reader,
         s =>
         {
             if (result.Premiere == null)
             {
                 result.Premiere = new XmlTvPremiere() { Details = s };
             }
             else
             {
                 result.Premiere.Details = s;
             }
         }, _language);
 }