Как сохранить плейлист дня в яндекс музыке
Перейти к содержимому

Как сохранить плейлист дня в яндекс музыке

  • автор:

15 скрытых функций «Яндекс.Музыки», о которых вы могли не знать

Мы рассказали о неочевидных возможностях Apple Music и YouTube Music. Пришло время посмотреть, какие скрытые функции есть в «Яндекс.Музыке», втором по популярности платном стриминге у читателей «Афиши Daily».

Включите темную тему

Самое лучшее в темной теме «Яндекс.Музыки» — она есть и в приложении, и на сайте. Если будете на вечеринке ставить музыку с ноутбука, оцените, насколько удобно — свет от экрана не бьет в глаза.

Как это сделать

В приложении зайдите в «Мою музыку» — настройки — «Темная тема». На сайте зайдите в «Мою музыку» — настройки — «Прочее» — «Темная тема»

Подробности по теме
15 функций Apple Music, о которых вы могли не знать

Ищите песню по строчке

Для тех, кто не помнит ни имени музыканта, ни названия песни, но почему-то знает какую-то случайную строчку. «Яндекс.Музыка» найдет песню по строчке, если в каталоге есть ее текст. Иногда песня ищется по напеву, например, «эрондондон» поможет найти песню «Get Low» из Need for Speed: Underground.

Слушайте редакторские и умные плейлисты

В «Яндекс.Музыке» три вида плейлистов: составленные пользователями, редакторами стриминга и алгоритмами. Последних четыре, и они уникальны для каждого слушателя: «Плейлист дня», «Дежавю», «Премьера» и «Тайник». Чем больше песен вы слушаете, чем больше лайкаете или дизлайкаете, тем более интересными они будут. Остальные составлены или редакторами «Яндекс.Музыки», например как «Хайп», или пользователями, например как сборники канала «Всякая годная попса».

Ищите в стриминге музыку, которую услышали в такси

Мобильное приложение распознает музыку, прямо как Shazam, и узнает даже ту песню, которой нет в библиотеке. Но если она есть в сервисе, «Яндекс.Музыка» сразу предложит добавить ее в медиатеку и сохранит в отдельный плейлист.

Как это сделать

В поиске в приложении нажмите на иконку с микрофоном

Настраивайте рекомендации, не заходя в приложение

Конечно, в «Яндекс.Музыке» есть радио. Оно включает треки или по жанру, занятию, настроению, новизне, или на основе каких-то альбомов, треков и плейлистов. Если понравился альбом или плейлист, а треки в нем закончились, включите радио — оно построит бесконечный поток песен по треклисту альбома или плейлиста. Это делается или в приложении для iOS, или на сайте. Треки в радио лайкают и дизлайкают — это повлияет на музыку, которую приложение предложит в будущем. Но самое удобное — лайкать и дизлайкать с экрана блокировки.

Как это сделать

Нажмите на иконку «гамбургера» на плеере и выберите, что сделать с текущим треком. Но работает это только с радио

Как перенести треки из Spotify в Яндекс.Музыку (полное руководство)

Недавно компания Spotify заявила о временном уходе с рынка РФ. Сейчас не понятно, что будет с аккаунтами российских пользователей и сохраненной ими музыкой, поэтому самое время позаботиться о переносе своих любимых треков в другой сервис. В Яндекс.Музыку можно перенести треки и без подписки, поэтому пока что я выбрал её.

Итак, чтобы не потерять свою музыку, вам нужно воспользоваться одним из сервисов по ее переносу. (Как оказалось, у спотифай нет возможности вывести музыку в файл без сторонних приложений, по крайней мере я не нашел).

Способ 1. Автоперенос

У этого способа есть свои недостатки:

  • Вы не можете выбрать определенные плейлисты и треки — только всю музыку, что у вас есть.
  • Он не всегда срабатывает — иногда сервис недоступен

Если вам это не подходит — переходите сразу к способу 2.

1. Заходим на новую страницу импорта Яндекс.Музыки — видим возможность выбора сервиса из которого будет экспортироваться музыка, выбираем спотифай:

шаг 1. выбор

2. Откроется страница со входом в спотифай, после входа появится предложение дать разрешение боту на использование ваших данных — соглашаемся (отключение бота показано в самом низу страницы)

шаг 2. принятие условий

3. После этого вас вернет на страницу Яндекс.Музыки и вам нужно будет просто дождаться переноса ваших треков — все треки и плейлисты, которые есть в наличии перенесутся и станут доступны в вашем профиле.

шаг 3. ждем экспорта

Способ 2: Вручную и надежно

Буду показывать на примере tunemymusic, но, думаю, что порядок действий в других сервисах не будет сильно отличаться.

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

добавить свои треки с компьютера

1. Зайдя на главную страницу сайта tunemymusic вы увидите большой банер, собственно, на нем нужно нажать кнопку «Давайте приступим».

шаг 1. начало

