57 lines
2.1 KiB
C#
57 lines
2.1 KiB
C#
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 HttpClient();
|
|
|
|
public static async Task<Result<string>> 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<Result<DownloadResult>> 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); |