Все любители музыки в России с нетерпением ждали выхода Spotify на наш рынок. Когда наконец это случилось, перед пользователями встала проблема переноса музыки из других сервисов. Лично у меня за годы накопилась огромная коллекция музыки на разных платформах: Яндекс.Музыка, ВКонтакте, личная коллекция на жёстком диске и облако на Яндекс.Диске.
Сначала я думал воспользоваться сервисами вроде Soundiiz и TuneMyMusic. Но вдохновившись статьёй об использовании Python в тех же целях, мне стало интересно решить эту задачку с помощью Javascript. Далее я опишу ряд простых шагов с исходным кодом, которые помогут перенести вашу музыку из разных источников в Spotify.
Итак, для начала нам потребуется три вещи: 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). Будут выбраны все треки в плейлисте. И нажимаем лайк.
Приятного прослушивания! )