public void StartDownload(DownloadRequestBM request)
        {
            QueuedDownloadBM download = new QueuedDownloadBM(
                downloadId: request.DownloadId,
                downloadProgress: this.youtubeDl.PrepareDownload(request.MediaUri, request.Format, serviceConfig.DownloadPath)
                );

            runningDownloads.Add(download);
            download.DownloadHandler.PercentageChanged     += (o, e) => this.notifier.Notify(download.DownloadID, download.DownloadHandler.Status, e);
            download.DownloadHandler.DownloadStatusChanged += (o, e) => {
                this.notifier.Notify(download.DownloadID, e, download.DownloadHandler.Percentage);

                if (e == DownloadState.Completed)
                {
                    EventHandler_DownloadCompleted(download);
                }
                else if (e == DownloadState.Failed)
                {
                    string errorOutput = download.DownloadHandler.ErrorMessage.Replace("\r", "\\r").Replace("\n", "\\n");
                    logger.LogError($"Error occurred during download: CommandLine='{download.DownloadHandler.CommandLine}' StdErr='{errorOutput}'");
                }
            };
            download.DownloadHandler.Start();

            this.logger.LogInformation($"Download started with GUID: {download.DownloadID}");
        }
        private void EventHandler_DownloadCompleted(QueuedDownloadBM download)
        {
            CompletedQueuedDownloadBM completedDownload = new CompletedQueuedDownloadBM(download.DownloadID, download.DownloadHandler, DateTime.UtcNow);

            runningDownloads.Remove(download);
            completedDownloads.Add(completedDownload);
            cleanupService.MarkToCleanup(completedDownload);

            this.logger.LogInformation($"Download completed with GUID: {download.DownloadID}");
        }
        public DownloadStatusBM GetDownloadStatus(Guid downloadID)
        {
            QueuedDownloadBM result = this.runningDownloads.Concat(this.completedDownloads).FirstOrDefault(x => x.DownloadID == downloadID);

            if (result == null)
            {
                throw new InvalidOperationException($"Download not found with ID {downloadID}.");
            }

            return(new DownloadStatusBM(result.DownloadHandler.Percentage, result.DownloadHandler.Status));
        }