diff --git a/YaMusicCli/Program.cs b/YaMusicCli/Program.cs index 99dbea1..df28863 100644 --- a/YaMusicCli/Program.cs +++ b/YaMusicCli/Program.cs @@ -1,4 +1,6 @@ -internal class Program +using YandexMusic.API.Extensions.API; + +internal class Program { private async static Task Main(string[] args) { @@ -6,5 +8,9 @@ var type = await client.Authorize("y0__xDy2budARje-AYg7rmliBc11LbYoMeUiwiO6f6mSCAMDYVIKg"); var playlists = (await client.GetFavoritesAsync()).Where(t => t.Owner.Uid == client.Account.Uid).ToList(); var playlist = await client.GetPlaylistAsync("97ae0768-8a40-8485-9fa4-b6c856bc6b21"); + + + var tracks = await client.GetTracksAsync(new[] { "78412759" }); + await playlist.InsertTracksAsync(tracks.ToArray()); } } \ No newline at end of file diff --git a/YandexMusic.API/Common/Providers/CommonRequestProvider.cs b/YandexMusic.API/Common/Providers/CommonRequestProvider.cs index d6e8369..3f7e97d 100644 --- a/YandexMusic.API/Common/Providers/CommonRequestProvider.cs +++ b/YandexMusic.API/Common/Providers/CommonRequestProvider.cs @@ -11,13 +11,6 @@ public abstract class CommonRequestProvider : IRequestProvider /// Хранилище данных авторизации. protected readonly AuthStorage storage; - /// Настройки сериализации JSON (регистронезависимые, поддержка enum-строк). - private static readonly JsonSerializerOptions JsonOptions = new() - { - PropertyNameCaseInsensitive = true, - Converters = { new JsonStringEnumConverter(JsonNamingPolicy.KebabCaseLower), new IntToStringConverter() } - }; - /// Инициализирует новый экземпляр провайдера. /// Хранилище авторизации. protected CommonRequestProvider(AuthStorage authStorage) @@ -37,6 +30,16 @@ public abstract class CommonRequestProvider : IRequestProvider { var json = await response.Content.ReadAsStringAsync(); + JsonSerializerOptions JsonOptions = new() + { + PropertyNameCaseInsensitive = true, + Converters = { + new JsonStringEnumConverter(JsonNamingPolicy.KebabCaseLower), + new IntToStringConverter(), + new YExecutionContextConverter(api, storage), + } + }; + if (!response.IsSuccessStatusCode) { var error = JsonSerializer.Deserialize(json, JsonOptions); diff --git a/YandexMusic.API/Models/Common/YExecutionContextConverter.cs b/YandexMusic.API/Models/Common/YExecutionContextConverter.cs index 115978c..8d5834c 100644 --- a/YandexMusic.API/Models/Common/YExecutionContextConverter.cs +++ b/YandexMusic.API/Models/Common/YExecutionContextConverter.cs @@ -5,7 +5,7 @@ using YandexMusic.API.Common; namespace YandexMusic.API.Models.Common; /// Конвертер для внедрения контекста выполнения (API и хранилище) в модели. -public class YExecutionContextConverter : JsonConverter +public class YExecutionContextConverter : JsonConverter { private readonly YandexMusicApi _api; private readonly AuthStorage _storage; @@ -16,26 +16,27 @@ public class YExecutionContextConverter : JsonConverter _storage = storage; } - public override YBaseModel? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + public override bool CanConvert(Type typeToConvert) => + typeof(YBaseModel).IsAssignableFrom(typeToConvert); + + public override object? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - // Десериализуем объект без контекста - var obj = (YBaseModel?)JsonSerializer.Deserialize(ref reader, typeToConvert, options); - if (obj != null) + // Убираем этот конвертер из опций, чтобы избежать рекурсии + var innerOptions = new JsonSerializerOptions(options); + innerOptions.Converters.Remove(this); + + var obj = JsonSerializer.Deserialize(ref reader, typeToConvert, innerOptions); + if (obj is YBaseModel baseModel) { - obj.Context = new YExecutionContext - { - API = _api, - Storage = _storage - }; + baseModel.Context = new YExecutionContext { API = _api, Storage = _storage }; } return obj; } - public override void Write(Utf8JsonWriter writer, YBaseModel value, JsonSerializerOptions options) + public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options) { - // При сериализации игнорируем контекст - var cloneOptions = new JsonSerializerOptions(options); - cloneOptions.Converters.Remove(this); - JsonSerializer.Serialize(writer, value, cloneOptions); + var innerOptions = new JsonSerializerOptions(options); + innerOptions.Converters.Remove(this); + JsonSerializer.Serialize(writer, value, innerOptions); } -} +} \ No newline at end of file