|
@ -14,7 +14,8 @@ from tzlocal import get_localzone |
|
|
from configparser import RawConfigParser |
|
|
from configparser import RawConfigParser |
|
|
from requests_oauthlib import OAuth2Session |
|
|
from requests_oauthlib import OAuth2Session |
|
|
from oauthlib.oauth2 import LegacyApplicationClient |
|
|
from oauthlib.oauth2 import LegacyApplicationClient |
|
|
from requests_toolbelt.multipart.encoder import MultipartEncoder |
|
|
|
|
|
|
|
|
from requests_toolbelt import MultipartEncoder, MultipartEncoderMonitor |
|
|
|
|
|
from clint.textui.progress import Bar as ProgressBar |
|
|
|
|
|
|
|
|
from . import utils |
|
|
from . import utils |
|
|
logger = logging.getLogger('Prismedia') |
|
|
logger = logging.getLogger('Prismedia') |
|
@ -303,7 +304,12 @@ def upload_video(oauth, secret, options): |
|
|
if options.get('--url-only') or options.get('--batch'): |
|
|
if options.get('--url-only') or options.get('--batch'): |
|
|
logger_stdout = logging.getLogger('stdoutlogs') |
|
|
logger_stdout = logging.getLogger('stdoutlogs') |
|
|
|
|
|
|
|
|
multipart_data = MultipartEncoder(fields) |
|
|
|
|
|
|
|
|
encoder = MultipartEncoder(fields) |
|
|
|
|
|
if options.get('--quiet'): |
|
|
|
|
|
multipart_data = encoder |
|
|
|
|
|
else: |
|
|
|
|
|
progress_callback = create_callback(encoder, options.get('--progress')) |
|
|
|
|
|
multipart_data = MultipartEncoderMonitor(encoder, progress_callback) |
|
|
|
|
|
|
|
|
headers = { |
|
|
headers = { |
|
|
'Content-Type': multipart_data.content_type |
|
|
'Content-Type': multipart_data.content_type |
|
@ -311,12 +317,14 @@ def upload_video(oauth, secret, options): |
|
|
response = oauth.post(url + "/api/v1/videos/upload", |
|
|
response = oauth.post(url + "/api/v1/videos/upload", |
|
|
data=multipart_data, |
|
|
data=multipart_data, |
|
|
headers=headers) |
|
|
headers=headers) |
|
|
|
|
|
|
|
|
if response is not None: |
|
|
if response is not None: |
|
|
if response.status_code == 200: |
|
|
if response.status_code == 200: |
|
|
jresponse = response.json() |
|
|
jresponse = response.json() |
|
|
jresponse = jresponse['video'] |
|
|
jresponse = jresponse['video'] |
|
|
uuid = jresponse['uuid'] |
|
|
uuid = jresponse['uuid'] |
|
|
video_id = str(jresponse['id']) |
|
|
video_id = str(jresponse['id']) |
|
|
|
|
|
|
|
|
logger.info('Peertube: Video was successfully uploaded.') |
|
|
logger.info('Peertube: Video was successfully uploaded.') |
|
|
template = 'Peertube: Watch it at %s/videos/watch/%s.' |
|
|
template = 'Peertube: Watch it at %s/videos/watch/%s.' |
|
|
logger.info(template % (url, uuid)) |
|
|
logger.info(template % (url, uuid)) |
|
@ -334,6 +342,42 @@ def upload_video(oauth, secret, options): |
|
|
exit(1) |
|
|
exit(1) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
upload_finished = False |
|
|
|
|
|
def create_callback(encoder, progress_type): |
|
|
|
|
|
upload_size_MB = encoder.len * (1 / (1024 * 1024)) |
|
|
|
|
|
|
|
|
|
|
|
if progress_type is None or "percentage" in progress_type.lower(): |
|
|
|
|
|
progress_lambda = lambda x: int((x / encoder.len) * 100) # Default to percentage |
|
|
|
|
|
elif "bigfile" in progress_type.lower(): |
|
|
|
|
|
progress_lambda = lambda x: x * (1 / (1024 * 1024)) # MB |
|
|
|
|
|
elif "accurate" in progress_type.lower(): |
|
|
|
|
|
progress_lambda = lambda x: x * (1 / (1024)) # kB |
|
|
|
|
|
else: |
|
|
|
|
|
# Should not happen outside of development when adding partly a progress type |
|
|
|
|
|
logger.critical("Peertube: Unknown progress type `" + progress_type + "`") |
|
|
|
|
|
exit(1) |
|
|
|
|
|
|
|
|
|
|
|
bar = ProgressBar(expected_size=progress_lambda(encoder.len), label=f"Peertube upload progress ({upload_size_MB:.2f}MB) ", filled_char='=') |
|
|
|
|
|
|
|
|
|
|
|
def callback(monitor): |
|
|
|
|
|
# We want the condition to capture the varible from the parent scope, not a local variable that is created after |
|
|
|
|
|
global upload_finished |
|
|
|
|
|
progress = progress_lambda(monitor.bytes_read) |
|
|
|
|
|
|
|
|
|
|
|
bar.show(progress) |
|
|
|
|
|
|
|
|
|
|
|
if monitor.bytes_read == encoder.len: |
|
|
|
|
|
if not upload_finished: |
|
|
|
|
|
# We get two time in the callback with both bytes equals, skip the first |
|
|
|
|
|
upload_finished = True |
|
|
|
|
|
else: |
|
|
|
|
|
# Print a blank line to not (partly) override the progress bar |
|
|
|
|
|
print() |
|
|
|
|
|
logger.info("Peertube : Upload finish, Processing…") |
|
|
|
|
|
|
|
|
|
|
|
return callback |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def run(options): |
|
|
def run(options): |
|
|
secret = RawConfigParser() |
|
|
secret = RawConfigParser() |
|
|
try: |
|
|
try: |
|
|