Scripted uploads to Youtube
Branch: master
Clone or download
Latest commit c37b5e8 Dec 12, 2018

Youtube Uploader

Scripted uploads to youtube.

  • upload video files from local disk or from the web.
  • ratelimit upload bandwidth


Grab a precompiled binary for Linux, Mac or Windows or build it yourself.


This project uses 'dep' for vendoring.

  • Install Go e.g. yum install golang or apt-get install golang
  • Define your Go Path e.g. export GOPATH=$HOME/go
  • Fetch the project go get
  • run dep ensure in the project root
  • run go build


Youtube API

Talking to the Youtube API requires oauth2 authentication. As such, you must:

  1. Create an account on the Google Developers Console
  2. Register a new app there
  3. Enable the Youtube API (APIs & Auth -> APIs)
  4. Create Client ID (APIs & Auth -> Credentials), select 'Web application'
  5. Add an 'Authorized redirect URI' of 'http://localhost:8080/oauth2callback'
  6. Take note of the Client ID and Client secret values

The utility looks for client_secrets.json in the local directory. Create it first using the details from above:

  "installed": {
    "client_id": "",
    "client_secret": "xxxxxxxxxxxxxxxxxxxxx",
    "redirect_uris": ["http://localhost:8080/oauth2callback"],
    "auth_uri": "",
    "token_uri": ""

Update client_id and client_secret to match your details


At a minimum, just specify a filename:

./youtubeuploader -filename blob.mp4

If it is the first time you've run the utility, a browser window should popup and prompt you to provide Youtube credentials. A token will be created and stored in request.token file in the local directory for subsequent use. To run the utility on a headless-server, generate the token file locally first, then simply copy the token file along with youtubeuploader and client_secrets.json to the remote host.

Full list of options:

  -cache string
    	Token cache file (default "request.token")
  -caption string
      Caption to upload. Can be a URL
  -categoryId string
    	Video category Id
  -chunksize int
    	size (in bytes) of each upload chunk. A zero value will cause all data to be uploaded in a single request (default 8388608)
  -description string
    	Video description (default "uploaded by youtubeuploader")
  -filename string
    	Filename to upload. Can be a URL
    	set this if no browser available for the oauth authorisation step
  -language string
      Video language (default "en")
  -limitBetween string
    	Only rate limit between these times e.g. 10:00-14:00 (local time zone)
  -metaJSON string
    	JSON file containing title,description,tags etc (optional)
  -oAuthPort int
    	TCP port to listen on when requesting an oAuth token (default 8080)
  -privacy string
    	Video privacy status (default "private")
    	Suppress progress indicator
  -ratelimit int
    	Rate limit upload in kbps. No limit by default
  -secrets string
    	Client Secrets configuration (default "client_secrets.json")
  -tags string
    	Comma separated list of video tags
  -thumbnail string
    	Thumbnail to upload. Can be a URL
  -title string
    	Video title (default "Video Title")
  -v	show version

NOTE: When specifying a URL as the filename, the data will be streamed through the localhost (download from remote host, then upload to Youtube)


Video title, description etc can specified via the command line flags or via a JSON file using the -metaJSON flag. An example JSON file would be:

  "title": "my test title",
  "description": "my test description",
  "tags": ["test tag1", "test tag2"],
  "privacyStatus": "private",
  "embeddable": true,
  "license": "creativeCommon",
  "publicStatsViewable": true,
  "publishAt": "2017-06-01T12:05:00+02:00",
  "categoryId": "10",
  "recordingdate": "2017-05-21",
  "location": {
    "latitude": 48.8584,
    "longitude": 2.2945
  "locationDescription":  "Eiffel Tower",
  "playlistIds":  ["xxxxxxxxxxxxxxxxxx", "yyyyyyyyyyyyyyyyyy"],
  "playlistTitles":  ["my test playlist"],
  "language":  "fr"
  • all fields are optional. Command line flags will be used by default (where available)
  • use \n in the description to insert newlines
  • times can be provided in one of two formats: yyyy-mm-dd (UTC) or yyyy-mm-ddThh:mm:ss+zz:zz

Alternative Oauth setup for headless clients

If you do not have access to a web browser on the host where youtubeuploader is installed, you may follow this oauth setup method instead:

  1. Create an account on the Google Developers Console
  2. Register a new app there
  3. Enable the Youtube API (APIs & Auth -> APIs)
  4. Create Client ID (APIs & Auth -> Credentials), select Application Type 'Other'
  5. Download the resulting credentials file, saving it as client_secrets.json in the youtubeuploader directory
  6. Run youtubeuploader for the first time, passing the -headlessAuth parameter
  7. Copy-and-paste the URL displayed and open that in a browser
  8. Copy the resulting authorisation code and paste that into the youtubeuploader prompt: "Enter authorisation code here:"

(subsequent invocations of youtubeuploader do not require the -headlessAuth parameter)


Based on Go Youtube API Sample code

Thanks to for insight into how to update playlists.