using System.Net.Mime; using System.Text; using System.Text.Json; using System.Text.Json.Nodes; using DotBased.Monads; using Manager.YouTube.Models.Innertube; using Manager.YouTube.Parsers; using Manager.YouTube.Util; namespace Manager.YouTube; public static class NetworkService { private const string Origin = "https://www.youtube.com"; public static async Task> GetClientStateAsync(YouTubeClient client) { var httpRequest = new HttpRequestMessage { Method = HttpMethod.Get, RequestUri = new Uri(Origin) }; httpRequest.Headers.IfModifiedSince = new DateTimeOffset(DateTime.UtcNow); httpRequest.Headers.UserAgent.ParseAdd(client.UserAgent); httpRequest.Headers.Accept.ParseAdd("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); httpRequest.Headers.Connection.Add("keep-alive"); httpRequest.Headers.Add("DNT", "1"); httpRequest.Headers.Add("Upgrade-Insecure-Requests", "1"); var http = client.GetHttpClient(); if (http == null) { return ResultError.Fail("Unable to get http client!"); } var response = await http.SendAsync(httpRequest); if (!response.IsSuccessStatusCode) { var responseResult = await response.Content.ReadAsStringAsync(); return ResultError.Fail(responseResult); } var responseHtml = await response.Content.ReadAsStringAsync(); var clientStateResult = HtmlParser.GetStateJson(responseHtml); if (clientStateResult is { IsSuccess: false, Error: not null }) { return clientStateResult.Error; } ClientState? clientState; try { clientState = JsonSerializer.Deserialize(clientStateResult.Value.Item1); } catch (Exception e) { return ResultError.Error(e, "Error while parsing JSON!"); } return clientState == null ? ResultError.Fail("Unable to parse client state!") : clientState; } public static async Task GetCurrentAccountInfoAsync(YouTubeClient client) { if (client.ClientState is not { LoggedIn: true }) { return ResultError.Fail("Client not logged in!"); } var httpRequest = new HttpRequestMessage { Method = HttpMethod.Post, RequestUri = new Uri($"{Origin}/youtubei/v1/account/account_menu") }; httpRequest.Headers.UserAgent.ParseAdd(client.UserAgent); httpRequest.Headers.Add("Origin", Origin); if (client.SapisidCookie != null) { httpRequest.Headers.Authorization = AuthenticationUtilities.GetSapisidHashHeader(client.ClientState.WebPlayerContextConfig?.WebPlayerContext?.DatasyncId ?? "", client.SapisidCookie.Value, Origin); } var serializedContext = JsonSerializer.SerializeToNode(client.ClientState.InnerTubeContext); var contextJson = new JsonObject { { "context", serializedContext } }; httpRequest.Content = new StringContent(contextJson.ToJsonString(), Encoding.UTF8, MediaTypeNames.Application.Json); var http = client.GetHttpClient(); if (http == null) { return ResultError.Fail("Unable to get http client!"); } var response = await http.SendAsync(httpRequest); if (!response.IsSuccessStatusCode) { var responseResult = await response.Content.ReadAsStringAsync(); return ResultError.Fail(responseResult); } var json = await response.Content.ReadAsStringAsync(); var jsonObject = JsonNode.Parse(json); return ResultError.Fail("Not implemented"); } }