Offline YouTube Playlist Downloader & Merger with FastAPI, React, and FFmpeg
Description and use
TubeMerger is a local desktop app that downloads YouTube playlists, normalizes clips, merges them into a single MP4 with chapters, and streams real‑time progress via SSE.
Problem
Web‑based video downloaders limit duration, show pop‑ups, and produce many unsorted files, making offline playlist handling cumbersome.
Outcome
TubeMerger delivers a lightweight, cross‑platform desktop app that downloads YouTube playlists locally, normalizes heterogeneous clips, merges them into a single MP4 with chapters, and provides real‑time progress via SSE—all without cloud dependencies or privacy leaks.
Workflow
- 1. User selects a YouTube playlist URL in the React UI.
- 2. FastAPI backend uses yt‑dlp to download each video clip locally.
- 3. Each clip is passed through an FFmpeg normalization command (scale, pad, set SAR, fps, re‑encode audio to 44.1 kHz AAC).
- 4. Normalized clips are listed in a concat list file.
- 5. FFmpeg concatenates the clips using the concat demuxer, attaching a generated metadata file to inject MP4 chapter atoms.
- 6. The merged MP4 is saved locally and opened in the user’s media player.
- 7. Throughout the process, FastAPI streams progress events via SSE to the React frontend, updating download speed, encoding status, and ETA.
Evidence
TubeMerger uses a decoupled, local‑first stack: React 19 + TypeScript + Vite + Tailwind CSS, PyWebView, FastAPI, yt‑dlp, and FFmpeg.
By enforcing a locked frame rate, consistent canvas size, and uniform audio, the downstream concat demuxer runs seamlessly without audio drops or stuttering.
The FastAPI backend pushes live progress metrics to the React frontend using Server‑Sent Events.
- Record date: 2026-09-16T10:15:38.411Z