alexta69 / metube
git clone https://github.com/alexta69/metube.git
2026.10.20 · 2d ago
Self-hosted video downloader for YouTube and other sites (web UI for yt-dlp)
+13
stars, 24h · #2,781
+~68
stars, 7 days · #3,078
+~290
stars, 30 days · #2,806
15k
★ total · +0% this week
1.1k
forks · 11 open issues
Star history (as recorded here)
LanguagePython
LicenseAGPL-3.0
Created2019-11-29 (6y ago)
Last push1d ago
Watchers52
OwnerUser
GitHub topics
Links
- GitHub: github.com/alexta69/metube
- Releases · Issues · Hacker News mentions
README excerpt
# MeTube MeTube is a self-hosted web UI for yt-dlp. Paste a link from YouTube or hundreds of other sites, and it downloads to your server: * Video, audio, subtitles and thumbnails — from single videos, whole playlists or entire channels. * Subscriptions to channels and playlists, which queue new uploads as they appear. * Per-download choices of quality, format and folder, plus server-wide yt-dlp options and presets. 📖 **Guides, recipes and a troubleshooting FAQ live in the wiki** — many feature requests are already a recipe there, so check it before filing one. ## Quick start [code] Or with Docker Compose: [code] Then open `http:// :8081` in your browser. Images are multi-arch (amd64/arm64), and also published on Docker Hub as `alexta69/metube`. ## Configuration MeTube is configured with environment variables: `-e NAME=value` on the `docker run` command line, or the `environment:` section in Compose. Defaults are the Docker image's; outside Docker, the directories default to the working directory. ### Runtime and permissions | Variable | Default | Description | | :--- | :--- | :--- | | `PUID` / `PGID` | `1000` | User and group MeTube runs as and writes files with. Legacy `UID`/`GID` also work. | | `UMASK` | `022` | Umask for the files MeTube creates. | | `CHOWN_DIRS` | `true` | Make `PUID:PGID` the owner of the download, state and temp directories at startup. With `false`, MeTube's user must already have access. | | `LOGLEVEL` | `INFO` | `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL` or `NONE`. | | `ENABLE_ACCESSLOG` | `false` | Log every HTTP request. | | `DEFAULT_THEME` | `auto` | UI theme: `light`, `dark`, or `auto` to follow the system. | ### Downloads | Variable | Default | Description | | :--- | :--- | :--- | | `MAX_CONCURRENT_DOWNLOADS` | `3` | Downloads that run at once; the rest wait their turn. | | `DEFAULT_OPTION_PLAYLIST_ITEM_LIMIT` | `0` | Default for the **Items Limit** field: how many entries of a playlist or channel to download (`0` = all). | | `CLEAR_COMPLETED_AFTER` | `0` | Seconds before finished and failed downloads leave the Completed list (`0` = never). | | `DELETE_FILE_ON_TRASHCAN` | `false` | Also delete the file from disk when its entry is removed from Completed. `ask` prompts each time. | | `SUBSCRIPTION_DEFAULT_CHECK_INTERVAL` | `60` | Default minutes between checks of a subscription. | | `SUBSCRIPTION_SCAN_PLAYLIST_END` | `50` | Newest entries fetched each time a subscription is checked. | | `SUBSCRIPTION_MAX_SEEN_IDS` | `50000` | Video IDs remembered per subscription, to bound the state file's size. | ### Directories | Variable | Default | Description | | :--- | :--- | :--- | | `DOWNLOAD_DIR` | `/downloads` | Where downloads are saved. | | `AUDIO_DOWNLOAD_DIR` | same as `DOWNLOAD_DIR` | Where audio-only downloads are saved, to keep them apart from video. | | `TEMP_DIR` | `/downloads` | Where files are written while downloading. An SSD or `tmpfs` is faster, but on a RAM disk interrupted downloads can't resume. | |