Когда-то музыку слушали на пластинках, затем на кассетах, CD-дисках, потом пришёл Winamp и mp3-плееры.

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

Или же всё-таки не достигло? Я вот, например, пользуюсь Spotify. И казалось бы, это лидер среди музыкальных стримингов, у них-то точно должно быть всё на высоте. Но мне постоянно приходят мысли, что в их приложении не хватает той или иной функции.

К счастью, мы постепенно вступаем в ИИ-эпоху. А это значит, что если какой-то сервис предоставляет официальный API, то даже без знания программирования можно сделать себе нужную автоматизацию или даже построить полноценное альтернативное приложение.

Так и я недавно сорвался, засел на выходных с Codex и начал пилить свой собственный Spotify-улучшайзер.

В этой статье расскажу, что на данный момент получается и как это облегчает мне жизнь. А также покажу, как вы можете запустить себе такую же автоматизацию локально на своём ПК или на облачной платформе.

❯ Главная проблема Spotify

Для меня пожалуй самая насущная проблема в Spotify — это неудобное прослушивание песен, которые копятся в избранном.

По умолчанию процесс работы с избранным устроен примитивно:

  • Я где-то натыкаюсь на хорошую песню или целенаправленно её нахожу.

  • Сохраняю её одним кликом на кнопку лайка.

  • Если я хочу послушать понравившиеся мне песни, то включаю плейлист «Избранное».

При этом для прослушивания избранного есть всего два варианта: слушать вперемешку все треки плейлиста или слушать по порядку с нужного места. И оба этих варианта — ерунда:

  • Слушать вперемешку неудобно, потому что вместе с недавно добавленными свежими треками будут включаться и старые треки, которые я уже слушал сто раз.

  • Слушать по порядку тоже такое себе, потому что придётся или слушать одно и то же каждый раз, или постоянно вручную переходить на новые места.

А мне просто хочется послушать недавно добавленные треки в случайном порядке.

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

Наверное, идеальное решение это, если бы в Spotify были разные фильтры и сортировки в избранном. И желательно, чтобы настройки фильтрации можно было сохранять и быстро переключаться между ними.

Понятно, что от Spotify мы вряд ли дождёмся подобного. Но тогда что можно сделать своими силами?

❯ Моё решение — «автоплейлисты»

Я решил начать с конкретной самой насущной проблемы и постарался решить её максимально простым способом.

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

Само приложение я назвал Mustash — это осознанно исковерканное английское слово «mustache» (усы) и это сокращение по первым буквам от «Music Streaming Assistant Hub» («Платформа ассистента музыкального стриминга»). Да, это громкое описание для такой простой программы, но оно взято сразу на вырост.

Код программы доступен в репозитории по Open Source лицензии MIT. Это значит, что вы можете ставить его себе на ПК, на сервер, модифицировать и распространять его как угодно.

Вот как работает Mustash в версии 0.1:

1. Автоплейлисты «Недавнее сохранённое»

Каждые 10 минут приложение забирает из Spotify список моих недавних избранных треков и составляет из них плейлисты по принципу «N последних треков, добавленных в избранное».

Например, сейчас у меня настроено получение «50 последних» и «200 последних».

Если плейлисты уже есть, то они обновляются, а если их нет, то они перед этим создаются. Плейлисты называются «Recent 50 [AUTO]» и «Recent 200 [AUTO]». Для них автоматически создаются обложки с общим дизайном — пока это просто черный фон и надпись «200 recent».

2. Автоплейлисты «Избранное по годам».

Раз в 3 часа приложение забирает из Spotify список уже всех моих избранных треков и составляет плейлисты по годам добавления, например «2024 [AUTO]», «2025 [AUTO]» и т. д.

Как и в случае выше, если плейлисты уже есть, то они обновляются, если их нет, то они создаются. Добавляются обложки с общим дизайном — синий фон и надпись, например «2026 year».

Созданные автоплейлисты в моем профиле Spotify
Созданные автоплейлисты в моем профиле Spotify

3. Вывод трека, который сейчас играет.

Каждые 5 секунд приложение запрашивает, какой трек играет в данный момент, и если что-то находит, то выводит название песни в логах приложения.

Особого смысла в этой функции сейчас нет, разве что просто почти в реальном времени видеть, что приложение действительно работает.

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

Чего нет, но хотелось бы

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

Для получения этой информации нужно обращаться к другим источникам, так что потенциально это всё-таки можно реализовать.

