From 09c2d843576339004b23afb7fea7f81069dbcdff Mon Sep 17 00:00:00 2001 From: Zykino Date: Mon, 14 Dec 2020 21:59:12 +0100 Subject: [PATCH] Add a progression bar to Peertube upload --- prismedia/pt_upload.py | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/prismedia/pt_upload.py b/prismedia/pt_upload.py index 7c779ad..512c24b 100644 --- a/prismedia/pt_upload.py +++ b/prismedia/pt_upload.py @@ -14,7 +14,8 @@ from tzlocal import get_localzone from configparser import RawConfigParser from requests_oauthlib import OAuth2Session 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 logger = logging.getLogger('Prismedia') @@ -303,7 +304,9 @@ def upload_video(oauth, secret, options): if options.get('--url-only') or options.get('--batch'): logger_stdout = logging.getLogger('stdoutlogs') - multipart_data = MultipartEncoder(fields) + encoder = MultipartEncoder(fields) + progress_callback = create_callback(encoder) + multipart_data = MultipartEncoderMonitor(encoder, progress_callback) headers = { 'Content-Type': multipart_data.content_type @@ -311,12 +314,14 @@ def upload_video(oauth, secret, options): response = oauth.post(url + "/api/v1/videos/upload", data=multipart_data, headers=headers) + if response is not None: if response.status_code == 200: jresponse = response.json() jresponse = jresponse['video'] uuid = jresponse['uuid'] video_id = str(jresponse['id']) + logger.info('Peertube: Video was successfully uploaded.') template = 'Peertube: Watch it at %s/videos/watch/%s.' logger.info(template % (url, uuid)) @@ -333,6 +338,30 @@ def upload_video(oauth, secret, options): '%s') % response) exit(1) +upload_finished = False +def create_callback(encoder): + encoder_len = encoder.len + upload_size_MB = encoder_len * (1 / (1024 * 1024)) + + bar = ProgressBar(expected_size=100, 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 + percentage = int((monitor.bytes_read / encoder_len) * 100) + bar.show(percentage) + + 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): secret = RawConfigParser()