private Task CreateTimer(CancellationToken cancellationToken, Program program, Timers timers)
        {
            if (!timers.Timer.Any(t =>
                                  t.ChannelId == program.ChannelId &&
                                  GeneralExtensions.GetScheduleTime(t.Date, t.Start).AddMinutes(t.PreEPG) == GeneralExtensions.GetProgramTime(program.Start) &&
                                  GeneralExtensions.GetScheduleTime(t.Date, t.Start).AddMinutes(t.Duration).AddMinutes(-t.PostEPG) == GeneralExtensions.GetProgramTime(program.Stop)))
            {
                var builder = new StringBuilder("api/timeradd.html?");

                builder.AppendFormat("title={0}&", (program.EpisodeTitle != null ? program.Name + " - " + program.EpisodeTitle : program.Name).ToUrlString());
                builder.AppendFormat("series={0}&", program.Name.ToUrlString());
                builder.AppendFormat("encoding={0}&", 255);
                builder.AppendFormat("ch={0}&", program.ChannelId);
                builder.AppendFormat("dor={0}&", GeneralExtensions.GetProgramTime(program.Start).ToDelphiDate());
                builder.AppendFormat("start={0}&", GeneralExtensions.GetProgramTime(program.Start).AddMinutes(-(double)Configuration.TimerPrePadding).ToLocalTime().TimeOfDay.TotalMinutes);
                builder.AppendFormat("stop={0}&", GeneralExtensions.GetProgramTime(program.Stop).AddMinutes((double)Configuration.TimerPostPadding).ToLocalTime().TimeOfDay.TotalMinutes);
                builder.AppendFormat("pre={0}&", Configuration.TimerPrePadding);
                builder.AppendFormat("post={0}&", Configuration.TimerPostPadding);
                builder.AppendFormat("prio={0}&", 49);
                builder.AppendFormat("after={0}&", !String.IsNullOrWhiteSpace(Configuration.TimerTask) ? Configuration.TimerTask.ToUrlString() : String.Empty);

                builder.Remove(builder.Length - 1, 1);

                Plugin.Logger.Info("Create new schedule: {0} - {1}, StartTime: {2}, EndTime: {3}, ChannelId: {4}", program.Name, program.EpisodeTitle, program.Start, program.Stop, program.ChannelId);
                return(Task.FromResult(GetToService(cancellationToken, builder.ToString())));
            }

            return(Task.Delay(0));
        }
        private Task CreateTimer(CancellationToken cancellationToken, Program program, Timers timers)
        {
            var channels = _tvServiceProxy.GetChannelList(cancellationToken).Root.ChannelGroup.SelectMany(c => c.Channel);
            var guide    = GetFromService <Guide>(cancellationToken, typeof(Guide),
                                                  "api/epg.html?lvl=2&channel={0}&start={1}&end={2}",
                                                  program.ChannelEPGID,
                                                  GeneralExtensions.FloatDateTime(GeneralExtensions.GetProgramTime(program.Start)),
                                                  GeneralExtensions.FloatDateTime(GeneralExtensions.GetProgramTime(program.Stop)));

            var episodeTitle = program.EpisodeTitle;

            if (!timers.Timer.Any(t =>
                                  t.ChannelId == program.ChannelId &&
                                  GeneralExtensions.GetScheduleTime(t.Date, t.Start).AddMinutes(t.PreEPG) == GeneralExtensions.GetProgramTime(program.Start) &&
                                  GeneralExtensions.GetScheduleTime(t.Date, t.Start).AddMinutes(t.Duration).AddMinutes(-t.PostEPG) == GeneralExtensions.GetProgramTime(program.Stop)))
            {
                var builder = new StringBuilder("api/timeradd.html?");

                builder.AppendFormat("title={0}&", (episodeTitle != null ? program.Name + " - " + episodeTitle : program.Name).ToUrlString());
                builder.AppendFormat("series={0}&", program.Name.ToUrlString());
                builder.AppendFormat("encoding={0}&", 255);
                builder.AppendFormat("ch={0}&", program.ChannelId);
                builder.AppendFormat("dor={0}&", GeneralExtensions.GetProgramTime(program.Start).ToDelphiDate());
                builder.AppendFormat("start={0}&", GeneralExtensions.GetProgramTime(program.Start).AddMinutes(-(double)Configuration.TimerPrePadding).ToLocalTime().TimeOfDay.TotalMinutes);
                builder.AppendFormat("stop={0}&", GeneralExtensions.GetProgramTime(program.Stop).AddMinutes((double)Configuration.TimerPostPadding).ToLocalTime().TimeOfDay.TotalMinutes);
                builder.AppendFormat("pre={0}&", Configuration.TimerPrePadding);
                builder.AppendFormat("post={0}&", Configuration.TimerPostPadding);
                builder.AppendFormat("after={0}&", !String.IsNullOrWhiteSpace(Configuration.TimerTask) ? Configuration.TimerTask.ToUrlString() : String.Empty);

                builder.Remove(builder.Length - 1, 1);

                Plugin.Logger.Info("Create new schedule: {0}, StartTime: {1}, EndTime: {2}, ChannelId: {3}", program.Name, program.Start, program.Stop, program.ChannelId);
                return(Task.FromResult(GetToService(cancellationToken, builder.ToString())));
            }

            return(Task.Delay(0));
        }