❯ Выбранные технологии и архитектурные решения

  • Архитектура. У нас бэкенд-приложение без UI-интерфейса и пока без базы данных. Команды через терминал отправлять нам тоже не нужно. Настройки задаются один раз через переменные окружения. Общение с приложением одностороннее — мы как пользователи просто читаем сообщения в логах.

  • Язык программирования. Я выбрал TypeScript, потому что знаком с этим языком и использую его в работе и для моих пет-проектов. Также, для TS есть официальная библиотека Spotify, хотя в текущей версии проекта она не используется.

  • Фреймворк. Можно было бы обойтись без фреймворка, но хочется всё-таки придерживаться стандартного подхода в серверном TS, поэтому был выбран фреймворк Nest.

  • Запуск. Для простого развёртывания проекта используется Docker Compose.

  • ИИ-агенты. Для агентной разработки я использовал Codex с моделью GPT-5.4. Использую предпоследнюю на данный момент версию, потому что она экономней, но вполне эффективная. Из полезных скиллов отмечу NestJS Best Practices. Также, полезные промпты и рекомендации для работы со Spotify API через ИИ есть в их документации.

  • Открытость. Приложение доступно на GitHub как Open Source — вы можете ставить его себе, дорабатывать и в целом использовать код в любых целях по вашему желанию.

Примечание 1. Не скрываю, что проект полностью навайбкожен. Я пока не успел сам проверить код и архитектуру, хотя позже планирую это сделать. Поэтому за качество кода не ручаюсь, но вроде бы всё работает. Если у вас будут ошибки, пишите в личку, будем вместе разбираться.

Примечание 2. Забегая вперёд, скажу, что в приложении уже сейчас заложена возможность подключения к базе данных, чтобы сохранять информацию о прослушанных треках. Это пока что черновая функциональность, поэтому в статье я её полностью игнорирую. После доработки я выпущу новую версию с БД и посвящу этому отдельный пост.

❯ Почему Open Source, а не облачный сервис (SaaS)

Учитывая, что приложение довольно простое, а круг потенциальных пользователь вполне большой, логичным вариантом покажется создание онлайн сервиса (SaaS), к которому любой пользователь Spotify мог бы подключиться.

Но у меня для вас плохие новости — с недавних пор Spotify фактически запретил создавать публичные сервисы на основе Spotify API в небольших масштабах. Единственный вариант получить разрешение — это если у вас уже есть тысячи пользователей, т. е. полноценный онлайн-бизнес.

Это решение конечно ударило по репутации компании в среде разработчиков-любителей, которые долгое время создавали интересные приложения для работы со Spotify API.

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

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

❯ Настройки приложения

Далее я хочу рассказать, как вы можете запустить такое же приложение для себя.

И начнём мы с того, что рассмотрим все настройки приложения. Они задаются в переменных окружения (.env) перед запуском проекта.

Для упрощения, я буду разбивать настройки на условные группы.

Сначала настройка языка.

  • APP_LOCALE — позволяет указать язык работы приложения. Доступны английский (EN) и русский (RU). По умолчанию стоит английский, поэтому рекомендую прописать RU.

Настройки ниже нужны для запуска приложения и подключения к Spotify API. Это обязательные параметры. Мы ещё к ним вернёмся дальше в разделе про подключение к API и установку приложения.

  • SPOTIFY_CLIENT_ID и SPOTIFY_CLIENT_SECRET — настройки для подключения к вашему Spotify API.

  • SPOTIFY_REDIRECT_URI — это url, на которой Spotify будет перенаправлять вас после авторизации. Для локального запуска на домашнем ПК это скорее всего будет http://127.0.0.1:3000/callback. Для запуска на сервере вам нужно использовать реальный домен проекта, например https://mustash.ivanivanov.ru/callback. Позже мы подробно разберем это на этапе установки.

  • SPOTIFY_LISTEN_PORT — рабочий порт приложения. Можно оставить 3000.

Отдельная группа настроек для дополнительных подключений. Это необязательные поля.

  • SPOTIFY_PROXY_URL — наверняка пригодится, потому что Spotify блокирует доступ к своему API с российского IP-адреса.

  • DATABASE_URL — подключение к базе данных. Это пока что недоработанная функциональность, поэтому просто игнорируем это поле и не заполняем.

