Browse Source

Add a progression bar to Peertube upload

pull/52/head
Zykino 3 years ago
parent
commit
09c2d84357
1 changed files with 31 additions and 2 deletions
  1. +31
    -2
      prismedia/pt_upload.py

+ 31
- 2
prismedia/pt_upload.py View File

@ -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()

Loading…
Cancel
Save