Какую проблему решит эта фича?
Сейчас LMP останавливает воспроизведение, когда очередь треков подходит к концу. Чтобы продолжить слушать музыку, пользователю приходится вручную искать новые альбомы или запускать плейлисты.
Интеграция полноценного Радио (YouTube Music Mixes) решит эту проблему:
- Эффект бесконечной музыки: Пользователь сможет включить один трек, а плеер сам продолжит генерировать и подгружать бесконечный поток похожих композиций.
- Сохранение привычного UX: Воспроизведение бесконечных миксов («Радио по треку») — одна из ключевых и любимых функций официального клиента YouTube Music.
Описание предлагаемого решения
Реализовать полноценную поддержку радио-миксов на уровне провайдера, очереди движка и настроек плеера.
Опция бесконечной очереди (Автовоспроизведение / Autoplay)
Добавить в настройки звука (AudioSettings / AppSettings) новую булеву настройку AutoplayEnabled (отображать в UI как «Автовоспроизведение похожих треков» или «Бесконечная очередь»).
- Если настройка выключена: плеер работает в классическом режиме (останавливается в конце очереди).
- Если настройка включена: при достижении конца очереди (при условии, что повтор очереди
RepeatMode выключен) плеер не останавливается, а автоматически запрашивает у YouTube похожие треки на основе последнего сыгранного трека, добавляет их в конец очереди и продолжает играть.
Запуск радио на основе трека или плейлиста
Реализовать точки входа для ручного старта радио-режима из любого списка:
- Радио по треку: При клике на пункт «Запустить радио» в контекстном меню трека (
TrackItemViewModel.StartRadioCommand) очищать текущую очередь, запрашивать у YoutubeProvider.GetRadioAsync(sourceTrack, 25) первую партию из 25 похожих треков, загружать их в очередь AudioEngine и запускать первый трек. Думаю парти тоже можно настраивать точно от там 10 до 50.
- Радио по плейлисту: При клике на кнопку «Радио» в шапке плейлиста формировать микс на основе первого трека этого плейлиста или использовать встроенные миксы YouTube Music (RD-плейлисты вида
RDCLAK...).
Архитектурная интеграция в фоновый движок
Внедрить логику автогенерации в AudioEngine.cs в метод навигации TryMoveNext:
- На шаге проверки перехода к следующему треку, если
_currentIndex + 1 >= _queue.Count (достигнут конец очереди) и AutoplayEnabled равен true:
- Не вызывать
Stop(). Вместо этого отправлять асинхронный запрос в фоновом потоке (Task.Run) [1] к _youtube.GetRadioAsync(lastTrack, 25) под токеном текущей сессии [1].
- Полученные 25 похожих треков атомарно добавлять в конец текущей очереди через
_audio.EnqueueRange(nextTracks).
- Движок переходит к следующему индексу и бесшовно продолжает играть без пауз.
- Каждый добавленный таким образом трек должен помечаться свойством
RadioSeedId = sourceTrack.Id, чтобы при последующих переходах мы знали, от какого трека-«прародителя» строится текущий микс.
Альтернативные варианты (если есть)
- Только ручной запуск: Позволить пользователям запускать радио только вручную из контекстного меню. Это проще в реализации, но сильно вредит UX, так как не даёт эффекта «бесконечного радио», когда плеер сам подхватывает воспроизведение после завершения выбранного альбома.
Какую проблему решит эта фича?
Сейчас LMP останавливает воспроизведение, когда очередь треков подходит к концу. Чтобы продолжить слушать музыку, пользователю приходится вручную искать новые альбомы или запускать плейлисты.
Интеграция полноценного Радио (YouTube Music Mixes) решит эту проблему:
Описание предлагаемого решения
Реализовать полноценную поддержку радио-миксов на уровне провайдера, очереди движка и настроек плеера.
Опция бесконечной очереди (Автовоспроизведение / Autoplay)
Добавить в настройки звука (
AudioSettings/AppSettings) новую булеву настройкуAutoplayEnabled(отображать в UI как «Автовоспроизведение похожих треков» или «Бесконечная очередь»).RepeatModeвыключен) плеер не останавливается, а автоматически запрашивает у YouTube похожие треки на основе последнего сыгранного трека, добавляет их в конец очереди и продолжает играть.Запуск радио на основе трека или плейлиста
Реализовать точки входа для ручного старта радио-режима из любого списка:
TrackItemViewModel.StartRadioCommand) очищать текущую очередь, запрашивать уYoutubeProvider.GetRadioAsync(sourceTrack, 25)первую партию из 25 похожих треков, загружать их в очередьAudioEngineи запускать первый трек. Думаю парти тоже можно настраивать точно от там 10 до 50.RDCLAK...).Архитектурная интеграция в фоновый движок
Внедрить логику автогенерации в
AudioEngine.csв метод навигацииTryMoveNext:_currentIndex + 1 >= _queue.Count(достигнут конец очереди) иAutoplayEnabledравенtrue:Stop(). Вместо этого отправлять асинхронный запрос в фоновом потоке (Task.Run) [1] к_youtube.GetRadioAsync(lastTrack, 25)под токеном текущей сессии [1]._audio.EnqueueRange(nextTracks).RadioSeedId = sourceTrack.Id, чтобы при последующих переходах мы знали, от какого трека-«прародителя» строится текущий микс.Альтернативные варианты (если есть)