X-Git-Url: https://git.mdrn.pl/audio.git/blobdiff_plain/d7186e88fcc0cf5d5449a16d3907e01aaafc484e..3c7adf8af63a913089eb5ec736443ea0c59a8d68:/src/apiclient/models.py diff --git a/src/apiclient/models.py b/src/apiclient/models.py index ae8c74a..49403f0 100644 --- a/src/apiclient/models.py +++ b/src/apiclient/models.py @@ -1,7 +1,9 @@ import json +import os from django.db import models from django.contrib.auth.models import User from requests_oauthlib import OAuth2Session +from requests_toolbelt.streaming_iterator import StreamingIterator from .settings import YOUTUBE_CLIENT_ID, YOUTUBE_CLIENT_SECRET, YOUTUBE_TOKEN_URL @@ -37,24 +39,32 @@ class YouTubeToken(models.Model): token_updater=self.token_updater ) - def call(self, method, url, params=None, data=None, media_data=None): + def call(self, method, url, params=None, json=None, data=None, resumable_file_path=None): params = params or {} - params['uploadType'] = 'resumable' + if resumable_file_path: + params['uploadType'] = 'resumable' + file_size = os.stat(resumable_file_path).st_size session = self.get_session() response = session.request( method=method, url=url, - json=data, + json=json, + data=data, params=params, headers={ - 'X-Upload-Content-Length': str(len(media_data)), + 'X-Upload-Content-Length': str(file_size), 'x-upload-content-type': 'application/octet-stream', - } - ) - location = response.headers['Location'] - return session.put( - url=location, - data=media_data, - headers={"Content-Type": "application/octet-stream"}, + } if resumable_file_path else {} ) + response.raise_for_status() + if resumable_file_path: + location = response.headers['Location'] + with open(resumable_file_path, 'rb') as f: + response = session.put( + url=location, + data=StreamingIterator(file_size, f), + headers={"Content-Type": "application/octet-stream"}, + ) + response.raise_for_status() + return response