private void donetimer_Tick(object sender, EventArgs e)
        {
            /* Updates the process for the end user */

            //Set volume to Zero, otherwise the user will hear Plays.tv in the background because of gecko
            waveOutSetVolume(IntPtr.Zero, 0);


            if (done4)
            {
                //DONE
                Infotimer.Stop();
                donetimer.Stop();
                step4.ForeColor       = Color.Lime;
                loadingind.Image      = Properties.Resources.checkmark_96px;
                downloadingrn.Visible = true;
                downloadingrn.Text    = "Done!";
                infolbl.Show();
                infolbl.Text = "Please consider donating if you support this project";
                didyouknow.Hide();
                paypal.Show();
                geckoWebBrowser.Dispose();
            }
            else if (done3)
            {
                //Stage 3
                if (videosfound != 0 && continuenow == false)
                {
                    continuenow = true;
                }
                else
                {
                    step3.ForeColor       = Color.Lime;
                    downloadingrn.Visible = true;
                    downloadingrn.Text    = "Downloaded: " + (downdone) + "/" + videosfound;

                    if ((downdone == videosfound) && (Math.Round(downloadeddone) == Math.Round(downloaded)))
                    {
                        done4 = true;
                    }
                }
            }
            else if (done2)
            {
                //Stage 2
                step2.ForeColor       = Color.Lime;
                downloadingrn.Visible = true;
                if (!downloadingrn.Text.Contains("Retrying:"))
                {
                    if (!downloadingrn.Text.Contains("Plays servers are slow today..."))
                    {
                        downloadingrn.Text = "Loading...";
                    }
                }
            }
            else if (done1)
            {
                //Stage 1
                step1.ForeColor       = Color.Lime;
                downloadingrn.Visible = true;
                downloadingrn.Text    = "Logging in...";
            }
        }
        private async Task Load1SiteAsync()
        {
            //Navigates to the homescreen and sets a SAFE delay
            await PutTaskDelay(5000);

            geckoWebBrowser.Navigate("https://plays.tv/home");
            done1 = true;

            string linkredirect = "";

            while (linkredirect == "")
            {
                await PutTaskDelay(5000);

                //Checks if the user is logged in or not
                GeckoNodeCollection links = geckoWebBrowser.Document.GetElementsByClassName("avatar");

                foreach (GeckoElement link in links)
                {
                    try
                    {
                        if (link.GetAttribute("href").Length > 0)
                        {
                            linkredirect = link.GetAttribute("href");
                        }
                    }
                    catch
                    {
                    }
                }
                if (linkredirect != "")
                {
                    break;
                }
                else
                {
                    geckoWebBrowser.Navigate("https://plays.tv/home");
                    await PutTaskDelay(10000);
                }
            }

            //Redirects to users home video
            geckoWebBrowser.Navigate("https://plays.tv" + linkredirect);
            await PutTaskDelay(5000);

            done2 = true;

            //Gets users ID
            GeckoElement VideoJSONtemp;

            while (true)
            {
                try
                {
                    VideoJSONtemp = (GeckoElement)geckoWebBrowser.Document.GetElementsByClassName("full-width header-profile")[0];
                    break;
                }
                catch
                {
                    setTextSafe("Plays servers are slow today. Still loading...");
                    await PutTaskDelay(3000);
                }
            }
            string  JSON    = Convert.ToString(VideoJSONtemp.GetAttribute("data-conf"));
            dynamic details = JValue.Parse(JSON);

            //Navigates to the JSON file (With a webclient the JSON would only show published videos)
            geckoWebBrowser.Navigate("https://plays.tv/playsapi/feedsys/v1/userfeed/" + details.login_user.id + "/uploaded?limit=999999");
            await PutTaskDelay(5000);

            string JSONformated = "";
            int    retrying     = 0;

            while (retrying < 100)
            {
                //Tries to get the JSON, you need to be logged in to get unlisted videos
                try
                {
                    string JSONunformated = geckoWebBrowser.Document.Body.OuterHtml;
                    if (!JSONunformated.Contains("</pre></body>"))
                    {
                        retrying++;
                        setTextSafe("Retrying: " + retrying + "/100");
                        await PutTaskDelay(3500);
                    }
                    else
                    {
                        JSONformated = JSONunformated.Replace("</pre></body>", "").Replace("<body><pre>", "");
                        break;
                    }
                }
                catch
                {
                    retrying++;
                    setTextSafe("Retrying: " + retrying + "/100");
                    await PutTaskDelay(3500);
                }
            }
            if (retrying > 100)
            {
                MessageBox.Show("Can't access Plays.TV api...", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                System.Diagnostics.Process.Start(Application.ExecutablePath); // to start new instance of application
                this.Close();
            }

            //Gets the JSON from Plays api
            dynamic videoJSON = JValue.Parse(JSONformated);
            JArray  items     = (JArray)videoJSON["items"];

            //Creates a list that hold video information
            List <string> nameList         = new List <string>();
            List <string> downloadlinkList = new List <string>();
            List <string> typeList         = new List <string>();
            List <string> gameList         = new List <string>();
            List <string> descriptionList  = new List <string>();
            List <string> dateList         = new List <string>();

            for (int i = 0; i < items.Count; i++)
            {
                dynamic item     = (JObject)items[i];
                bool    unlisted = item.unlisted;

                //Get video information
                string name         = item.description;
                string downloadlink = item.downloadUrl;
                string type         = item.type;
                string game         = item.gameTitle;
                string description  = item.description;
                string date         = item.created;

                if ((dntscreenshots.Checked == true) && (type.Contains("image") == true))
                {
                }
                else
                {
                    if (unlisted == true && publiconly == true)
                    {
                    }
                    else
                    {
                        nameList.Add(name);
                        downloadlinkList.Add(downloadlink);
                        typeList.Add(type);
                        gameList.Add(game);
                        descriptionList.Add(description);
                        dateList.Add(Convert.ToString(date).Replace("000", ""));
                    }
                }

                //Inserts information to Did you know
                JObject res  = (JObject)items[i];
                double  secc = Convert.ToDouble(item.duration);
                infoclipseconds += Convert.ToDouble(secc);
                infoviews       += (int)res["stats"]["clicks"];
                infocomments    += (int)res["stats"]["comments"];
                double dateUnix = Convert.ToDouble(Convert.ToString(item.created).Replace("000", ""));
                infofirstplays = UnixTimeStampToDateTime(dateUnix);
            }
            //Adds the total videos the a integer that the end user will see
            videosfound = nameList.Count;

            done3 = true;

            //First did you know
            Infotimer.Start();
            infolbl.Text = "Did you know:";
            infolbl.Show();
            didyouknow.Text = "The first Plays.tv video was uploaded 03/09/2015 by Plays";
            didyouknow.Show();

            for (int i = 0; i < nameList.Count; i++)
            {
                curdown = i;

                //Adds SORT BY DATE
                if (rbUD.Checked)
                {
                    sort = "[" + (i + 1) + "] ";
                }
                if (incDate.Checked)
                {
                    if (paranthesiscbx.Checked == true)
                    {
                        dateString = (" (" + (UnixTimeStampToDateTime(Convert.ToDouble(dateList[i]))).ToShortDateString() + ")").Replace("/", "-");
                    }
                    else
                    {
                        dateString = (" " + (UnixTimeStampToDateTime(Convert.ToDouble(dateList[i]))).ToShortDateString()).Replace("/", "-");
                    }
                }

                //Gets current video information
                string name         = Convert.ToString(nameList[i]);
                string downloadlink = Convert.ToString(downloadlinkList[i]);
                string game         = Convert.ToString(gameList[i]);
                string description  = Convert.ToString(descriptionList[i]);
                string type         = Convert.ToString(typeList[i]);



                //Tries to get the game if the description is the name of the game.
                if (game == null)
                {
                    if (gameList.Contains(description))
                    {
                        game = description;
                    }
                    else
                    {
                        game = "Unknown";
                    }
                }



                //Replaces bad names
                Regex illegalName = new Regex(@"[\\/:*?""<>|]");
                name       = illegalName.Replace(name, "_");
                dateString = illegalName.Replace(dateString, "_");
                game       = illegalName.Replace(game, " ");


                try
                {
                    //Checks if it's an image or not
                    if (type == "image")
                    {
                        //If the user wants screenshots or not
                        if (incscreenshots.Checked == true)
                        {
                            //If the user wants it to be put into game-folders
                            if (includeGameFolders.Checked)
                            {
                                if (!Directory.Exists(path + @"\" + game))
                                {
                                    Directory.CreateDirectory(path + @"\" + game);
                                }
                                if (rbUD.Checked)
                                {
                                    sort = "[" + (Directory.GetFiles(path + @"\" + game).Length + 1) + "] ";
                                }

                                if (!File.Exists(path + @"\" + game + @"\" + sort + name + dateString + ".jpeg"))
                                {
                                    DownloadFile(downloadlink, path + @"\" + game + @"\" + sort + name + dateString + ".jpeg");
                                    break;
                                }
                                else
                                {
                                    int addIfExists = 1;
                                    while (true)
                                    {
                                        if (!File.Exists(path + @"\" + game + @"\" + sort + name + "(" + addIfExists + ")" + dateString + ".jpeg"))
                                        {
                                            DownloadFile(downloadlink, path + @"\" + game + @"\" + sort + name + "(" + addIfExists + ")" + dateString + ".jpeg");
                                            break;
                                        }
                                        else
                                        {
                                            addIfExists++;
                                        }
                                    }
                                }
                            }
                            else
                            {
                                if (!File.Exists(path + @"\" + sort + name + dateString + ".jpeg"))
                                {
                                    DownloadFile(downloadlink, path + @"\" + sort + name + dateString + ".jpeg");
                                }
                                else
                                {
                                    int addIfExists = 1;
                                    while (true)
                                    {
                                        if (!File.Exists(path + @"\" + sort + name + "(" + addIfExists + ")" + dateString + ".jpeg"))
                                        {
                                            DownloadFile(downloadlink, path + @"\" + sort + name + "(" + addIfExists + ")" + dateString + ".jpeg");
                                            break;
                                        }
                                        else
                                        {
                                            addIfExists++;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        if (includeGameFolders.Checked)
                        {
                            if (!Directory.Exists(path + @"\" + game))
                            {
                                Directory.CreateDirectory(path + @"\" + game);
                            }
                            if (rbUD.Checked)
                            {
                                sort = "[" + (Directory.GetFiles(path + @"\" + game).Length + 1) + "] ";
                            }

                            if (!File.Exists(path + @"\" + game + @"\" + sort + name + dateString + ".mp4"))
                            {
                                DownloadFile(downloadlink, path + @"\" + game + @"\" + sort + name + dateString + ".mp4");
                            }
                            else
                            {
                                int addIfExists = 1;
                                while (true)
                                {
                                    if (!File.Exists(path + @"\" + game + @"\" + sort + name + "(" + addIfExists + ")" + dateString + ".mp4"))
                                    {
                                        DownloadFile(downloadlink, path + @"\" + game + @"\" + sort + name + "(" + addIfExists + ")" + dateString + ".mp4");
                                        break;
                                    }
                                    else
                                    {
                                        addIfExists++;
                                    }
                                }
                            }
                        }
                        else
                        {
                            // DownloadFile(downloadlink, path + @"\" + sort + name + dateString + ".mp4");
                            if (!File.Exists(path + @"\" + sort + name + dateString + ".mp4"))
                            {
                                DownloadFile(downloadlink, path + @"\" + sort + name + dateString + ".mp4");
                            }
                            else
                            {
                                int addIfExists = 1;
                                while (true)
                                {
                                    if (!File.Exists(path + @"\" + sort + name + "(" + addIfExists + ")" + dateString + ".mp4"))
                                    {
                                        DownloadFile(downloadlink, path + @"\" + sort + name + "(" + addIfExists + ")" + dateString + ".mp4");
                                        break;
                                    }
                                    else
                                    {
                                        addIfExists++;
                                    }
                                }
                            }
                        }
                    }
                }
                catch
                {
                    //If an error occured.
                    MessageBox.Show("Plays did not provide any download link to the video called: " + name + "\nYou will need to download it manually.\nClick OK to continue downloading the rest of the videos.", "Error.", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                await PutTaskDelay(3000);
            }
        }