| Pro Video Suite (Downloader + Editor) |
|---|
![]() |
Welcome to the Pro Video Suite! This is a small, all-in-one desktop app that lets you download videos from YouTube (and other supported sites) and edit them right away.
Whether you're just looking to save a video for offline viewing, trim a long clip, or extract the audio as an MP3, this app has you covered.
Platforms: built and tested primarily on macOS and Linux. Windows is still supported.
- Download Videos: Paste a video link and the app downloads it at high quality.
- Trim & Cut: Open any video file and keep only the part you want.
- Convert Formats: Save your edit as an MP4, or extract just the audio as MP3/M4A.
- Control Quality: Target an exact file size, or let the app pick the best quality.
You need three things installed and on your PATH:
- Python 3.9+ — the language the app is built with.
- FFmpeg (
ffmpeg+ffprobe) — trims, converts, and inspects videos. - yt-dlp — downloads videos.
Install the two external tools:
- macOS (Homebrew):
brew install ffmpeg yt-dlp
- Linux (Debian/Ubuntu):
sudo apt install ffmpeg pipx install yt-dlp # or: sudo apt install yt-dlp - Windows (winget):
winget install ffmpeg yt-dlp
The app checks for these on startup and warns you (without crashing) if any are missing.
From the project folder:
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e .
pro-video-suite # launches the apppro-video-suite is installed as a command. You can also run it as a module, or with the
convenience launcher script:
python -m pro_video_suite
python run.py # simplest — run from the project root inside the venvLaunch it any time (no venv activation needed):
~/Pro-Video-Suite/.venv/bin/pro-video-suiteThis is the most reliable way to start the app. Tip: make it a one-word shortcut by adding
alias pvs='~/Pro-Video-Suite/.venv/bin/pro-video-suite' to your ~/.zshrc.
- Downloading: On the 1. Download tab, paste a YouTube URL and click
DOWNLOAD & LOAD. Files save to your Downloads folder by default — change it with the
Save to → Choose… button. Downloads are forced to H.264/AAC so they always preview, and
when finished the video opens automatically in the editor. There's also an Open a Video
File to Edit button here if you just want to edit a file you already have.
- Age-restricted or private videos need your YouTube login. Tick Use browser cookies and pick a browser you're signed in to YouTube with — yt-dlp will use that session (Waterfox is supported too; it's read via its Firefox-format profile). If a download fails, the log now shows the real reason (e.g. "Sign in to confirm your age").
- Editing: On the 2. Editor tab:
- Click 📂 Open Video File (top) to load a local file, or arrive here from a download.
- Use the timeline slider to find the part you want.
- Click [ Set IN ] to mark the start, [ Set OUT ] to mark the end.
- Configuration and Log start collapsed to give the preview room — click their headers to expand them.
- Pick your output format (Video or Audio Only) and click EXPORT.
macOS's built-in video playback can't decode some codecs — AV1 most commonly (YouTube
uses it), but others too. When you open such a file, the app automatically builds a small,
temporary H.264 preview in ~/.pro-video-suite/ so you can still see and scrub it. This
is detected automatically — if the preview renders no frames, the app switches to a proxy — so
it isn't limited to a fixed list of codecs. Your original file is never modified, EXPORT
always uses the original (full quality), and only one temporary preview ever exists (it's
overwritten and deleted automatically). No stray converted copies.
- GUI: PySide6 (Qt for Python). Playback uses
QMediaPlayer+ aQVideoSink; frames are painted by a customVideoDisplaywidget (see below for why we avoidQVideoWidget). - Downloading:
subprocesscalls toyt-dlp(with a lazily-downloaded Deno JS runtime). - Media processing:
subprocesscalls toffmpegandffprobe.
src/pro_video_suite/
__init__.py # version / app name
__main__.py # entry point: QApplication, theme, icon, log filtering
app.py # VideoEditorApp — the main window and all editor logic
workers.py # QThreads: DownloadWorker (yt-dlp), ConversionWorker + ProxyWorker (ffmpeg)
widgets.py # VideoDisplay (sink painter), RangeBar (trim bar), CollapsibleSection
platform_utils.py # OS-specific helpers: asset paths, tool discovery, Deno download
assets/ # app icons (.icns / .ico / .png / .svg)
tests/
test_smoke.py # headless construction test (Qt offscreen)
ProVideoSuite.spec # cross-platform PyInstaller build recipe
All OS-specific behavior is isolated in platform_utils.py, so the UI and worker code
stay platform-agnostic. Notable cross-platform details:
- Video preview paints
QVideoSinkframes into a plain widget (VideoDisplay) instead of usingQVideoWidget, whose native macOS layer overpaints adjacent controls and ignores size constraints. - Preview proxy for undecodable formats: known-bad codecs (
PREVIEW_UNSUPPORTED_CODECS, e.g. AV1) proxy immediately; anything else is detected at runtime —VideoDisplaycounts rendered frames and_verify_previewfalls back toProxyWorkerif a playing file renders zero frames. Export always uses the original file. - Worker threads (download / export / proxy) are all stopped in
closeEvent, so quitting mid-task doesn't abort the process. - Downloads force H.264/AAC via a yt-dlp format filter (
bv*[vcodec^=avc1]+...), not a soft-Ssort, so previews always work. - Monospace fonts use a fallback stack (
Menlo, Monaco, Consolas, …) that resolves on every OS instead of relying on a Windows-only font. - The Deno runtime and the preview proxy are cached under
~/.pro-video-suite/, never inside the install dir. - Windows-only encoders (NVENC/AMF) and console-hiding are gated behind OS checks.
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]" # app + pytest + pyinstallerTests run headless via Qt's offscreen platform plugin (no display needed):
QT_QPA_PLATFORM=offscreen pytest -vA single PyInstaller spec covers all three platforms:
pip install -e ".[dev]" # if you haven't already (installs pyinstaller)
pyinstaller --noconfirm ProVideoSuite.spec- macOS →
dist/Pro Video Suite.app(onedir bundle) — drag it into/Applications:cp -R "dist/Pro Video Suite.app" /Applications/ - Linux →
dist/ProVideoSuite(single binary) - Windows →
dist/ProVideoSuite.exe(single binary)
The app still needs ffmpeg and yt-dlp installed on the machine (it shells out to them).
When launched from Finder/Dock, macOS gives apps a minimal PATH; the app adds the usual
Homebrew locations (/opt/homebrew/bin, /usr/local/bin) at startup so it can still find
them. A locally-built .app isn't code-signed — if Gatekeeper blocks it, right-click →
Open once to approve it.
If the
.appwon't open, just run it from the terminal instead — that's the most reliable path:~/Pro-Video-Suite/.venv/bin/pro-video-suite.
CI workflows in .github/workflows/ build each platform on demand
(build-macos.yml, build-linux.yml, build-windows.yml) and run the tests on every
push/PR (test.yml).
- More encoders: add hardware encoders in
VideoEditorApp.populate_encoders. - Advanced FFmpeg filters: extend the
-vfchain inVideoEditorApp.start_encoding. - Batch/queue: the app processes one job at a time; a
queue.Queuewould enable batches.