Теперь главные настройки приложения — они определяют, какие функции приложения должны работать, и как именно. Главным образом, речь конечно про автоплейлисты. Если что-то из этого не нужно, то поля можно оставить пустыми.

  • SAVED_RECENT_WINDOWS — какие плейлисты создавать для последних добавленных в избранное песен. Можно написать одно или несколько чисел через запятую. Например, «50,200,500» создаст и будет обновлять 3 плейлиста: «Recent 50 [AUTO]» и «Recent 200 [AUTO]», «Recent 500 [AUTO]». Поле необязательно.

  • SAVED_IN_YEAR_YEARS — какие плейлисты по годам составлять из избранного. Можно написать одно или несколько лет через запятую. Например, «2020,2023,2024,2025». Поле необязательно.

  • TRACK_MONITORING_ENABLED — определяет, нужна ли функция вывода в консоль названия песни, которая сейчас играет. По умолчанию true, поэтому можно поставить false, если это сейчас не нужно.

Следующие настройки определяют, как будут выглядеть создаваемые плейлисты: как они будут называться и какого цвета будет обложка.

  • AUTO_PLAYLISTS_PLAYLIST_PREFIX — префикс перед названием всех автоплейлистов. По умолчанию пусто. Например, если прописать TEST, то плейлисты будут «TEST Recent 50», «TEST 2025» и т. д.

  • AUTO_PLAYLISTS_PLAYLIST_SUFFIX — суффикс после названия автоплейлистов. По умолчанию «[AUTO]», т. е. все созданные автоплейлисты будут создаваться с надписью «[AUTO]» в конце, например «Recent 200 [AUTO]» и «2024 [AUTO]». Рекомендуется, чтобы был прописан или префикс, или суффикс, чтобы вы могли отличать автоплейлисты от других плейлистов в библиотеке.

  • SAVED_RECENT_COVER_COLOR — цвет фона (HEX-код) для обложек автоплейлистов последних треков. По умолчанию: 000000 (черный цвет)

  • SAVED_IN_YEAR_COVER_COLOR — цвет фона (HEX-код) для обложек автоплейлистов по годам. По умолчанию: 060E73 (темно-синий цвет)

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

  • AUTO_PLAYLISTS_FREQUENT_SYNC_INTERVAL_MS — периодичность меньшего («частого») цикла. В текущей версии у нас в этом цикле происходит только одно действие — обновление автоплейлистов с последними избранными треками, в мс. По умолчанию: 600000 (10 минут). В целях тестирования приложения можно поначалу поставить меньше, например 120000 (2 минуты).

  • AUTO_PLAYLISTS_RARE_SYNC_INTERVAL_MS — периодичность большого («редкого») цикла. В текущей версии у нас в этом цикле происходит только одно действие — обновление автоплейлистов с разбивкой по годам, в мс. По умолчанию: 10800000 (3 часа)

  • POLL_INTERVAL_MS — частота запроса, чтобы выводить текущий трек, который сейчас играет. По умолчанию значение 5000 (5 секунд).

  • SPOTIFY_MIN_REQUEST_GAP_MS — задержка между запросами к API Spotify (по умолчанию 100 мс). Речь тут идёт об задержке, которая будет добавляться вообще ко всем запросам к Spotify. Иногда приходится делать много запросов к API подряд, что может расценено негативно и повлечь к временному бану доступа к API. Дальше в статье мы вернёмся к этому вопросу.

Весь этот список настроек не должен вас пугать: для многих из них уже прописаны значения по умолчанию, поэтому их можно не заполнять. Минимальный набор параметров (.env-файл) выглядит примерно так:

APP_LOCALE=RU

SPOTIFY_CLIENT_ID=your_client_id
SPOTIFY_CLIENT_SECRET=your_client_secret
SPOTIFY_REDIRECT_URI=http://127.0.0.1:3000/callback
SPOTIFY_LISTEN_PORT=3000

SAVED_RECENT_WINDOWS=50,200
SAVED_IN_YEAR_YEARS=2024,2025

❯ Как настроить Spotify API

Прежде чем подключаться к Spotify API, вам нужно создать приложение (App) в личном кабинете разработчика и настроить доступы.

Сначала важные примечания:

  • Создание приложения доступно только на платных планах Spotify.

  • С территории РФ вход в личный кабинет закрыт, как и доступ к API.

  • У вас может быть создано только одно приложение (App).

  • У приложения могут быть всего лишь до 5 пользователей, и каждого пользователя нужно заранее добавить вручную.

Последовательность шагов для настройки Spotify API:

(1) Заходим в личный кабинет разработчика:

Дашборд разработчика на сайте Spotify
Дашборд разработчика на сайте Spotify

(2) Для создания приложения кликаем на Create App

