All projects

Technical Report · Workflow Automation

YouTube Upload Automation Demo

YouTube Data API upload automation with OAuth, resumable transfers, retry/backoff handling, and post-upload comment and recommendation steps.

AUTHOR  Gaurav Verma CATEGORY  Workflow Automation SOURCE  https://github.com/gaurav-321/yt_upload_demo DATE  Aug 2023 STATUS  published
View Source Python API Automation OAuth Resumable Uploads YouTube Data API

Abstract

A Python script that automates the full YouTube publishing API path: OAuth authentication, resumable media upload with exponential-backoff retry, and post-upload actions for comments and recommendation-related steps. The interesting part is the failure-recovery layer — a long media transfer should not restart from zero on a transient network blip.

1. What This Is

Built in August 2023 to remove the manual API chore from publishing videos to YouTube. The uploader authenticates a configured Google/YouTube account via OAuth, performs a resumable upload of the media file, retries eligible transient failures with backoff, and then runs a small set of post-upload actions (comment creation, recommendation/end-screen-related calls). Upload state is kept separate from the source video file so the same script can drive multiple publishing jobs without re-wiring.

2. How It Works

The pipeline is linear: authenticate, prepare, upload, recover, then act on the uploaded video. Each stage hands off to the next; the retry stage sits between upload and post-upload so a failed transfer never reaches the comment/recommendation step.

# Stage Input Tool Output
01 Authenticate OAuth credentials Google OAuth Authenticated YouTube session
02 Prepare Video file + metadata Python Upload payload
03 Upload Media file Resumable upload protocol Video on YouTube
04 Retry / Recover Transient HTTP or quota error Exponential backoff logic Recovered upload or final failure
05 Post-upload actions Uploaded video ID YouTube Data API Comments, recommendation / end-screen steps

3. Implementation Notes

3.1 Resumable upload handling

The upload uses YouTube's resumable upload protocol rather than a single PUT. If the connection drops mid-transfer, the client resumes from the last acknowledged chunk instead of re-sending the entire file. For large renders this is the difference between a five-minute hiccup and a thirty-minute restart.

3.2 Retry and backoff

Retryable conditions (5xx responses, quota-exceeded, transient network errors) trigger an exponential-backoff loop. Non-retryable errors (auth failure, invalid media) abort immediately. The backoff keeps the script from hammering the API during a quota window while still giving transient issues a chance to clear.

3.3 State separation

Upload state (session ID, resume offset, metadata) is stored independently of the source video file. This lets the same script instance pick up a different video for the next job without re-initialising the OAuth session or re-reading configuration.

4. Constraints

  • Demo scope on post-upload actions

    The recommendation and end-screen code is experimental; it exercises the API calls but is not a production-ready scheduling or A/B-testing layer.

  • Single-account, single-job

    OAuth is configured for one YouTube account and the script processes one upload at a time. There is no queue, no concurrency, and no multi-channel support.

  • No monitoring or alerting

    Failures surface in stdout/logs only. If the script runs unattended, a stuck retry loop or a silent quota exhaustion will not page anyone.

  • No test suite

    The project is a working demo; there are no unit or integration tests covering the retry paths or the resumable-offset logic, so refactors are unguarded.

5. Next

  1. a. Add a simple batch queue so multiple videos can be enqueued and uploaded sequentially with per-job retry budgets.
  2. b. Wire the uploader in as the final stage of the larger automated render pipeline, passing the rendered file path and metadata as job arguments.
  3. c. Add a lightweight status file or log-tail hook so an unattended run can be checked without SSH-ing into the host.

— end of report —