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(); } }
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(); } }
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); }
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; } }
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()); }
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]; } }
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(); } }
public void ProcessSubTitle(XmlReader reader, XmlTvProgram result) { /* * <sub-title lang="en">Gino'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); }
public void ProcessCountry(XmlReader reader, XmlTvProgram result) { /* * <country>Canadá</country> * <country>EE.UU</country> */ ProcessNode(reader, s => result.Countries.Add(s), _language); }
public void ProcessPremiereNode(XmlReader reader, XmlTvProgram result) { // <title lang="en">Gino's Italian Escape</title> ProcessNode( reader, s => { (result.Premiere ??= new XmlTvPremiere()).Details = s; },
public void ParseEpisodeDataForProgramId(XmlReader reader, XmlTvProgram result) { var value = reader.ReadElementContentAsString(); if (!string.IsNullOrWhiteSpace(value)) { result.ProgramId = value; } }
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()); }
public void ProcessPremiereNode(XmlReader reader, XmlTvProgram result) { // <title lang="en">Gino's Italian Escape</title> ProcessNode( reader, s => { result.Premiere = new XmlTvPremiere(s); }, _language); }
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; } }
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; } } }
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; } } }
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(); } }
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 // } }
public void ProcessPremiereNode(XmlReader reader, XmlTvProgram result) { // <title lang="en">Gino's Italian Escape</title> ProcessNode(reader, s => { if (result.Premiere == null) { result.Premiere = new XmlTvPremiere() { Details = s }; } else { result.Premiere.Details = s; } }, _language); }
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]); } } }
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 }
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; } } }
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 } }
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(); } }
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(); } }
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; } }
public void ProcessDescription(XmlReader reader, XmlTvProgram result) { ProcessNode(reader, s => result.Description = s, _language); }
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(); } }
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(); } }
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); }
public void ProcessNew(XmlReader reader, XmlTvProgram result) { result.IsNew = true; reader.Skip(); // Move on }
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 }
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()); }
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; }
public void ProcessQuality(XmlReader reader, XmlTvProgram result) { result.Quality = reader.ReadElementContentAsString(); }
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(); } }
public void ProcessTitleNode(XmlReader reader, XmlTvProgram result) { // <title lang="en">Gino's Italian Escape</title> ProcessNode(reader, s => result.Title = s, _language); }
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(); } }
public void ProcessSubTitle(XmlReader reader, XmlTvProgram result) { /* <sub-title lang="en">Gino'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); }
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; } }
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); }