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
- You copy photos and videos from your phone into a folder
- A Python CLI clusters them by date and GPS into candidate gigs
- You label each one (artist, venue, date)
- It concatenates all clips from one gig into a single reel, handling mixed portrait/landscape orientations
- 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.