2. После этого вам предложат выбрать сервис, из которого вы хотите перенести музыку — выбираем, конечно, Spotify (благо он идет первым).

шаг 2. выбор сервиса

3. Далее вас автоматически перенесет на страницу Spotify, либо сверху появится плашка, на которую нужно нажать и вы окажитесь на этой самой странице. Тут нужно просто войти в свой аккаунт (если вы оплачивали подписку, то наверняка это уже делали раньше)

шаг 3. авторизация

4. После входа вам откроется окно, в котором нужно резрешить приложению доступ к вашим данным (позже это можно будет отключить в настройках) сейчас нажимаем «Принимаю»

шаг 4. согласие

5. Вас снова перенесет на сайт сервиса, где нужно нажать на кнопку «Загрузить из вашей учетной записи»

шаг 5. загрузка

6. Приложение покажет все ваши треки и плейлисты, вам нужно выбрать те, которые вы хотите перенести.

шаг 6. выбор музыки

Выбираем и нажимаем «Далее: Выберите целевую платформу»

7. Здесь есть нюанс. Вы можете экспортировать всё файлом или же перенести на платформу напрямую. К сожалению, когда нажимаешь на Яндекс.Музыку он предлагает нам ввести пароль и логин от нее (без каких либо безопасных подключений к аккаунту, что кажется подозрительным), поэтому я просто перенес музыку в файл.

шаг 7.1. Выбор целевой платформы

Для Яндекс.Музыки выбираем формат .txt.

шаг 7.2. Выбор формата

Сервис заботливо переспросит нас о том, хотим ли мы перенести выбранную музыку — просто нажмите «Начать перенос музыки»

По завершению работы вы получите текстовый файл такого вида:

полученный файл

8. Далее просто переходим на страницу импорта Яндекс.Музыки.

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

Здесь вы можете выбрать файл, либо просто вставить весь его текст в соответствующее поле. Я вставил текстом и нажал «Найти»

шаг 8. вставка в яндекс.музыку

Какое-то время запрос будет обрабатываться, не переживайте, по завершению работы все ваши треки (если они есть в Яндекс.Музыке) найдутся и выпадет такой список:

шаг 9. сохранение в плейлист

9. Нажмите кнопку «Сохранить в плейлист» и далее выберите плейлист в который хотите сохранить все свои треки. Либо вы можете сделать тоже самое для каждого трека отдельно.

Готово. Музыка теперь в вашем аккаунте, даже если нет подписки!

Пункт 10 не обязательный, но я бы на вашем месте позаботился о своих данных, зашел в спотифай, во вкладку «Account» далее «Apps» и нажал «Remove access»

удаление приложения из аккаунта spotify

Так приложение больше не сможет получать ваши личные данные.

МТС Music

МТС Music

Слушайте музыку и подкасты, добавляйте любимые треки в плейлисты и наслаждайтесь ими офлайн на своем смартфоне.

Выбери подходящее

Подписка на сутки

Подписка на месяц

Миллионы музыкальных треков в приложении
«МТС Music»!

Преимущества

  • Авторские плейлисты и подборки
  • Встроенное распознавание музыки
  • Прослушивание онлайн и офлайн
  • Музыка и подкасты
  • Высокое качество звука

Подробности

Как подключить

  1. Самостоятельно на сайте music.mts.by или в приложении МТС Music;
  2. При помощи USSD запроса *717# для подписки на месяц либо *727# для подписки на сутки;
  3. Путем обращения в контактный центр или в центры продаж и обслуживания абонентов;
  4. При помощи интернет-помощника.

Как воспользоваться

  1. Скачайте приложение «МТС Music» в Google Play/App Store/AppGallery или с сайта music.mts.by
  2. Подключите услугу любым удобным способом: набрав *717# (подписка на месяц) либо *727# (подписка на сутки), через Интернет-помощник или приложение «Мой МТС»;
  3. Для авторизации в приложении введите номер мобильного телефона, пароль к Интернет-помощнику или получите пароль в SMS-сообщении;
  4. После подключения услуги на номер абонента приходит SMS-сообщение об успешной активации сервиса.

Как перейти с посуточной подписки на подписку на месяц

  1. в приложении «Мой МТС»;
  2. в разделе «Моя Музыка» в приложении МТС Music;
  3. отправив USSD запрос *717*#;
  4. путем обращения в контактный центр или в центры продаж и обслуживания абонентов;
  5. при помощи интернет-помощника.

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

Сколько стоит?

При подключении подписки на месяц впервые — месяц бесплатно, далее
5,45 руб. в месяц
При подключении подписки на сутки впервые – 7 дней бесплатно, далее
0,25 руб. в сутки
Интернет-трафик
бесплатный!

**мобильный интернет-трафик МТС бесплатен для музыки, прослушанной в приложении «МТС Music». Сервисом могут воспользоваться абоненты всех тарифных планов. Сервис предназначен для смартфонов и планшетов на базе операционных систем Android (4.4 и выше), iOS (11.0 и выше). Сервис предоставляет СООО «Мобильные ТелеСистемы» при поддержке ПАО «МТС» и ООО «Яндекс.Медиасервисы». Все цены указаны с учетом НДС.

