powell.at

Get your gig videos from phone to YouTube with Claude Code

Gaz asked me how to get concert videos off his iPhone and onto YouTube without it being a massive ball-ache. He’s got hundreds of clips from years of shows, sitting around and not being used. He wanted it as automated as possible: dump from the phone, label the gigs, let the machine do the rest.

A combo of another side-project I’ve been working on (Trev’s Tapes, a story for another day) and him asking prompted me to write the pipeline for my own gig log, the one powering the site you’re reading now. I pull down files from Google photos or off my Pixel directly, they get clustered by date and GPS, clips from the same gig get concatenated into a single reel with chapter markers, and it uploads to YouTube with metadata. The whole thing is Python, ffmpeg, and the YouTube Data API.

So I extracted the video-upload part into a standalone package, just the phone-to-YouTube pipeline, adapted for iPhone + Windows (apparently now I’m Mac, And Gary’s PC. If you’re old enough to remember that.)

What it does

  1. You copy photos and videos from your phone into a folder
  2. A Python CLI clusters them by date and GPS into candidate gigs
  3. You label each one (artist, venue, date)
  4. It concatenates all clips from one gig into a single reel, handling mixed portrait/landscape orientations
  5. It uploads to your YouTube channel with title, description, tags, and automatic chapter markers

What you need

  • Python 3.11+
  • ffmpeg
  • A Google Cloud project with the YouTube Data API
  • A verified YouTube channel (this is the critical step — do it first, see the lessons file)
  • Claude Code (optional, but the package includes a CLAUDE.md system prompt that walks you through everything interactively)

Download

gig-video-uploader.zip (10 KB)

Unzip, open the folder in Claude Code, and let it drive. Or read SETUP.md if you want to go it alone.

Lessons learned

The package includes a LESSONS.md with everything that made me scratch my head or demanded debugging when I built the original pipeline. The highlights:

Verify your YouTube channel before touching the API. This was the biggie, had me chasing my tail for a while. Unverified channels have a hard upload cap (~15 videos). The error message (uploadLimitExceeded) looks like an API quota issue but isn’t. I spent a while futzing with Google Cloud OAuth audits before discovering the fix was a 30-second scan of my ID to verify my YouTube account. Do it first.

EXIF timestamps live in ExifIFD, not the main IFD. The main DateTime tag is often the edit time, not the capture time. Your clustering will be wrong if you read the wrong one.

Use ffmpeg’s concat filter, not the concat demuxer. Phone clips have different resolutions and codecs. The filter handles mixed inputs by scaling and padding to a common canvas; the demuxer chokes on mismatches.

YouTube chapter markers are free. Put timestamps in your video description starting from 00:00 and YouTube creates chapter markers automatically. Compute them from individual clip durations before concatenation.

The full list is in the download, probably helps to read it before you start.

Source

The package is extracted from the pipeline powering this site.