The button disabled its own status polling once a download reached a terminal state and fell back to the video prop it was first rendered with. On the video detail page that prop only refreshes on a full page reload (only ['feed'] was invalidated, not ['video', id]), so the button showed "Скачать" again right after a real completion until the user refreshed. Keep the polling query enabled permanently once a download starts tracking (refetchInterval alone already stops the ticking on a terminal status) and use its cache as the source of truth instead of the prop, so the button reflects the fetched status directly rather than depending on an unrelated query being invalidated and refetched in time. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|---|---|---|
| backend | ||
| frontend | ||
| migrations | ||
| tests | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| AGENTS.md | ||
| alembic.ini | ||
| compose.yml | ||
| Dockerfile | ||
| entrypoint.sh | ||
| pyproject.toml | ||
| README.md | ||
| UI_UX_spec.md | ||
| youtube_categories_metube_TZ.md | ||
MyYouTube
Персональный YouTube-клиент с категориями подписок и интеграцией с существующим MeTube.
Полное техническое задание: youtube_categories_metube_TZ.md.
Текущий статус: Phase 1 — skeleton (FastAPI backend, PostgreSQL, Alembic, React frontend, Docker Compose, healthcheck).
Стек
- Backend: Python 3.13, FastAPI, SQLAlchemy 2.x, Alembic, Pydantic Settings
- Frontend: React, TypeScript, Vite, React Router, TanStack Query
- DB: PostgreSQL 16
- Deployment: Docker Compose
Запуск в production (Docker Compose)
-
Скопируй
.env.exampleв.envи заполни значения (Google OAuth credentials, секреты, MeTube URLs). -
Собери и запусти:
docker compose up -d --build -
Проверь health:
curl http://localhost:8080/api/health
Миграции Alembic применяются автоматически при старте контейнера app (см. entrypoint.sh).
Локальная разработка
Backend
cd backend
uv venv .venv
uv pip install -p .venv -r requirements-dev.txt
source .venv/bin/activate
cd ..
DATABASE_URL=postgresql+psycopg://youtube_app:password@localhost:5432/youtube_app \
APP_SECRET_KEY=dev APP_SECRET_KEY=dev TOKEN_ENCRYPTION_KEY=dev \
alembic upgrade head
uvicorn app.main:app --reload --app-dir backend --port 8080
Тесты:
backend/.venv/bin/python -m pytest tests/ -v
Frontend
cd frontend
npm install
npm run dev
Dev-сервер Vite проксирует /api/* на http://127.0.0.1:8080 (см. vite.config.ts).
Миграции
alembic revision -m "описание"
alembic upgrade head
alembic.ini и папка migrations/ находятся в корне проекта и подключают модели из backend/app.
Структура проекта
myyoutube/
├── backend/ # FastAPI приложение
├── frontend/ # React SPA
├── migrations/ # Alembic migrations
├── tests/ # backend tests (pytest)
├── Dockerfile
├── compose.yml
├── .env / .env.example
└── youtube_categories_metube_TZ.md
Секреты
.env в .gitignore, не коммитится. Обязательные секреты: APP_SECRET_KEY, TOKEN_ENCRYPTION_KEY, GOOGLE_CLIENT_SECRET, POSTGRES_PASSWORD.