No description
Find a file
vrubelroman b1faeb3729 Autoplay video when opening the video page
Add autoPlay/playsInline to the local video element, autoplay: 1 to
the YouTube IFrame API playerVars, and ?autoplay=1 to the plain-iframe
fallback. Best-effort: browsers may block unmuted autoplay, so the
play button stays as fallback.
2026-09-25 12:06:11 +00:00
.opencode/agent Remove AGENT_TEAM.md, add project baseline analytics 2026-09-17 21:42:30 +00:00
analytics Autoplay video when opening the video page 2026-09-25 12:06:11 +00:00
backend Add channels view toggle on the main page 2026-09-18 12:13:32 +00:00
frontend Autoplay video when opening the video page 2026-09-25 12:06:11 +00:00
migrations Channel features: subscribers, new-videos badges, activity-driven sync 2026-09-17 21:07:33 +00:00
tests Add channels view toggle on the main page 2026-09-18 12:13:32 +00:00
.dockerignore Implement Phases 1-5: skeleton, OAuth, categories, video sync/feed, playback 2026-09-16 18:44:30 +00:00
.env.example Expand .env.example with per-field comments and setup hints 2026-09-17 21:11:48 +00:00
.gitignore Implement Phases 1-5: skeleton, OAuth, categories, video sync/feed, playback 2026-09-16 18:44:30 +00:00
AGENTS.md Switch agent team to opencode, drop Codex/Herdr multi-agent setup 2026-09-16 23:08:21 +00:00
alembic.ini Implement Phases 1-5: skeleton, OAuth, categories, video sync/feed, playback 2026-09-16 18:44:30 +00:00
compose.yml Implement Phases 1-5: skeleton, OAuth, categories, video sync/feed, playback 2026-09-16 18:44:30 +00:00
Dockerfile Fix review findings and remove Uncategorized from sidebar 2026-09-17 17:22:22 +00:00
entrypoint.sh Implement Phases 1-5: skeleton, OAuth, categories, video sync/feed, playback 2026-09-16 18:44:30 +00:00
opencode.json Switch agent team to opencode, drop Codex/Herdr multi-agent setup 2026-09-16 23:08:21 +00:00
pyproject.toml Implement Phase 6: MeTube download integration 2026-09-16 18:56:17 +00:00
README.md Add channels view toggle on the main page 2026-09-18 12:13:32 +00:00

MyYouTube

Персональный YouTube-клиент с категориями подписок и интеграцией с существующим MeTube. Работа агентской команды (opencode) описана в секции «Агентская команда (opencode)» ниже; роли агентов — в .opencode/agent/.

Текущий статус: функционально готово (основные этапы 1–6 и доработки по итогам тестирования). Развёрнуто и вручную протестировано на тестовом окружении (testmyyoutube.vrubel.xyz → hermesVM 192.168.8.173 → MeTube на mediaVM 192.168.8.177).

Что сделано

  • Skeleton, Google OAuth (single-user allow-list), sync подписок/видео (APScheduler), категории (CRUD + many-to-many), лента с курсорной пагинацией, YouTube-плеер, полная MeTube-интеграция (download/delete, Socket.IO live-статусы, recovery после рестарта).
  • Режим «Каналы» на главной (?view=channels): переключатель «Лента | Каналы», список подписанных каналов по свежести последнего видео с тремя последними роликами в строке; фильтр категорий из сайдбара действует в обоих режимах.
  • Раздел «На сервере» — скачанные видео; /saved перенаправляет на /local.
  • Тёмный адаптивный интерфейс: общая навигация, категории с постоянными URL, поиск по названиям видео и каналов, мобильное меню.
  • Отписанные каналы скрываются из списка каналов.
  • Реальная отписка от канала на YouTube (subscriptions.delete) реализована по запросу пользователя сверх исходного MVP. Из-за этого OAuth scope расширен с youtube.readonly до полного youtube (read/write) — см. backend/app/services/google_oauth.py.
  • Удаление скачанного видео с сервера (DELETE /api/videos/{id}/download) — тоже сверх исходного MVP-скоупа, добавлено по запросу.

Что осталось / сознательно отложено

  • Дополнительные идеи после MVP пока не реализованы: PWA, watch later, Shorts-фильтр, SponsorBlock и т.д.
  • Hardening (retry/recovery, тесты) выполнялся по факту находок в live-тестировании, а не отдельным проходом — см. git log для конкретных багфиксов (flapping статусов загрузки, неверный id в MeTube /delete, OAuth scope mismatch).

Стек

  • 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)

  1. Скопируй .env.example в .env и заполни значения (Google OAuth credentials, секреты, MeTube URLs).

  2. Собери и запусти:

    docker compose up -d --build
    
  3. Проверь health:

    curl http://localhost:8080/api/health
    

Миграции Alembic применяются автоматически при старте контейнера app (см. entrypoint.sh).

Локальная разработка

Агентская команда (opencode)

Работа идёт в одной сессии opencode: она стартует агентом orchestrator (default_agent в opencode.json). Порядок работы: orchestrator → analyst (аналитика/README) → coder → reviewer → tester. Orchestrator сам декомпозирует задачу и вызывает субагентов через Task tool: analyst (до Coder'а фиксирует задачу в analytics/*.md и при необходимости актуализирует README), coder (единственный меняет код продукта), reviewer (read-only review, edit: deny) и tester (проверки без правок, edit: deny). Роли описаны в .opencode/agent/. Аналитика задач ведётся в analytics/ (см. analytics/README.md).

opencode

Задачу пиши обычным сообщением: Orchestrator передаст её сначала Analyst'у (аналитика и README), затем Coder'у, соберёт review и QA, повторит цикл при находках и вернёт финальный отчёт. Вручную писать субагентам не нужно.

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)
├── analytics/    # аналитика задач агентской команды
├── Dockerfile
├── compose.yml
├── .env / .env.example
└── .opencode/      # агенты команды (orchestrator/analyst/coder/reviewer/tester)

Секреты

.env в .gitignore, не коммитится. Обязательные секреты: APP_SECRET_KEY, TOKEN_ENCRYPTION_KEY, GOOGLE_CLIENT_SECRET, POSTGRES_PASSWORD.