(3) Заполняем поля:

  • App name — название приложения. Полностью произвольное, например «Mustash».

  • App description — пишем что угодно, например «Music Streaming Assistant Hub».

  • Website — можно оставить пустым

  • Redirect URIs — здесь можно добавить любое число адресов перенаправления. Если вы запускаете приложение локально со своего ПК по адресу http://127.0.0.1:3000/, то добавьте адрес http://127.0.0.1:3000/callback. Если вы запускаете приложение на сервере по адресу например https://myspotify.ivanivanov.ru/, то нужно так же отдельно добавить https://myspotify.ivanivanov.ru/callback и т. д. Обращайте внимание на корректность http или https в адресе. Не забудьте нажать кнопку «Add», чтобы адрес реально добавился. Пока при создании достаточно добавить только локальный адрес http://127.0.0.1:3000/callback. Подробней мы про этом еще поговорим в разделе про установку.

  • Which API/SDKs are you planning to use? — выбираем только «Web API», потому что у нас обычное веб-приложение.

  • Ставим галочку, что мы принимаем условия

Создание App (приложения) в дашборде разработчика Spotify
Создание App (приложения) в дашборде разработчика Spotify

(4) После заполнения формы мы видим настройки уже добавленного приложения. Сохраняем «Client Id». Кликаем на «View client secret» и сохраняем также «Client secret». Эти данные затем нужно будет подставить в переменные приложения.

(5) Переходим на вкладку «User management» и добавляем пользователей приложения. В нашем случае это пока будем только мы. Указываем e-mail, к которому привязан ваш аккаунт Spotify и любое полное имя (Full Name). Нажимаем «Add User».

На этом добавление приложения в Spotify готово, и вы можете пользоваться Spotify API. Только ещё раз напомним, что Spotify закрывает доступ к своему личному кабинету и API с территории России.

❯ Код приложения

Исходный код приложения доступен в GitHub-репозитории.

При этом будут выходить новые версии, и со временем инструкция в этой статье устареет. Текущая статья написана по версии v0.1, поэтому для установки и настройки приложения согласно данной статье используйте только эту версию. Для этого выберите нужную ветку в репозитории или воспользуйтесь этой ссылкой: https://github.com/nickneustroev/mustash/tree/v0.1

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

❯ Как запустить приложение локально на ПК

Самый простой способ запустить приложение — локально на своём ПК.

Плюс этого способа в том, что не нужно тратиться на покупку внешнего сервера и заниматься его настройкой. Минус же в том, что приложение будет работать только пока запущен ваш ПК.

Локальная установка идёт в несколько простых шагов:

Шаг 1. Скачать код проекта нужной версии

Чтобы скачать код проекта сразу с включенной нужной веткой (версией) “v0.1”, запустите через терминал команду: (у вас уже должен быть установлен git)

git clone -b v0.1 https://github.com/nickneustroev/mustash.git

Будет создана папка «mustash» с кодом проекта.

Шаг 2. Заполнить .env файл (переменные окружения)

Проект идёт сразу с двумя примерами .env-файлов:

  • .env.full.example — содержит все возможные переменные, для детальной настройки.

  • .env.minimal.example — только минимальное необходимые переменные.

Создайте в корне проекта новый файл .env, скопируйте подходящий вариант-пример и заполните его вашими значениями. В качестве SPOTIFY_CLIENT_ID и SPOTIFY_CLIENT_SECRET пропишите значения, которые вы скопировали из панели разработчика Spotify.

При этом в качестве SPOTIFY_REDIRECT_URI укажите значение http://127.0.0.1:3000/callback. Также, убедитесь, что это же значение редиректа есть в панели разработчика Spotify.

Шаг 3. Запустить проект

Запустить проект можно через docker compose или через npm

1. Через docker compose

Если в системе отсутствуют docker и docker compose, то сначала их нужно установить. Это можно сделать напрямую или через установку программы Docker Desktop.

Далее заходим в папку проекта и через терминал запускаем команду docker compose up.

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

2. Через npm

В системе должны быть установлены Node.js и npm.

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

  • npm install — установить зависимости,

  • npm run build — собрать приложение,

  • npm run start — запустить собранное приложение.

В случае успеха вы увидите сообщения от приложения в терминале.

Чуть ниже мы рассмотрим, что делать дальше после запуска приложения.

❯ Как запустить приложение на сервере

Скорее всего вы хотите, чтобы приложение всё-таки работало круглосуточно, независимо от того, включен ли ваш ПК.

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

Если у вас уже есть VPS, который уже для чего-то используется, то конечно, использовать его это самый логичный вариант, потому что наше приложение не требует мощных ресурсов для своей работы. А покупать отдельный VPS для простенького приложения не каждый захочет.

По поводу домена (адреса проекта)

Хотя наше приложение это просто работает по расписанию на бэкенде, но для работы на сервере ему всё равно нужен адрес в интернете (домен) для того, чтобы пользователи приложения смогли в нём авторизоваться. Использовать ip-адрес сервера не получится — нужен именно настоящий адрес.

