Implement Phases 1-5: skeleton, OAuth, categories, video sync/feed, playback
- FastAPI + PostgreSQL + Alembic + React/Vite skeleton, Docker Compose, healthcheck - Google OAuth (single allowed account), encrypted refresh token storage - Subscriptions sync with pagination, uploads playlist batch fetch - Categories CRUD, many-to-many channel assignment, category filtering - Video sync (playlistItems + videos.list batching), cached feed with cursor pagination, background scheduler (APScheduler) - Video detail page with YouTube embed player - SPA fallback routing, optimistic UI updates, client-side query caching 40 backend tests covering OAuth allow-list, sync idempotency, cascade deletes, cursor pagination, and category filtering. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
commit
0ed20bb838
90 changed files with 8545 additions and 0 deletions
43
AGENTS.md
Normal file
43
AGENTS.md
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
# AGENTS.md
|
||||
|
||||
Полное ТЗ: [`youtube_categories_metube_TZ.md`](./youtube_categories_metube_TZ.md). Перед любой существенной работой сверяйся с ним — этот файл лишь выжимка ограничений.
|
||||
|
||||
## Жёсткие ограничения (раздел 34 ТЗ)
|
||||
|
||||
1. Не форкать/копировать Tube Archivist.
|
||||
2. Не встраивать yt-dlp в этот сервис — скачивание только через существующий MeTube (`mediaVM`).
|
||||
3. Не дублировать функции скачивания MeTube.
|
||||
4. Не монтировать media storage MeTube на `hermesVM` — видео не хранится локально, только проксируется/линкуется.
|
||||
5. Не реализовывать YouTube Recommendations/Home.
|
||||
6. Не делать multi-user — приложение строго single-user (`ALLOWED_GOOGLE_EMAIL`).
|
||||
7. Frontend не должен напрямую вызывать Google API.
|
||||
8. Frontend не должен напрямую вызывать MeTube write API (`POST /add` и т.п.) — только через наш backend.
|
||||
9. Не восстанавливать filename скачанного видео из YouTube title — использовать только точное имя, пришедшее от MeTube по событию `completed`.
|
||||
10. Не удалять существующие файлы MeTube.
|
||||
11. Не менять исходный код MeTube.
|
||||
12. Все внешние base URL (MeTube, Google) — через env/config, не хардкодить.
|
||||
13. REST API должен оставаться пригодным для будущего mobile/PWA клиента.
|
||||
|
||||
## Порядок фаз (раздел 33 ТЗ)
|
||||
|
||||
Не реализовывать следующую фазу, пока не работает предыдущая:
|
||||
|
||||
1. Skeleton (текущая фаза) — FastAPI, PostgreSQL, Alembic, React, Docker Compose, healthcheck.
|
||||
2. Google OAuth + subscriptions sync + channels UI.
|
||||
3. Categories CRUD + many-to-many + фильтр по категориям.
|
||||
4. Video sync/feed (uploads playlists, playlistItems, videos, background scheduler).
|
||||
5. YouTube playback (embed).
|
||||
6. MeTube integration (`/add`, download_jobs, Socket.IO consumer, media URL).
|
||||
7. Hardening (retry/recovery, logging, quota handling, tests, README).
|
||||
|
||||
## Структура и соглашения
|
||||
|
||||
- `migrations/` — Alembic, живёт в корне репозитория (не внутри `backend/`), импортирует модели из `backend/app`.
|
||||
- Схема БД добавляется миграциями инкрементально по фазам (см. раздел 11 ТЗ), а не одним махом в Phase 1.
|
||||
- MeTube-специфичные HTTP/Socket.IO вызовы должны быть инкапсулированы в отдельный класс `MeTubeClient` (раздел 36 ТЗ) — не размазывать по backend.
|
||||
- Секреты только через `.env` (см. `.env.example`), никогда не коммитить `.env`, refresh token, client secret.
|
||||
- Backend тесты — `pytest`, лежат в `tests/` в корне. Integration-тесты против Google/MeTube — mocked по умолчанию; реальные вызовы к `http://192.168.8.177:8081` — только opt-in, не в обычном CI.
|
||||
|
||||
## Запуск/проверка
|
||||
|
||||
См. `README.md`. Быстрая проверка: `docker compose up -d --build` и `curl http://localhost:8080/api/health`.
|
||||
Loading…
Add table
Add a link
Reference in a new issue