using DotBased.Monads; using Manager.YouTube.Util; namespace Manager.YouTube; public static class NetworkService { public const string Origin = "https://www.youtube.com"; private static readonly HttpClient HttpClient = new(); public static async Task> MakeRequestAsync(HttpRequestMessage request, YouTubeClient client, bool skipAuthenticationHeader = false) { request.Headers.Add("Origin", Origin); request.Headers.UserAgent.ParseAdd(client.UserAgent); if (client.SapisidCookie != null && !skipAuthenticationHeader) { request.Headers.Authorization = AuthenticationUtilities.GetSapisidHashHeader(client.GetDatasyncId(), client.SapisidCookie.Value, Origin); } try { var response = await client.HttpClient.SendAsync(request); var contentString = await response.Content.ReadAsStringAsync(); if (!response.IsSuccessStatusCode) { return ResultError.Fail(contentString); } return contentString; } catch (Exception e) { return ResultError.Error(e); } } public static async Task> DownloadBytesAsync(HttpRequestMessage request, YouTubeClient? client = null) { try { var response = client != null ? await client.HttpClient.SendAsync(request) : await HttpClient.SendAsync(request); if (!response.IsSuccessStatusCode) { return ResultError.Fail($"Failed to get file to download, response code: {response.StatusCode}."); } var data = await response.Content.ReadAsByteArrayAsync(); return new DownloadResult(data, response.Content.Headers.ContentType?.MediaType, response.Content.Headers.ContentDisposition?.FileName?.Trim('"'), response.Content.Headers.ContentLength ?? 0); } catch (Exception e) { return ResultError.Error(e); } } } public record DownloadResult(byte[] Data, string? ContentType, string? FileName, long ContentLength);