Command-line script to upload videos to Youtube using theYoutube APIv3. It should work on any platform (GNU/Linux, BSD, OS X, Windows, ...) that runs Python.
Check if your operating system provides those packages (check also those deb/rpm/mac files), otherwise install them with pip
:
$ sudo pip install --upgrade google-api-python-client oauth2client progressbar2
$ wget https://github.com/tokland/youtube-upload/archive/master.zip
$ unzip master.zip
$ cd youtube-upload-master
$ sudo python setup.py install
Or run directly from sources:
$ cd youtube-upload-master
$ PYTHONPATH=. python bin/youtube-upload ...
You'll see that there is no email/password options. Instead, the Youtube API uses OAuth 2.0 to authenticate the upload. The first time you try to upload a video, you will be asked to follow a URL in your browser to get an authentication token. If you have multiple channels for the logged in user, you will also be asked to pick which one you want to upload the videos to. You can use multiple credentials, just use the option --credentials-file
. Also, check the token expiration policies.
The package used to include a default client_secrets.json
file. It does not work anymore, Google has revoked it. So you now must create and use your own OAuth 2.0 file, it's a free service. Steps:
--client-secrets=CLIENT_SECRETS
or copy it to ~/client_secrets.json
.Note: client_secrets.json
is a file you can download from the developer console, the credentials file is something auto generated after the first time the script is run and the google account sign in is followed, the file is stored at ~/.youtube-upload-credentials.json
.
Upload a video (a valid ~/.client_secrets.json
should exist, check the Setup section):
$ youtube-upload --title="A.S. Mutter" anne_sophie_mutter.flv
pxzZ-fYjeYs
Upload a video with extra metadata, with your own client secrets and credentials file, and to a playlist (if not found, it will be created):
$ youtube-upload \
--title="A.S. Mutter" " \
--description="A.S. Mutter plays Beethoven" \
--category="Music" \
--tags="mutter, beethoven" \
--recording-date="2011-03-10T15:32:17.0Z" \
--default-language="en" \
--default-audio-language="en" \
--client-secrets="my_client_secrets.json" \
--credentials-file="my_credentials.json" \
--playlist="My favorite music" \
--embeddable=True|False \
anne_sophie_mutter.flv
tx2Zb-145Yz
Other extra medata available :
--privacy (public | unlisted | private)
--publish-at (YYYY-MM-DDThh:mm:ss.sZ)
--location (latitude=VAL,longitude=VAL[,altitude=VAL])
--thumbnail (string)
Upload a video using a browser GUI to authenticate:
$ youtube-upload --title="A.S. Mutter" --auth-browser anne_sophie_mutter.flv
Split a video with ffmpeg
If your video is too big or too long for Youtube limits, split it before uploading:
$ bash examples/split_video_for_youtube.sh video.avi
video.part1.avi
video.part2.avi
video.part3.avi
Set environment variables http_proxy and https_proxy:
$ export http_proxy=http://user:password@host:port
$ export https_proxy=$http_proxy
$ youtube-upload ....
id,snippet
es
(2 letter code of your country)And see the JSON response below. Note that categories with the attribute assignable
equal to false
cannot be used.
Using shoogle:
$ shoogle execute --client-secret-file client_secret.json \
youtube:v3.videoCategories.list <(echo '{"part": "id,snippet", "regionCode": "es"}') |
jq ".items[] | select(.snippet.assignable) | {id: .id, title: .snippet.title}"
upload_video
).shoogle can send requests to any Google API service, so it can be used not only to upload videos, but also to perform any operation regarding the Youtube API.
youtubeuploader uploads videos to Youtube from local disk or from the web. It also provides rate-limited uploads.