From 33c5ee9be4826ecc4e63ad78bcaa1c2b484ee0b0 Mon Sep 17 00:00:00 2001 From: Lonami Exo Date: Tue, 28 Mar 2023 18:15:57 +0200 Subject: [PATCH] Implement progress_callback for sending albums Closes #3190. --- telethon/client/uploads.py | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/telethon/client/uploads.py b/telethon/client/uploads.py index fa18f646..5147724a 100644 --- a/telethon/client/uploads.py +++ b/telethon/client/uploads.py @@ -352,6 +352,11 @@ class UploadMethods: # First check if the user passed an iterable, in which case # we may want to send grouped. if utils.is_list_like(file): + sent_count = 0 + used_callback = None if not progress_callback else ( + lambda s, t: progress_callback(sent_count + s, len(file)) + ) + if utils.is_list_like(caption): captions = caption else: @@ -361,19 +366,20 @@ class UploadMethods: while file: result += await self._send_album( entity, file[:10], caption=captions[:10], - progress_callback=progress_callback, reply_to=reply_to, + progress_callback=used_callback, reply_to=reply_to, parse_mode=parse_mode, silent=silent, schedule=schedule, supports_streaming=supports_streaming, clear_draft=clear_draft, force_document=force_document, background=background, ) file = file[10:] captions = captions[10:] + sent_count += 10 for doc, cap in zip(file, captions): result.append(await self.send_file( entity, doc, allow_cache=allow_cache, caption=cap, force_document=force_document, - progress_callback=progress_callback, reply_to=reply_to, + progress_callback=used_callback, reply_to=reply_to, attributes=attributes, thumb=thumb, voice_note=voice_note, video_note=video_note, buttons=buttons, silent=silent, supports_streaming=supports_streaming, schedule=schedule, @@ -436,16 +442,22 @@ class UploadMethods: reply_to = utils.get_message_id(reply_to) + used_callback = None if not progress_callback else ( + # use an integer when sent matches total, to easily determine a file has been fully sent + lambda s, t: progress_callback(sent_count + 1 if s == t else sent_count + s / t, len(files)) + ) + # Need to upload the media first, but only if they're not cached yet media = [] - for file in files: + for sent_count, file in enumerate(files): # Albums want :tl:`InputMedia` which, in theory, includes # :tl:`InputMediaUploadedPhoto`. However using that will # make it `raise MediaInvalidError`, so we need to upload # it as media and then convert that to :tl:`InputMediaPhoto`. fh, fm, _ = await self._file_to_media( file, supports_streaming=supports_streaming, - force_document=force_document, ttl=ttl) + force_document=force_document, ttl=ttl, + progress_callback=used_callback) if isinstance(fm, (types.InputMediaUploadedPhoto, types.InputMediaPhotoExternal)): r = await self(functions.messages.UploadMediaRequest( entity, media=fm @@ -546,6 +558,13 @@ class UploadMethods: A callback function accepting two parameters: ``(sent bytes, total)``. + When sending an album, the callback will receive a number + between 0 and the amount of files as the "sent" parameter, + and the amount of files as the "total". Note that the first + parameter will be a floating point number to indicate progress + within a file (e.g. ``2.5`` means it has sent 50% of the third + file, because it's between 2 and 3). + Returns :tl:`InputFileBig` if the file size is larger than 10MB, `InputSizedFile `