示例#1
0
        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);
        }
示例#2
0
        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.");
                }
            }
        }
示例#3
0
        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"]);
            }
        }
示例#4
0
        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);
            }
        }