All work

Short-video factory on stock footage

Hundreds of stock clips filtered, cut and checked into ready-to-post vertical edits, without opening an editor.

Stack:
  • Python
  • FFmpeg
  • OpenCV
  • YuNet
  • curl_cffi
  • Pexels API
  • Pillow

What it makes

Real videos produced by the system.

  • 456downloaded clips rejected automatically out of about 1,300 checked, 322 of them for faces
  • 340clips left in the working library after a 504-entry blocklist kept by hand
  • 30 / 30renders in the last full batch passing automatic QC

340 stock clips in, 49 vertical edits out

Searches stock libraries, filters every clip on five frames, grades it to 1080×1920 and cuts muted vertical edits by rule, then checks each one automatically.

Tap a block to see what it does.

  • Input
  • AI
  • Logic
  • People
  • Data
  • Output

Input

Stock search

26 curated queries on Pexels and Pixabay: official APIs with a key, else search pages via curl_cffi posing as Chrome. 5 parallel downloads, 120 MB cap.

  • Pexels API
  • Pixabay API
  • curl_cffi

Hands to Visual filters

The problem

Faceless luxury pages post fast-cut vertical edits every day. Cutting them takes minutes; finding clips that fit takes hours, because free stock is full of faces, flat footage, adverts and near-duplicates. A search for 'lamborghini interior' returned a tractor and a video game, but no Lamborghini.

What I built

  1. I built sourcing for Pexels and Pixabay: official APIs when a key is set, otherwise the search pages through a client that impersonates Chrome, because plain requests got 403s.
  2. I check every download on five sampled frames: YuNet face detection, Hasler–Süsstrunk colourfulness, contrast, Laplacian detail and a perceptual hash against every clip already kept.
  3. I normalize each clip to the same 1080×1920, 30 fps H.264 profile with a light colour grade, so a finished edit is joined by stream copy, with no re-encode.
  4. I encoded the edit rules in the assembler: 5–8 cuts of 1.4–2.6 s, at least 65% first-person shots, one car and one watch-or-cash clip per video, the punchiest clip first, no clip reused within five videos.
  5. I added automatic QC (black frames, freezes, scene cuts, first-frame brightness) and review tools that print one contact sheet per search query, so weak queries get dropped and bad clips blocked for good.

The hard part

Relevance. The filters catch faces and dull footage, not a Toyota inside a 'luxury car interior' result. Random spot checks kept missing these, so I switched to auditing the library one search query at a time: that audit dropped seven queries with almost no usable hits and grew the blocklist to 504 clips.

Result

Of about 1,300 downloaded clips, 456 were rejected automatically and 504 more blocked by hand, leaving 340 in the working library. The engine rendered 49 edits of 9.5 to 12 seconds, and the last full batch passed QC 30 out of 30. The project report rates 72–78% of the clips in each video as on brief; the free catalogue is the ceiling.

My role

Solo project. I set the visual brief from viral reference reels, rejected outputs clip by clip with the reasons logged in a playbook, and decided what to block; Claude Code wrote most of the Python, including long unattended runs overnight.