Как бесплатно перенести свои любимые треки в Spotify, используя Javascript

Все любители музыки в России с нетерпением ждали выхода Spotify на наш рынок. Когда наконец это случилось, перед пользователями встала проблема переноса музыки из других сервисов. Лично у меня за годы накопилась огромная коллекция музыки на разных платформах: Яндекс.Музыка, ВКонтакте, личная коллекция на жёстком диске и облако на Яндекс.Диске.

Сначала я думал воспользоваться сервисами вроде Soundiiz и TuneMyMusic. Но вдохновившись статьёй об использовании Python в тех же целях, мне стало интересно решить эту задачку с помощью Javascript. Далее я опишу ряд простых шагов с исходным кодом, которые помогут перенести вашу музыку из разных источников в Spotify.

u6en88ivrxksj5zxzm_ghqvqbr4.jpeg

Итак, для начала нам потребуется три вещи:
Node.js, браузер Google Chrome и исходники скриптов.

И установить зависимости, конечно же.

Идём в корень проекта и выполняем команду:

npm i

Готово?

Отлично, идём дальше.

В первую очередь, нам необходимо получить список треков.


Дисклеймер:

Код и подходы, представленные в скриптах, не являются эталонными.
Уверен, есть масса более лаконичных способов.
Мне просто было интересно реализовать это именно так.


ВКонтакте

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

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

Открываем свой профиль, переходим в музыку и прокручиваем страницу вниз. После этого открываем консоль браузера (F12) и копируем туда то, что находится в файле src/grabTracksVk.js. Нажимаем Enter.

В консоли появится список ваших треков.


Яндекс.Диск

Долгое время я хранил свою коллекцию на жёстком диске, пока не осознал, что слишком уж много она стала занимать полезного места. Поэтому, собравшись с духом, я перенёс всё на Яндекс.Диск. И лишь самое любимое оставил на винте.

Здесь нам потребуется получить токен для работы с API. Парсить DOM-дерево в этом случае уже не получится.

Идём по ссылке:
https://yandex.ru/dev/disk/poligon

Нажимаем кнопку «Получить OAuth токен».

Далее нужно пройти в файл src/grabTracksYandexDisk.js.

Там найти строчку

const token = ''

И вставить полученный токен.

Например:

const token = 'AgAAAAACbokuAADL45FDSww2d3SDSffddwAAAAA';

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

После этого нужно открыть консоль в корне проекта и запустить выполнение скрипта командой:

node ./src/grabTracksYandexDisk.js

Результат появится в файле collection-yandex-disk.txt.

У Яндекс.Диска в API есть очень удобный для этих целей запрос (получить все файлы сразу):

https://cloud-api.yandex.net/v1/disk/resources/files

В параметрах можно указать media type, чем я и воспользовался.


Файловая система

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

Никаких хитростей — я просто рекурсивно бегу по директориям, начиная с переданного пути, и по маске отсекаю лишнее.

Итак, идём в файл src/grabTracksFileSystem.js.

Ищем строку

const rootPath = ''

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

Например:

const rootPath = 'D:/Music/Metal';

Рядом находятся ещё две переменные.

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

Например:

const mask = ['.mp3', '.flac'];

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

Затем нужно открыть консоль в корне проекта и запустить выполнение скрипта командой:

node ./src/grabTracksFileSystem.js

Результат появится в файле collection-fs.txt.


Яндекс.Музыка

Здесь дела обстояли сложнее. У Яндекс.Музыки нет открытого API, поэтому я сперва решил, как и в случае с ВКонтакте, просто открыть страницу с плейлистом и забрать из него треки через парсинг DOM-а. Но не учёл того, что единовременно в DOM-е могут находиться максимум 150 элементов, а остальные начинают выгружаться. И при прокрутке появляются следующие элементы, которые заменяют собой предыдущие.

В итоге я придумал другое решение (впечатлительным лучше не смотреть):

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

Чтобы это сделать, мне пришлось немного поменять прототип метода send у XMLHttpRequest.

Из минусов можно отметить низкую скорость работы. Если треков очень много — это займёт время. Тем не менее — результат достижим!

