raise ApiError("WL API call error %s, path: %s" % (r.status_code, path))
-def youtube_call(method, url, params=None, json=None, data=None, resumable_data=None):
+def youtube_call(method, url, params=None, json=None, data=None, resumable_file_path=None):
from .models import YouTubeToken
yt = YouTubeToken.objects.first()
- return yt.call(method, url, params=params, json=json, data=data, resumable_data=resumable_data)
+ return yt.call(method, url, params=params, json=json, data=data, resumable_file_path=resumable_file_path)
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
token_updater=self.token_updater
)
- def call(self, method, url, params=None, json=None, data=None, resumable_data=None):
+ def call(self, method, url, params=None, json=None, data=None, resumable_file_path=None):
params = params or {}
- if resumable_data:
+ if resumable_file_path:
params['uploadType'] = 'resumable'
+ file_size = os.stat(resumable_file_path).st_size
session = self.get_session()
response = session.request(
data=data,
params=params,
headers={
- 'X-Upload-Content-Length': str(len(resumable_data)),
+ 'X-Upload-Content-Length': str(file_size),
'x-upload-content-type': 'application/octet-stream',
- } if resumable_data else {}
+ } if resumable_file_path else {}
)
- if resumable_data:
+ if resumable_file_path:
location = response.headers['Location']
- return session.put(
- url=location,
- data=resumable_data,
- headers={"Content-Type": "application/octet-stream"},
- )
+ with open(resumable_file_path, 'rb') as f:
+ return session.put(
+ url=location,
+ data=StreamingIterator(file_size, f),
+ headers={"Content-Type": "application/octet-stream"},
+ )
data = self.get_data(audiobook)
part = ",".join(data.keys())
- with open(path, "rb") as f:
- response = youtube_call(
- "POST",
- "https://www.googleapis.com/upload/youtube/v3/videos",
- params={'part': part},
- json=data,
- resumable_data=f.read(),
- )
+ response = youtube_call(
+ "POST",
+ "https://www.googleapis.com/upload/youtube/v3/videos",
+ params={'part': part},
+ json=data,
+ resumable_file_path=path,
+ )
data = response.json()
audiobook.youtube_id = data['id']
audiobook.save(update_fields=['youtube_id'])