Как отключить

  1. Самостоятельно на сайте music.mts.by или в приложении МТС Music;
  2. При помощи USSD запроса *717*0# для отключения подписки на месяц либо *727*0# для отключения подписки на сутки;
  3. Путем обращения в контактный центр или в центры продаж и обслуживания абонентов;
  4. При помощи интернет-помощника.

FAQ

Для каких устройств доступен сервис МТС Music?

Для смартфонов и планшетов на базе операционных систем Android (4.4 и выше), iOS (11.0 и выше). Web-версия сервиса более не поддерживается.

Могу ли я пользоваться сервисом «МТС Music» без регистрации?

Нет. Чтобы воспользоваться полным функционалом, подключите подписку на месяц либо на сутки.

Могут ли абоненты других операторов (не МТС) зарегистрироваться в сервисе?

Сервис доступен только для абонентов МТС. Чтобы стать абонентом МТС, обратитесь в ближайший Салон связи.

Как написать (отправить) сообщение в техподдержку?

Отправить сообщение можно, нажав на кнопку «Написать разработчикам» в Настройках приложения.

Для чего нужен офлайн режим?

Используйте офлайн режим, чтобы слушать музыку в местах, где нет интернета. В этом режиме для прослушивания в приложении доступны только скачанные треки. Сервис МТC Music позволяет сохранять понравившиеся треки в папку приложения, но воспроизвести их возможно только через приложение.

Как включить офлайн режим?

В разделе Моя музыка в правом левом верхнем углу нажмите значок . В настройках установите переключатель подключение к интернету в положение Офлайн-режим.

Как сохранить и удалить треки из памяти устройства?

Чтобы скачать музыку:

  1. Найдите нужный трек, подборку, плейлист или альбом.
  2. Для скачивания трека нажмите справа от его названия значок , затем нажмите . Если вы хотите скачать сразу все треки из подборки, плейлиста или альбома, откройте его и нажмите значок в строке под названием.

Скачанные на устройство треки помечаются значком галочки слева от названия.

Чтобы удалить трек, нажмите справа от него → Удалить с устройства.

Скачанные треки сохраняются в памяти устройства в зашифрованном виде. Загрузить их в память устройства или на другой сервис невозможно.

Примечание. При удалении скачанной музыки стираются и сохраненные в кэше треки. Кэш используется для экономии трафика при повторном прослушивании треков.

Как расходуется трафик в приложении?

Во время прослушивания музыки в приложении при активной подписке на сервис «МТС Music» трафик не тарифицируется и не ограничен по объему и скорости.

Как формируется плейлист дня?

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

Могу ли я пользоваться приложением в роуминге?

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

Будут ли доступны загруженные в память устройства треки, если я отключу подписку?

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

Где на телефоне можно найти треки из раздела «Загруженные треки»?

Скачанные треки сохраняются в памяти устройства в зашифрованном виде. Загрузить их в память другого устройства или на другой сервис невозможно.

Можно ли в приложении очистить историю поиска?

Да, историю поиска можно очистить в «Настройках» (в разделе «Моя Музыка») — Очистить историю поиска.

Можно ли сохранять треки не в памяти телефона, а на карту памяти?

Скачанные треки по умолчанию сохраняются в памяти устройства в зашифрованном виде. Если ваша карта поддерживает тип шифрования приложения, то в Настройках приложения в разделе «Память» будет выбор, куда сохранять треки.

Как узнать какая подписка оформлена – с оплатой на сутки или на месяц?

Статус подписки можно узнать во вкладке «Моя музыка», в разделе «Профиль».

Где можно найти промокод для ввода в поле «Ввести промокод»?

Промокоды распространяются в рамках проводимых МТС акций, следите за новостями на сайте www.mts.by

Что такое «Кеш треков» и зачем приложение предлагает его очистить?

Кэш используется для экономии трафика при повторном прослушивании треков. Очистка кеша позволяет уменьшить занятую память устройства.

Почему исполнитель, трек или альбом больше недоступен?

Вся музыка в сервисе размещена по лицензионным договорам с владельцами авторских прав. Если вам не удаётся найти ранее доступного исполнителя, трек или альбом, скорее всего, закончилось действие такого договора. Также музыка могла быть удалена по требованию правообладателя. Вы всегда можете написать нам, чтобы мы учли ваше пожелание: «Настройки» — «О приложении» — «Сообщить об ошибке».

Где можно оставить пожелание, чтобы понравившийся трек, которого нет в базе МТС Music, внесли в перечень доступных треков?

Отправьте сообщение разработчикам («Настройки» — «О приложении» — «Сообщить об ошибке»), мы постараемся учесть Ваше пожелание.

