Русский
Русский
English
Статистика
Реклама

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

Все любители музыки в России с нетерпением ждали выхода 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 SermonGrim Christmas - Jingle BellsNovembers 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 DylanSlaughter To PrevailNovembers Doom

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


node ./src/addTracksToSpotify.js

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


Всё!


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


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

Источник: habr.com
К списку статей
Опубликовано: 18.08.2020 16:06:31
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Блог компании dentsu aegis network

Javascript

Социальные сети и сообщества

Node.js

Spotify

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru