k1llman / yandex.music.api Goto Github PK
View Code? Open in Web Editor NEWYandex.Music API (Unofficial) for .Net
License: GNU General Public License v3.0
Yandex.Music API (Unofficial) for .Net
License: GNU General Public License v3.0
При получении треков из чарта возвращается только 10 объектов.
Использую следующую конструкцию:
List<YLandingEntity> list = Client.GetLanding(YLandingBlockType.Chart).Blocks[0].Entities;
Здесь список имеет значение свойства Count
, равное 10, а не 100, как ожидалось.
Каждый из этих объектов преобразуется в YLandingEntityChart
, у которого, в свою очередь, есть свойство Track
, которое далее используется.
Возможно, требуются какие-то дополнительные инструкции?
Заранее спасибо огромное!!!
Необходимо добавить асинхронный клиент, а также асинхронные версию для методов-расширений. Проверить методы авторизации на синхронные вызовы.
Хотелось бы узнать, можно ли с помощью данного API получить список абсолютно всех треков по исполнителю, чтобы из них сформировать плейлист? Своими силами удалось получить только количество треков для определённого исполнителя.
Необходимо реализовать получение состояния плеера через подключение по веб-сокетам:
Привет!
Прежде всего хочу сказать спасибо за доработку API ;)
В Nuget сейчас опубликована старая версия пакета 2019 года . Как насчет публикации nuget пакета последней версии?
Привет. Я не против. По лендингу, правда, надо бы капитально переделать (https://github.com/K1llMan/Yandex.Music.Api/issues/44#issuecomment-2057637913)
Не знаю, все ли есть эндпоинты, но можно дополнить ещё из https://github.com/acherkashin/yandex-music-open-api/blob/main/src/yandex-music.yaml из landing3, а также по genres тоже ничего нет.
Originally posted by @K1llMan in #45 (comment)
День добрый пишу свой аналог ЯМузыки,пытаюсь получать ссылку на трек,чтобы передать в воспроизведение
YandexMusicApi _client;
AuthStorage _storage;
public DashboardPage(ViewModels.DashboardViewModel viewModel)
{
ViewModel = viewModel;
InitializeComponent();
_client = new YandexMusicApi();
_storage = new AuthStorage();
YandexAsync();
}
private async Task YandexAsync()
{
await _client.User.AuthorizeAsync(_storage, "Токен");
var play = await _client.Playlist.OfTheDayAsync(_storage);
foreach (var item in play.Result.Tracks)
{
tracks.Items.Add(item.Track.Artists[0].Name + " - " + item.Track.Title);
Debug.WriteLine(_client.Track.GetFileLink(_storage, item.Track));
}
}
Но код зависает наглухо без ошибок.
Без Debug.WriteLine(_client.Track.GetFileLink(_storage, item.Track));
все работает
At \src\Yandex.Music.Api\API\Y*API.cs classes has wrong definition for async methotds.
public async Task<YResponse<YLibraryTracks>> GetLikedTracksAsync(AuthStorage storage) { return await ...; }
No need async/await here. You method already returns a task, async/await must be in the calling code.
Здраствуйте.
А есть возможность с помощью этой библиотеки скачивать песни(треки, подкасты) по ссылкам с сервиса Yandex Music??
Привет! Можно при помощи github actions проверять билд на наличие ошибок, выгружать в nuget/docker и т.д.
Советую использовать в проекте. Для этого тебе надо взять API ключ у nuget и сохранить его в Environment репозитория, а в папке .gtihub/workflows создать файл примерно с таким содержанием:
name: NuGet - Release
on:
release:
types: [published]
jobs:
publish-nuget:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup .NET Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: !!DOTNET_VERSION!!
- name: Set output
id: vars
run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
- name: Publish to NuGet
uses: kelson-dev/[email protected]
with:
PROJECT_FILE_PATH: !!PATH_TO_sln_FILE!!
VERSION_STATIC: ${{ steps.vars.outputs.tags }}
TAG_COMMIT: true
TAG_FORMAT: "*"
NUGET_KEY: ${{secrets.NUGET_API_KEY}}
NUGET_SOURCE: https://api.nuget.org
INCLUDE_SYMBOLS: false
где DOTNET_VERSION - версия .net, например, '7.x.x' или '6.x.x', а PATH_TO_sln_FILE - путь до файла с расширением .sln, у тебя это
src/Yandex.Music.Api.sln
p.s. в .csproj надо добавить
<Version>!!VERSION!!</Version>
где VERSION - версия проекта для выгрузки в nuget, надо изменять перед каждым release
Использование библиотеки в приложениях Windows Forms (не важно, какой версии .NET Framework или даже .NET / .NET Core) ведёт к их вечному зависанию при вызове любого метода, обращающегося к API Яндекс Музыки в любом месте приложения (в консольных программах библиотека работает нормально).
Например, следующий код, помещённый в конструктор формы вообще не даст отобразить форму, и приложение намертво зависнет:
YandexMusicClient api = new();
MessageBox.Show(api.GetAuthQRLink());
При получении плейлиста Api.GetPlaylist("yamusic-summer2023", "7934310") (с другими ID так же, пробовал эти плейлисты с разных аккаунтов) возникает исключение System.Exception с сообщением:
Ошибка десериализации System.InvalidOperationException: Current error context error is different to requested error.
at Newtonsoft.Json.Serialization.JsonSerializerInternalBase.GetErrorContext(Object currentObject, Object member, String path, Exception error)
at Newtonsoft.Json.Serialization.JsonSerializerInternalBase.IsErrorHandled(Object currentObject, JsonContract contract, Object keyValue, IJsonLineInfo lineInfo, String path, Exception ex)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)
at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings)
at Yandex.Music.Api.Common.Providers.CommonRequestProvider.GetDataFromResponseAsync[T](YandexMus
icApi api, HttpResponseMessage response)
В методе public virtual async Task GetDataFromResponseAsync(YandexMusicApi api, HttpResponseMessage response) получен JSON в текстовом формате, в нем присутствует вся информация о треках (сравнил с результатом по запросу плейлиста другого типа)
Как я вызывал: var feed = await _yandexApi.Landing.GetFeedAsync(_storage);
Где, _yandexApi
экземпляр класса YandexMusicApi
Стек трейс:
Ошибка десериализации System.Exception: Ошибка десериализации типа "last-week-personal-popular-tracks".
---> System.ArgumentException: Could not convert 'last-week-personal-popular-tracks' to YFeedEventType.
---> Newtonsoft.Json.JsonSerializationException: Error converting value "last-week-personal-popular-tracks" to type 'Yandex.Music.Api.Models.Feed.Event.YFeedEventType'. Path '[1].typeForFrom', line 1, position 30827.
---> System.ArgumentException: Requested value 'last-week-personal-popular-tracks' was not found.
at Newtonsoft.Json.Utilities.EnumUtils.ParseEnum(Type enumType, NamingStrategy namingStrategy, String value, Boolean disallowNumber)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureType(JsonReader reader, Object value, CultureInfo culture, JsonContract contract, Type targetType)
--- End of inner exception stack trace ---
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureType(JsonReader reader, Object value, CultureInfo culture, JsonContract contract, Type targetType)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
at Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType)
at Newtonsoft.Json.Linq.JToken.ToObject(Type objectType, JsonSerializer jsonSerializer)
at Newtonsoft.Json.Linq.JToken.ToObject(Type objectType)
--- End of inner exception stack trace ---
at Newtonsoft.Json.Linq.JToken.ToObject(Type objectType)
at Newtonsoft.Json.Linq.JToken.ToObject[T]()
at Yandex.Music.Api.Models.Feed.Event.YFeedEventConverter.GetEvent(JToken jObject)
--- End of inner exception stack trace ---
at Yandex.Music.Api.Models.Feed.Event.YFeedEventConverter.GetEvent(JToken jObject)
at System.Linq.Enumerable.SelectIListIterator`2.ToList()
at Yandex.Music.Api.Models.Feed.Event.YFeedEventConverter.ReadJson(JsonReader reader, Type objectType, Object existingValue, JsonSerializer serializer)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.DeserializeConvertable(JsonConverter converter, JsonReader reader, Type objectType, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, Object target)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateList(IList list, JsonReader reader, JsonArrayContract contract, JsonProperty containerProperty, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, Object existingValue, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, Object target)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, Object target)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
at Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType)
at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)
at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings)
at Yandex.Music.Api.Common.Providers.CommonRequestProvider.GetDataFromResponseAsync[T](YandexMusicApi api, HttpResponseMessage response)
Здравствуйте.
Спасибо за интересный проект.
Не планируете ли сделать функционал по загрузке треков из своей коллекции или по id ??
Есть расширение для браузера по загрузке. Может как основу для идеи взять.
Скачать музыку 2.0.6
Привет, в апи сейчас не реализованы следующие эндпоинты:
GET /users/{uid}/contexts?trackCount={trackCount}&types={contexTypeArray}&contextCount={contextsCount}
GET /children-landing/catalogue
Хочу законтрибьютить этот функционал. @K1llMan нет возражений?
Есть ли способ получения популярности всех треков исполнителя, чтобы была такая же последовательность, как при их просмотре (artist/***/tracks)?
Нашел YTrack.Chart.Position, но для тех треков, которых нет в чарте, Chart == null
Есть еще YArtistBriefInfo.PopularTracks, но в этой коллекции меньше треков, чем их всего
Заранее спасибо!
В чем проблема:
При попытке авторизоваться через метод public bool Authorize(string login, string password)
класса Yandex.Music.Client.YandexMusicClient
возвращается ошибка:
System.Net.WebException: The remote server returned an error: (400) Bad Request.
at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at System.Net.WebRequest.<>c.<GetResponseAsync>b__68_2(IAsyncResult iar)
at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
--- End of stack trace from previous location ---
at Yandex.Music.Api.Requests.YRequest`1.GetWebResponseAsync()
at Yandex.Music.Api.Requests.YRequest`1.GetWebResponseAsync()
at Yandex.Music.Api.Requests.YRequest`1.GetResponseAsync()
at Yandex.Music.Api.API.YUserAPI.AuthPassport(AuthStorage storage, String login, String password)
at Yandex.Music.Api.API.YUserAPI.AuthorizeAsync(AuthStorage storage, String login, String password)
at Yandex.Music.Api.API.YUserAPI.Authorize(AuthStorage storage, String login, String password)
at Yandex.Music.Client.YandexMusicClient.Authorize(String login, String password)
В чем причина:
Как я понимаю начиная с некоторого момента осталась возможность авторизоваться только по токену.
Метод авторизации по токену отрабатывает как нужно.
Для получения токена по U/P нашел такую информацию из телеграмм группы (использовал 1 метод из списка):
Своё OAuth приложение создать нельзя. Единственный вариант это использовать приложения официальных клиентов Яндекс.Музыка.
- Самый простой способ получения токена: https://github.com/MarshalX/yandex-music-api/discussions/513#discussioncomment-2729781
- Сайт для получения токена который работает не со всеми аккаунтами: https://music-yandex-bot.ru/
- Скрипт получения токена для изучения. В этом чате с ним не помогают: https://github.com/AlexxIT/YandexStation/blob/master/custom_components/yandex_station/core/yandex_session.py
Что предлагается
Может кто-то проверить, действительно ли перестала работать авторизация по U/P ?
Если так, то предлагаю либо удалить метод из класса, либо пометить его как устаревший.
@K1llMan а библиотека все?
Получаю список треков,далее получаю ссылку на трек,а там такое:
https://pixeldrain.com/u/269hNdNL
"Удалите текущую версию..."
Привет, увидел что в апи не реализован функционал работы с лейблами. В апи есть два эндпоинта:
GET /labels/{id}/artists?page={page}
GET /labels/{id}/albums?page={page}
Каждый из них в ответе возвращает массив артистов/альбомов и объект YPager. Хочу законтрибьютить этот функционал.
@K1llMan нет возражений?
Всем привет!
Прежде всего спасибо @K1llMan за обратную связь по проблемам и проделанную работу!
Есть некоторые предложения:
Если есть какие-то планы по доработке API и приветствуется контрибьютинг со стороны, то можно где-то их увидеть?
Готов со своей стороны помочь с некоторыми проблемами, написанием тестов и т.п.
Сам использую либу в своем пет-проектке ;)
В readme не было бы лишним добавить ссылки на nuget пакеты и короткое их описание.
Здраствуйте.
А не планируется работа с Яндекс диском. По аналогии я Яндекс музыкой??
В логах результатов запросов (во время десериализации) появляются записи:
Could not find member 'status' on object of type 'YAccessToken'.
Path 'status', line 1, position 10.
Could not find member 'location_id' on object of type 'YShortAccountInfo'.
Path 'location_id', line 1, position 94.
Could not find member 'gender' on object of type 'YShortAccountInfo'.
Path 'gender', line 1, position 329.
Could not find member 'is_avatar_empty' on object of type 'YShortAccountInfo'.
Path 'is_avatar_empty', line 1, position 351.
Could not find member 'machine_readable_login' on object of type 'YShortAccountInfo'.
Path 'machine_readable_login', line 1, position 544.
Could not find member 'has_cards' on object of type 'YShortAccountInfo'.
Path 'has_cards', line 1, position 569.
Could not find member 'has_family' on object of type 'YShortAccountInfo'.
Path 'has_family', line 1, position 588.
Could not find member 'x_token_client_id' on object of type 'YShortAccountInfo'.
Path 'x_token_client_id', line 1, position 644.
Could not find member 'x_token_need_reset' on object of type 'YShortAccountInfo'.
Path 'x_token_need_reset', line 1, position 700.
Could not find member 'hasTrailer' on object of type 'YArtist'.
Path 'result.artist.hasTrailer', line 1, position 2326.
Добавил эти поля в соответствующие классы "по образу и подобию".
Подавлены предупреждения в проекте API, связанные с "legacy" конструкциями для netstandard2.0.
Исправил окончания всех файлов и произвел небольшую очистку кода в ручном режиме.
Тесты проводил при авторизации через пароль. Статистика результатов теста не изменилась. Записи в логах больше не появляются.
Хочу законтрибьютить изменения.
Проблема
Во время выполнения поиска трека по исполнителю и названию наткнулся на следующую ошибку:
Текст ошибки:
System.Exception: 'Ошибка десериализации типа "YSearchAlbumModel".'
JsonReaderException: Unexpected character encountered while parsing value: {. Path 'result.tracks.results[0].albums[0].labels', line 1, position 1570.
Как воспроизвести
Сделать вызов метода
public YSearch Search(string searchText, YSearchType searchType, int page = 0)
из класса Yandex.Music.Client.YandexMusicClient
С передачей аргументов:
searchText="Parkway Drive - Carrion"
searchType = YSearchType.Track
В чем проблема
При десериализации результата запроса json в модель YSearchAlbumModel
поле public new List<string> Labels { get; set; }
может иметь разные типы внутри.
Например в одном месте:
"labels": [
{
"id": 445547,
"name": "Epitaph"
}
],
В другом:
"labels": [
"Epitaph"
],
Здравствуйте, перестала работать авторизация через client.Authorize(), после обновления методов авторизации способ авторизации поменялся? Выдает исключение с пустым токеном
Привет! Сейчас не реализован данный функционал, скорее всего по причине того, что используется API от мобильных приложений я.музыки. У меня возникла необходимость использовать этот функционал, поэтому предлагаю со своей стороны реализовать это, но с использованием API с веб версии.
Однако возник вопрос, насколько это будет релевантно в данной библиотеке?
Здравствуйте, подскажите пожалуйста, может ли данный API получать данные о текущем проигрываемом треке?
При вызове метода CreateAuthSession(AuthStorage storage, string userName)
возникает исключение внутри CommonRequestProvider
в методе GetDataFromResponseAsync<T>
. Массив методов авторизации в ответе на запрос содержит в себе элемент "social_gg" десериализация которого текущей версией API не предусмотренна. Ошибка предположительно возникает только при выполнении запросов с IP аддресов находящихся не на территории РФ.
Часть ответа на запрос создания сессии:
StackTrace:
System.Exception: Ошибка десериализации Newtonsoft.Json.JsonSerializationException: Error converting value "social_gg" to type 'Yandex.Music.Api.Models.Account.YAuthMethod'. Path 'auth_methods[3]', line 1, position 298.
---> System.ArgumentException: Requested value 'social_gg' was not found.
at Newtonsoft.Json.Utilities.EnumUtils.ParseEnum(Type enumType, NamingStrategy namingStrategy, String value, Boolean disallowNumber)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureType(JsonReader reader, Object value, CultureInfo culture, JsonContract contract, Type targetType)
--- End of inner exception stack trace ---
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureType(JsonReader reader, Object value, CultureInfo culture, JsonContract contract, Type targetType)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateList(IList list, JsonReader reader, JsonArrayContract contract, JsonProperty containerProperty, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, Object existingValue, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, Object target)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
at Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType)
at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)
at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings)
at Yandex.Music.Api.Common.Providers.CommonRequestProvider.GetDataFromResponseAsync[T](YandexMusicApi api, HttpResponseMessage response)
at Yandex.Music.Api.Common.Providers.CommonRequestProvider.GetDataFromResponseAsync[T](YandexMusicApi api, HttpResponseMessage response) in C:\Users\Wayne Harsman\Documents\Programming\Projects\KA.YandexMusicApi\src\Yandex.Music.Api\Common\Providers\CommonRequestProvider.cs:line 61
at Yandex.Music.Api.Requests.Common.YRequest`1.GetResponseAsync() in C:\Users\Wayne Harsman\Documents\Programming\Projects\KA.YandexMusicApi\src\Yandex.Music.Api\Requests\Common\YRequest.cs:line 41
at Yandex.Music.Api.API.YUserAPI.CreateAuthSessionAsync(AuthStorage storage, String userName) in C:\Users\Wayne Harsman\Documents\Programming\Projects\KA.YandexMusicApi\src\Yandex.Music.Api\API\YUserAPIAsync.cs:line 126
at Yandex.Music.Api.API.YUserAPI.CreateAuthSession(AuthStorage storage, String userName) in C:\Users\Wayne Harsman\Documents\Programming\Projects\KA.YandexMusicApi\src\Yandex.Music.Api\API\YUserAPI.cs:line 43
at Program.<Main>$(String[] args) in C:\Users\Wayne Harsman\Documents\Programming\Projects\YaMAPIQuickTest\Playground\YaMuApiPlayground\YaMuApiPlayground\Program.cs:line 9
var api = new YandexMusicApi();
var storage = new AuthStorage();
api.User.CreateAuthSession(storage, "...actualLogin...");
Как указано выше, наличие елемента social_gg вероятнее всего связано с региональными ограничениями самого Яндекса
Простейшим решением может быть модификация перечисления YAuthMethod следующим способом:
public enum YAuthMethod
{
Password,
[EnumMember(Value = "magic_x_token")]
MagicToken,
[EnumMember(Value = "magic_link")]
MagicLink,
Magic,
Otp,
[EnumMember(Value = "social_gg")]
Social
}
Вариант рабочий
Предположительно игнорирование незнакомых типов будет более универсальным решением. Я не имею ни малейшего представления о том что из себя должен представлять данным метод авторизации т.к. веб интерфейс при ручном входе в аккаунт не имеет отличий от "родного славянского"
YLanding landing = await MainWindow.Client.GetLanding(YLandingBlockType.PersonalPlaylists); //всё окей
YPlaylist playlist = (landing.Blocks[0].Entities[0] as YLandingEntityPersonalPlaylist).Data.Data; //на этом этапе корректно получается плейлист дежавю
//так как плейлист пустой (playlist.Tracks == null), получаю треки
YPlaylist playlistWithTracks = await playlist.WithTracksAsync(); //тут падает с исключением
Метод Client.GetPersonalPlaylists() работает исправно
Немногочисленные результаты дебагера прикрепляю
log.txt
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.