YouTube Downloader & Transcript Extractor
Go to file
2026-08-29 22:23:16 +02:00
.vscode Initial commit — yt-dlf YouTube downloader & transcript extractor 2026-05-16 20:33:23 +02:00
scripts Transcribe videos without subtitles via faster-whisper fallback 2026-08-29 22:20:55 +02:00
src Transcribe videos without subtitles via faster-whisper fallback 2026-08-29 22:20:55 +02:00
static Initial commit — yt-dlf YouTube downloader & transcript extractor 2026-05-16 20:33:23 +02:00
.gitignore Transcribe videos without subtitles via faster-whisper fallback 2026-08-29 22:20:55 +02:00
.npmrc Initial commit — yt-dlf YouTube downloader & transcript extractor 2026-05-16 20:33:23 +02:00
ads-left.html Add login, ad columns and user management 2026-05-16 21:21:48 +02:00
ads-right.html Add login, ad columns and user management 2026-05-16 21:21:48 +02:00
Handoff.md Update Handoff (Whisper fallback) and document CLI transcription in README 2026-08-29 22:23:16 +02:00
INSTALL.md Transcribe videos without subtitles via faster-whisper fallback 2026-08-29 22:20:55 +02:00
jsconfig.json Initial commit — yt-dlf YouTube downloader & transcript extractor 2026-05-16 20:33:23 +02:00
package-lock.json Normalize package-lock.json (npm on Gisela drops libc fields) 2026-08-29 21:36:35 +02:00
package.json Initial commit — yt-dlf YouTube downloader & transcript extractor 2026-05-16 20:33:23 +02:00
README.md Update Handoff (Whisper fallback) and document CLI transcription in README 2026-08-29 22:23:16 +02:00
start.sh Transcribe videos without subtitles via faster-whisper fallback 2026-08-29 22:20:55 +02:00
svelte.config.js Initial commit — yt-dlf YouTube downloader & transcript extractor 2026-05-16 20:33:23 +02:00
vite.config.js Initial commit — yt-dlf YouTube downloader & transcript extractor 2026-05-16 20:33:23 +02:00

yt-dlf

YouTube Downloader & Transcript Extractor — a local web frontend for yt-dlp and ffmpeg.

Features

  • Paste a YouTube URL and download the best available video quality
  • Subtitles downloaded automatically in the video's original language, English, and German (where available)
  • Subtitles converted to clean Markdown (timestamps stripped, text deduplicated and paragraph-wrapped)
  • Videos without subtitles (Instagram, archive.org, …) are transcribed locally via Whisper (faster-whisper, GPU-accelerated) — see INSTALL.md
  • Optional audio extraction to MP3 via ffmpeg
  • Real-time progress log streamed to the browser
  • Files saved to ~/YouTube/<video title>/

Prerequisites

brew install yt-dlp ffmpeg

Node.js 16+ is required for the web app (tested with Node 26).

Project Layout

yt-dlf/
├── scripts/
│   └── subtitle_to_markdown.py   # standalone CLI converter
├── src/
│   ├── lib/
│   │   └── subtitle.js           # JS conversion module (used by web app)
│   └── routes/
│       ├── api/download/
│       │   └── +server.js        # SSE endpoint — runs yt-dlp / ffmpeg
│       ├── +layout.svelte
│       └── +page.svelte          # UI
└── vite.config.js

Running the web app

npm install       # first time only
npm run dev       # starts on http://localhost:5173

To use a custom port:

PORT=8080 npm run dev

Standalone transcription

Transcribe any local video/audio file to WebVTT directly from the terminal (requires the faster-whisper venv, see INSTALL.md):

.venv/bin/python scripts/transcribe.py video.mp4

The language is detected automatically and the subtitle file is written next to the input as video.<lang>.vtt (e.g. video.de.vtt). Model and device can be overridden via environment variables:

WHISPER_MODEL=large-v3 .venv/bin/python scripts/transcribe.py video.mp4   # best quality
WHISPER_DEVICE=cpu     .venv/bin/python scripts/transcribe.py video.mp4   # don't touch the GPU

To get a Markdown transcript, feed the VTT through the subtitle converter below:

./scripts/subtitle_to_markdown.py video.de.vtt

Standalone subtitle converter

Convert a .vtt or .srt subtitle file to Markdown directly from the terminal:

./scripts/subtitle_to_markdown.py video.en.vtt
./scripts/subtitle_to_markdown.py video.en.vtt output.md

Output is saved next to the input file (same name, .md extension) unless a second argument is given.