Skip to main content

CLI daemon for syncing music libraries between Yandex Music and Spotify

Project description

Spondex

CLI-демон для синхронизации музыкальных библиотек между Spotify и Яндекс Музыкой.

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

Установка

# Клонировать и установить через uv
git clone <repo-url> && cd spondex
uv sync

Предварительная настройка

Перед первым запуском spondex start понадобятся учётные данные обоих сервисов. Мастер настройки запросит их интерактивно; ниже — как их получить заранее.

Токен Яндекс Музыки

OAuth-токен можно получить через браузер (DevTools) или по инструкции:

Полученный токен нужно будет ввести в wizard или позже задать командой:

spondex config set yandex.token <ваш_токен>

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

  1. Откройте Spotify Developer Dashboard.
  2. Создайте новое приложение (Create app).
  3. В настройках приложения скопируйте Client ID и Client Secret.
  4. В разделе Redirect URIs добавьте URI для OAuth:
    • http://127.0.0.1:8888/callback
  5. Сохраните изменения.

При первом запуске wizard настройки запросит Client ID и Client Secret, откроет браузер для авторизации в Spotify и сохранит refresh_token в ~/.spondex/config.toml.

При необходимости задать данные вручную:

spondex config set spotify.client_id <client_id>
spondex config set spotify.client_secret <client_secret>
spondex config set spotify.redirect_uri "http://127.0.0.1:8888/callback"
# refresh_token выдаётся после авторизации через браузер (wizard это делает автоматически)

Быстрый старт

# Первый запуск — запускает wizard настройки
spondex start

# Проверить статус
spondex status

# Запустить синхронизацию сразу
spondex sync --now

# Смотреть логи
spondex logs -f

# Открыть веб-дашборд
spondex dashboard

# Остановить демон
spondex stop

Команды

Команда Описание
spondex start Запустить демон (при первом запуске — мастер настройки)
spondex stop Остановить демон корректно
spondex restart Остановить и снова запустить
spondex status Состояние, аптайм, планировщик, счётчики треков
spondex sync [--mode full] Запустить цикл синхронизации
spondex logs [-n 50] [-f] Вывод логов демона
spondex logs --sync JSON-лог синхронизации
spondex dashboard Открыть веб-дашборд в браузере
spondex config show Текущая конфигурация (секреты скрыты)
spondex config set <key> <val> Задать значение (напр. sync.mode full)
spondex db status Статистика БД и данные последней синхронизации

Подробная документация по CLI со всеми опциями и примерами: docs/CLI.md.

Конфигурация

Конфигурация хранится в ~/.spondex/config.toml и создаётся мастером настройки при первом запуске spondex start.

# Просмотр
spondex config show

# Изменение
spondex config set sync.interval_minutes 15
spondex config set sync.mode full
spondex config set spotify.refresh_token <token>
spondex config set yandex.token <token>

Секции

  • daemondashboard_port, log_level
  • syncinterval_minutes, mode (full/incremental), propagate_deletions
  • spotifyclient_id, client_secret, redirect_uri, refresh_token
  • yandextoken

Архитектура

CLI (typer)
  │
  │  httpx (UDS)
  ▼
FastAPI RPC Server ──► DaemonState
  │  ~/.spondex/daemon.sock       │
  │                               ├── SyncEngine
  │                               ├── SyncScheduler
  │                               └── Database (SQLite)
  │
Dashboard Server (Starlette + React SPA)
  │  http://127.0.0.1:9847

CLI — тонкий клиент, отправляющий JSON-команды через Unix domain socket.

Daemon — даемонизация через double-fork с PID-файлом, обработкой сигналов и структурированным логированием (structlog → RotatingFileHandler).

RPC Server — FastAPI на UDS. Все команды идут через POST /rpc с телом {"cmd": "...", "params": {}}.

Sync Engine — двунаправленная синхронизация с трёхуровневым нечётким сопоставлением (нормализация, транслитерация, fuzzy с проверкой длительности). Режимы full и incremental.

Dashboard — React SPA на Starlette с обновлениями по WebSocket в реальном времени, графиками и управлением треками.

Разработка

# Установить dev-зависимости
uv sync --extra dev

# Запустить тесты
uv run pytest tests/ -v

# Тесты с покрытием
uv run pytest tests/ --cov=spondex --cov-report=term-missing

# Линтинг
uv run ruff check src/ tests/

# Форматирование
uv run ruff format src/ tests/

# Проверка типов
uv run mypy src/

Безопасность

  • Файл конфигурации (~/.spondex/config.toml) создаётся с правами chmod 600
  • Выводится предупреждение, если права на конфиг слишком открытые
  • Демон выставляет umask(0o077) — все runtime-файлы (сокет, логи) доступны только владельцу
  • API-токены хранятся как SecretStr и не попадают в логи и вывод CLI

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

spondex-0.1.0.tar.gz (255.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

spondex-0.1.0-py3-none-any.whl (112.0 kB view details)

Uploaded Python 3

File details

Details for the file spondex-0.1.0.tar.gz.

File metadata

  • Download URL: spondex-0.1.0.tar.gz
  • Upload date:
  • Size: 255.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for spondex-0.1.0.tar.gz
Algorithm Hash digest
SHA256 c859084105e7b3ec7d30cbb1864acaea7fad4fd5b33ca061ce651068bdae3e01
MD5 1885a2a0e87c72e31afb15dfbc524d6d
BLAKE2b-256 a963b2ddf768408c23ac92993bdfb284c7d4a23ad845f5f4cb7115046c597f6e

See more details on using hashes here.

File details

Details for the file spondex-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: spondex-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 112.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for spondex-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a65429fe1c737010312a11efd18f55e0bf3623f81f8d6d4f2e2f5ae28ed9d818
MD5 2edbd6946e940ada5217f69dcafbd638
BLAKE2b-256 42dd5ff01550ca899c747fe951e40ae3034238631e1f21ee91cb639873a26452

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page