尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Минималистичный музыкальный веб-плеер с коллекцией релизов, синхронизированными текстами и статистикой прослушиваний. Проект создан для личного использования и не является стриминговым сервисом.檢視完整 README ↗
Закрытый музыкальный сайт с коллекцией релизов frnk ness: плеер, тексты с караоке и разборами строк, аккаунты, друзья, плейлисты, комнаты для совместного прослушивания, итоги года. Сайт для личного использования и не является стриминговым сервисом.
Адрес: https://frnkness.ru/. Без входа видна только заставка.
/admin.html): контент, тексты и караоке, статистика, пользователи, теги, обращения, ошибкиVue 3, TypeScript (strict), Vite, Vue Router (hash-режим), Tailwind CSS 4, Supabase (база, вход,
Storage, Realtime, Edge Functions на Deno), Vitest, Playwright, PGlite (SQL-тесты на настоящем Postgres в WASM).
Сайт публикуется на GitHub Pages из main.
Нужен Node.js 18+.
npm install
npm run dev
Переменные окружения необязательные: без них используются значения по умолчанию из src/supabaseConfig.ts
(боевой проект Supabase). Свои значения кладут в .env.local по образцу .env.example.
npm run dev # локальный сервер
npm run typecheck # проверка типов (.ts; шаблоны .vue проверяет сборка)
npm run test:run # юнит-тесты и SQL-тесты на PGlite (используется в CI); npm test: режим наблюдения
npm run check:content # проверка настоящего контента: реестр, файлы, разборы, .lrc
npm run build # сборка в dist/ и проверка, что код админки не попал в сайт и в precache
npm run preview # посмотреть собранный сайт
npm run test:e2e # Playwright: сайт и админка (Supabase и GitHub замоканы)
npm run check:function # типы Edge Functions через Deno (в CI не запускается)
Тесты работают на фикстуре tests/fixtures/catalog и не зависят от настоящего каталога: он меняется из админки.
Правила работы в репозитории (обязательные проверки перед коммитом, формат текстов песен, правила для ассистента) в CLAUDE.md.
src/
main.ts, App.vue корень сайта: шапка, RouterView, плеер
site/ сайт: router.ts, session.ts, pages/, components/, player/, social/, rooms/, recap/, services/
admin/ админка (admin.html → src/admin/main.ts), отдельные чанки admin-*
runtime/ экран блокировки и сессии прослушивания
content/ releases.json (реестр релизов) и site.json (промо, анонс): их правит админка
content-check/ проверка контента для npm run check:content и правила деплоя
utils/, types/ общие утилиты и типы
sw.js service worker
supabase/
migrations/ схема базы (только добавлять новые файлы, старые не менять)
functions/ Edge Functions: admin-content, admin-users, account, register, recovery-request; общий код в _shared/
audit/check_all.sql «проверить всё» (права, закрытые таблицы и функции)
setup/ SQL для аварий
tests/ SQL-тесты прав и лимитов на PGlite
scripts/ проверка контента, проверка сборки, страницы превью ссылок, CSP
e2e/ Playwright-тесты
tests/fixtures/catalog/ фикстура каталога для тестов
audio/ images/ lyrics/ lyrics-books/ контент
Адреса сайта (hash-режим): #/, #/chart, #/release/<id>, #/track/<id>/<слаг>, #/u/<ник>, #/friends, #/feed,
#/room/<id>, #/recap/<год>, #/me и другие, список в начале src/site/router.ts. Для отправки в мессенджеры
сборка создаёт статические страницы /r/<релиз>/ и /t/<релиз>/<слаг>/ с превью, они перенаправляют на «#/…».
Весь текст выводится шаблонами Vue с экранированием, v-html не используется.
src/sw.js): оболочка сайта отдаётся из кэша сразу, сам он обновляется в фоне при каждом заходе и при возврате в
приложение; новая версия включается сразу, страница перезагружается на неё (src/site/updates.ts), когда не играет музыка и никто не
печатает. Аудио и PDF с текстами идут мимо service worker (iOS требует честные ответы на Range-запросы). Тексты (lyrics/,
lyrics-index.json, track-notes.json) — сеть первой, не дольше 4 с. Каталог и site.json вшиты в чанки сборки, поэтому свежие
вместе с оболочкой.src/site/player/playbackGuard.ts): play() вызывается сразу в обработчике нажатия; если звук не пошёл, плеер
повторяет попытку (1, 3 и 7 с, после возвращения сети — сразу), затем показывает «Нажми, чтобы играть». Причина каждого сбоя
(«Не удалось начать воспроизведение: …») попадает в журнал ошибок админки.public/fonts/ (только кириллица и латиница, OFL) и подключены в src/assets/fonts.css; внешний хостинг шрифтов не
нужен и закрыт в CSP.images/*.jpg|png создаются webp-копии
images/<имя>-160|320|640|960.webp (vite.config.ts, src/utils/cover.ts); страницы подставляют их в srcset.TrackMenuSheet.vue); на компьютере — иконки как раньше.src/assets/mobile.css.src/content/releases.json. Аудио лежит в audio/, обложки в images/, тексты в lyrics/, PDF с текстами в lyrics-books/.<имя текста>.notes.json с полями about («О треке») и annotations (разборы строк);
строка ищется в тексте без учёта регистра и знаков по краям.01-makanochki.txt → makanochki.<releaseId>-<индекс трека>. Админка и функция admin-content такие изменения не пропускают.main публикует сайт через GitHub Actions (.github/workflows/deploy-pages.yml). Правки из админки это те же пуши в main..github/workflows/ci.yml. PR с красным CI не мержится.frnk ness: музыка и контент. mentanicarli: разработка. Только личное использование.