No description
Find a file
xpltd 1e9014f569 Error log: failed download diagnostics for admin
Backend:
- New error_log table: url, domain, error, format_id, media_type,
  session_id, created_at
- log_download_error() called when yt-dlp throws during download
- GET /admin/errors returns recent entries (limit 200)
- DELETE /admin/errors clears all entries
- Manual purge also clears error log
- Domain extracted from URL via urlparse for grouping

Frontend:
- New 'Errors' tab in admin panel (Sessions, Storage, Errors, Settings)
- Each error entry shows: domain, timestamp, full URL, error message,
  format/media type metadata
- Red left border + error-colored message for visual scanning
- Clear Log button to wipe entries
- Empty state: 'No errors logged.'

Error entries contain enough context (full URL, error message, domain,
format, media type) to paste into an LLM for domain-specific debugging.
2026-03-19 06:34:08 -05:00
.bg-shell chore(M001/S01/T02): auto-commit after execute-task 2026-03-17 22:41:58 -05:00
.claude GSD: S02 complete — SSE transport, session system, health/config endpoints 2026-03-18 18:37:35 -05:00
.github/workflows M001: media.rip() v1.0 — complete application 2026-03-18 20:00:17 -05:00
.gsd M002/S04: UX review fixes — round 1 2026-03-18 23:01:36 -05:00
.planning docs: complete project research 2026-03-17 21:36:25 -05:00
backend Error log: failed download diagnostics for admin 2026-03-19 06:34:08 -05:00
frontend Error log: failed download diagnostics for admin 2026-03-19 06:34:08 -05:00
.dockerignore M001: media.rip() v1.0 — complete application 2026-03-18 20:00:17 -05:00
.env.example M001: media.rip() v1.0 — complete application 2026-03-18 20:00:17 -05:00
.gitignore chore: init gsd 2026-03-17 21:43:36 -05:00
Caddyfile M001: media.rip() v1.0 — complete application 2026-03-18 20:00:17 -05:00
docker-compose.example.yml M001: media.rip() v1.0 — complete application 2026-03-18 20:00:17 -05:00
docker-compose.yml M001: media.rip() v1.0 — complete application 2026-03-18 20:00:17 -05:00
Dockerfile M001: media.rip() v1.0 — complete application 2026-03-18 20:00:17 -05:00
PROJECT.md chore: checkpoint v1 GSD research artifacts before migrating to GSDv2 2026-03-17 21:40:37 -05:00
README.md M001: media.rip() v1.0 — complete application 2026-03-18 20:00:17 -05:00

media.rip()

A self-hostable yt-dlp web frontend. Paste a URL, pick quality, download — with session isolation, real-time progress, and a cyberpunk default theme.

License

Features

  • Paste & download — Any URL yt-dlp supports. Format picker with live quality extraction.
  • Real-time progress — Server-Sent Events stream download progress to the browser instantly.
  • Session isolation — Each browser gets its own download queue. No cross-talk.
  • Three built-in themes — Cyberpunk (default), Dark, Light. Switch in the header.
  • Custom themes — Drop a CSS file into /themes volume. No rebuild needed.
  • Admin panel — Session management, storage info, manual purge. Protected by HTTP Basic + bcrypt.
  • Zero telemetry — No outbound requests. Your downloads are your business.
  • Mobile-friendly — Responsive layout with bottom tabs on small screens.

Quickstart

docker compose up

Open http://localhost:8080 and paste a URL.

Downloads are saved to ./downloads/.

Configuration

All settings have sensible defaults. Override via environment variables or config.yaml:

Variable Default Description
MEDIARIP__SERVER__PORT 8000 Internal server port
MEDIARIP__DOWNLOADS__OUTPUT_DIR /downloads Where files are saved
MEDIARIP__DOWNLOADS__MAX_CONCURRENT 3 Maximum parallel downloads
MEDIARIP__SESSION__MODE isolated isolated, shared, or open
MEDIARIP__SESSION__TIMEOUT_HOURS 72 Session cookie lifetime
MEDIARIP__ADMIN__ENABLED false Enable admin panel
MEDIARIP__ADMIN__USERNAME admin Admin username
MEDIARIP__ADMIN__PASSWORD_HASH (empty) Bcrypt hash of admin password
MEDIARIP__PURGE__ENABLED false Enable auto-purge of old downloads
MEDIARIP__PURGE__MAX_AGE_HOURS 168 Delete downloads older than this
MEDIARIP__THEMES_DIR /themes Custom themes directory

Session Modes

  • isolated (default): Each browser session has its own private queue.
  • shared: All sessions see all downloads. Good for household/team use.
  • open: No session tracking at all.

Custom Themes

  1. Create a folder in your themes volume: ./themes/my-theme/
  2. Add metadata.json:
    { "name": "My Theme", "author": "You", "description": "A cool theme" }
    
  3. Add theme.css with CSS variable overrides:
    [data-theme="my-theme"] {
      --color-bg: #1a1a2e;
      --color-accent: #e94560;
      /* See base.css for all 50+ tokens */
    }
    
  4. Restart the container. Your theme appears in the picker.

See the built-in themes in frontend/src/themes/ for fully commented examples.

Secure Deployment

For production with TLS:

cp docker-compose.example.yml docker-compose.yml
cp .env.example .env
# Edit .env with your domain and admin password hash
docker compose up -d

This uses Caddy as a reverse proxy with automatic Let's Encrypt TLS.

Generate an admin password hash:

python -c "import bcrypt; print(bcrypt.hashpw(b'YOUR_PASSWORD', bcrypt.gensalt()).decode())"

Development

Backend

cd backend
python -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/pip install pytest pytest-asyncio pytest-anyio httpx ruff
.venv/bin/python -m pytest tests/ -v

Frontend

cd frontend
npm install
npm run dev       # Dev server with hot reload
npx vitest run    # Run tests
npm run build     # Production build

API

Endpoint Method Description
/api/health GET Health check with version + uptime
/api/config/public GET Public configuration
/api/downloads GET List downloads for current session
/api/downloads POST Start a new download
/api/downloads/{id} DELETE Cancel/remove a download
/api/formats GET Extract available formats for a URL
/api/events GET SSE stream for real-time progress
/api/cookies POST Upload cookies.txt for authenticated downloads
/api/themes GET List available custom themes
/api/admin/* GET/POST Admin endpoints (requires auth)

Architecture

  • Backend: Python 3.12 + FastAPI + aiosqlite + yt-dlp
  • Frontend: Vue 3 + TypeScript + Pinia + Vite
  • Transport: Server-Sent Events for real-time progress
  • Database: SQLite with WAL mode
  • Styling: CSS custom properties (no Tailwind, no component library)

License

MIT