Если у вас есть домен, то вы можете использовать его или создать поддомен, например spotify.ivanivanov.ru.

Но это не обязательно, потому что Timeweb Cloud вместе с сервером бесплатно предоставляет автоматические технические поддомены, например ivanivanov-mustash-9ce1.twc1.net. Для подобных пет-проектов, где не нужен собственный красивый адрес, такой вариант вполне подходит. Дальше мы покажем, как его подключать к проекту.

Запуск в App Platform от Timeweb Cloud

Один из самых простых способов запуска приложений в облаке — через специальные облачные платформы, которые называют PaaS (Platform-as-a-Service).

Идея PaaS в том, что вам не нужно настраивать сервер самому. Достаточно только указать репозиторий и, при необходимости, параметры запуска. Установка и запуск произойдут автоматически, и в дальнейшем изменения будут сами подтягиваться из репозитория.

App Platform от Timeweb Cloud это как раз пример такой платформы. Сегодня мы будем использовать её для установки нашего приложения.

Сначала переходим в раздел App Platform и нажимаем кнопку «Создать».

Главная страница App Platform в Timeweb Cloud
Главная страница App Platform в Timeweb Cloud

Мы попадаем на страницу добавления нового приложения (App).

Шаг 1. Тип

Сначала вверху под заголовком «1. Тип» мы должны из предложенных вариантов выбрать тип нашего приложения.

Выбор типа приложения в App Platform
Выбор типа приложения в App Platform

У нас бэкенд-приложение на Nest, и поэтому кажется логичным вариантом выбрать на первом шаге вкладку Backend, затем Node.js и далее Nest.

Однако если код приложения уже идёт с Dockerfile или Docker Compose, то будет проще и надёжней ставить контейнерное приложение не через вкладку Backend, а через вкладку Docker. Так вам не нужно будет прописывать параметры сборки и запуска вручную, потому что всё это уже задано в docker-файлах.

Поэтому, в пункте «1. Тип» мы выбираем вкладку Docker.

Здесь предлагается выбрать Dockerfile или Docker Compose. Из-за особенностей структуры нашего приложения корректно будет работать только вариант через Docker Compose, поэтому выбираем его.

Шаг 2. Репозиторий

Далее нужно подключить репозиторий с кодом приложения.

Если вы используете чужой репозиторий (например, просто хотите использовать мой репозиторий по ссылке выше), то кликайте на ссылку «Подключите git-репозиторий по URL» под кнопками.

В открывшемся окне просто вставьте в поле «URL репозитория» ссылку на репозиторий. Обращаю внимание, что это не ссылка на страницу, а ссылка именно на репозиторий, поэтому она будет https://github.com/nickneustroev/mustash.git. Оставьте поля «имя» и «пароль» пустыми.

Если же вы вместо этого используете свой собственный репозиторий (например, вы скачали мой, доработали его и выгрузили на свой GitHub), то кликайте на кнопку соответствующего провайдера (например, GitHub). Далее вам будет предложено установить «Timeweb Cloud Apps» в ваш аккаунт GitHub и открыть доступ к нужному репозиторию (или ко всем сразу).

Настройки репозитория
Настройки репозитория

После подключения репозитория вам нужно будет выбрать ветку (версию). Вместо main выбираем v0.1.

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

Тут есть галочка «Сборка по последнему выполненному коммиту». Если она выбрана, то у вас будет включен автокоммит — т. е. приложение само будет обновляться, когда в репозиторий будут приходить обновления.

Но эту галочку можно активировать только если вы подключаетесь к своему личному репозиторию. Если же вы подключаетесь к чужому репозиторию (как в нашем примере), то галочка будет неактивна — т. е. в дальнейшем вам нужно будет обновляться вручную.

Шаг 3. Регион

Далее нужно выбрать регион сервера.

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

Но в нашем случае взаимодействие приложения идёт не с пользователями, а с API Spotify, поэтому чем ближе будет сервер к серверам Spotify, тем быстрее будут приходить ответы на запросы. Предполагаю, что сервера Spotify находятся в Европе или США, поэтому и локацию лучше выбирать европейскую, например «Амстердам» или «Франкфурт».

Выбор региона сервера
Выбор региона сервера

Другая причина, почему возможно лучше выбрать зарубежную локацию в том, что так Spotify API будет доступен напрямую.

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

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

Шаг 4. Конфигурация

Далее выбираю конфигурацию. Оставляем «Фиксированную» и выбираем самую простую «1 CPU, 1 RAM» — нам этого достаточно.