Итак, алгоритм действий такой:

Открываем Яндекс.Музыку, далее «Моя коллекция» → плейлисты, плейлист «Мне нравится» → нажимаем на название (теоретически, любой другой плейлист тоже можно). Далее должен открыться плейлист на всё окно.

Открываем консоль браузера, вставляем туда код из файла src/grabTracksYandexMusic и нажимаем Enter.

Ждём.

После завершения выполнения скрипта в консоли распечатается список треков.

P.S.:
Во время работы скрипта лучше ничего не делать.

Прервать выполнение всегда можно, перезагрузив страницу.


Apple Music

Сам я этим сервисом не пользуюсь, но просьб было очень много, поэтому этот сервис мы тоже разберём.
Здесь я просто парсю DOM, как и в случае с ВКонтакте. Проблема лишь в том, что ни у кого не нашлось очень длинного плейлиста. И может возникнуть ситуация, как в Яндекс.Музыке.

Итак, алгоритм действий такой же, как и с ВКонтакте.
Открываем наш плейлист, прокручиваем страницу вниз и выполняем в консоли бразуера код из файла src/grabTracksAppleMusic.js.

В консоли появится список ваших треков.


Spotify

Наконец, мы получили список треков, которые хотим добавить в Spotify.

У Spotify с API всё очень даже хорошо.
Но для работы нам необходимо получить авторизационный токен.
Для этого нужно зарегистрировать своё приложение.

Идём сюда:
https://developer.spotify.com/dashboard

Нажимаем на кнопку «Create an app», даём имя нашему приложению.
Заходим внутрь.
Здесь нам нужно забрать Client ID и Client Secret.

Ищем в файле src/getSpotifyToken.js переменные client_id и client_secret. Вставляем значения соответственно.

Далее нам нужно задать redirect_uri.

На странице нашего приложения нажимаем кнопку «Edit settings».
Находим там «Redirect URIs», пишем http://localhost:8888/callback.
Нажимаем кнопку «Save» внизу.

Теперь мы готовы перенести наши треки!

Создаём файлик в корне проекта с именем tracks.txt, вставляем в него список треков, полученный ранее.
Треки должны разделяться вертикальным пробелом между собой.

Например:

Slaughter To Prevail - Misery Sermon
Grim Christmas - Jingle Bells
Novembers Doom - Rain

Далее нам понадобится скрипт для получения токена: ./src/getSpotifyToken.js
В нём я минимально изменил код из официального примера Spotify под наши нужды.

Запускаем скрипт:

node ./src/getSpotifyToken.js

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

После чего появятся две строчки:
access token: <значение токена> и refresh token: <значение токена>.

Нас интересует первый.
Копируем его значение, кликнув на него.

Далее идём в файлик src/addTracksToSpotify.js.
Находим там строку

const accessToken = ''

И вставляем туда наш токен.

После этого запускаем скрипт командой:

node ./src/addTracksToSpotify.js

И ждём.

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

Также появится файлик spotify-tracks-no-found.txt, в котором будет список не найденных в Spotify треков.

Если вы хотите добавить новых исполнителей, то алгоритм точно такой же, только скрипт другой (в коде тоже отличий мало).

Создаём файлик в корне проекта с именем artists.txt, вставляем в него список исполнителей.

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

Например:

Bob Dylan
Slaughter To Prevail
Novembers Doom

Далее всё то же самое, что и с треками, только файл нам нужен src/addArtistsToSpotify.js.
После вставки токена, просто запускаем скрипт командой:

node ./src/addTracksToSpotify.js

В вашем аккаунте появятся новые исполнители.
Но если вдруг кого-то не нашлось, он будет помещён в файл spotify-artists-no-found.txt.

Всё!

P.S.:
Если хочется добавить все треки сразу в избранное, это удобнее всего сделать через десктопную версию приложения.

Переходим в плейлист, кликаем на первый трек и нажимаем Ctrl + A (Cmd + A).
Будут выбраны все треки в плейлисте. И нажимаем лайк.
Приятного прослушивания! :)

© Habrahabr.ru