private static bool CreateXmltvFile() { try { xmltv = new xmltv { Date = DateTime.UtcNow.ToString(CultureInfo.InvariantCulture), SourceInfoUrl = "http://schedulesdirect.org", SourceInfoName = "Schedules Direct", GeneratorInfoName = "EPG123", GeneratorInfoUrl = "http://epg123.garyan2.net", Channels = new List <XmltvChannel>(), Programs = new List <XmltvProgramme>() }; foreach (var service in SdMxf.With.Services) { xmltv.Channels.Add(BuildXmltvChannel(service)); if (service.MxfScheduleEntries.ScheduleEntry.Count == 0 && config.XmltvAddFillerData) { // add a program specific for this service var program = new MxfProgram { Description = config.XmltvFillerProgramDescription, IsGeneric = true, Title = service.Name, ProgramId = $"EPG123FILL{service.StationId}" }; // populate the schedule entries var startTime = new DateTime(DateTime.UtcNow.Year, DateTime.UtcNow.Month, DateTime.UtcNow.Day, 0, 0, 0); var stopTime = startTime + TimeSpan.FromDays(config.DaysToDownload); do { service.MxfScheduleEntries.ScheduleEntry.Add(new MxfScheduleEntry { Duration = config.XmltvFillerProgramLength * 60 * 60, mxfProgram = SdMxf.GetProgram(program.ProgramId, program), StartTime = startTime, IsRepeat = true }); startTime += TimeSpan.FromHours(config.XmltvFillerProgramLength); } while (startTime < stopTime); } foreach (var scheduleEntry in service.MxfScheduleEntries.ScheduleEntry) { xmltv.Programs.Add(BuildXmltvProgram(scheduleEntry, $"EPG123.{service.StationId}.schedulesdirect.org")); } } return(true); } catch (Exception ex) { Logger.WriteInformation("Failed to create the XMLTV file. Message : " + ex.Message); } return(false); }
private static void ProcessProgramResponses() { // process request response foreach (var sdProgram in programResponses) { ++processedObjects; ReportProgress(); // determine which program this belongs to var mxfProgram = SdMxf.GetProgram(sdProgram.ProgramId); // build a standalone program BuildMxfProgram(mxfProgram, sdProgram); // add JSON to cache if (sdProgram.Md5 != null) { mxfProgram.extras["md5"] = sdProgram.Md5; using (var writer = new StringWriter()) { try { var serializer = new JsonSerializer(); serializer.Serialize(writer, sdProgram); epgCache.AddAsset(sdProgram.Md5, writer.ToString()); } catch { // ignored } } } else { Logger.WriteWarning($"Did not cache program {mxfProgram.ProgramId} due to missing Md5 hash."); } } }
private static void ProcessMovieImageResponses() { // process request response foreach (var response in imageResponses) { ++processedObjects; ReportProgress(); if (response.Data == null) { continue; } // determine which program this belongs to var mxfProgram = SdMxf.GetProgram(response.ProgramId); // first choice is return from Schedules Direct List <ProgramArtwork> artwork; artwork = GetTieredImages(response.Data, new List <string> { "episode" }).Where(arg => arg.Aspect.Equals("2x3")).ToList(); // second choice is from TMDb if allowed and available if (artwork.Count == 0 || artwork[0].Category.Equals("Staple") && config.TMDbCoverArt && tmdbApi.IsAlive) { var tmdb = GetTmdbMoviePoster(mxfProgram.Title, mxfProgram.Year, mxfProgram.Language); if (tmdb.Count > 0) { artwork = tmdb; } } // regardless if image is found or not, store the final result in xml file // this avoids hitting the tmdb server every update for every movie missing cover art mxfProgram.extras.Add("artwork", artwork); mxfProgram.mxfGuideImage = GetGuideImageAndUpdateCache(artwork, ImageType.Movie, mxfProgram.extras["md5"]); } }
private static void ProcessMd5ScheduleEntry(string md5) { // ensure cached file exists if (!epgCache.JsonFiles.ContainsKey(md5)) { return; } // read the cached file ScheduleResponse schedule; try { using (var reader = new StringReader(epgCache.GetAsset(md5))) { var serializer = new JsonSerializer(); schedule = (ScheduleResponse)serializer.Deserialize(reader, typeof(ScheduleResponse)); if (schedule == null) { Logger.WriteError("Failed to read Md5Schedule file in cache directory."); return; } } } catch (Exception ex) { Logger.WriteError("Error occurred when trying to read Md5Schedule file in cache directory. Message: " + ex.Message); return; } // determine which service entry applies to var mxfService = SdMxf.GetService(schedule.StationId); // process each program schedule entry foreach (var scheduleProgram in schedule.Programs) { // prepopulate some of the program var mxfProgram = SdMxf.GetProgram(scheduleProgram.ProgramId); if (mxfProgram.extras.Count == 0) { mxfProgram.ProgramId = scheduleProgram.ProgramId; mxfProgram.UidOverride = $"{scheduleProgram.ProgramId.Substring(0, 10)}_{scheduleProgram.ProgramId.Substring(10)}"; mxfProgram.extras.Add("md5", scheduleProgram.Md5); if (scheduleProgram.Multipart?.PartNumber > 0) { mxfProgram.extras.Add("multipart", $"{scheduleProgram.Multipart.PartNumber}/{scheduleProgram.Multipart.TotalParts}"); } if (config.OadOverride && scheduleProgram.New) { mxfProgram.extras.Add("newAirDate", scheduleProgram.AirDateTime.ToLocalTime()); } } mxfProgram.IsSeasonFinale |= Helper.StringContains(scheduleProgram.IsPremiereOrFinale, "Season Finale"); mxfProgram.IsSeasonPremiere |= Helper.StringContains(scheduleProgram.IsPremiereOrFinale, "Season Premiere"); mxfProgram.IsSeriesFinale |= Helper.StringContains(scheduleProgram.IsPremiereOrFinale, "Series Finale"); mxfProgram.IsSeriesPremiere |= Helper.StringContains(scheduleProgram.IsPremiereOrFinale, "Series Premiere"); if (!mxfProgram.extras.ContainsKey("premiere")) { mxfProgram.extras.Add("premiere", false); } if (scheduleProgram.Premiere) { mxfProgram.extras["premiere"] = true; // used only for movie and miniseries premieres } // grab any tvratings from desired countries var scheduleTvRatings = new Dictionary <string, string>(); if (scheduleProgram.Ratings != null) { var ratings = config.RatingsOrigin.Split(','); foreach (var rating in scheduleProgram.Ratings.Where(rating => string.IsNullOrEmpty(rating.Country) || Helper.TableContains(ratings, "ALL") || Helper.TableContains(ratings, rating.Country))) { scheduleTvRatings.Add(rating.Body, rating.Code); } } // populate the schedule entry and create program entry as required mxfService.MxfScheduleEntries.ScheduleEntry.Add(new MxfScheduleEntry { AudioFormat = EncodeAudioFormat(scheduleProgram.AudioProperties), Duration = scheduleProgram.Duration, Is3D = Helper.TableContains(scheduleProgram.VideoProperties, "3d"), IsBlackout = scheduleProgram.SubjectToBlackout, IsClassroom = scheduleProgram.CableInTheClassroom, IsCc = Helper.TableContains(scheduleProgram.AudioProperties, "cc"), IsDelay = Helper.StringContains(scheduleProgram.LiveTapeDelay, "delay"), IsDvs = Helper.TableContains(scheduleProgram.AudioProperties, "dvs"), IsEnhanced = Helper.TableContains(scheduleProgram.VideoProperties, "enhanced"), IsFinale = Helper.StringContains(scheduleProgram.IsPremiereOrFinale, "finale"), IsHdtv = CheckHdOverride(schedule.StationId) || !CheckSdOverride(schedule.StationId) && Helper.TableContains(scheduleProgram.VideoProperties, "hdtv"), //IsHdtvSimulCast = null, IsInProgress = scheduleProgram.JoinedInProgress, IsLetterbox = Helper.TableContains(scheduleProgram.VideoProperties, "letterbox"), IsLive = Helper.StringContains(scheduleProgram.LiveTapeDelay, "live"), //IsLiveSports = null, IsPremiere = scheduleProgram.Premiere || Helper.StringContains(scheduleProgram.IsPremiereOrFinale, "premiere"), IsRepeat = !scheduleProgram.New, IsSap = Helper.TableContains(scheduleProgram.AudioProperties, "sap"), IsSubtitled = Helper.TableContains(scheduleProgram.AudioProperties, "subtitled"), IsTape = Helper.StringContains(scheduleProgram.LiveTapeDelay, "tape"), Part = scheduleProgram.Multipart?.PartNumber ?? 0, Parts = scheduleProgram.Multipart?.TotalParts ?? 0, mxfProgram = mxfProgram, StartTime = scheduleProgram.AirDateTime, //TvRating is determined in the class itself to combine with the program content ratings IsSigned = scheduleProgram.Signed }); mxfService.MxfScheduleEntries.ScheduleEntry.Last().extras.Add("ratings", scheduleTvRatings); } }