Более того, «1 CPU, 1 RAM» нам даже перебор, поэтому что наше приложение почти не требует ресурсов для себя. Тем не менее, на данный момент это минимальная доступная конфигурация на платформе.

Шаг 5. Сеть

Оставляем по умолчанию.

Шаг 6. Настройка приложения — переменные

Для локального запуска мы использовали .env файл в корне проекта, где прописаны все нужные параметры. В случае с App Platform вам нужно добавить эти переменные вручную. Для начала нажмите «Добавить», чтобы открыть окно добавления переменных.

Настройки переменных окружения (env)
Настройки переменных окружения (env)

Переменные можно добавить по отдельности, но проще будет скопировать их разом из .env и вставить в поле «Название» — все переменные будут созданы автоматически. Или же можно загрузить их из файла.

Здесь важный момент насчет домена. Если у вас свой домен, то в SPOTIFY_REDIRECT_URI вы его и прописываете, через https и с /callback в конце. Но если вы хотите использовать бесплатный технический домен, то в качестве параметра SPOTIFY_REDIRECT_URI пока указывайте любое временное значение, например http://127.0.0.1:3000/callback. Дело в том, что технический адрес заранее не известен. Только после создания сервиса платформа автоматически сгенерирует и выдаст нам адрес, и мы вернёмся сюда, чтобы прописать его.

Шаг 7. Информация о приложении

Имя: впишите любое имя, которое будет показываться в панели управления. Например, «Mustash», «Spotify helper» или «Auto playlists»

Поля «Комментарий» и «Проект» можно оставить по умолчанию. Хотя если у вас уже много разных приложений в Timeweb Cloud, то лучше сразу разбивать их по проектам.

Шаг 8. Стартуем запуск проекта, но тут же отменяем

Мы внесли все данные для запуска проекта, поэтому можем нажать «Заказать».

Через несколько секунд у нас откроется страница приложения и мы увидим, что установка уже запущена.

Процесс установки (деплоя) приложения в App Platform
Процесс установки (деплоя) приложения в App Platform

Но вместо того, чтобы дождаться ее завершения, сразу нажмем кнопку «Остановить деплой», потому что нам нужно теперь посмотреть актуальный адрес и прописать его.

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

Шаг 9. Копируем актуальный адрес

Переходим на вкладку «Дашборд» и в панели справа смотрим домен, который нам выдали. Например, он будет nickneustroev-mustash-9ce1.twc1.net.

Дашборд запущенного приложения
Дашборд запущенного приложения

Это значит, что для данного примера callback-адрес проекта будет вида https://nickneustroev-mustash-9ce1.twc1.net/callback. Т. е. мы в начале добавили https (именно с «s» на конце), а в конце — /callback.

Этот адрес нам теперь нужно подставить в панели разработчика Spotify и в переменных приложения.

Шаг 10. Добавляем этот адрес в панели разработчика Spotify

Переходим в панель разработчика Spotify в настройки нашего приложения и в Redirect URIs добавляем ссылку на callback. Не забываем нажать «Add» и затем «Save».

Шаг 11. Подставляем адрес в настройках переменных

В App Platform открываем вкладку «Настройки» и там в пункте «Настройки деплоя» нажимаем «Редактировать».

В настройках находим нашу переменную SPOTIFY_REDIRECT_URI и нажимаем иконку редактирования. Меняем значение адреса на нужное.

Нажимаем «Сохранить». Возможно, нам будет сразу же предложено перезапустить приложение с новыми настройками. Соглашаемся.

Шаг 12. Снова запускаем проект

Если установка проекта не была запущена автоматически на предыдующем шаге, то переходим на вкладку «Деплой» и нажимаем кнопку запуска деплоя.

Подготовка образа проекта и запуск может занять до 1-2 минут. Когда процесс будет завершен, мы увидим зеленый индикатор «Успешно».

Переключаемся на вкладку «Логи приложения», чтобы увидеть, как приложение начинает работу.

Как начать работу с приложением, мы рассмотрим чуть дальше.

Запуск с помощью Coolify

Другая альтернатива для запуска приложения — приобрести отдельный облачный сервер (VPS) и установить там open-source PaaS, например Coolify. И уже с помощью него ставить приложение и управлять им. С точки зрения возможностей это будет примерно то же самое, что и App Platform. Мы не будем на этом останавливаться, потому что у нас есть отдельная серия статей про Coolify.

Но для быстрого старта более простым вариантом будет App Platform.

Запуск на своём VPS