Как разместить свой трек для проигрывания в МТС Music, если я музыкальный исполнитель?

  • Если вы представитель лейбла, дистрибьютор или исполнитель, управляющий правами на свои произведения самостоятельно, воспользуйтесь услугами наших партнеров: FreshTunes, Believe Digital, The Orchard, TuneCore, CD Baby, ONErpm. Произведения, размещенные в системе любого из этих партнеров, становятся доступными на МТС Music.
  • Если вы сотрудничаете с лейблом или дистрибьютором из числа партнеров Яндекс.Музыки, обратитесь к нему с просьбой разместить ваши треки.

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

Алгоритмы перестраиваются в течение 1-2 месяцев, чем больше вы будете слушать музыку, тем быстрее они перестроятся.

Интегрируем Яндекс Музыку в Visual Studio Code

Представьте, что вы можете слушать свои любимые песни на Яндекс.Музыке, прямо из своего любимого редактора кода, не переключаясь между приложениями. Это уже не мечта, а реальность! В этой статье мы рассмотрим, как интегрировать Яндекс.Музыку в Visual Studio Code и наслаждаться любимой музыкой прямо во время работы.

  • Обзор расширения
  • API Яндекс Музыки
    • Авторизация
    • Плейлисты
      • Персональные плейлисты
      • Плейлист “Мне нравится”
      • Плейлисты пользователей
      • Создание очереди
      • Получение текущего проигрываемого трека
      • Основные компоненты
      • TreeView
      • Диалог подтверждения
      • Хранение паролей и настроек
      • Предыстория
      • Под капотом Microsoft Live Share Audio
      • Архитектура Electron
      • Воспроизведение трека
      • Загрузка Electron в рантайме

      Обзор расширения

      Перед тем перейти к описанию реализации давайте краем глаза взглянем на само расширение и его возможности.

      Описание возможностей расширения

      Я думаю, легко заметить, что левая панель по большому счёту просто повторяет реализацию главной страницы Яндекс Музыки. Здесь вам:

      • и персональные плейлисты
      • и ваши любимые песни и подкасты
      • и рекомендации
      • и поиск

      Подборки пока отсутствуют, но со временем и они должны появиться (если не хватает ещё чего-то — дайте знать ��).

      Конечно же, расширение — лишь урезанная версия Я.Музыки, поэтому вы можете быстро перейти к нужному треку, альбому или плейлисту с помощью кнопки “Открыть в браузере”.

      Не буду углубляться в детали, это всё-таки разбор реализации, а не демо. Если интересно поближе посмотреть на расширение — можете просто установить его.

      Как авторизоваться в расширении

      Есть два способа авторизоваться в расширении:

      Способы авторизации в расширении

      • По токену
      • По логину и паролю

      Почему так? Яндекс постепенно уходит от авторизации по логину и паролю, ведь способ не очень безопасный, и всё меньше и меньше пользователей могут использовать данный способ. Если вы уверены, что ввели корректные данные, но всё равно видите данную ошибку, то вам стоит использовать второй вариант — вход с помощью токена.

      Ошибка, если для вашего аккаунта не работает авторизация по логину и паролю

      Существует 3 способа получить токен:

      1. С помощью расширения
        1. Для Google Chrome
        2. Для Firefox

        Оба браузерных расширения используют последний способ и просто перехватывают токен во время редиректа, поэтому вам нужно уже быть авторизованным в Яндекс.Музыке. Исходники всех способов собраны здесь в репозитории (спасибо Илье, что всё это дело собрал вместе).

        Самый простой способ — расширение для Хрома, установите его и нажмите на кнопку “Скопировать токен”.

        Расширение для Хрома, для получения токена

        Теперь самое время взглянуть под капот. Реализация расширения будет состоять из 3-х частей:

        • Работа с API Яндекс Музыки
        • Разработка VS Code расширения, отображающее треки и плейлисты
        • Воспроизведение треков с помощью Electron

        API Яндекс Музыки

        Я думаю будет логично начать рассказ с базовой вещи, без которой это расширение не увидело бы свет — с API. Подробностей уже не помню, но мне кажется дело было так:

        • Погуглил, есть ли у Я.Музыки официальное API
        • Официального API нет, нашёл неофициальное API
        • К сожалению, библиотека заброшена, к тому же в ней отсутствуют нужные мне методы
        • Натыкаюсь на статью “Как я библиотеку для сервиса «Яндекс.Музыка» писал” и на библиотеку на питоне (Илья, если ты читаешь статью — Спасибо тебе, я не забыл про тебя!).
        • Начинаю самостоятельно писать клиент Яндекс.Музыки внутри расширения. Использую также как указано в статье HTTP Analyzer и виндовое приложение Яндекс Музыки.
        • Вручную пишу OpenAPI схему
        • Генерирую JavaScript-клиент yandex-music-client на основе OpenAPI схемы

        Работа над генерацией клиента всё ещё продолжается, и когда появится первая более-менее стабильная версия — я напишу отдельную статью.

        Теперь рассмотрим самые популярные методы.

        Авторизация

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

        Если для вашего аккаунта всё ещё работает вход по логину и паролю — используйте метод getToken как показано ниже, иначе — скопируйте токен с помощью Google Chrome Extension.

        import < getToken >from 'yandex-music-client/token'; import < YandexMusicClient >from 'yandex-music-client/YandexMusicClient' // Получение токена работает не для всех пользователей // Универсальный способ получения токена через Google Chrome Extension: // https://chrome.google.com/webstore/detail/yandex-music-token/lcbjeookjibfhjjopieifgjnhlegmkib const token = await getToken('your email', 'your password'); const client = new YandexMusicClient(< BASE: "https://api.music.yandex.net:443", HEADERS: < 'Authorization': `OAuth $`, >, >);

        Плейлисты

        Персональные плейлисты

        Большинство плейлистов, которые вы видите на главной странице, можно получить с помощью метода client.landing.getLandingBlocks (GET /landing3 )

        Есть разные типы лендинг блоков:

        • Например, чтобы получить плейлисты “плейлист дня”, “дежавю”, “премьера” и т.д. необходимо запросить блок типа personalplaylists — client.landing.getLandingBlocks(«personalplaylists»)
        • Плейлист с новинками — нужно запрашивать блок new-releases
        • Чарт Я.Музыки — chart
        • Новые плейлисты — new-playlists
        • Подкасты — podcasts
        • Интересно сейчас — promotions

        Можно получить сразу несколько блоков, указав их через запятую:

        client.landing.getLandingBlocks( "personalplaylists,promotions,new-releases,new-playlists,podcasts" )

        Именно такой запрос отправляет официальное приложение Яндекс.Музыки.

        Запрос, который отправляет приложение Я.Музыки для получения лендинг блоков

        Плейлист “Мне нравится”

        Все понравившиеся треки нужно получать в 2 захода:

        1. Получить идентификаторы понравившихся треков — (GET /users//likes/tracks )
        2. Получение треков по идентификаторам — (POST /tracks ). Идентификаторы должны выглядеть как строка “:”.

        Код будет выглядеть вот так:

        const result = await client.tracks.getLikedTracksIds(userId); const ids = result.result.library.tracks.map(track => `$:$`); const tracks = await client.tracks.getTracks(< "track-ids": ids >);

        Почему нужно делать 2 запроса? Возможно за всё время использования вы налайкали несколько тысяч треков и загружать их все одним махом будет достаточно жирно. Правильнее будет делать пагинацию и загружать все треки постепенно.

        Стоит упомянуть ещё несколько методов:

        • Лайкнуть трек — client.tracks.likeTracks (POST /users//likes/tracks/add-multiple )
        • Убрать лайк — client.tracks.removeLikedTracks (POST /users//likes/tracks/remove )
        • Список треков с дизлайками — client.tracks.getDislikedTracksIds (GET /users//likes/tracks/remove )
        Плейлисты пользователей

        Тут ничего интересного — просто перечислю существующие методы работы с плейлистами:

        • Создать плейлист — client.playlists.createPlaylist (POST /users//playlists/create )
        • Переименовать плейлист — client.playlists.renamePlaylist (POST /users//playlists//name )
        • Удалить плейлист — client.playlists.deletePlaylist (POST /users//playlists//delete )
        • Добавить/удалить треки из плейлиста — client.playlists.changePlaylistTracks (POST /users//playlists//change-relative )
        • Получить все плейлисты пользователя — client.playlists.getPlayLists (GET /users//playlists/list )
        • Получить плейлист по полю kind (такой идентификатор, уникальный внутри плейлистов пользователя, у других пользователей будут такие же айдишки) — client.playlists.getPlaylistById(userId, playlistKind) (GET /users//playlists/ )
        • Получить список плейлистов по kind , позволяет получить треки вместе с плейлистами, если передать rich-tracks как true — client.playlists.getUserPlaylistsByIds (GET /users//playlists )
        • Получить плейлист по kind — client.playlists.getPlaylistById (GET /users//playlists/ )

        Радио

        Методы работы с радио:

        • Получить информации о станции — client.rotor.getStationInfo (GET /rotor/station//info )
        • Получить треки для станции — client.rotor.getStationTracks (GET /rotor/station//tracks )
        • Получить списка радиостанций — client.rotor.getStationsList (GET /rotor/stations/list )
        • Получить рекомендации станций для текущего пользователя — client.rotor.getRotorStationsDashboard (GET /rotor/stations/dashboard )
        • Отправить фидбэк о событиях станции. Необходимо отправлять, когда включается радио и начинается/заканчивается/или пользователь пропускает трек — (GET /rotor/station//feedback )

        Если до этого, я просто перечислял запросы, то с радио всё сложнее. Тут мы остановимся поподробнее. Если мы включим HTTP Analyzer, и запустим радио в официальном виндовом приложении Я.Музыки (например “Моя волна” — user:anyourwave ) мы получим вот такую портянку запросов.

        Набор запросов при воспроизведении радио “Моя волна”

        Всё выглядит гораздо проще, если нарисовать диаграмму. Стрелочки используются, чтобы показать как связаны между собой запросы, и как одни запросы используют в качестве параметров ответы других запросов.

        Схема воспроизведения радио

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

        В расширении пока реализовано только одно радио — Моя волна (исходники тут).

        Радио “Моя волна” в расширении для VS Code

        Очереди

        Один из самых частых вопросов в чате по Яндекс.Музыке — как получить трек, который играет в данный момент. Мы уже шутили, что нужно интегрировать чат GPT, чтобы он отвечал на данный вопрос, но к сожалению он начал придумывать несуществующие методы. Так вот — получать текущий трек нужно именно на основе очередей.

        Создание очереди

        Очереди создаются при любом воспроизведении плейлиста, альбома или радио. Например, вот так происходит воспроизведение альбома.

        Запросы при воспроизведении альбома в официальном виндовом приложении Яндекс Музыки

        1. Получаем альбом с треками GET /albums//with-tracks
        2. Создание очереди POST /queue , куда мы передаём все треки из плейлиста
        3. Выставляем номер текущего трека — POST /queues//update-position?currentIndex=0

        Именно благодаря этому мы можем продолжить слушать трек на любом другом устройстве. Например, я включил альбом в официальном виндовом приложении

        Воспроизведение альбома

        и теперь могу продолжить слушать трек из браузера или со своего мобильного.

        Тот же самый альбом можно продолжить слушать

        Получение текущего проигрываемого трека

        Чтобы получить текущий проигрываемый трек, достаточно нескольких шагов:

        • Получить список очередей — client.queues.getQueues() (GET /queues)
        • Получить id последней воспроизводимой очереди — первая в массиве полученном на прошлом шаге.
        • Запросить эту очередь — client.queues.getQueueById() (GET /queues/)
        • Получить текущий трек в очереди — client.tracks.getTracks() (GET /tracks/)

        Код целиком будет выглядеть вот так:

        const < YandexMusicClient >= require('yandex-music-client'); const client = new YandexMusicClient(< BASE: "https://api.music.yandex.net:443", HEADERS: < 'Authorization': `OAuth `, >, >); client.queues .getQueues('os=unknown; os_version=unknown; manufacturer=unknown; model=unknown; clid=; device_id=unknown; uuid=unknown') .then(async () => < // Последняя проигрываемая очередь всегда в начале списка const currentQueue = await client.queues.getQueueById(result.queues[0].id); const = currentQueue.result; const currentTrackId = tracks[currentIndex ?? 0]; const currentTrack = (await client.tracks.getTracks(:$`]>)).result[0]; const supplement = await client.tracks.getTrackSupplement(currentTrack.id); console.log(JSON.stringify(supplement.result.lyrics.fullLyrics, null, 2)); >)

        Хоть для радио и создаётся очередь — получить текущий трек не получится. В этой очереди нет треков, так как треки для радио генерируются динамически. Поэтому если вы продолжите слушать радио на другом устройстве, воспроизведение начнётся совсем с другого трека.

        Скачивание трека

        Никому не было бы интересно API, если бы не могли скачивать музыку, ведь это самое главное.

        Если вы используете библиотеку yandex-music-client, то для скачивания трека достаточно знать его id и использовать метод getTrackUrl. Но под капотом скачивание происходит вот так:

        Процесс скачивания трека

        Swagger и CORS

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

        В своём проекте с OpenAPI схемой я обхожу это ограничение с помощью proxy-сервера на NodeJS, но в этом случае некоторые запросы могут не работать из-за того, что proxy-server не находится в России.

        Используемый Proxy-server для API Яндекс Музыки

        Если вы собираетесь писать своё приложение, в котором будет присутствовать бэкенд — то вы просто можете просто использовать yandex-music-client на бэке и, таким образом, не будет никаких проблем с крос-доменными запросами (но помните, что некоторые методы не доступны вне СНГ). Если вы пишите консольное приложение, телеграмм бота или мобильное приложение — то никаких проблем не будет, ведь CORS существует лишь в браузере.

        Разработка VS Code расширения

        Теперь, когда у нас есть API для Яндекс Музыки, мы можем всё это дело интегрировать в VS Code. Я не буду описывать всё очень подробно, поэтому, если вам интересна базовая структура расширений VS Code, можете почитать о ней здесь.

        Но есть одна из главных вещей, которую необходимо понимать. VS Code — обычное NodeJS приложение, поэтому вы можете использовать совершенно любые библиотеки, которые вы привыкли использовать, будь то axios для выполнения запросов или MobX для управления состоянием.

        Основные компоненты

        Ниже описаны основные компоненты, которые необходимы для разработки расширения.

        Компоненты VS Code, используемые в расширении

        Создание большинства компонентов начинается с добавления так называемых contribution points. Все они описываются в package.json в поле contributes.

        Contribution points в package.json

        Именно здесь необходимо определять:

        • Команды — что-то вроде обработчиков событий (contributes/commands)
        • Настройки вашего расширения (contributes/configuration)
        • Боковые панели и их содержимое (contributes/viewsContainers, contributes/views)
        • Горячие клавиши (contributes/keybindings)
        • Экшены для узлов дерева и контекстное меню (contributes/menus)

        Чтобы было более понятно как работать с компонентами, давайте рассмотрим пару примеров.

        TreeView

        Большая часть расширения представляет собой деревья с плейлистами, альбомами и треками. Прежде чем создать TreeView, необходимо определить соответствующий contribution point в package.json.

        Здесь мы определяем 4 дерева, которые будут использоваться в расширении:

        Далее для каждого дерева нужно определить data provider, который будет решать какие узлы необходимо отобразить в дереве. Для простоты возьмём дерево, отображающее Чарт.

        // Провайдер для Чарта Я.Музыки export class ChartTree implements vscode.TreeDataProvider  < constructor(private store: Store) < >getChildren(): vscode.ProviderResult  < // Каждый трек чарта рендерится как отдельный узел в дереве return this.store.getChart().then((items) => < return items.map((item) =>new ChartTreeItem(this.store, item, CHART_TRACKS_PLAYLIST_ID)); >); > > const api = new YandexMusicApi(); const store = new Store(api); // Создание провайдера const chartProvider = new ChartTree(store); // Создание дерева, объявленного во вью "yandex-music-chart" с провайдером chartProvider vscode.window.createTreeView("yandex-music-chart", < treeDataProvider: chartProvider >);

        Код немного упрощён, полную версию можно посмотреть тут и тут.

        Диалог подтверждения

        В VS Code есть альтернатива привычных нам alert/confirm, которые существуют в браузере (и которыми мы обычно не пользуемся) — window.showInformationMessage. Первым аргументом вы указываете сообщение, а затем передаёте сколько угодно кнопок.

        export async function showPrompt(title: string): Promise

        Диалог, показывающийся при удалении плейлиста

        Хранение паролей и настроек

        VS Code предоставляет 2 возможности хранения данных, обе схожи с localStorage:

        • WorkspaceConfiguration
        • и SecretStorage

        Так как нам необходимо хранить пароли, то первый вариант нам не подходит. Все настройки хранятся в общем файле settings.json и доступны для любого расширения. Это именно те настройки VS Code, которые вы изменяете, чтобы настроить размер шрифта или темы.

        Пример настроек VS Code, доступных через WorkspaceConfiguration

        Мы же собираемся хранить токен авторизации, поэтому важно использовать именно второй вариант — SecretStorage. Хранится SecretStorage в контексте нашего расширения, который передаётся в метод activate, выполняющийся при запуске расширения. API такой же простой, как и API localStorage в браузере.

        Интерфейс SecretStorage

        Очень просто и понятно оба способа хранения настроек описаны в статье SecretStorage VSCode extension API. В ней же описывается тот же подход с реализацией класс-синглтона для настроек, который я использую в расширении.

        Воспроизведение музыки

        Предыстория

        Мы разобрались с получением и отображением треков и находимся на финишной прямой, теперь осталось самое главное — воспроизвести их. Кажется, что всё довольно просто — VS Code работает на электроне, значит мы легко сможем воспроизвести музыку, так же как и в браузере. Всё так, да немного не так, немного погуглив, я наткнулся на гитхаб ишью.

        В этом ишью есть две новости:

        • плохая — нельзя просто взять и воспроизвести музыку
        • хорошая — можно использовать любой nodejs пакет, в том числе для проигрывания музыки.

        После долгих поисков подходящего npm-пакета я нахожу play-sound. Но после недолгого использования я сразу же понимаю, что использовать этот пакет просто невозможно:

        • он не умеет ничего кроме воспроизведения музыки, а значит перемотка, регулировка звука и всё остальное — ложится на ваши плечи
        • К тому же нельзя узнать закончился ли трек, чтобы включить следующий

        Далее, я нахожу mplayer — обёртку для MPlayer, которая поддерживает все данные функции. Кажется, что всё гораздо лучше — но нет, через некоторое время использования я понимаю, что работает он ужасно:

        • Следующий трек воспроизводится с задержкой (библиотека не умеет в потоковое скачивание, поэтому трек необходимо полностью скачать, из-за чего происходит задержка)
        • Перемотка работает очень плохо, всё постоянно заедает
        • Из мелочей — у библиотеки нет тайпингов, их приходится писать руками

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

        Под капотом Microsoft Live Share Audio

        Все расширения в vscode находятся в /Users//.vscode/extensions и представляют собой обычное JavaScript приложение, где есть package.json и набор js файлов, которые можно изучать и даже дебажить. Интересующее нас расширение находится в папке ms-vsliveshare.vsliveshare-audio-0.1.93

        Файлы расширения Microsoft Live Share Audio

        Как дебажить сторонние VS Code расширения

        На самом деле — всё очень просто. Открываете папку с нужным расширением в Vs Code, затем нажимаете F5 и выбираете “VS Code Extension Development” — готово.

        Немного подебажив исходники, несложно заметить, что расширение под капотом использует electron для совершения звонков с помощью Skype API. Для этого достаточно открыть файл ExternalAppCallingService — в котором одноимённый класс отвечает за запуск электрона.

        Файл externallAppCallingService, который отвечает за запуск электрона

        1. ./out/calling/externalApp/dist — путь к электрон приложению, с помощью которого будут осуществляться голосовые звонки
        2. При запуске электрона необходимо удалить переменные, которые устанавливает VS Code, чтобы запускаться в качестве NodeJS процесса. Нам не нужно, чтобы электрон запускался как NodeJS процесс, поэтому эти переменные нужно удалить, подробнее можно посмотреть вот в этом ишью.
        3. Непосредственный запуск электрона.

        Этот код показывает, как правильно запускать electron в качестве дочернего процесса vscode — это то, что нам нужно. Получается, чтобы воспроизвести музыку, нам нужно запустить электрон из электрона (VS Code тот же электрон).

        Также если покопаться, можно заметить, что электрон скачивается в рантайме только один раз при первом запуске расширения, но к этому мы ещё вернемся.

        Архитектура Electron

        Теперь мы умеем запускать электрон — круто, теперь нам необходимо научиться воспроизводить треки, а для этого нужно понимать его архитектуру.

        Процесс электрона состоит из 2-х частей:

        Архитектура Electron

        • main — главная часть, в которой есть доступ к нативному API
        • renderer — часть в которой рендерится web-страница

        Взаимодействуют эти части с помощью межпроцессовых каналов коммуникации (inter process communication (IPC) channels) — ipcMain и ipcRenderer. По названиям очевидно, что:

        • Внутри main-процесса нужно использовать ipcMain
        • А внутри renderer-процесса — ipcRenderer (либо напрямую — небезопасно, либо через contextBridge — безопасно)

        Оба канала могут как отправлять, так и получать сообщения.

        Подробнее об архитектуре Electron можно почитать здесь, а о IPC-каналах здесь.

        Воспроизведение трека

        Для воспроизведения будем использоваться обычное Audio-API, поэтому здесь всё просто. Самая интересная часть — передача трека, который мы хотим воспроизвести, от VS Code в Renderer-процесс электрона. Передавать мы будем пейлоад следующего типа:

        export interface IPlayPayload

        Чтобы понять как это реализовать — давайте взглянем на диаграмму, сейчас нас интересуют лишь зелёные стрелки, начало процесса в VS Code extension ⇒ Store.

        Схема воспроизведения трека

        Всё ещё сложнее, когда нужно воспроизвести следующий, трек, когда предыдущий завершился. В этом случае — нужно преодолеть целый круг:

        • От Audio до Store, чтобы оповестить Store, что трек завершился
        • От Store до Audio, чтобы воспроизвести следующий трек

        При передаче данных от VS Code extension до Electron Process — необходимо их сериализовать в JSON, потому что между процессами мы не можем передавать JavaScript объекты.

        play(trackinfo?: IPlayPayload) < this.childProcess?.send(JSON.stringify(< command: "play", payload: trackinfo >)); >

        Загрузка Electron в рантайме

        Кажется можно уже радоваться, всё прекрасно работает, треки крутятся, а звёзды на гитхабе мутятся (нет!), но начали появляться ишью на гитхабе для мака и линукса.

        Изначально, я просто добавил electron, как зависимость к проекту и всё работало хорошо. Как оказалось, нужная версия электрона скачивается при установке npm пакетов, а я работал на винде и соответственно, расширение работало только на винде.

        Снова покопавшись в Live Share Audio, я обнаружил, что расширение cкачивает нужную версию электрона в рантайме с собственных серверов.

        Мне не хотелось хостить электрон для всевозможных версий, как это сделано в Live Share Audio, из-за чего приостановил работу над расширением.

        Мне не хотелось хостить электрон для всевозможных версий, как это сделано в Live Share Audio, из-за чего приостановил работу над расширением.

        Через некоторое время я понял, что если electron устанавливает необходимые бинарники в рантайме, то код скачивания должен быть где-то в их репозитории. Немного покопавшись, я нашёл пакет electron/get — именно он используется под капотом, когда вы устанавливаете электрон в зависимости. Также я нашёл почти готовый скрипт для установки нужной версии электрона в рантайме.

        Итог

        На этом всё. Спасибо, если смогли дочитать до самого конца, я думаю таких не много, статья получилась достаточно длинной. Если у вас есть какие-либо вопросы или предложения — обязательно пишите в личку или в комментариях. Буду признателен, если сможете поддержать проект любым способом:

        • Идеями в комментариях к статье или в ишью на гитхабе
        • Звёздочками на гитхабе
        • Отзывами в магазине расширений
        • Подпиской на мой телеграмм канал, где я рассказываю о программировании

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *