Как я доделал функции за Яндекс.Музыкой
Можно ли без официального API создавать плейлисты и удалять дубликаты? Статья описывает расширение для браузеров на Chromium. Преследуя цель добавить новые функции на сайт Яндекс.Музыки.
Мой первый крупный опыт работы с JavaScript и что из этого вышло. В решении не используется библиотека от MarshalX, не запрашивается логин/пароль.
Небольшая предыстория. Проект является просто хобби. Это должно прояснить мои решения и качество кода. На протяжении нескольких лет активно пользовался Яндекс.Музыкой, курировал тему на 4PDA. Отсюда мне известны некоторые больные точки сервиса, которые Яндекс либо игнорирует, либо не может позволить себе сделать ввиду гиковой направленности.
Функционал
Наибольшее количество функций связано с созданием плейлистов и работой с ними, в том числе модификации.
В качестве источника треков выступают:
Раздел новых релизов. Как правило, не новый пользователь, получает в этом разделе только персональный набор релизов от отслеживаемых исполнителей и близких к ним в виде синглов и альбомов. Расширение позволяет собрать все треки в один плейлист.
Last.fm. Расширение позволяет импортировать различные рекомендации сервиса. Например, плейлист "Соседи" будет содержать треки, которые слушают пользователи с похожим музыкальным вкусом. Плейлист "Микс" поделит треки как на ранее прослушиваемые, так и новые рекомендации. Кроме того, есть топ прослушиваний за период и любимые треки.
Стена рекомендаций. Ранее Яндекс.Музыка предлагала ленту рекомендаций по адресу /feed. На текущий момент страница недоступна. Но некоторые API по-прежнему отвечают. Среди источников: треки малоизвестных исполнителей, давно не прослушиваемое, недельный чарт и другое.Без категории. На страницы исполнителя доступна команда сбора дискографии за некоторый период. Например, все треки исполнителя за 2 года; Еще один плейлист "Мои дизлайки", собирает все известные дизлайки, но не в порядке добавления; Плейлист "Из истории" подбирает случайные треки из истории прослушиваний самого Яндекс.
Под работой и модификацией подразумевается:
Создать похожий плейлист. Текущий набор треков передается Last.fm, ответ фильтруется по заданному значению схожести, который также считает Last.fm.
Поиск дубликатов. Треки с одинаковым id удаляются, схожие названия перемещаются наверх списка на пользовательскую модерацию. Остальные треки остаются на своем месте.
Фильтр треков. Позволяет удалить: диз/лайки; неоригинальные версии треков (mix, radio, cover и прочее); недавно игравшее; названия с кириллицей; вычесть треки другого плейлиста.
Сортировка. Не временная, удаляет треки и вставляет заново с новым порядком по исполнителю или названию.
Лайкер. Массовая постановка/снятие диз/лайка на все треки плейлиста.
Экспортер. Формирует текстовый список в виде "исполнитель - трек", который можно отдать другого сервису. Например, перенести в Spotify.
Принцип работы
Текущая страница проверяется по url. Если для нее есть функционал, происходит поиск ключевого элемента страницы, к которому добавляется элемент от расширения (кнопка и выпадающий список). Реагируя на клик, обрабатывающий код, как правило, выводит уведомление (для длительных операций).
Операции, связанные с модификацией, требуют freshCsrf. Его можно получить выполнив GET-запрос на /api/v2.1/handlers/auth. Параметры для запроса можно узнать из консоли разработчика по фильтру XHR. Оттуда были получены и все прочие адреса. Буквально методов тыка, ручных кликов по сайту.
Постарался максимально сократить разрешения - это ограниченный набор адресов, связанный с Яндекс.Музыкой и last.fm, чтобы иметь возможность совершать запросы, а также picsum.photos для загрузки случайных обложек к плейлистам.
Все используемые данные пользователя никуда не передаются и никак не хранятся. За исключением передачи логина с запросами к last.fm.
Ссылки
Расширение доступно в Chrome Web Store
Исходный код на GitHub вместе с обратной связью