77 lines
2.9 KiB
C#
77 lines
2.9 KiB
C#
using System.Net;
|
||
using YandexMusic.API;
|
||
using YandexMusic.API.Common;
|
||
using YandexMusic.API.Common.Ynison;
|
||
using YandexMusic.API.Models.Account;
|
||
|
||
namespace YandexMusic;
|
||
|
||
/// <summary>Асинхронный клиент для работы с API Яндекс Музыки.</summary>
|
||
public class YandexMusicClient : IDisposable
|
||
{
|
||
private readonly YandexMusicApi _api;
|
||
private readonly AuthStorage _storage;
|
||
private readonly HttpClient _httpClient;
|
||
private YnisonPlayer? _player;
|
||
|
||
/// <summary>Хранилище авторизации.</summary>
|
||
public AuthStorage AuthStorage => _storage;
|
||
|
||
/// <summary>Информация об аккаунте (после авторизации).</summary>
|
||
public YAccount Account => _storage.User;
|
||
|
||
/// <summary>Флаг авторизации.</summary>
|
||
public bool IsAuthorized => _storage.IsAuthorized;
|
||
|
||
/// <summary>Плеер Ynison (WebSocket) для синхронизации воспроизведения.</summary>
|
||
public YnisonPlayer? Ynison => _player;
|
||
|
||
/// <summary>HttpClient, используемый клиентом (можно получить для настройки кук).</summary>
|
||
public HttpClient HttpClient => _httpClient;
|
||
|
||
/// <summary>API Яндекс Музыки.</summary>
|
||
public YandexMusicApi Api => _api;
|
||
|
||
/// <summary>Создаёт новый экземпляр клиента с собственным HttpClient.</summary>
|
||
public YandexMusicClient(
|
||
CookieContainer? cookieContainer = null,
|
||
IWebProxy? proxy = null,
|
||
TimeSpan? timeout = null,
|
||
string? userAgent = null
|
||
)
|
||
{
|
||
if (cookieContainer == null) cookieContainer = new CookieContainer();
|
||
|
||
var handler = new HttpClientHandler
|
||
{
|
||
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate,
|
||
UseCookies = true,
|
||
CookieContainer = cookieContainer,
|
||
AllowAutoRedirect = true,
|
||
MaxAutomaticRedirections = 10,
|
||
Proxy = proxy,
|
||
UseProxy = proxy != null
|
||
};
|
||
|
||
var client = new HttpClient(handler, disposeHandler: true)
|
||
{
|
||
Timeout = timeout ?? TimeSpan.FromSeconds(30)
|
||
};
|
||
|
||
// Стандартный User-Agent, похожий на браузерный
|
||
client.DefaultRequestHeaders.Add("User-Agent",
|
||
userAgent ?? "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36");
|
||
client.DefaultRequestHeaders.Add("Accept", "*/*");
|
||
client.DefaultRequestHeaders.Add("Accept-Language", "ru-RU,ru;q=0.9,en;q=0.8");
|
||
|
||
_httpClient = client;
|
||
_storage = new AuthStorage(cookieContainer);
|
||
_api = new YandexMusicApi(_httpClient, _storage);
|
||
}
|
||
|
||
public void Dispose()
|
||
{
|
||
_httpClient?.Dispose();
|
||
_player?.Dispose();
|
||
}
|
||
} |