upload_video.py 1.5 KB

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