-
Notifications
You must be signed in to change notification settings - Fork 0
/
upload_video.py
103 lines (90 loc) · 3.79 KB
/
upload_video.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#!/usr/bin/env python
# Changes from sample provided here:
# https://github.com/youtube/api-samples/blob/master/python/upload_video.py
# - Modified get_authenticated_service() to store authentication token.
# - Build arguments directly without using argparser, per say.
import http.client
import httplib2
from random import random
from time import sleep
from sys import argv
import google.oauth2.credentials
import google_auth_oauthlib.flow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from googleapiclient.http import MediaFileUpload
from oauth2client.client import flow_from_clientsecrets
from oauth2client.file import Storage
from oauth2client.tools import run_flow
CLIENT_SECRET_FILE = 'client_secret.json'
OAUTH_FILE = 'oauth2.json'
SCOPE = 'https://www.googleapis.com/auth/youtube.upload'
API_SERVICE_NAME = 'youtube'
API_VERSION = 'v3'
VALID_PRIVACY_STATUSES = ('public', 'private', 'unlisted')
httplib2.RETRIES = 1
MAX_RETRIES = 10
RETRIABLE_STATUS_CODES = [500, 502, 503, 504]
RETRIABLE_EXCEPTIONS = (httplib2.HttpLib2Error, IOError, http.client.NotConnected,
http.client.IncompleteRead, http.client.ImproperConnectionState,
http.client.CannotSendRequest, http.client.CannotSendHeader,
http.client.ResponseNotReady, http.client.BadStatusLine)
def get_authenticated_service(storage=OAUTH_FILE):
credentials = storage.get()
if credentials is None or credentials.invalid:
flow = flow_from_clientsecrets(
CLIENT_SECRET_FILE,
scope=SCOPE,
message='WARNING: Please configure OAuth 2.0')
credentials = run_flow(flow, storage)
return build(API_SERVICE_NAME, API_VERSION, http=credentials.authorize(httplib2.Http()))
def initialize_upload(youtube, options):
tags = None
if options['keywords']:
tags = options['keywords'].split(',')
body = dict(
snippet = dict(
title = options['title'],
description = options['description'],
tags = tags,
categoryId = options['category']
),
status = dict(
privacyStatus = options['privacyStatus']
)
)
insert_request = youtube.videos().insert(
part=','.join(list(body.keys())),
body=body,
media_body=MediaFileUpload(options['file'], chunksize=-1, resumable=True)
)
resumable_upload(insert_request)
def resumable_upload(request):
response = None
error = None
retry = 0
while response is None:
try:
print('Uploading file...')
status, response = request.next_chunk()
if response is not None:
if 'id' in response:
print('Video id "%s" was successfully uploaded.' % response['id'])
else:
exit('The upload failed with an unexpected response: %s' % response)
except HttpError as e:
if e.resp.status in RETRIABLE_STATUS_CODES:
error = 'A retriable HTTP error %d occurred:\n%s' % (e.resp.status, e.content)
else:
raise
except RETRIABLE_EXCEPTIONS as e:
error = 'A retriable error occurred: %s' % e
if error is not None:
print(error)
retry += 1
if retry > MAX_RETRIES:
exit('No longer attempting to retry.')
max_sleep = 2 ** retry
sleep_seconds = random() * max_sleep
print('Sleeping %f seconds and then retrying...' % sleep_seconds)
sleep(sleep_seconds)