Ну и конечно можно пойти самым прямолинейным путём и просто запустить докер-контейнер с приложением напрямую на VPS без всяких новомодных PaaS.

Сегодня мы не будем останавливаться на этом варианте. Если будут вопросы по установке, спрашивайте в комментариях.

Не запускайте сразу несколько копий приложения (например, сразу локально и на сервере). Если запустить несколько копий приложения, то они будут давать двойную нагрузку на API Spotify, что скорее всего приведет к временному бану вашего доступа к API.

❯ Работа с приложением после установки

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

Логи приложения в App Platform
Логи приложения в App Platform

Сначала приложение показывает, с какой конфигурацией оно запущено. Т.е. вы видите все указанные вами параметры в env, а также параметры со значениями по умолчанию.

INFO  Конфигурация загружена: {"spotifyClientId":"asdfqewrzcxv12345qwert","spotifyRedirectUri":"http://127.0.0.1:3000/callback","pollIntervalMs":5000,"spotifyMinRequestGapMs":100,"trackMonitoringEnabled":true,"databaseUrl":"","requestTimeoutMs":5000,"autoPlaylistsPlaylistPrefix":"","autoPlaylistsPlaylistSuffix":"[AUTO]","autoPlaylistsFrequentSyncIntervalMs":600000,"autoPlaylistsRareSyncIntervalMs":10800000,"savedRecentCoverColor":"#000000","savedInYearCoverColor":"#060E73","savedRecentWindows":"50,200","savedInYearYears":"2022,2023,2024,2025,2026","spotifyProxyEnabled":false,"spotifyProxyConfigured":false}

Далее вам нужно будет авторизоваться, т. е. разрешить приложению взаимодействовать с вашим аккаунтом Spotify. Для этого нужно открыть в браузере ссылку на ваше приложение. Например, для локального запуска это http://127.0.0.1:3000/, а для нашего примера в App Platform это может быть адрес вида https://nickneustroev-mustash-9ce1.twc1.net. В логах будет подсказка, по какой ссылке переходить.

INFO  Сохранённые токены Spotify не найдены, запуск авторизации.
INFO  Открытие авторизации Spotify в браузере.
INFO  Ожидание OAuth callback на 0.0.0.0:3000 (/callback), хост redirect URI: 127.0.0.1
INFO  Точка входа авторизации: http://127.0.0.1:3000/

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

Если вы не авторизованы в Spotify в браузере, сначала нужно будет выполнить вход в Spotify.

Затем вы увидите окно со списком разрешений, которые требуются для приложения и кнопку для вашего согласия.

Окно предоставления доступа приложения к вашему Spotify-аккаунту
Окно предоставления доступа приложения к вашему Spotify-аккаунту

Согласие потребуется только один раз для каждого пользователя, пока будет сохраняться App в панели разработчика. В дальнейшем согласие не нужно будет давать повторно, если только у проекта не поменяется набор нужных разрешений.

Отдельный момент — авторизация приложения. В первый раз она произойдет автоматически после вашего согласия. В дальнейшем она будет иногда требоваться, например, при переустановке приложения. Авторизация заключается в том, что вы опять же переходите по главной ссылке, а в ответ получаете сообщение вида «Authorization complete. You can close this tab.»

INFO  Callback авторизации получен. Обмен кода на токены.
INFO  Обмен токена Spotify завершён успешно.
INFO  Токены Spotify сохранены в ключ AppState "spotify_oauth_tokens:auto_playlists".
INFO  Авторизация Spotify готова.

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

Теперь приложение непосредственно начинает работу. Анализируются параметры и сообщается, какие типы автоплейлистов будут работать и с каким интервалами.

INFO  Будут обновляться автоплейлисты недавно сохранённого (плейлистов=2, интервал=600000мс, начальная задержка=0мс).
INFO  Будут обновляться автоплейлисты по годам (плейлистов=5, интервал=10800000мс, начальная задержка=60000мс).

Тут же сразу начнётся синхронизация плейлистов недавно сохранённого. При необходимости, плейлисты будут созданы.

INFO  Начато обновление плейлистов недавно сохранённого.
INFO  Создан "RECENT 50 [AUTO]".
INFO  Обложка загружена для "RECENT 50 [AUTO]".
INFO  Создан "RECENT 200 [AUTO]".
INFO  Обложка загружена для "RECENT 200 [AUTO]".
INFO  Плейлист "RECENT 50 [AUTO]" был обновлен.
INFO  Плейлист "RECENT 200 [AUTO]" был обновлен.
INFO  Обновлены плейлисты недавно сохранённого (обновлено=2/2).

Через минуту также начнется синхронизация плейлистов по годам:

