A self-hosted, multi-platform video, audio, and subtitle downloader.
3.6K
A self-hosted, multi-platform video, audio, and subtitle downloader.
Frame Video Studio brings X / Twitter, YouTube, and Bilibili into one clean, responsive interface. Paste a media URL, inspect available formats, and download the content you want to keep. Powered by yt-dlp, FastAPI, FFmpeg, Vue 3, and Nginx.
GitHub Repository · Documentation
Frame Video Studio is published as two images. The same API image is used to run a separate background worker.
| Image | Role |
|---|---|
hythzx/video-downloader-web | Vue 3 frontend served by Nginx |
hythzx/video-downloader-api | FastAPI backend, yt-dlp/FFmpeg processing, and background Worker |
Deploy all three services: Web + API + Worker. The existing Docker image names are intentionally retained for compatibility, even though the GitHub repository is now called Frame-Video-Studio.
| Platform | Video | Audio | Subtitles |
|---|---|---|---|
| X / Twitter | Available MP4 formats | MP3 / M4A if an audio stream is available | If provided by the platform |
| YouTube | Resolution selection; FFmpeg merging when needed | MP3 / M4A | Human and automatic captions if available |
| Bilibili | Resolution selection; FFmpeg merging when needed | MP3 / M4A | If provided by the platform |
Actual availability depends on the media, platform permissions, your region, login state, and yt-dlp extractor compatibility. DRM-protected content is not supported.
Recommended: Use the current Compose configuration from the repository. It contains the required web, api, and worker services and a shared persistent volume.
git clone https://github.com/hythzx/Frame-Video-Studio.git
cd Frame-Video-Studio
cp .env.example .env
docker compose pull
docker compose up -d
Open http://127.0.0.1:8080 on the Docker host.
The Web UI binds to localhost only by default. For access from another device, update BIND_ADDRESS and configure HTTPS and authentication using a trusted reverse proxy.
Check services and logs:
docker compose ps
docker compose logs -f api worker web
Update to current images:
git pull origin main
docker compose pull
docker compose up -d
Important: Use the repository's main
compose.yaml. The legacycompose.deploy.yamldoes not include the background Worker or persistent data volume and is not suitable for the current asynchronous video workflow.
Edit the server-local .env file as needed.
| Variable | Default | Description |
|---|---|---|
BIND_ADDRESS | 127.0.0.1 | Web interface bind address |
PORT | 8080 | Web interface port |
MAX_DURATION_SECONDS | 3600 | Maximum accepted video duration |
MAX_DOWNLOAD_MB | 1024 | Configured maximum download size |
TWITTER_COOKIES | Empty | Optional X login cookies; required for private bookmarks |
BILI_COOKIES | Empty | Optional Bilibili login cookies |
FRAME_ACCESS_TOKEN | Empty | Separate secret (at least 20 characters) protecting the private X bookmarks endpoints |
For private X bookmarks, configure your own account's auth_token and ct0 under TWITTER_COOKIES and generate a separate Frame access token locally:
python -c "import secrets; print(secrets.token_urlsafe(32))"
Store credentials only in the server's .env file. Never commit credentials or share them in public logs or screenshots. The X bookmarks integration uses unofficial web endpoints, may be rate-limited, and can stop working when X changes its website.
Browser
│
▼
Web (Vue 3 + Nginx)
│
▼
API (FastAPI + yt-dlp)
├── Media extraction and recent history
├── Audio and subtitle downloads
└── Video download task → SQLite
│
▼
Worker (yt-dlp + FFmpeg)
│
▼
Persistent /data volume
│
▼
Completed MP4 download
The API and Worker share the frame-data Docker volume. Keep that volume when updating containers; removing it deletes application data and stored downloads.
FRAME_ACCESS_TOKEN protects only private bookmark endpoints, not the entire site. Add authentication, HTTPS, and appropriate rate controls before exposing it on another network.| Method | Endpoint | Description |
|---|---|---|
GET | /api/health | Health check |
POST | /api/extract | Media metadata, available formats, audio and captions |
POST | /api/tasks | Create a background video download task |
GET | /api/tasks/{id} | Query task status |
GET | /api/tasks/{id}/file | Download a completed MP4 |
GET | /api/history | Recent extraction history |
POST | /api/audio | Download MP3 / M4A |
POST | /api/subtitle | Download SRT / VTT |
GET | /api/bookmarks | Optional private X bookmarks (access token required) |
For details, see the project README.
linux/amd64 and linux/arm64latest from the main branch, commit SHA tags, and semantic version tags for v* releasesPlease review the repository for licensing details. Download only content that you have permission to access and save.
Frame Video Studio — Save media from the platforms you love, in one place.
Content type
Image
Digest
sha256:1c2922901…
Size
222.7 MB
Last updated
3 days ago
docker pull hythzx/video-downloader-api