- Add Like button: promotes wave track to permanent library and refills buffer - Add Dislike button: blacklists track in SQLite disliked_tracks, removes audio, refills buffer - Add Delete button in history table for library file removal - Add AI Radio module: wttr.in weather, Qwen 2.5 host monologues, speech synthesis, ID3 tags - Generate interleaved 'AI Радио.m3u8' alongside clean 'Моя Волна.m3u8' - Update Web UI with Radio DJ card, voice selection, and track actions
94 lines
10 KiB
Markdown
94 lines
10 KiB
Markdown
# 🎵 Navidrome Music Sync
|
||
|
||
Мультисервисный импортер и синхронизатор музыки для **Navidrome**.
|
||
|
||
Позволяет в один клик или по расписанию импортировать треки, альбомы и плейлисты из **Яндекс Музыки**, **Spotify**, **Apple Music** и **YouTube Music** напрямую в медиатеку Navidrome с сохранением оригинальных тегов, обложек в высоком разрешении и синхронизированных караоке-текстов (`.lrc`).
|
||
|
||
---
|
||
|
||
## 🚀 Возможности
|
||
|
||
- **Прямой импорт из Яндекс Музыки (320 kbps)**:
|
||
- Скачивание отдельных треков, альбомов и плейлистов.
|
||
- Полная синхронизация личного плейлиста **«Мне нравится»** (880+ треков).
|
||
- **Импорт из Spotify и Apple Music**:
|
||
- Без необходимости платных подписок и зарубежных аккаунтов.
|
||
- Извлечение точных метаданных через официальные открытые каталоги и аудио-матчинг с YouTube Music CDN (Opus 160 / MP3 320k).
|
||
- **Обход цензуры и региональных блокировок**:
|
||
- Если трек в каталоге РФ заблокирован или зацензурен («запикан»), движок автоматически переключается на глобальные источники и скачивает полноценную **Explicit (18+)** версию.
|
||
- **Мультисервисный поиск & Предпрослушивание**:
|
||
- Параллельный поиск по **Spotify** (приоритетный источник), **Яндекс Музыке**, **SoundCloud**, **YouTube** и **Apple Music**.
|
||
- **Приоритет Spotify**: треки и альбомы со Spotify получают бонус релевантности и всегда выводятся первыми в выдаче.
|
||
- Сквозное ранжирование по точности совпадения: лучшие совпадения сразу со всех платформ показываются вверху.
|
||
- Определение цензуры: бейджи `🔞 18+ Explicit` (без цензуры) и `⚠️ Clean` (зацензуренная версия).
|
||
- Встроенный аудиоплеер предпрослушивания с возможностью перемотки на лету (**HTTP Range 206**).
|
||
- Прямое скачивание в браузер или добавление в очередь сервера в 1 клик.
|
||
- **🔐 Защита & Авторизация через Navidrome**:
|
||
- Панель синхронизации защищена авторизацией. Для входа используются те же имя пользователя и пароль, что и в Navidrome.
|
||
- Сессионные токены HMAC (30 дней) для браузера и поддержка HTTP Basic Auth для API / автоматизации.
|
||
- **🌊 Моя Волна (Smart Wave V2 & V3)**:
|
||
- Автономный генератор персональных рекомендаций на основе профиля вкусов (звёздочки, скробблы, топ артистов из `navidrome.db`).
|
||
- **Контекстный LLM-реранкер**: локальная Ollama (`qwen2.5:1.5b` с `keep_alive: 0`, 0 МБ RAM в простое) анализирует расширенный пул кандидатов и отбирает треки под время суток (*утро / день / вечер / ночь*) или выбранное настроение (*Энергия*, *Чилл*, *Андеграунд*).
|
||
- **⭐ Лайк («В коллекцию»)**: моментальный перенос трека в постоянную медиатеку `/music/{Artist}/{Album}/{Title}.mp3` и мгновенное пополнение Волны свежим кандидатом.
|
||
- **👎 Дизлайк**: моментальное удаление файла и занесение исполнителя и трека в persistent черный список `disliked_tracks`, исключающий его из всех будущих рекомендаций навсегда.
|
||
- Скользящий буфер на 25 треков в `/music/AI Recommendations/Моя Волна/` (~180 МБ).
|
||
- **Авто-ротация**: если трек лайкнут в Navidrome — переносится в основную библиотеку навсегда; если лежит более 7 дней без лайка — автоматически удаляется.
|
||
- **Фоновое расписание**: автоматическая ротация и пополнение буфера каждые 6 часов.
|
||
- Автоматическая генерация умного плейлиста `Моя Волна.nsp` и `Моя Волна.m3u8` для всех Subsonic клиентов.
|
||
- **🎙️ AI Радио (AI DJ Host & AI Радио.m3u8)**:
|
||
- Персональный радиоэфир: виртуальный ведущий радиостанции приветствует слушателей по времени суток, объявляет погоду за окном в реальном времени (`wttr.in`) и делает короткие живые подводки к трекам.
|
||
- Нейросетевая генерация реплик диктора через `qwen2.5:1.5b` (`keep_alive: 0`).
|
||
- Нейросинтез речи с нулевой нагрузкой на GPU и сохранением MP3-реплик с ID3-тегами `AI Радио (DJ)`.
|
||
- Отдельный интерливинг-плейлист `AI Радио.m3u8` (реплики ведущего чередуются перед музыкальными треками каждые 2–3 песни), сохраняя `Моя Волна` полностью чистой от разговоров.
|
||
- Автоматическое уведомление Navidrome через Subsonic API (`startScan`) для мгновенного появления радиоэфира в клиентах.
|
||
- **Интеграция с Navidrome**:
|
||
- Организация каталога по стандарту: `/music/{Artist}/{Album}/{Track_Number} - {Title}.mp3`.
|
||
- Автоматическое скачивание построчных караоке-текстов (`.lrc`).
|
||
- Уведомление Navidrome через Subsonic API (`startScan`) сразу после завершения загрузки.
|
||
- **Веб-интерфейс & REST API**:
|
||
- Адаптивный темный Web UI с прогресс-баром задач, переключателем настроения Волны, карточкой AI Радио с выбором голоса ведущего, кнопками Лайк/Дизлайк и удалением треков.
|
||
- Фоновый асинхронный воркер без блокировки интерфейса.
|
||
- Дедупликация (не скачивает повторно треки, которые уже есть в библиотеке).
|
||
|
||
---
|
||
|
||
## 🛠️ Установка и запуск
|
||
|
||
### 1. Конфигурация (.env)
|
||
Скопируйте пример конфигурации и укажите токен Яндекс Музыки:
|
||
```bash
|
||
cp .env.example .env
|
||
```
|
||
|
||
### 2. Запуск через Docker Compose
|
||
```bash
|
||
docker compose up -d --build
|
||
```
|
||
|
||
Сервис доступен по адресу: `http://127.0.0.1:8005` (или `https://music.qpid.pro/sync/`).
|
||
|
||
---
|
||
|
||
## 🔌 API Эндпоинты
|
||
|
||
- `GET /` — Веб-интерфейс управления (требуется авторизация).
|
||
- `GET /login` / `POST /login` — Страница и эндпоинт авторизации (валидация через Navidrome).
|
||
- `GET /logout` / `POST /logout` — Завершение сессии.
|
||
- `GET /api/search?q={query}` — Сквозной поиск по всем платформам с ранжированием.
|
||
- `GET /api/stream?url={url}` — Аудио-стриминг для плеера с поддержкой Range-запросов и перемотки.
|
||
- `GET /api/direct-download?url={url}` — Прямая отдача файла в браузер.
|
||
- `POST /api/download` — Запуск задачи на скачивание по ссылке:
|
||
```json
|
||
{ "url": "https://music.yandex.ru/album/123/track/456" }
|
||
```
|
||
- `POST /api/sync/yandex-likes` — Запуск полной синхронизации понравившихся треков из Яндекс Музыки.
|
||
- `GET /api/wave/status` — Статус буфера «Моей Волны» и якорные артисты.
|
||
- `POST /api/wave/generate` — Генерация свежих рекомендаций и наполнение буфера Волны.
|
||
- `POST /api/wave/rotate` — Ротация буфера (перенос лайкнутых в библиотеку, очистка устаревших).
|
||
- `POST /api/wave/like` — Лайк трека в Волне (мгновенный перенос в постоянную библиотеку и докачка нового слота).
|
||
- `POST /api/wave/dislike` — Дизлайк трека в Волне (удаление, занесение в blacklist и докачка замены).
|
||
- `DELETE /api/track?file_path={path}` — Удаление любого трека с диска и из истории.
|
||
- `GET /api/radio/status` — Статус AI Радиовещания и количество реплик ведущего.
|
||
- `POST /api/radio/generate` — Генерация реплик ведущего и сборка плейлиста «AI Радио.m3u8».
|
||
- `GET /api/tasks` — Список активных задач и прогресс выполнения.
|
||
- `GET /api/history` — История и статистика загруженной музыки. |