upload_video.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. import httplib
  2. import googleapiclient.errors
  3. import apiclient.http
  4. import httplib2
  5. import lib
  6. RETRIABLE_EXCEPTIONS = [
  7. IOError, googleapiclient.errors.ResumableUploadError,
  8. httplib2.HttpLib2Error, httplib.NotConnected,
  9. httplib.IncompleteRead, httplib.ImproperConnectionState,
  10. httplib.CannotSendRequest, httplib.CannotSendHeader,
  11. httplib.ResponseNotReady, httplib.BadStatusLine,
  12. ]
  13. def _upload_to_request(request, progress_callback):
  14. """Upload a video to a Youtube request. Return video ID."""
  15. while 1:
  16. status, response = request.next_chunk()
  17. if response:
  18. if "id" in response:
  19. return response['id']
  20. else:
  21. raise KeyError("Expected field 'id' not found in response")
  22. elif status and progress_callback:
  23. progress_callback(status.total_size, status.resumable_progress)
  24. def upload(resource, path, body, chunksize=1024*1024,
  25. progress_callback=None, max_retries=10):
  26. """Upload video to Youtube. Return video ID."""
  27. body_keys = ",".join(body.keys())
  28. media = apiclient.http.MediaFileUpload(path, chunksize=chunksize,
  29. resumable=True, mimetype="application/octet-stream")
  30. request = resource.videos().insert(part=body_keys, body=body, media_body=media)
  31. upload_fun = lambda: _upload_to_request(request, progress_callback)
  32. return lib.retriable_exceptions(upload_fun,
  33. RETRIABLE_EXCEPTIONS, max_retries=max_retries)