1717# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
1818
1919import binascii
20+ import logging
2021import mimetypes
2122import os
2223import struct
24+ import time
2325from typing import Union , List
2426
2527import pyrogram
2628from pyrogram .api import functions , types
27- from pyrogram .api .errors import FileIdInvalid
29+ from pyrogram .api .errors import FileIdInvalid , FloodWait
2830from pyrogram .client .ext import BaseClient , utils
2931
32+ log = logging .getLogger (__name__ )
33+
3034
3135class SendMediaGroup (BaseClient ):
3236 # TODO: Add progress parameter
33- # TODO: Return new Message object
3437 # TODO: Figure out how to send albums using URLs
3538 def send_media_group (self ,
3639 chat_id : Union [int , str ],
3740 media : List [Union ["pyrogram.InputMediaPhoto" , "pyrogram.InputMediaVideo" ]],
3841 disable_notification : bool = None ,
3942 reply_to_message_id : int = None ):
4043 """Use this method to send a group of photos or videos as an album.
41- On success, an Update containing the sent Messages is returned.
4244
4345 Args:
4446 chat_id (``int`` | ``str``):
@@ -57,6 +59,13 @@ def send_media_group(self,
5759
5860 reply_to_message_id (``int``, *optional*):
5961 If the message is a reply, ID of the original message.
62+
63+ Returns:
64+ On success, a :obj:`Messages <pyrogram.Messages>` object is returned containing all the
65+ single messages sent.
66+
67+ Raises:
68+ :class:`Error <pyrogram.Error>` in case of a Telegram RPC error.
6069 """
6170 multi_media = []
6271
@@ -65,14 +74,21 @@ def send_media_group(self,
6574
6675 if isinstance (i , pyrogram .InputMediaPhoto ):
6776 if os .path .exists (i .media ):
68- media = self .send (
69- functions .messages .UploadMedia (
70- peer = self .resolve_peer (chat_id ),
71- media = types .InputMediaUploadedPhoto (
72- file = self .save_file (i .media )
77+ while True :
78+ try :
79+ media = self .send (
80+ functions .messages .UploadMedia (
81+ peer = self .resolve_peer (chat_id ),
82+ media = types .InputMediaUploadedPhoto (
83+ file = self .save_file (i .media )
84+ )
85+ )
7386 )
74- )
75- )
87+ except FloodWait as e :
88+ log .warning ("Sleeping for {}s" .format (e .x ))
89+ time .sleep (e .x )
90+ else :
91+ break
7692
7793 media = types .InputMediaPhoto (
7894 id = types .InputPhoto (
@@ -106,25 +122,32 @@ def send_media_group(self,
106122 )
107123 elif isinstance (i , pyrogram .InputMediaVideo ):
108124 if os .path .exists (i .media ):
109- media = self .send (
110- functions .messages .UploadMedia (
111- peer = self .resolve_peer (chat_id ),
112- media = types .InputMediaUploadedDocument (
113- file = self .save_file (i .media ),
114- thumb = None if i .thumb is None else self .save_file (i .thumb ),
115- mime_type = mimetypes .types_map [".mp4" ],
116- attributes = [
117- types .DocumentAttributeVideo (
118- supports_streaming = i .supports_streaming or None ,
119- duration = i .duration ,
120- w = i .width ,
121- h = i .height
122- ),
123- types .DocumentAttributeFilename (os .path .basename (i .media ))
124- ]
125+ while True :
126+ try :
127+ media = self .send (
128+ functions .messages .UploadMedia (
129+ peer = self .resolve_peer (chat_id ),
130+ media = types .InputMediaUploadedDocument (
131+ file = self .save_file (i .media ),
132+ thumb = None if i .thumb is None else self .save_file (i .thumb ),
133+ mime_type = mimetypes .types_map [".mp4" ],
134+ attributes = [
135+ types .DocumentAttributeVideo (
136+ supports_streaming = i .supports_streaming or None ,
137+ duration = i .duration ,
138+ w = i .width ,
139+ h = i .height
140+ ),
141+ types .DocumentAttributeFilename (os .path .basename (i .media ))
142+ ]
143+ )
144+ )
125145 )
126- )
127- )
146+ except FloodWait as e :
147+ log .warning ("Sleeping for {}s" .format (e .x ))
148+ time .sleep (e .x )
149+ else :
150+ break
128151
129152 media = types .InputMediaDocument (
130153 id = types .InputDocument (
@@ -165,11 +188,30 @@ def send_media_group(self,
165188 )
166189 )
167190
168- return self .send (
169- functions .messages .SendMultiMedia (
170- peer = self .resolve_peer (chat_id ),
171- multi_media = multi_media ,
172- silent = disable_notification or None ,
173- reply_to_msg_id = reply_to_message_id
191+ while True :
192+ try :
193+ r = self .send (
194+ functions .messages .SendMultiMedia (
195+ peer = self .resolve_peer (chat_id ),
196+ multi_media = multi_media ,
197+ silent = disable_notification or None ,
198+ reply_to_msg_id = reply_to_message_id
199+ )
200+ )
201+ except FloodWait as e :
202+ log .warning ("Sleeping for {}s" .format (e .x ))
203+ time .sleep (e .x )
204+ else :
205+ break
206+
207+ return pyrogram .Messages ._parse (
208+ self ,
209+ types .messages .Messages (
210+ messages = [m .message for m in filter (
211+ lambda u : isinstance (u , (types .UpdateNewMessage , types .UpdateNewChannelMessage )),
212+ r .updates
213+ )],
214+ users = r .users ,
215+ chats = r .chats
174216 )
175217 )
0 commit comments