private void BeginDownload()
        {
            Debug.Print("BeginDownload()");
            if (string.IsNullOrEmpty(DownloadUrl))
            {
                MessageBox.Show("The URL is null or empty. Please enter a URL or Download path.");
                return;
            }
            rtbConsoleOutput.AppendText("Beginning download, this box will output progress\n");
            if (BatchDownload)
            {
                chkDownloaderCloseAfterDownload.Checked = true;
            }

            if (DownloadUrl.StartsWith("http://"))
            {
                DownloadUrl = "https" + DownloadUrl.Substring(4);
            }

            string YoutubeDlFileName   = null;
            string ArgumentsBuffer     = string.Empty;
            string QualityFormatBuffer = string.Empty;
            string hlsFF     = string.Empty;
            string webFolder = string.Empty;
            bool   usehlsFF  = Downloads.Default.fixReddit;

            #region youtube-dl path
            if (General.Default.UseStaticYtdl && File.Exists(General.Default.ytdlPath))
            {
                YoutubeDlFileName = General.Default.ytdlPath;
            }
            else
            {
                YoutubeDlFileName = verif.YoutubeDlPath;
            }
            if (YoutubeDlFileName == null)
            {
                rtbConsoleOutput.AppendText("Youtube-DL has not been found\nA rescan for youtube-dl was called");
                verif.RefreshYoutubeDlLocation();
                if (verif.YoutubeDlPath != null)
                {
                    rtbConsoleOutput.AppendText("try redownloading the video, it seems to be detected now.");
                }
                else
                {
                    rtbConsoleOutput.AppendText("still couldnt find youtube-dl.");
                }
                return;
            }
            rtbConsoleOutput.AppendText("Youtube-DL has been found and set\n");
            #endregion

            #region Output
            rtbConsoleOutput.AppendText("Generating output directory structure\n");
            if (Downloads.Default.separateIntoWebsiteURL)
            {
                webFolder = Download.getUrlBase(DownloadUrl) + "\\";
            }
            ArgumentsBuffer = DownloadUrl + " -o \"" + Downloads.Default.downloadPath + BatchTime + "\\" + webFolder + "{0}" + Downloads.Default.fileNameSchema + "\"";

            if (Downloads.Default.separateDownloads)
            {
                switch (DownloadType)
                {
                case 0:
                    ArgumentsBuffer = ArgumentsBuffer.Replace("{0}", "Video\\");
                    break;

                case 1:
                    ArgumentsBuffer = ArgumentsBuffer.Replace("{0}", "Audio\\");
                    break;

                case 2:
                    ArgumentsBuffer = ArgumentsBuffer.Replace("{0}", "Custom\\");
                    break;

                default:
                    rtbConsoleOutput.AppendText("Unable to determine what download type to use (expected 0, 1, or 2)");
                    return;
                }
            }
            else
            {
                ArgumentsBuffer = ArgumentsBuffer.Replace("{0}", "");
            }
            rtbConsoleOutput.AppendText("The output was generated and will be used\n");
            #endregion

            #region Quality + format
            switch (DownloadType)
            {
            case 0: {
                if (DownloadQuality == 0)
                {
                    if (DownloadVideoAudio)
                    {
                        if (DownloadFormat == 4)
                        {
                            ArgumentsBuffer += DownloadFormats.VideoFormatArgsArrayOld[0];
                        }
                        else
                        {
                            ArgumentsBuffer += DownloadFormats.VideoArgs[0];
                        }
                    }
                    else
                    {
                        if (DownloadFormat == 4)
                        {
                            ArgumentsBuffer += DownloadFormats.VideoFormatArgsArrayNoSoundOld[0];
                        }
                        else
                        {
                            ArgumentsBuffer += DownloadFormats.VideoArgsNoSound[0];
                        }
                    }
                }
                else
                {
                    if (DownloadVideoAudio)
                    {
                        ArgumentsBuffer += DownloadFormats.GetVideoFormatArgs(DownloadQuality, Set60FPS);
                    }
                    else
                    {
                        ArgumentsBuffer += DownloadFormats.GetVideoFormatArgsNoSound(DownloadQuality, Set60FPS);
                    }
                }
                break;
            }

            case 1: {
                if (UseVBR)
                {
                    if (DownloadQuality == 0)
                    {
                        ArgumentsBuffer += " -f bestaudio --extract-audio --audio-quality 0";
                    }
                    else
                    {
                        ArgumentsBuffer += " --extract-audio --audio-quality " + DownloadQuality;
                    }
                }
                else
                {
                    if (DownloadQuality == 0)
                    {
                        ArgumentsBuffer += " -f bestaudio --extract-audio --audio-quality 0";
                    }
                    else
                    {
                        ArgumentsBuffer += " --extract-audio --audio-quality " + DownloadFormats.AudioQualityNamesArray[DownloadQuality];
                    }
                }
                break;
            }

            case 2: {
                rtbConsoleOutput.AppendText("Custom was requested, skipping quality + format");
                ArgumentsBuffer += " " + DownloadArguments;
                break;
            }

            default: {
                rtbConsoleOutput.AppendText("Expected a downloadtype (Quality + Format)");
                return;
            }
            }

            if (DownloadFormat > 0 && DownloadType == 0 && DownloadFormat != 4)
            {
                ArgumentsBuffer += DownloadFormats.VideoFormatsArray[DownloadFormat - 1];
            }
            else if (DownloadType == 1)
            {
                ArgumentsBuffer += " --audio-format " + DownloadFormats.AudioFormatsArray[DownloadFormat];
            }

            rtbConsoleOutput.AppendText("The quality and format has been set\n");
            #endregion

            #region Arguments
            rtbConsoleOutput.AppendText("Looking for ffmpeg\n");
            if (verif.FFmpegPath != null)
            {
                if (General.Default.UseStaticFFmpeg)
                {
                    ArgumentsBuffer += "--ffmpeg-location \"" + General.Default.ffmpegPath + "\\ffmpeg.exe\"";
                }
                else
                {
                    ArgumentsBuffer += " --ffmpeg-location \"" + verif.FFmpegPath + "\\ffmpeg.exe\" --hls-prefer-ffmpeg";
                }
            }
            else
            {
                rtbConsoleOutput.AppendText("ffmpeg path is null, downloading may be affected\n");
            }

            if (Downloads.Default.fixReddit)
            {
                if (verif.FFmpegPath == null)
                {
                    rtbConsoleOutput.AppendText("Fix v.redd.it was requested, but ffmpeg hasn't been found\n");
                }
                else if (Download.isReddit(DownloadUrl) && usehlsFF)
                {
                    ArgumentsBuffer += " --hls-prefer-ffmpeg";
                    rtbConsoleOutput.AppendText("hls prefers ffmpeg (fix v.redd.it)\n");
                }
            }
            if (DownloadType != 2)
            {
                if (Downloads.Default.SaveSubtitles)
                {
                    ArgumentsBuffer += " --all-subs";
                    if (!string.IsNullOrEmpty(Downloads.Default.SubtitleFormat))
                    {
                        ArgumentsBuffer += "--sub-format " + Downloads.Default.SubtitleFormat + " ";
                    }
                    if (Downloads.Default.EmbedSubtitles && DownloadType == 0 && DownloadFormat == 3 || DownloadFormat == 4 || DownloadFormat == 6)
                    {
                        ArgumentsBuffer += " --embed-subs";
                    }
                }
                if (Downloads.Default.SaveVideoInfo)
                {
                    ArgumentsBuffer += " --write-info-json";
                }
                if (Downloads.Default.SaveDescription)
                {
                    ArgumentsBuffer += " --write-description";
                }
                if (Downloads.Default.SaveAnnotations)
                {
                    ArgumentsBuffer += " --write-annotations";
                }
                if (Downloads.Default.SaveThumbnail)
                {
                    // ArgumentsBuffer += "--write-all-thumbnails "; // Maybe?
                    ArgumentsBuffer += " --write-thumbnail";
                    if (Downloads.Default.EmbedThumbnails)
                    {
                        switch (DownloadType)
                        {
                        case 0:
                            if (DownloadFormat == 4)
                            {
                                ArgumentsBuffer += " --embed-thumbnail";
                            }
                            else
                            {
                                rtbConsoleOutput.AppendText("!!!!!!!! WARNING !!!!!!!!\nCannot embed thumbnail to non-mp4 videos files\n");
                            }
                            break;

                        case 1:
                            if (DownloadFormat == 3 || DownloadFormat == 4)
                            {
                                ArgumentsBuffer += " --embed-thumbnail";
                            }
                            else
                            {
                                rtbConsoleOutput.AppendText("!!!!!!!! WARNING !!!!!!!!\nCannot embed thumbnail to non-m4a/mp3 audio files\n");
                            }
                            break;
                        }
                    }
                }
                if (Downloads.Default.WriteMetadata)
                {
                    ArgumentsBuffer += " --add-metadata";
                }

                if (Downloads.Default.KeepOriginalFiles)
                {
                    ArgumentsBuffer += " -k";
                }

                if (Downloads.Default.LimitDownloads && Downloads.Default.DownloadLimit > 0)
                {
                    ArgumentsBuffer += " --limit-rate " + Downloads.Default.DownloadLimit;
                    switch (Downloads.Default.DownloadLimitType)
                    {
                    case 0: {     // kb
                        ArgumentsBuffer += "K ";
                        break;
                    }

                    case 1: {     // mb
                        ArgumentsBuffer += "M ";
                        break;
                    }

                    case 2: {     // gb
                        ArgumentsBuffer += "G ";
                        break;
                    }

                    default: {     // kb default
                        ArgumentsBuffer += "K ";
                        break;
                    }
                    }
                }

                if (Downloads.Default.RetryAttempts != 10 && Downloads.Default.RetryAttempts > 0)
                {
                    ArgumentsBuffer += " --retries " + Downloads.Default.RetryAttempts;
                }

                if (Downloads.Default.ForceIPv4)
                {
                    ArgumentsBuffer += " --force-ipv4";
                }
                else if (Downloads.Default.ForceIPv6)
                {
                    ArgumentsBuffer += " --force-ipv6";
                }

                if (Downloads.Default.UseProxy && Downloads.Default.ProxyType > -1 && !string.IsNullOrEmpty(Downloads.Default.ProxyIP) && !string.IsNullOrEmpty(Downloads.Default.ProxyPort))
                {
                    ArgumentsBuffer += " --proxy " + Download.ProxyProtocols[Downloads.Default.ProxyType] + Downloads.Default.ProxyIP + ":" + Downloads.Default.ProxyPort + "/ ";
                }
            }

            rtbConsoleOutput.AppendText("Arguments have been generated and are readonly in the textbox\n");
            txtArgumentsGenerated.Text = ArgumentsBuffer;
            #endregion

            #region Download thread
            if (Program.IsDebug && Debugging && !BatchDownload)
            {
                rtbConsoleOutput.Text = ArgumentsBuffer.Replace(' ', '\n');
                return;
            }
            rtbConsoleOutput.AppendText("Creating download thread\n");
            DownloadThread = new Thread(() => {
                try {
                    DownloadProcess = new System.Diagnostics.Process()
                    {
                        StartInfo = new System.Diagnostics.ProcessStartInfo(YoutubeDlFileName)
                        {
                            UseShellExecute        = false,
                            RedirectStandardOutput = true,
                            RedirectStandardError  = true,
                            CreateNoWindow         = true,
                            Arguments = ArgumentsBuffer
                        }
                    };

                    DownloadProcess.OutputDataReceived += (s, e) => {
                        this.BeginInvoke(new MethodInvoker(() => {
                            if (e.Data != null && rtbConsoleOutput != null)
                            {
                                rtbConsoleOutput.AppendText(e.Data + "\n");
                            }
                        }));
                    };
                    DownloadProcess.ErrorDataReceived += (s, e) => {
                        this.BeginInvoke(new MethodInvoker(() => {
                            if (e.Data != null && rtbConsoleOutput != null)
                            {
                                rtbConsoleOutput.AppendText("Error:\n");
                                rtbConsoleOutput.AppendText(e.Data + "\n");
                            }
                        }));
                    };

                    DownloadProcess.Start();
                    DownloadProcess.BeginOutputReadLine();
                    DownloadProcess.BeginErrorReadLine();
                    DownloadProcess.WaitForExit();

                    DownloadFinished = true;

                    if (DownloadProcess.ExitCode == 0)
                    {
                        DownloadFinished = true;
                        DownloadAborted  = false;
                        DownloadErrored  = false;
                    }
                    else
                    {
                        DownloadErrored  = true;
                        DownloadFinished = false;
                    }
                }
                catch (ThreadAbortException) {
                    DownloadAborted  = true;
                    DownloadFinished = false;
                    return;
                }
                catch (Exception ex) {
                    ErrorLog.ReportException(ex);
                    DownloadErrored = true;
                }
                finally {
                    ThreadExit();
                }
            });
            rtbConsoleOutput.AppendText("Created, starting download thread\n");
            DownloadThread.Start();
            #endregion
        }
 private void btnRedownload_Click(object sender, EventArgs e)
 {
     Download.downloadYoutubeDL(Settings.Default.youtubedlDir);
 }