explainroo
explainroo는 AI 에이전트가 음성으로 설명 영상을 만들 수 있는 무료 오픈소스 도구이며, 로컬에서 API 키 없이 실행됩니다
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗VEIN Music — независимая платформа для любителей музыки. Она собирает прослушивания из приложения и сайта Яндекс Музыки, браузера, десктопных плееров и облачных сервисов, строит статистику и рекомендации, превращает прослушивание в игру с уровнями и достижениями и даёт разработчикам открытый API.
Проект на бета-тестировании. Сайт работает, но возможны ошибки и изменения. Если заметили ошибку, пожалуйтесь на неё через профиль или комментарий: жалобы попадают в админку.
chrome.alarms./link, и расширение получает собственный ключ. Ключ можно отозвать в настройках.desktop/, Tauri 2):
desktop_client/, Python) — для Linux:
playerctl); на Windows — SMTC и заголовки окон.~/.veinmusic/queue.json, которая досылается при восстановлении сети./api/developer/export/config).Remastered, Live at …, Radio Edit, Deluxe Edition, Explicit, а feat. переносится к артисту./api/recommendations/me), а в профиле — артисты, которых слушают ваши «музыкальные двойники».Now Playing — что играет сейчас, с анимированным эквалайзером (/api/widgets/now-playing/{username}.svg);Top Artists — топ-5 артистов (/api/widgets/top-artists/{username}.svg)./api/widgets/og/recap/{username}.svg) и полученные достижения (/api/widgets/og/achievement/{username}/{id}.svg).manifest.json).vm_...) с правами (scopes), хранятся в виде хэша PBKDF2-HMAC-SHA256.scrobble.created и achievement.unlocked с подписью X-VEIN-Signature (HMAC-SHA256)./developers./api/redirect: открывает найденный трек в Яндекс Музыке.nosniff, HSTS в продакшене./admin)Роль администратора выдаётся командой на сервере:
docker compose exec backend python -m app.cli set-role <username> admin
Аватары и обложки профиля при загрузке уменьшаются (аватар до 512 px,
обложка до 2000 px по длинной стороне), разворачиваются по EXIF и теряют
метаданные камеры и GPS. Файлы, загруженные раньше, один раз ужимаются на
месте (имена и ссылки не меняются; --dry-run только покажет экономию):
docker compose exec backend python -m app.cli shrink-uploads --dry-run
docker compose exec backend python -m app.cli shrink-uploads
Подробнее: личная музыка и перенос истории.
Подробнее: сценарии и замеры большой истории, внешние бэкапы, реагирование на инцидент.
┌────────────────────────────────────────────────────────┐
│ КЛИЕНТСКИЙ СЛОЙ │
│ Next.js 16 (PWA) │ Расширение MV3 │ Desktop (Py/RPC) │
└───────────────────────────┬────────────────────────────┘
│ HTTPS / WebSockets
▼
┌────────────────────────────────────────────────────────┐
│ FASTAPI SERVER │
│ Auth / API / WebSockets / Антифрод / Рекомендации │
└───────────────┬────────────────────────┬───────────────┘
│ │
PostgreSQL │ │ Redis / ARQ
┌──────────────────────▼───────┐ ┌───────▼────────────────────────┐
│ Пользователи, прослушивания │ │ Кэш, лимиты, WebSocket-комнаты│
│ каталог, вебхуки (Alembic) │ │ Воркер: достижения, вебхуки, │
│ │ │ экспорт, импорт, опрос облака │
└──────────────────────────────┘ └────────────────────────────────┘
playerctl/MPRIS), Discord IPC.VEINMusic/
├── app/ # Бэкенд (FastAPI)
│ ├── core/ # Безопасность, шифрование, Redis, WebSockets, лимиты, миграции
│ ├── models.py # Модели базы данных SQLAlchemy
│ ├── schemas.py # Схемы валидации Pydantic
│ ├── routers/ # Роутеры (auth, scrobbling, users, stats, admin, developer, devices, account…)
│ ├── services/ # Бизнес-логика (антифрод, рекомендации, Ynison, экспорт, импорт, вебхуки, push, OG)
│ ├── worker.py # Фоновый воркер ARQ
│ └── main.py # Точка входа приложения
├── desktop/ # Приложение для Windows (Tauri 2): окно сайта, трей, скробблинг из панели медиа
├── desktop_client/ # Консольный клиент на Python (Linux: MPRIS, Discord RPC)
├── frontend/ # Веб-приложение Next.js 16 (React 19)
│ ├── app/ # Страницы и маршруты (about, admin, auth, developers, feed, link, user…)
│ ├── components/ # Общие компоненты (PWARegistration, StatsCharts, GlobalAnnouncementBanner)
│ └── public/ # Иконка, манифест PWA и Service Worker (sw.js)
├── music-extension/ # Браузерное расширение (Manifest V3)
├── alembic/ # Миграции базы данных
├── tests/ # Тесты бэкенда (pytest)
├── deploy/ # Продакшен на VPS: готовые образы, Caddy (HTTPS), автообновление, страница обновления
└── docker-compose.yml # PostgreSQL, Redis, API, воркер и фронтенд
git clone https://github.com/Peaostrel/VEINMusic.git
cd VEINMusic
cp .env.example .env
# Обязательно задайте SECRET_KEY, POSTGRES_PASSWORD и REDIS_PASSWORD
Для облачного SoundCloud-скробблинга зарегистрируйте приложение в SoundCloud
и задайте SOUNDCLOUD_CLIENT_ID, SOUNDCLOUD_CLIENT_SECRET и точный callback
SOUNDCLOUD_REDIRECT_URI (для продакшена —
https://api.music.vein.guru/auth/soundcloud/callback).
Для входа и привязки через VK ID создайте веб-приложение в кабинете
id.vk.ru, укажите доверенный redirect
URL https://api.music.vein.guru/auth/vk/callback и задайте VK_CLIENT_ID
(ID приложения). Защищённый ключ не нужен: вход идёт по OAuth 2.1 с PKCE.
Пока VK_CLIENT_ID пуст, кнопки VK ID на сайте не показываются.
docker compose up -d --build
Поднимаются PostgreSQL, Redis, API (миграции применяются автоматически при старте),
фоновый воркер arq (достижения, вебхуки, экспорт скробблов, импорт Last.fm,
живое соединение с Яндексом, опрос Spotify и SoundCloud, ночная очистка неиспользуемых
загрузок) и фронтенд.
Проверка состояния: GET /health.
Для VPS с 1–2 ГБ памяти удобнее deploy/: образы
собирает GitHub Actions, сервер только скачивает их, а Caddy сам выпускает
HTTPS-сертификаты. Сервер сам подтягивает новые коммиты, а на время
перезапуска Caddy показывает страницу «Идёт обновление».
Резервные копии. Сервис db-backup раз в сутки делает pg_dump в том
db_backups и хранит копии BACKUP_KEEP_DAYS дней (по умолчанию 7).
Восстановление:
docker compose exec db-backup ls /backups
docker compose exec -T db-backup pg_restore --clean --if-exists \
-d veinmusic /backups/<файл>.dump
Копии лежат на том же сервере: для защиты от потери диска периодически забирайте их на другое хранилище.
Для работы по обычному http поставьте в .env значение ENVIRONMENT=development
(в продакшене должно оставаться production).
# Только базы данных
docker compose up -d db redis
pip install -r requirements.txt
python -m app.core.migrate # миграции (подхватывает и старые базы без истории Alembic)
uvicorn app.main:app --reload --port 8000
arq app.worker.WorkerSettings # фоновый воркер (в отдельном терминале)
Web Push включается ключами VAPID: python -m app.services.push_notifications
выведет пару ключей для .env.
cd frontend
npm install
npm run dev
Фронтенд будет доступен по адресу: http://localhost:3000.
Установщик публикуется в релизах с тегом desktop-v*;
сборка из исходников описана в desktop/README.md.
cd desktop_client
pip install -r requirements.txt
python -m desktop_client.main
Готовые пакеты: VEINMusic Extension 1.5.0. Скачать ZIP можно без аккаунта GitHub. Инструкция и ограничения установки.
В Chrome, Edge, Brave и Яндекс Браузере распакуйте пакет chromium, откройте
страницу расширений, включите режим разработчика и загрузите распакованную папку.
В Firefox 142+ пакет firefox пока устанавливается временно через about:debugging;
для постоянной установки требуется подпись Mozilla или публикация на AMO.
В окне расширения включите «Передавать прослушивания в VEIN», нажмите «Подключить через сайт» и подтвердите код. Ключ устройства можно отозвать в настройках VEIN. «Тест связи» проверяет доступ, не добавляя треков в историю.
Для разработчиков: python scripts/package_extension.py собирает два пакета,
node --test music-extension/tests/*.test.cjs запускает тесты.
# Юнит- и интеграционные тесты бэкенда (SQLite)
pytest
# Те же тесты на PostgreSQL и с реальным Redis (как в CI)
TEST_DATABASE_URL=postgresql://USER:PASSWORD@localhost:5432/veinmusic_test \
TEST_REDIS_URL=redis://localhost:6379 pytest
# Проверка, что миграции совпадают с моделями
alembic check
# Проверка типизации и линтинга бэкенда
flake8 app tests desktop_client
mypy app/
# Проверка линтера и форматирования фронтенда
cd frontend
npm run lint
npm run format:check
npm run build
Проект распространяется под условиями собственной лицензии. Подробнее см. в файле LICENSE.