K1llMan/Yandex.Music.Api

Зависает при вызове GetFileLink

UrbanSide opened this issue · 25 comments

День добрый пишу свой аналог ЯМузыки,пытаюсь получать ссылку на трек,чтобы передать в воспроизведение

        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)); все работает

Добрый день. Таким способом не совсем корректно будет получать данные для проигрывания, потому что ссылки протухают через несколько минут. Рекомендуется кэшировать композиции.

По поводу зависания. На любом треке виснет? Нужен идентификатор, чтобы я смог протестировать.
DashboardPage - это конструктор?

По поводу зависания. На любом треке виснет? Нужен идентификатор, чтобы я смог протестировать.

У меня почему-то да...

DashboardPage - это конструктор?

Я использую WpfUI библиотеку,это от туда.

Добрый день. Таким способом не совсем корректно будет получать данные для проигрывания, потому что ссылки протухают через несколько минут. Рекомендуется кэшировать композиции.

А вот это я не очень понял...(

Ссылки я планировал получать на трек лишь в тот момент когда юзер его включает.Или все равно не вариант?
Я в данный момент просто пытаюсь тестовую площадку свою собрать,чтобы понять как дальше работать)

Ссылки я планировал получать на трек лишь в тот момент когда юзер его включает.Или все равно не вариант?

Если на момент передачи в какой-то плеер в браузере, то вариант. Просто в коде цикл, и на момент проигрывания треков после первого ссылки уже протухнут.

Если на момент передачи в какой-то плеер в браузере, то вариант. Просто в коде цикл, и на момент проигрывания треков после первого ссылки уже протухнут.

Ну вот я так и хочу,когда пользователь клацает на иконку "играть" тогда из списка треков брать его «<id альбома>:<id трека>». и по нему получать ссылку.Понимаю что будут подвисы...но имхо это выход.Но пока увы это не работает у меня.
Сижу изучаю.

В общем, если кратко, то это проблема потока выполнения на интерфейсе. Ловится блокировка на асинхронные операции от библиотеки.
https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

Подумаю, что с этим можно сделать. Первые две операции выполняются асинхронно, а ссылка сейчас получается синхронно.

В общем, если кратко, то это проблема потока выполнения на интерфейсе. Ловится блокировка на асинхронные операции от библиотеки. https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

Подумаю, что с этим можно сделать. Первые две операции выполняются асинхронно, а ссылка сейчас получается синхронно.

Понял,спасибо. А то либ лучше вашей пока не нашлось под мои задачи,и только вроде все пошло,и тут на тебе...

            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);
                    await Task.Run(() =>
                    {
                        Debug.WriteLine(_client.Track.GetFileLink(_storage, item.Track));
                    });
            }

Вот такой костыль пока помог решить проблему частично.
Буду пытаться так же при клике на трек вызывать.

Я скоро выложу новую версию, где добавил асинхронность на эти методы.

... пишу свой аналог ЯМузыки
Сижу изучаю.

Подписался на вас. Надеюсь, однажды опенсорсните свои наработки. Своя Я.Музыка это оч круто, а то вдруг Яндекс прибьет олдскульную UWP-версию своего творения

Выложил версию 1.3.6. Публикуется. Проверьте по возможности.

Выложил версию 1.3.6. Публикуется. Проверьте по возможности.

Спасибо,сейчас обновлюсь.

... пишу свой аналог ЯМузыки
Сижу изучаю.

Подписался на вас. Надеюсь, однажды опенсорсните свои наработки. Своя Я.Музыка это оч круто, а то вдруг Яндекс прибьет олдскульную UWP-версию своего творения

https://t.me/YDiscordMusic
Надеюсь автор не будет ругаться)Раз интересно,там веду блог не спешно)
Я давно этим занимаюсь,но раньше юзал WebView2 а ща решил на либу перейти дабы свой UI сделать и т.п

@K1llMan слушай вопрос,а Волну как-то реально получать? Или нет?
Пока все остальное работает,после обновления,спасибо.

Моя волна это радиостанция с id "user:onyourwave".

Моя волна это радиостанция с id "user:onyourwave".

Да,понял,но я не очень понимаю правильно ли вызываю?

            var wave = await _client.Radio.GetStationAsync(_storage,"user", "onyourwave");
            var wave_data = wave.Result[0].GetTracks();
            foreach(var test in wave_data)
            {
                Debug.WriteLine(test.Track.Title);
            }

В итоге просто замораживает Ui и все.Я так понимаю тут похоже то же самое что было до этого в первом посте?Или нет и я просто криворукий?

@K1llMan

            await Task.Run(() =>
            {
                Debug.WriteLine(wave.Result[0].GetTracks()[0].Track.Title);
            });

Да,такой костыль как и раньше срабатывает,для теста вывел хардкодом один трек.Все получил.
Видимо надо async опять метод делать?)
Или же я все же тупой просто)

В итоге просто замораживает Ui и все.Я так понимаю тут похоже то же самое что было до этого в первом посте?Или нет и я просто криворукий?

Здесь два подхода смешались. Методы-расширения из клиента идут, и они синхронные. Надо через API получать.

В итоге просто замораживает Ui и все.Я так понимаю тут похоже то же самое что было до этого в первом посте?Или нет и я просто криворукий?

Здесь два подхода смешались. Методы-расширения из клиента идут, и они синхронные. Надо через API получать.

Я вот и не очень понимаю просто как)
Доку смотрю,но вижу фигу)

YResponse<YStationSequence> sequence = Fixture.API.Radio.GetStationTracks(Fixture.Storage, Fixture.Station.Result.First());

Только версию метода асинхронную нужно использовать.

YResponse<YStationSequence> sequence = Fixture.API.Radio.GetStationTracks(Fixture.Storage, Fixture.Station.Result.First());

Только версию метода асинхронную нужно использовать.

А у меня еще такой сработал вроде

            var station = await _client.Radio.GetStationAsync(_storage, "user", "onyourwave");
            var wave = await _client.Radio.GetStationTracksAsync(_storage, station.Result[0]);
            foreach(var test in wave.Result.Sequence)
            {
                Debug.WriteLine(test.Track.Title);
            }

Но это я понимаю так не правильно?

Правильно. Это он и есть.

Правильно. Это он и есть.

А,понял,спасибо)Отлично,будем думать теперь как его обновлять по мере проходки треков и т.д
Спасибо большое за отзывчивость)

По поводу обновления треков на станции может проблема с повторением, потому что методы отправки состояния не реализованы, а без них следующая порция треков может часто повторяться. Пробовал реализовать на примере из API на Python, но запрос не проходил, не было времени разбираться с ним.

По поводу обновления треков на станции может проблема с повторением, потому что методы отправки состояния не реализованы, а без них следующая порция треков может часто повторяться. Пробовал реализовать на примере из API на Python, но запрос не проходил, не было времени разбираться с ним.

Хм,понял...спасибо.Ну пока хоть что то и то радует.А то народ хотел волну :D
Они и на трубе,пк бывают повторяются,так что не критично особо думаю.