public async Task <BasicStreamInfo> GetLivestreamStatusFromChannelId(string ChannelId)
    {
        try
        {
            var client = new RestClient($"https://www.youtube.com/channel/{ChannelId}/live");
            client.Timeout = 8000;
            var request = new RestRequest(Method.GET);
            request.AddCookie("CONSENT", "YES+cb");
            IRestResponse response = await client.ExecuteAsync(request);

            if (response.StatusCode == HttpStatusCode.NotFound)
            {
                CMessage.GotResponseNonExistentUser(ChannelId, API_NAME);
                return(BasicStreamInfo.Empty);
            }

            string videoId = ScrapeBit.FirstString(response.Content, "\"videoDetails\":{\"videoId\":\"", "\"");
            if (videoId == null)
            {
                return(BasicStreamInfo.Empty);
            }

            if (response.Content.Contains("LIVE_STREAM_OFFLINE"))
            {
                CMessage.GotResponseScheduledLivestream(ChannelId, API_NAME);
                return(BasicStreamInfo.Empty);
            }
            else
            {
                return(new BasicStreamInfo(true, videoId));
            }
        }
        catch (Exception) { return(BasicStreamInfo.Empty); }
    }
    public async Task Run()
    {
        try
        {
            string PageResponse = await RequestCurrentStatus();

            if (PageResponse != null)
            {
                Player DownloadInfo = Player.RetrievePlayer(PageResponse);
                if (DownloadInfo.Quality == Quality.NotFound)
                {
                    return;
                }

                string Title       = ScrapeBit.FirstFrom(PageResponse, TITLE);
                string Path        = FilePaths.GetLivestreamsPath(FileName.Purify($"{Title} [{DateTime.Now.Ticks.GetHashCode()}].mp4"));
                string Description = ScrapeBit.FirstFrom(PageResponse, DESCRIPTION);


                Console.WriteLine($"Found Livestream with Title: {Title} and Quality: {DownloadInfo.Quality}");
                await Download(DownloadInfo.Url, Path);

                var Upload = new Youtube(FilePaths.SecretsFile);
                await Upload.Init();

                _ = Upload.UploadWithRetry(new YoutubeUpload()
                {
                    LivestreamPath = Path, Title = Title, Description = Description, ThumbnailPath = null
                }, TimeSpan.FromHours(3));
            }
        }

        catch (Exception x) { Console.WriteLine($"Error in Check loop, Exception occurred: {x.Message}, please restart"); }
    }
    public async Task <string> RequestCurrentStatus()
    {
        try
        {
            var client = new RestClient($"https://trovo.live/{Name}");
            client.Timeout   = -1;
            client.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36";
            var           request      = new RestRequest(Method.GET);
            IRestResponse PageResponse = await client.ExecuteAsync(request);

            if (PageResponse.Content == null)
            {
                return(null);
            }

            string BoolText = ScrapeBit.FirstFrom(PageResponse.Content, ISLIVE);
            if (BoolText == null)
            {
                return(null);
            }

            bool status = bool.Parse(BoolText.ToLower());

            if (status)
            {
                return(PageResponse.Content);
            }
            else
            {
                return(null);
            }
        }
        catch (Exception) { return(null); }
    }
    public static Player RetrievePlayer(string PageContent)
    {
        IList <Player> PlayerQualityTypes = new List <Player>();

        Bitrate[] Bitrates = { Bitrate.Create(5000, Quality.High), Bitrate.Create(0, Quality.MediumHighest), Bitrate.Create(2500, Quality.Medium), Bitrate.Create(1500, Quality.Low), Bitrate.Create(600, Quality.VeryLow) };


        foreach (var Bitrate in Bitrates)
        {
            string Url = ScrapeBit.FirstString(PageContent, "{\"bitrate\":" + Bitrate.amount + ",\"playUrl\":\"", "\","); // FHD High Bitrate

            if (Url == null)
            {
                continue;
            }
            else
            {
                return(new Player(Url, Bitrate.quality));
            }
        }
        return(new Player(null, Quality.NotFound));
    }
 public static string[] AllFrom(string Source, Scrape scrape)
 {
     return(ScrapeBit.AllString(Source, scrape.SearchString, scrape.SearchUntilString));
 }
 public static string FirstFrom(string Source, Scrape scrape)
 {
     return(ScrapeBit.FirstString(Source, scrape.SearchString, scrape.SearchUntilString));
 }