Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

✂️ YT Clipmaker

Cut exact clips out of YouTube videos and hand them to DaVinci Resolve, edit-ready.

A local web app that wraps yt-dlp and ffmpeg in a frame-accurate trimming UI — no uploads, no ads, no sketchy download sites. Everything stays on your machine.

Python FastAPI yt-dlp FFmpeg Platform i18n Themes


Why

Downloading a whole 40-minute video to use six seconds of it is a waste of time and disk. YT Clipmaker lets you scrub to the exact moment, set in/out points on a zoomable timeline, and pull down only that range — already transcoded to a codec your NLE actually enjoys working with.


Features

🎯 Frame-accurate trimming Step frame by frame with the arrow keys. The real frame rate is read from the video's metadata.
🔍 Zoomable timeline Scroll to zoom, Shift+scroll to pan, drag the overview strip below. Zoom in far enough and the ruler switches to milliseconds.
🚩 Flagged in/out handles IN and OUT markers carry labelled flags, so they are easy to grab — and the playhead always draws on top of them.
🎨 Colour-coded selection The I→O range gets its own colour, clearly separate from the orange playback progress.
Starred export options Pin the resolutions and formats you actually use; they sort to the top of the dropdown and persist.
🎬 Resolve-ready output Export straight to DNxHR HQ or ProRes 422 with PCM audio — no more media-pool surprises.
📋 Segment queue Mark several ranges in one video, then export them all in one go.
📊 Live download queue Progress, speed and ETA per job, with cancel and Show in Explorer.
↩️ Undo / redo Every in/out placement and segment edit is undoable with Ctrl+Z — and redoable with Ctrl+Y.
🎨 Four colour themes Orange or green, each in dark and light. Saved with the rest of your settings.
🕘 History The last 12 videos with thumbnails — individually removable.
⌨️ Keyboard-first Every action has a shortcut. Press ? for the full list.
🌍 English & German Switch in the settings; the choice is saved.

Requirements

Tool Purpose Install
Python 3.10+ Runs the backend python.org
yt-dlp Metadata + section download winget install yt-dlp
FFmpeg Muxing, keyframe cuts, transcoding winget install Gyan.FFmpeg

yt-dlp and ffmpeg are located through your PATH, so keeping them updated through your package manager is all the maintenance they need.

Note — The reveal-in-Explorer and folder-picker features are Windows-specific. Everything else is cross-platform.


Quick start

pip install fastapi "uvicorn[standard]"
python app.py

The app opens at http://127.0.0.1:8321 automatically. On Windows you can also just double-click start.bat.


Usage

  1. Paste a YouTube URL into the top bar — it loads on paste, no click needed. Accepts watch?v=, youtu.be, /shorts/, /live/ and bare 11-character IDs.
  2. Set the range. Press I and O at the playhead, drag the flagged handles, or type a timecode into the fields — 90, 1:30, 00:01:30.500 and 1m30s are all understood.
  3. Pick resolution and format in the sidebar. Star the ones you reach for often.
  4. Export. Watch it in the download queue, then hit Show in Explorer or Copy path and drag the file into your Resolve media pool.

Export formats

Format Codec Use it when
MP4 H.264 + AAC Default. Smallest file, fastest export, no transcode step.
MOV — DNxHR HQ DNxHR HQ + PCM Recommended for Resolve on Windows. Smooth scrubbing, no audio surprises.
MOV — ProRes 422 ProRes 422 + PCM Your project already runs on ProRes.
M4A AAC Audio only.

DNxHR and ProRes are transcoded locally after the download; the source MP4 is kept alongside the result.


Keyboard shortcuts

PlaybackTrimming
Key Action
Space K Play / pause
One frame
Shift + One second
Ctrl + Ten seconds
J L ±5 seconds
Home End Start / end
19 Jump to 10 %…90 %
M Mute
+ Playback speed
Key Action
I O Set in / out point
Shift+I O Jump to in / out
X Reset selection
P Loop the selection
Z Shift+Z Zoom in / out
F Fit view to selection
Shift+F Show whole video
A Save as segment
Enter Export clip
Ctrl+Z / Ctrl+Y Undo / redo

Settings

Stored in settings.json next to app.py, so they survive browser restarts and cache clears.

Setting Default Notes
language en en or de
theme orange-dark orange-dark, orange-light, green-dark, green-light
resolution 1080 Falls back to the next available height per video
container mp4 mp4, dnxhr, prores, audio
output_dir ~/Documents/Video/Clips Pick it through the native folder dialog
prefer_h264 true Avoids VP9/AV1 — Resolve is much happier with H.264
force_keyframes true Exact cut edges instead of up to 10 s of drift
restrict_filenames true ASCII-safe names, avoids media-pool issues
concurrent_fragments 4 Parallel download fragments
fav_resolutions / fav_containers [] Starred options, sorted to the top

Themes

Four schemes, switchable under ⚙ → Colour theme:

Theme Accent Surface
Orange · Dark (default) #ff7a35 near-black
Orange · Light #d95c0c warm white
Green · Dark #1bd96a cool grey
Green · Light #009f52 soft mint white

Every colour in the stylesheet resolves from CSS custom properties on :root, so adding a fifth theme is one override block in style.css plus one entry in the THEMES array in app.js.

Undo / redo

The editor keeps up to 100 snapshots of the in/out points and the segment list. Zoom and playback position are deliberately excluded — undoing a zoom would be noise rather than help. Loading a new video starts a fresh stack, and making an edit after undoing discards the redo branch, exactly as you would expect.

Language

English is the default. Switch to German under ⚙ → Language; the choice is written to settings.json immediately and applies without a reload.


Project layout

.
├── app.py              FastAPI backend, job queue, yt-dlp/ffmpeg orchestration
├── start.bat           Windows launcher
├── settings.json       Generated on first run
└── static/
    ├── index.html      Markup
    ├── style.css       Dark UI theme
    ├── i18n.js         EN/DE strings
    └── app.js          Player, timeline, zoom, export logic

API

Method Endpoint Purpose
GET POST /api/settings Read / patch settings
POST /api/info Video metadata (duration, fps, heights, chapters)
GET POST /api/jobs List / create export jobs
POST /api/jobs/{id}/cancel Cancel a running job
DELETE /api/jobs/{id} Remove a job from the list
DELETE /api/recents/{id} Remove one history entry
DELETE /api/recents Clear the history
POST /api/reveal Open the output folder in Explorer
POST /api/pick-folder Native folder picker
GET /api/health Resolved yt-dlp / ffmpeg paths

Limitations

  • The preview player is a YouTube embed. Frame stepping gets very close, but YouTube seeks to the nearest reachable point internally, so it is not guaranteed to be frame-exact. The download cuts exactly, because --force-keyframes-at-cuts places real keyframes at the cut edges.
  • The resolution picker controls the download, not the preview quality — YouTube decides that itself inside the embed.
  • Videos with embedding disabled show no preview, but still export fine.

Legal

YouTube's Terms of Service only permit downloads through their own offline feature. Use this for content you own, Creative Commons material, or where local law grants you an exception (quotation, private copy). That call is yours to make.


Built with FastAPI · yt-dlp · FFmpeg

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages