If you run a YouTube channel with more than a handful of videos, some chores are
quietly miserable. Appending the same footer to every description. Renaming
titles to a new convention. Dropping a pinned-style comment on your top videos.
YouTube Studio makes you do all of this one video at a time.
So you write a script. And now you have a worse problem: a bulk videos.update
loop will happily overwrite dozens of descriptions if you get one line wrong, and
there's no undo. I wanted the bulk part without that sinking feeling.
That's the whole idea behind ytmeta:
every write is a dry-run until you explicitly say otherwise.
npm install -g ytmeta
# preview exactly what would change (reads the API, changes nothing)
ytmeta titles titles.json
# apply it once you're happy
ytmeta titles titles.json --execute
A few decisions follow from that:
- every write command previews first; nothing changes without
--execute - uploads default to
private, so nothing goes public by accident - deletes need a typed confirmation phrase, even with
--execute - your
client_secret.jsonandtoken.jsonstay local and are never committed
A real example I use a lot — add a footer to a bunch of videos:
[
{ "id": "VIDEO_ID_1", "append": "\n—\nSubscribe: https://youtube.com/@you" },
{ "id": "VIDEO_ID_2", "append": "\n—\nSubscribe: https://youtube.com/@you" }
]
ytmeta descriptions data.json --execute
Each entry can append, prepend, or fully replace the description.
The rest of the commands: login (OAuth loopback), titles, comments,
watermark, upload, and delete.
It's a thin wrapper over the YouTube Data API — Node 18+, tested with the
built-in node:test, CI on Node 18/20/22, MIT. If it's useful to you I'd love to
hear what to add next.
Top comments (0)