YouTube Studio Batch Upload
Operating Rules
- Use the browser/computer-use skill for live YouTube Studio or Airtable UI work. Call
get_app_state before direct UI actions in a turn.
- Treat upload as a batch waterfall: download/source recovery, filename staging, metadata staging, upload, per-video titling/playlist/visibility/save, verification, ledger.
- Do not include source video URLs in YouTube descriptions. Strip Drive, Loom, WeTransfer, and source YouTube links from final descriptions unless the user explicitly asks to publish those links.
- Use the full submitted talk abstract in the description by default; do not compress it to a teaser unless the user asks for short copy.
- Do not publish internal Airtable fields such as
Additional Notes, reviewer notes, source status, or operational comments unless the user explicitly marks them as public copy.
- Always select the target playlist before advancing to visibility.
- Always choose
Unlisted and click Save before opening or editing the next upload.
- If YouTube blocks saving because SD processing is not finished, wait on the modal and save after processing clears. Do not assume the draft is published.
- Prefer batch file selection where the UI allows it. If selector controls fail, upload smaller batches or one file at a time, but keep download and metadata preparation batched.
- Preserve a clear blocked list for rows like
waitlisted, WIP, To provide, private/deleted links, or access-denied Drive files.
Workflow
- Export or scrape the source table into CSV/TSV with at least: speaker name, talk title, talk description, video source URL, bio, company, handles, LinkedIn/GitHub, and any public links. Treat notes/status fields as private unless told otherwise.
- Build a manifest and metadata JSON:
- Run
scripts/youtube_batch_helper.py build-metadata presenters.csv --out work/youtube_metadata.json.
- Use
--playlist "Playlist Name" and --skip-source-url unless the user says otherwise.
- Inspect blocked rows and rows with placeholder source values before downloading.
- Download source videos into
downloads/.../raw:
- Drive: prefer
yt-dlp or direct browser-authenticated downloads if permissions require Chrome cookies/session.
- Loom: try
yt-dlp; if it fails, inspect the page for signed HLS manifests and assemble with ffmpeg.
- YouTube source videos: try
yt-dlp with browser cookies or alternate player clients. Respect access and copyright limitations.
- Stage upload files under a batch directory with final human-readable names:
Talk Title - Speaker Name.mp4
- Keep punctuation YouTube accepts; avoid filesystem-hostile characters.
- Open YouTube Studio upload in Chrome, select as many staged files as practical, and then complete each upload dialog:
- Set title and description from metadata.
- Select the playlist.
- Advance through Video elements and Checks.
- Select
Unlisted.
- Save and wait until the row appears as
Unlisted / None or known restriction.
- Record each YouTube link in a ledger and report:
- Uploaded count and new links.
- Any restrictions, especially copyright.
- Blocked/unavailable source rows with exact reason.
Metadata Shape
Use this description layout unless the user gives a channel-specific template:
<Talk Description>
Speakers:
- <Name> (<Company>): <Bio>
X/Twitter: <url-or-handle>
LinkedIn: <url>
GitHub: <url-or-handle>
Include the whole submitted talk description/abstract when it is suitable for public viewing. Include social media and company/project URLs entered by the speaker, but omit blank lines for missing fields. Do not include source video URLs or internal Additional Notes/reviewer fields.
Keep descriptions factual and avoid inventing missing affiliations. For incomplete presenter names, use available fields and web search if the user asked to fill missing public info.
UI Automation
Read references/ui-js-snippets.md when using Chrome DOM automation for YouTube Studio. These snippets cover setting contenteditable title/description boxes, selecting playlists, clicking through steps, saving unlisted, and verifying row state.
For Studio-only cleanup on existing videos, such as thumbnail replacement, schedule times, save-state recovery, or playlist fixes after upload, switch to the youtube-studio-computer-use skill. Keep this skill focused on source acquisition, metadata preparation, staged filenames, upload batching, and upload ledgers.
Use direct Computer Use clicks for file pickers and modal buttons when DOM automation cannot reach native UI. Use coordinates only after confirming the screenshot state.
Verification
- Verify every uploaded row shows
Unlisted after Save.
- Verify source URL patterns are absent from descriptions using the helper audit or DOM readback.
- Verify playlist selection during the upload modal; YouTube Studio's channel list does not always show playlist membership.
- Check upload processing dialogs:
Video upload complete is not enough if the dialog still says SD processing must finish before unlisted publication.
Helper Script
scripts/youtube_batch_helper.py provides:
build-metadata: convert Airtable/CSV rows into YouTube metadata JSON and a blocked-row report.
audit-descriptions: scan metadata JSON for accidental source URLs.
ledger: create or update a CSV ledger of uploaded links and statuses.
Run python3 scripts/youtube_batch_helper.py --help for command details.
1---2name: youtube-studio-batch-upload3description: Batch YouTube Studio upload workflow for videos sourced from Airtable, Google Drive, Loom, YouTube, or local files. Use when Codex needs to download many submitted videos, stage filenames, build YouTube titles/descriptions from table fields, upload through Chrome/Computer Use, set videos Unlisted, add a playlist, save each upload before moving on, track links, and report incomplete or blocked source rows.4---56# YouTube Studio Batch Upload78## Operating Rules910- Use the browser/computer-use skill for live YouTube Studio or Airtable UI work. Call `get_app_state` before direct UI actions in a turn.11- Treat upload as a batch waterfall: download/source recovery, filename staging, metadata staging, upload, per-video titling/playlist/visibility/save, verification, ledger.12- Do not include source video URLs in YouTube descriptions. Strip Drive, Loom, WeTransfer, and source YouTube links from final descriptions unless the user explicitly asks to publish those links.13- Use the full submitted talk abstract in the description by default; do not compress it to a teaser unless the user asks for short copy.14- Do not publish internal Airtable fields such as `Additional Notes`, reviewer notes, source status, or operational comments unless the user explicitly marks them as public copy.15- Always select the target playlist before advancing to visibility.16- Always choose `Unlisted` and click `Save` before opening or editing the next upload.17- If YouTube blocks saving because SD processing is not finished, wait on the modal and save after processing clears. Do not assume the draft is published.18- Prefer batch file selection where the UI allows it. If selector controls fail, upload smaller batches or one file at a time, but keep download and metadata preparation batched.19- Preserve a clear blocked list for rows like `waitlisted`, `WIP`, `To provide`, private/deleted links, or access-denied Drive files.2021## Workflow22231. Export or scrape the source table into CSV/TSV with at least: speaker name, talk title, talk description, video source URL, bio, company, handles, LinkedIn/GitHub, and any public links. Treat notes/status fields as private unless told otherwise.242. Build a manifest and metadata JSON:25 - Run `scripts/youtube_batch_helper.py build-metadata presenters.csv --out work/youtube_metadata.json`.26 - Use `--playlist "Playlist Name"` and `--skip-source-url` unless the user says otherwise.27 - Inspect blocked rows and rows with placeholder source values before downloading.283. Download source videos into `downloads/.../raw`:29 - Drive: prefer `yt-dlp` or direct browser-authenticated downloads if permissions require Chrome cookies/session.30 - Loom: try `yt-dlp`; if it fails, inspect the page for signed HLS manifests and assemble with `ffmpeg`.31 - YouTube source videos: try `yt-dlp` with browser cookies or alternate player clients. Respect access and copyright limitations.324. Stage upload files under a batch directory with final human-readable names:33 - `Talk Title - Speaker Name.mp4`34 - Keep punctuation YouTube accepts; avoid filesystem-hostile characters.355. Open YouTube Studio upload in Chrome, select as many staged files as practical, and then complete each upload dialog:36 - Set title and description from metadata.37 - Select the playlist.38 - Advance through Video elements and Checks.39 - Select `Unlisted`.40 - Save and wait until the row appears as `Unlisted / None` or known restriction.416. Record each YouTube link in a ledger and report:42 - Uploaded count and new links.43 - Any restrictions, especially copyright.44 - Blocked/unavailable source rows with exact reason.4546## Metadata Shape4748Use this description layout unless the user gives a channel-specific template:4950```text51<Talk Description>5253Speakers:54- <Name> (<Company>): <Bio>55 X/Twitter: <url-or-handle>56 LinkedIn: <url>57 GitHub: <url-or-handle>58```5960Include the whole submitted talk description/abstract when it is suitable for public viewing. Include social media and company/project URLs entered by the speaker, but omit blank lines for missing fields. Do not include source video URLs or internal `Additional Notes`/reviewer fields.6162Keep descriptions factual and avoid inventing missing affiliations. For incomplete presenter names, use available fields and web search if the user asked to fill missing public info.6364## UI Automation6566Read `references/ui-js-snippets.md` when using Chrome DOM automation for YouTube Studio. These snippets cover setting contenteditable title/description boxes, selecting playlists, clicking through steps, saving unlisted, and verifying row state.6768For Studio-only cleanup on existing videos, such as thumbnail replacement, schedule times, save-state recovery, or playlist fixes after upload, switch to the `youtube-studio-computer-use` skill. Keep this skill focused on source acquisition, metadata preparation, staged filenames, upload batching, and upload ledgers.6970Use direct Computer Use clicks for file pickers and modal buttons when DOM automation cannot reach native UI. Use coordinates only after confirming the screenshot state.7172## Verification7374- Verify every uploaded row shows `Unlisted` after Save.75- Verify source URL patterns are absent from descriptions using the helper audit or DOM readback.76- Verify playlist selection during the upload modal; YouTube Studio's channel list does not always show playlist membership.77- Check upload processing dialogs: `Video upload complete` is not enough if the dialog still says SD processing must finish before unlisted publication.7879## Helper Script8081`scripts/youtube_batch_helper.py` provides:8283- `build-metadata`: convert Airtable/CSV rows into YouTube metadata JSON and a blocked-row report.84- `audit-descriptions`: scan metadata JSON for accidental source URLs.85- `ledger`: create or update a CSV ledger of uploaded links and statuses.8687Run `python3 scripts/youtube_batch_helper.py --help` for command details.