From a2263ad8ce2b9b47ad7933d59d247ad6a2d5607d Mon Sep 17 00:00:00 2001 From: Dan <14043624+delivrance@users.noreply.github.com> Date: Tue, 5 Feb 2019 11:50:32 +0100 Subject: [PATCH] Make send_media_group return the new Messages object --- .../methods/messages/send_media_group.py | 110 ++++++++++++------ 1 file changed, 76 insertions(+), 34 deletions(-) diff --git a/pyrogram/client/methods/messages/send_media_group.py b/pyrogram/client/methods/messages/send_media_group.py index e1731e0b..6eb0f415 100644 --- a/pyrogram/client/methods/messages/send_media_group.py +++ b/pyrogram/client/methods/messages/send_media_group.py @@ -17,20 +17,23 @@ # along with Pyrogram. If not, see . import binascii +import logging import mimetypes import os import struct +import time from typing import Union, List import pyrogram from pyrogram.api import functions, types -from pyrogram.api.errors import FileIdInvalid +from pyrogram.api.errors import FileIdInvalid, FloodWait from pyrogram.client.ext import BaseClient, utils +log = logging.getLogger(__name__) + class SendMediaGroup(BaseClient): # TODO: Add progress parameter - # TODO: Return new Message object # TODO: Figure out how to send albums using URLs def send_media_group(self, chat_id: Union[int, str], @@ -38,7 +41,6 @@ class SendMediaGroup(BaseClient): disable_notification: bool = None, reply_to_message_id: int = None): """Use this method to send a group of photos or videos as an album. - On success, an Update containing the sent Messages is returned. Args: chat_id (``int`` | ``str``): @@ -57,6 +59,13 @@ class SendMediaGroup(BaseClient): reply_to_message_id (``int``, *optional*): If the message is a reply, ID of the original message. + + Returns: + On success, a :obj:`Messages ` object is returned containing all the + single messages sent. + + Raises: + :class:`Error ` in case of a Telegram RPC error. """ multi_media = [] @@ -65,14 +74,21 @@ class SendMediaGroup(BaseClient): if isinstance(i, pyrogram.InputMediaPhoto): if os.path.exists(i.media): - media = self.send( - functions.messages.UploadMedia( - peer=self.resolve_peer(chat_id), - media=types.InputMediaUploadedPhoto( - file=self.save_file(i.media) + while True: + try: + media = self.send( + functions.messages.UploadMedia( + peer=self.resolve_peer(chat_id), + media=types.InputMediaUploadedPhoto( + file=self.save_file(i.media) + ) + ) ) - ) - ) + except FloodWait as e: + log.warning("Sleeping for {}s".format(e.x)) + time.sleep(e.x) + else: + break media = types.InputMediaPhoto( id=types.InputPhoto( @@ -106,25 +122,32 @@ class SendMediaGroup(BaseClient): ) elif isinstance(i, pyrogram.InputMediaVideo): if os.path.exists(i.media): - media = self.send( - functions.messages.UploadMedia( - peer=self.resolve_peer(chat_id), - media=types.InputMediaUploadedDocument( - file=self.save_file(i.media), - thumb=None if i.thumb is None else self.save_file(i.thumb), - mime_type=mimetypes.types_map[".mp4"], - attributes=[ - types.DocumentAttributeVideo( - supports_streaming=i.supports_streaming or None, - duration=i.duration, - w=i.width, - h=i.height - ), - types.DocumentAttributeFilename(os.path.basename(i.media)) - ] + while True: + try: + media = self.send( + functions.messages.UploadMedia( + peer=self.resolve_peer(chat_id), + media=types.InputMediaUploadedDocument( + file=self.save_file(i.media), + thumb=None if i.thumb is None else self.save_file(i.thumb), + mime_type=mimetypes.types_map[".mp4"], + attributes=[ + types.DocumentAttributeVideo( + supports_streaming=i.supports_streaming or None, + duration=i.duration, + w=i.width, + h=i.height + ), + types.DocumentAttributeFilename(os.path.basename(i.media)) + ] + ) + ) ) - ) - ) + except FloodWait as e: + log.warning("Sleeping for {}s".format(e.x)) + time.sleep(e.x) + else: + break media = types.InputMediaDocument( id=types.InputDocument( @@ -165,11 +188,30 @@ class SendMediaGroup(BaseClient): ) ) - return self.send( - functions.messages.SendMultiMedia( - peer=self.resolve_peer(chat_id), - multi_media=multi_media, - silent=disable_notification or None, - reply_to_msg_id=reply_to_message_id + while True: + try: + r = self.send( + functions.messages.SendMultiMedia( + peer=self.resolve_peer(chat_id), + multi_media=multi_media, + silent=disable_notification or None, + reply_to_msg_id=reply_to_message_id + ) + ) + except FloodWait as e: + log.warning("Sleeping for {}s".format(e.x)) + time.sleep(e.x) + else: + break + + return pyrogram.Messages._parse( + self, + types.messages.Messages( + messages=[m.message for m in filter( + lambda u: isinstance(u, (types.UpdateNewMessage, types.UpdateNewChannelMessage)), + r.updates + )], + users=r.users, + chats=r.chats ) )