public void PrepareLiveChat(IJobDetail chatDownloadJob, long streamId)
        {
            var        schedulerFactory = new StdSchedulerFactory(QuartzSchedulers.RamScheduler());
            IScheduler scheduler        = schedulerFactory.GetScheduler().Result;

            scheduler.Start();

            ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create()
                                     .WithIdentity("LiveStreamDownloadTrigger" + streamId)
                                     .StartNow()
                                     .Build();

            scheduler.ScheduleJob(chatDownloadJob, trigger);
        }
        public Task PrepareLiveStreamDownload(StreamExtended stream, string streamerName)
        {
            streamUrl = "https://twitch.tv/" + streamerName;

            YoutubeDlVideoJson.YoutubeDlVideoInfo youtubeDlVideoInfo = StreamHelpers.GetDownloadQualityUrl(streamUrl, stream.streamerId);
            streamDirectory = $"{GlobalConfig.GetGlobalConfig("contentRootPath")}streamers/{stream.streamerId}/vods/{stream.streamId}";

            try {
                Directory.CreateDirectory(streamDirectory);
            } catch (UnauthorizedAccessException e) {
                _logger.Error(e);
                // todo handle this
                throw;
            }

            outputPath = $"{streamDirectory}/{stream.title}.{stream.streamId}";

            dbOutputPath = $"streamers/{stream.streamerId}/vods/{stream.streamId}/{stream.title}.{stream.streamId}.mp4";

            var job = JobBuilder.Create <LiveStreamDownloadJob>()
                      .WithIdentity("LiveStreamDownloadJob" + stream.streamId)
                      .UsingJobData("url", streamUrl)
                      .UsingJobData("streamDirectory", streamDirectory)
                      .UsingJobData("streamId", stream.streamId)
                      .UsingJobData("title", stream.title)
                      .UsingJobData("streamerId", stream.streamerId)
                      .Build();

            var triggerIdentity = $"LiveStreamDownload{stream.streamId}";

            var chatDownloadJob = JobBuilder.Create <LiveStreamChatDownloadJob>()
                                  .WithIdentity("LiveStreamChatDownloadJob" + stream.streamId)
                                  .UsingJobData("channel", streamerName)
                                  .UsingJobData("streamId", stream.streamId)
                                  .Build();

            using (var context = new MainDataContext()) {
                var dbStream = new Stream {
                    streamId          = stream.streamId,
                    vodId             = stream.vodId,
                    streamerId        = stream.streamerId,
                    quality           = youtubeDlVideoInfo.quality,
                    title             = stream.title,
                    url               = youtubeDlVideoInfo.url,
                    createdAt         = stream.createdAt,
                    location          = $"streamers/{stream.streamerId}/vods/{stream.streamId}/",
                    fileName          = $"{stream.title}.{stream.streamId}.mp4",
                    downloading       = true,
                    chatDownloading   = true,
                    downloadJobId     = job.Key.ToString(),
                    chatDownloadJobId = chatDownloadJob.Key.ToString()
                };

                context.Add(dbStream);
                context.SaveChanges();
            }

            var        schedulerFactory = new StdSchedulerFactory(QuartzSchedulers.RamScheduler());
            IScheduler scheduler        = schedulerFactory.GetScheduler().Result;

            scheduler.Start();

            ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create()
                                     .WithIdentity(triggerIdentity)
                                     .StartNow()
                                     .Build();

            scheduler.ScheduleJob(job, trigger);

            PrepareLiveChat(chatDownloadJob, stream.streamId);
            return(Task.CompletedTask);
        }