INFO  Начато обновление плейлистов по годам.
INFO  Создан "2022 [AUTO]".
INFO  Обложка загружена для "2022 [AUTO]".
INFO  Создан "2023 [AUTO]".
INFO  Обложка загружена для "2023 [AUTO]".
INFO  Плейлист "2022 [AUTO]" был обновлен.
INFO  Плейлист "2023 [AUTO]" был обновлен.
INFO  Обновлены плейлисты по годам (обновлено=2/2).

И в дальнейшем эти автоматические обновления плейлистов будут происходить по циклам согласно настройкам. Напомню, по умолчанию для плейлистов недавнего это каждые 10 минут, а для плейлистов по годам — каждые 3 часа. При этом старт запуска плейлистов по годам идет со сдвигом на 1 минуту, чтобы эти циклы не перекрывались.

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

Также, если включена функция вывода текущего трека, то каждые 5 секунд будет проверяться, что сейчас играет, и информация будет выводиться в лог.

INFO ТРЕК Linkin Park — The Emptiness Machine
INFO ТРЕК Foo Fighters — The Pretender
INFO ТРЕК Poppy — have you had enough?

Поздравляем, теперь у вас работают автоплейлисты в Spotify!

❯ Про лимиты Spotify

Важный вопрос, который обязательно надо иметь в виду — это лимиты запросов (rate limiting) на использование Spotify API.

Если отправлять слишком много запросов подряд к API или слишком много запросов в течение суток, то Spotify может временно заблокировать вам доступ. Обычно это на несколько часов. И речь именно про доступ к API — сам ваш аккаунт продолжит нормально работать.

WARN Spotify API вернул 429 для GET /v1/me. Ожидание 32554с перед повтором (осталось попыток: 2).

Точной информации о лимитах нет, поэтому придется ориентироваться на глаз.

В нашем приложении есть меры для работы с лимитами.

Сначала, есть параметр SPOTIFY_MIN_REQUEST_GAP_MS, который определяет паузу между запросами к API. По умолчанию значение 100 (т. е. 100 мс). Можете уменьшить это значение, если любите скорость и риск или увеличить, если хотите подстраховаться от временного бана.

Также, подозреваю, что учитывается общее число запросов в сутки. Поэтому не стоит выставлять короткие интервалы обновления автоплейлистов. А в случае проблем попробуйте увеличить значения AUTO_PLAYLISTS_FREQUENT_SYNC_INTERVAL_MS и AUTO_PLAYLISTS_RARE_SYNC_INTERVAL_MS.

Если у кого-то есть реальный опыт взаимодействия с лимитами Spotify API, то буду благодарен любым советам.

❯ Несколько пользователей одного приложения

Технически Spotify API в режиме пет-проектов позволяет добавлять до 5 пользователей для одного приложения. При этом их нужно предварительно добавить вручную в панели разработчика Spotify.

И хотя приложение должно работать в многопользовательском режиме, но я не тестировал его в этом качестве.

Основное опасение связано как раз с лимитами на запросы к API. Потому что они выдаются не под каждого пользователя приложения, а под само приложение в целом. И чем больше пользователей, тем выше риск блокировок.

❯ Использование других музыкальных сервисов

В текущем виде приложение сделано только под использование вместе со Spotify, потому что это сервис, которым я сам пользуюсь.

Но потенциально ничто не мешает в дальнейшем добавить поддержку других сервисов, которые предоставляют API для разработки, например Apple Music, Deezer и остальных. Или сделать форки (отдельные версии приложения) под них.

❯ Что дальше?

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

Очень жаль, что сам Spotify планомерно ограничивает возможности использования собственного API. Я бы с радостью сделал этот проект нормальным полноценным SaaS-сервисом, в котором любой из вас мог бы по клику зарегистрироваться и спокойно автоматизировать свои плейлисты. Но увы, теперь это невозможно.

Поэтому единственный вариант, который остался у разработчиков — выкладывать приложения в общий доступ и объяснять пользователям, как их самостоятельно установить и настроить. Надеюсь, я справился с этой задачей и у вас теперь есть своя Spotify-автоматизация. Если же возникли вопросы или проблемы, то не стесняйтесь спрашивать тут или в личке — постараюсь помочь.

У меня есть много идей, как дальше развивать Mustash, поэтому надеюсь, это не моя последняя статья тут про автоплейлисты. Так что подписывайтесь на Хабре или в телеграме: https://t.me/nickneustroev_blog. Делитесь своими впечатлениями и пожеланиями, что бы вы хотели видеть в следующих версиях приложения.


Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram-канале