Как стать автором
Обновить
0

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

Время на прочтение6 мин
Количество просмотров17K

Все любители музыки в России с нетерпением ждали выхода 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). Будут выбраны все треки в плейлисте. И нажимаем лайк.


Приятного прослушивания! )

Теги:
Хабы:
Всего голосов 20: ↑20 и ↓0+20
Комментарии30

Публикации

Информация

Сайт
www.okkam.group
Дата регистрации
Дата основания
Численность
1 001–5 000 человек
Местоположение
Россия

Истории