docs: add product idea, design prototypes and development documentation
- IDEA.md: product vision from the user's perspective (input for design)
- Architecture, ADRs, data model, REST API overview
- Auth and roles, library storage (NFS, path regexes, scanner, search),
playback, recommendation system ("My Wave"), track upload queue
- Web, Android (offline, self-update), i18n, design system
- Testing strategy, Gitea Actions CI/CD, deployment, conventions, roadmap
- Clickable web/Android design prototypes and wave button variants
- .claude/launch.json to serve the prototypes locally
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
36e99fe960
commit
9eb1c25147
30 files changed
+7538
No files matched your search
+169
@@ -0,0 +1,169 @@
|
||||
# Pipu Music — исходная идея продукта
|
||||
|
||||
> Документ описывает **что** должно быть в приложении с точки зрения пользователя.
|
||||
> Используется как входные данные для создания дизайна. Технические решения — в [README документации](README.md).
|
||||
|
||||
## Суть
|
||||
|
||||
Закрытое (self-hosted) музыкальное приложение для прослушивания музыки с собственного сервера.
|
||||
Есть веб-версия и мобильное приложение для Android. Главная фишка — **«Моя волна»**: бесконечный умный поток
|
||||
музыки, который подстраивается под вкус пользователя и под выбранное настроение или занятие.
|
||||
|
||||
Масштаб: до ~100 пользователей, библиотека от 11 000 треков и больше.
|
||||
|
||||
Интерфейс двуязычный — **русский и английский**, с возможностью добавить другие языки позже.
|
||||
Переключатель языка — в профиле / настройках (и на экране входа).
|
||||
|
||||
## Доступ и учётные записи
|
||||
|
||||
- При первом открытии приложение показывает **экран входа** (логин + пароль).
|
||||
В мобильном приложении на этом экране также указывается **адрес сервера**.
|
||||
- **Регистрации нет.** Учётные записи создаёт администрация.
|
||||
- Роли:
|
||||
- **Администратор** — полный доступ; единственный, кто может создавать и назначать модераторов
|
||||
и управлять хранилищами музыки.
|
||||
- **Модератор** (заместитель администратора) — доступ к админке, может создавать обычных пользователей
|
||||
и предлагать новые треки на добавление в библиотеку.
|
||||
- **Пользователь** — слушает музыку.
|
||||
- **Первый вход администратора:** система сразу предлагает сменить стандартные логин и пароль администратора
|
||||
(обязательный шаг, пока он не пройден, дальше не пустит).
|
||||
- **Любой пользователь** может сменить свой пароль (в профиле / настройках).
|
||||
- Если администратор сбросил пароль пользователю, тот при следующем входе обязан задать новый.
|
||||
|
||||
## Каркас интерфейса (на всех экранах)
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────────────────┐
|
||||
│ [Логотип] [ 🔍 Поиск ...................... ] [👤] │ ← верхняя панель
|
||||
├────────────┬─────────────────────────────────────────────────┤
|
||||
│ Главная │ │
|
||||
│ Коллекция │ Основной контент │
|
||||
│ История │ │
|
||||
│ Лайки │ │
|
||||
│ Дизлайки │ │
|
||||
│ Скачанное│ │
|
||||
│ │ │
|
||||
│ Админка │ │
|
||||
├────────────┴─────────────────────────────────────────────────┤
|
||||
│ [обл.] Трек — Исполнитель ⏮ ⏯ ⏭ ━━━━●━━━━ 1:23/3:45 🔊 ♥ 👎 │ ← плеер
|
||||
└──────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Поиск (всегда виден вверху)
|
||||
- При вводе появляется **выпадающий список** результатов, сгруппированный по типам:
|
||||
**исполнители, альбомы, треки**. Клик по результату сразу открывает исполнителя / альбом / запускает трек.
|
||||
- По нажатию **Enter** открывается **полная страница поиска** со всеми результатами.
|
||||
- Поиск прощает опечатки и неправильную раскладку.
|
||||
|
||||
### Левая панель навигации
|
||||
- **Главная**
|
||||
- **Коллекция** — с подкатегориями:
|
||||
- **История** — прослушанные треки;
|
||||
- **Лайки** — понравившиеся треки;
|
||||
- **Дизлайки** — треки, которые пользователь не хочет слышать (можно убрать дизлайк);
|
||||
- **Скачанное** — только в мобильном приложении, треки, сохранённые для офлайна.
|
||||
- **Админка** — видна только администраторам и модераторам.
|
||||
- Список будет расширяться в будущем (плейлисты и т.п.), дизайн должен это допускать.
|
||||
|
||||
На мобильном вместо левой панели — нижняя навигация (Главная / Поиск / Коллекция / Профиль),
|
||||
плеер — мини-полоска над навигацией, разворачивается в полноэкранный плеер.
|
||||
|
||||
### Плеер (всегда внизу)
|
||||
- Полноценный плеер в виде полоски: обложка, название трека, исполнитель, назад / пауза / вперёд,
|
||||
прогресс-бар с перемоткой, время, громкость, **лайк** и **дизлайк**, открыть очередь.
|
||||
- **Запоминает последний трек и момент**, на котором остановились: после перезахода / перезагрузки
|
||||
и даже на другом устройстве можно продолжить с того же места.
|
||||
- Если играет «Моя волна», плеер показывает это (и выбранное настроение / занятие).
|
||||
- Дизлайк в волне сразу переключает на следующий трек.
|
||||
|
||||
## Главная страница
|
||||
|
||||
- В центре — **большая кнопка «Моя волна»**. Это главный элемент приложения:
|
||||
- **анимированная** — живая, «дышащая» волновая анимация; во время воспроизведения пульсирует
|
||||
в такт музыке (темп и энергия текущего трека);
|
||||
- **интерактивная** — реагирует на наведение и нажатие; видно, играет волна или нет; повторное нажатие — пауза.
|
||||
- Рядом с волной — выбор **занятия** и **настроения**, по которым волна корректируется:
|
||||
- занятие: бегаю, просыпаюсь, работаю / фокус, тренировка, в дороге, отдыхаю, засыпаю;
|
||||
- настроение: энергичное, весёлое, спокойное, грустное;
|
||||
- можно не выбирать ничего — тогда волна просто «под вас».
|
||||
- Волна постоянно учится: лайки, дизлайки, пропуски, сколько раз и насколько долго слушался трек,
|
||||
жанры и звучание — всё влияет на то, что будет дальше.
|
||||
|
||||
## Страницы
|
||||
|
||||
| Страница | Содержимое |
|
||||
|---|---|
|
||||
| Вход | (мобильное: адрес сервера), логин, пароль, «Войти», выбор языка. Без регистрации. |
|
||||
| Смена учётных данных админа | Обязательный экран при первом входе: новый логин, новый пароль, подтверждение. |
|
||||
| Обязательная смена пароля | После сброса пароля администрацией. |
|
||||
| Главная | Кнопка «Моя волна», выбор занятия / настроения. |
|
||||
| Коллекция → История | Прослушанные треки, сгруппированные по дням; можно запустить любой. |
|
||||
| Коллекция → Лайки | Понравившиеся треки, можно запустить все / перемешать. |
|
||||
| Коллекция → Дизлайки | Скрытые из рекомендаций треки, можно снять дизлайк. |
|
||||
| Коллекция → Скачанное | (мобильное) офлайн-треки, занимаемое место, удалить. |
|
||||
| Поиск | Полные результаты: исполнители, альбомы, треки. |
|
||||
| Исполнитель | Фото / обложка, альбомы, популярные треки, «волна по исполнителю». |
|
||||
| Альбом | Обложка, год, список треков, «скачать альбом» (мобильное). |
|
||||
| Профиль / настройки | Смена пароля, язык, качество звука (мобильное: для сети и для скачивания), проверка обновлений (мобильное), выход. |
|
||||
| Админка → Пользователи | Список, создание, роли, сброс пароля, блокировка. |
|
||||
| Админка → Хранилища | (только админ) Подключение хранилищ музыки, шаблоны структуры папок, запуск сканирования, статус. |
|
||||
| Админка → Библиотека | Статистика: число треков, ход сканирования и анализа звука, ошибки. |
|
||||
| Админка → Предложить треки | (модератор и админ) Загрузка файлов и папок перетаскиванием, индикатор заполненности очереди, список своих предложений со статусами. |
|
||||
| Админка → Очередь на добавление | (только админ) Рассмотрение предложенных треков: прослушать, поправить данные, увидеть, куда файл ляжет, одобрить / отклонить. |
|
||||
| Админка → Настройки | (только админ) Лимит очереди на добавление, хранилище для новых треков. |
|
||||
|
||||
## Админка
|
||||
|
||||
- **Модератор**: видит пользователей, создаёт обычных пользователей, сбрасывает им пароль, блокирует.
|
||||
- **Администратор**: всё то же + создание модераторов, назначение / снятие роли модератора,
|
||||
**управление хранилищами**.
|
||||
- **Хранилища** (только админ):
|
||||
- добавить хранилище: сетевая папка NFS (адрес сервера + путь) или уже подключённая папка на сервере;
|
||||
- проверить подключение;
|
||||
- задать **один или несколько шаблонов (регулярных выражений)**, по которым из пути к файлу
|
||||
извлекаются исполнитель, альбом, год, номер трека, название — например
|
||||
`Исполнитель/Год - Альбом/01 - Название.flac`;
|
||||
- **предпросмотр**: показать, как шаблоны разберут несколько реальных файлов, до сохранения;
|
||||
- выбрать, что важнее — теги файла или структура папок;
|
||||
- запустить пересканирование, видеть прогресс и ошибки.
|
||||
- **Предложение треков** (модератор и админ):
|
||||
- модератор загружает новые треки (файлы или целые папки альбомов) в **очередь на добавление**;
|
||||
- у очереди есть **общий лимит размера** (например, 10 ГБ), его задаёт админ; виден индикатор «занято X из Y ГБ»;
|
||||
- треки, которые **уже есть** в библиотеке (или уже лежат в очереди), **сразу отклоняются** — ещё до загрузки,
|
||||
если это можно понять заранее, — и **не занимают место** в очереди; модератор видит, с каким треком совпало;
|
||||
- модератор видит свои предложения и их статус (загружается, на рассмотрении, одобрено, добавлено, отклонено + причина),
|
||||
может отозвать предложение до рассмотрения.
|
||||
- **Очередь на добавление** (только админ):
|
||||
- список предложенных треков, сгруппированных по альбомам: можно прослушать, посмотреть качество,
|
||||
поправить исполнителя / альбом / название / год / обложку;
|
||||
- пометка «возможно, уже есть» для похожих треков (другая версия, ремастер) — решает админ;
|
||||
- показан **путь, по которому файл ляжет** в хранилище, — в том же виде, как уже разложена музыка на сервере;
|
||||
- одобрить / отклонить (с причиной), в том числе пачкой;
|
||||
- после одобрения файл сам укладывается на файловый сервер и появляется в библиотеке.
|
||||
- Небольшая, утилитарная — не главная часть продукта.
|
||||
|
||||
## Рекомендации («Моя волна»)
|
||||
|
||||
Максимально умная система, которая учитывает:
|
||||
- жанры, а также **звучание** трека (темп, энергия, настроение) — даже если трек никто не слушал;
|
||||
- лайки и дизлайки;
|
||||
- сколько раз и как долго слушался каждый трек, пропуски;
|
||||
- выбранное занятие / настроение;
|
||||
- вкусы похожих пользователей;
|
||||
- постепенно обучается на поведении пользователей.
|
||||
|
||||
## Мобильное приложение (Android)
|
||||
|
||||
- Тот же функционал, что и веб: вход, главная с волной, поиск, коллекция, плеер.
|
||||
- Фоновое воспроизведение, управление с экрана блокировки / шторки / наушников.
|
||||
- **Офлайн по выбору пользователя**: скачать трек / альбом / лайки; прослушивания без сети
|
||||
учитываются и отправляются на сервер позже.
|
||||
- **Самообновление**: приложение проверяет новые релизы в репозитории, предлагает обновиться
|
||||
и скачивает новую версию.
|
||||
|
||||
## Инфраструктура (для контекста)
|
||||
|
||||
- Музыка хранится на сервере, подключение к хранилищу по NFS; хранилища подключает админ из админки.
|
||||
- Одобренные новые треки приложение само записывает на файловый сервер, соблюдая принятую там структуру папок.
|
||||
- Один репозиторий: веб, мобильное приложение, бэкенд, тесты, CI/CD.
|
||||
- CI/CD на Gitea: по тегу собирается релиз.
|
||||
Reference in new issue
Block a user