A simple web-based video download service powered by yt-dlp and a SvelteKit frontend.
Video Fetcher provides a simple web UI for downloading videos from URLs with configurable quality options.
Features:
- Add videos via URL and download them directly.
- Supports multiple quality modes:
highest,lowest. - Optional custom filenames or automatic appending of the webpage title.
- Separate views for active and completed downloads.
- Web interface runs on port 3000 by default.
Directory where downloaded files are stored. It is strongly recommended to mount this path as a Docker volume to ensure persistence:
volumes:
- ./downloads:/downloadsPath where the database file is stored. It is strongly recommended to mount this path as a Docker volume:
volumes:
- ./data/downloads.db:/data/downloads.dbDefault number of concurrent downloads.
- Default:
1 - Example:
PUBLIC_DEFAULT_CONCURRENCY=2Maximum number of concurrent downloads selectable in the UI. Affects only the frontend, not the underlying download engine.
- Default:
3 - Example:
PUBLIC_MAX_CONCURRENCY=5- Start the container (Docker or Docker Compose).
- Open the web interface at
http://localhost:3000. - Add video URLs.
- Select quality and optional filename settings.
- Monitor progress in the UI.
Downloaded files will be stored in the configured DOWNLOAD_PATH.
Server-Sent Events (SSE) endpoint for real-time updates on active downloads:
const eventSource = new EventSource('/api/downloads');
eventSource.onmessage = function (event) {
console.log('New message:', event.data);
};Adds multiple video downloads at once. Expects an array of download objects.
Fields:
videoUrl(required): Video URL.fileName(optional): Custom filename (max 200 characters, without extension).appendTitle(optional, default: false): Append webpage title to filename.quality(optional, default:highest): Download quality (highest/lowest).
Example:
curl -X POST http://localhost:3000/api/add \
-H "Content-Type: application/json" \
-d '[
{
"videoUrl": "https://example.com/video1.mp4",
"fileName": "Video1"
},
{
"videoUrl": "https://example.com/video2.mp4",
"fileName": "Video2"
}
]'docker run -d \
--name videofetch \
-p 3000:3000 \
-v /absolute/path/to/downloads:/downloads \
-v /absolute/path/to/data/downloads.db:/data/downloads.db \
blacktiger001/videofetchNotes:
- Use absolute paths for both volumes.
- Check logs:
docker logs videofetch.
services:
videofetch:
image: blacktiger001/videofetch
container_name: videofetch
restart: unless-stopped
ports:
- '3000:3000'
volumes:
- ./downloads:/downloads
- ./data/downloads.db:/data/downloads.dbStart:
docker-compose up -dCheck logs:
docker-compose logs -f videofetch- Project is experimental.
- Unexpected behavior may occur.
- Bug reports and issue submissions are welcome.