Skip to content

Commit a541bb4

Browse files
committed
Merge develop -> asyncio
2 parents 0392740 + 91d3508 commit a541bb4

35 files changed

Lines changed: 217 additions & 65 deletions

compiler/error/source/400_BAD_REQUEST.tsv

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,4 +127,6 @@ BUTTON_URL_INVALID The button url is invalid
127127
AUTH_BYTES_INVALID The authorization bytes are invalid
128128
CHANNELS_TOO_MUCH You have joined too many channels or supergroups
129129
ADMIN_RANK_INVALID The custom administrator title is invalid or is longer than 16 characters
130-
ADMIN_RANK_EMOJI_NOT_ALLOWED Emojis are not allowed in custom administrator titles
130+
ADMIN_RANK_EMOJI_NOT_ALLOWED Emojis are not allowed in custom administrator titles
131+
FILE_REFERENCE_EMPTY The file reference is empty
132+
FILE_REFERENCE_INVALID The file reference is invalid

pyrogram/client/client.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1235,6 +1235,7 @@ async def download_worker(self):
12351235
peer_access_hash=data.peer_access_hash,
12361236
volume_id=data.volume_id,
12371237
local_id=data.local_id,
1238+
file_ref=data.file_ref,
12381239
file_size=data.file_size,
12391240
is_big=data.is_big,
12401241
progress=progress,
@@ -1888,7 +1889,7 @@ async def get_file(self, media_type: int,
18881889
peer_id: int,
18891890
peer_access_hash: int, volume_id: int,
18901891
local_id: int,
1891-
file_size: int,
1892+
file_ref: str,file_size: int,
18921893

18931894
is_big: bool,
18941895
progress: callable,
@@ -1928,6 +1929,8 @@ async def get_file(self, media_type: int,
19281929

19291930
self.media_sessions[dc_id] = session
19301931

1932+
file_ref = utils.decode_file_ref(file_ref)
1933+
19311934
if media_type == 1:
19321935
location = types.InputPeerPhotoFileLocation(
19331936
peer=types.InputPeerUser(
@@ -1942,21 +1945,21 @@ async def get_file(self, media_type: int,
19421945
location = types.InputPhotoFileLocation(
19431946
id=document_id,
19441947
access_hash=access_hash,
1945-
file_reference=b"",
1948+
file_reference=file_ref,
19461949
thumb_size=thumb_size
19471950
)
19481951
elif media_type == 14:
19491952
location = types.InputDocumentFileLocation(
19501953
id=document_id,
19511954
access_hash=access_hash,
1952-
file_reference=b"",
1955+
file_reference=file_ref,
19531956
thumb_size=thumb_size
19541957
)
19551958
else:
19561959
location = types.InputDocumentFileLocation(
19571960
id=document_id,
19581961
access_hash=access_hash,
1959-
file_reference=b"",
1962+
file_reference=file_ref,
19601963
thumb_size=""
19611964
)
19621965

pyrogram/client/ext/file_data.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def __init__(
2222
self, *, media_type: int = None, dc_id: int = None, document_id: int = None, access_hash: int = None,
2323
thumb_size: str = None, peer_id: int = None, peer_access_hash: int = None, volume_id: int = None,
2424
local_id: int = None, is_big: bool = None, file_size: int = None, mime_type: str = None, file_name: str = None,
25-
date: int = None
25+
date: int = None, file_ref: str = None
2626
):
2727
self.media_type = media_type
2828
self.dc_id = dc_id
@@ -38,3 +38,4 @@ def __init__(
3838
self.mime_type = mime_type
3939
self.file_name = file_name
4040
self.date = date
41+
self.file_ref = file_ref

pyrogram/client/ext/utils.py

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
from ...api import types
3131

3232

33-
def decode(s: str) -> bytes:
33+
def decode_file_id(s: str) -> bytes:
3434
s = base64.urlsafe_b64decode(s + "=" * (-len(s) % 4))
3535
r = b""
3636

@@ -56,7 +56,7 @@ def decode(s: str) -> bytes:
5656
return r
5757

5858

59-
def encode(s: bytes) -> str:
59+
def encode_file_id(s: bytes) -> str:
6060
r = b""
6161
n = 0
6262

@@ -73,6 +73,17 @@ def encode(s: bytes) -> str:
7373
return base64.urlsafe_b64encode(r).decode().rstrip("=")
7474

7575

76+
def encode_file_ref(file_ref: bytes) -> str:
77+
return base64.urlsafe_b64encode(file_ref).decode().rstrip("=")
78+
79+
80+
def decode_file_ref(file_ref: str) -> bytes:
81+
if file_ref is None:
82+
return b""
83+
84+
return base64.urlsafe_b64decode(file_ref + "=" * (-len(file_ref) % 4))
85+
86+
7687
async def ainput(prompt: str = ""):
7788
print(prompt, end="", flush=True)
7889

@@ -94,10 +105,11 @@ def get_offset_date(dialogs):
94105

95106
def get_input_media_from_file_id(
96107
file_id_str: str,
108+
file_ref: str = None,
97109
expected_media_type: int = None
98110
) -> Union[types.InputMediaPhoto, types.InputMediaDocument]:
99111
try:
100-
decoded = decode(file_id_str)
112+
decoded = decode_file_id(file_id_str)
101113
except Exception:
102114
raise ValueError("Failed to decode file_id: {}".format(file_id_str))
103115
else:
@@ -123,7 +135,7 @@ def get_input_media_from_file_id(
123135
id=types.InputPhoto(
124136
id=file_id,
125137
access_hash=access_hash,
126-
file_reference=b""
138+
file_reference=decode_file_ref(file_ref)
127139
)
128140
)
129141

@@ -135,7 +147,7 @@ def get_input_media_from_file_id(
135147
id=types.InputDocument(
136148
id=file_id,
137149
access_hash=access_hash,
138-
file_reference=b""
150+
file_reference=decode_file_ref(file_ref)
139151
)
140152
)
141153

pyrogram/client/methods/messages/download_media.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class DownloadMedia(BaseClient):
3636
async def download_media(
3737
self,
3838
message: Union["pyrogram.Message", str],
39+
file_ref: str = None,
3940
file_name: str = DEFAULT_DOWNLOAD_DIR,
4041
block: bool = True,
4142
progress: callable = None,
@@ -48,6 +49,10 @@ async def download_media(
4849
Pass a Message containing the media, the media itself (message.audio, message.video, ...) or
4950
the file id as string.
5051
52+
file_ref (``str``, *optional*):
53+
A valid file reference obtained by a recently fetched media message.
54+
To be used in combination with a file id in case a file reference is needed.
55+
5156
file_name (``str``, *optional*):
5257
A custom *file_name* to be used instead of the one provided by Telegram.
5358
By default, all files are downloaded in the *downloads* folder in your working directory.
@@ -123,19 +128,21 @@ async def download_media(
123128
file_size = getattr(media, "file_size", None)
124129
mime_type = getattr(media, "mime_type", None)
125130
date = getattr(media, "date", None)
131+
file_ref = getattr(media, "file_ref", None)
126132

127133
data = FileData(
128134
file_name=media_file_name,
129135
file_size=file_size,
130136
mime_type=mime_type,
131-
date=date
137+
date=date,
138+
file_ref=file_ref
132139
)
133140

134141
def get_existing_attributes() -> dict:
135142
return dict(filter(lambda x: x[1] is not None, data.__dict__.items()))
136143

137144
try:
138-
decoded = utils.decode(file_id_str)
145+
decoded = utils.decode_file_id(file_id_str)
139146
media_type = decoded[0]
140147

141148
if media_type == 1:

pyrogram/client/methods/messages/edit_inline_media.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,35 +77,35 @@ async def edit_inline_media(
7777
url=media.media
7878
)
7979
else:
80-
media = utils.get_input_media_from_file_id(media.media, 2)
80+
media = utils.get_input_media_from_file_id(media.media, media.file_ref, 2)
8181
elif isinstance(media, InputMediaVideo):
8282
if media.media.startswith("http"):
8383
media = types.InputMediaDocumentExternal(
8484
url=media.media
8585
)
8686
else:
87-
media = utils.get_input_media_from_file_id(media.media, 4)
87+
media = utils.get_input_media_from_file_id(media.media, media.file_ref, 4)
8888
elif isinstance(media, InputMediaAudio):
8989
if media.media.startswith("http"):
9090
media = types.InputMediaDocumentExternal(
9191
url=media.media
9292
)
9393
else:
94-
media = utils.get_input_media_from_file_id(media.media, 9)
94+
media = utils.get_input_media_from_file_id(media.media, media.file_ref, 9)
9595
elif isinstance(media, InputMediaAnimation):
9696
if media.media.startswith("http"):
9797
media = types.InputMediaDocumentExternal(
9898
url=media.media
9999
)
100100
else:
101-
media = utils.get_input_media_from_file_id(media.media, 10)
101+
media = utils.get_input_media_from_file_id(media.media, media.file_ref, 10)
102102
elif isinstance(media, InputMediaDocument):
103103
if media.media.startswith("http"):
104104
media = types.InputMediaDocumentExternal(
105105
url=media.media
106106
)
107107
else:
108-
media = utils.get_input_media_from_file_id(media.media, 5)
108+
media = utils.get_input_media_from_file_id(media.media, media.file_ref, 5)
109109

110110
return await self.send(
111111
functions.messages.EditInlineBotMessage(

pyrogram/client/methods/messages/edit_message_media.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ async def edit_message_media(
100100
url=media.media
101101
)
102102
else:
103-
media = utils.get_input_media_from_file_id(media.media, 2)
103+
media = utils.get_input_media_from_file_id(media.media, media.file_ref, 2)
104104
elif isinstance(media, InputMediaVideo):
105105
if os.path.exists(media.media):
106106
media = await self.send(
@@ -137,7 +137,7 @@ async def edit_message_media(
137137
url=media.media
138138
)
139139
else:
140-
media = utils.get_input_media_from_file_id(media.media, 4)
140+
media = utils.get_input_media_from_file_id(media.media, media.file_ref, 4)
141141
elif isinstance(media, InputMediaAudio):
142142
if os.path.exists(media.media):
143143
media = await self.send(
@@ -173,7 +173,7 @@ async def edit_message_media(
173173
url=media.media
174174
)
175175
else:
176-
media = utils.get_input_media_from_file_id(media.media, 9)
176+
media = utils.get_input_media_from_file_id(media.media, media.file_ref, 9)
177177
elif isinstance(media, InputMediaAnimation):
178178
if os.path.exists(media.media):
179179
media = await self.send(
@@ -211,7 +211,7 @@ async def edit_message_media(
211211
url=media.media
212212
)
213213
else:
214-
media = utils.get_input_media_from_file_id(media.media, 10)
214+
media = utils.get_input_media_from_file_id(media.media, media.file_ref, 10)
215215
elif isinstance(media, InputMediaDocument):
216216
if os.path.exists(media.media):
217217
media = await self.send(
@@ -242,7 +242,7 @@ async def edit_message_media(
242242
url=media.media
243243
)
244244
else:
245-
media = utils.get_input_media_from_file_id(media.media, 5)
245+
media = utils.get_input_media_from_file_id(media.media, media.file_ref, 5)
246246

247247
r = await self.send(
248248
functions.messages.EditMessage(

pyrogram/client/methods/messages/send_animation.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ async def send_animation(
3030
self,
3131
chat_id: Union[int, str],
3232
animation: str,
33+
file_ref: str = None,
3334
caption: str = "",
3435
unsave: bool = False,
3536
parse_mode: Union[str, None] = object,
@@ -63,6 +64,10 @@ async def send_animation(
6364
pass an HTTP URL as a string for Telegram to get an animation from the Internet, or
6465
pass a file path as string to upload a new animation that exists on your local machine.
6566
67+
file_ref (``str``, *optional*):
68+
A valid file reference obtained by a recently fetched media message.
69+
To be used in combination with a file id in case a file reference is needed.
70+
6671
caption (``str``, *optional*):
6772
Animation caption, 0-1024 characters.
6873
@@ -176,7 +181,7 @@ def progress(current, total):
176181
url=animation
177182
)
178183
else:
179-
media = utils.get_input_media_from_file_id(animation, 10)
184+
media = utils.get_input_media_from_file_id(animation, file_ref, 10)
180185

181186
while True:
182187
try:
@@ -209,7 +214,7 @@ def progress(current, total):
209214

210215
if unsave:
211216
document = message.animation or message.document
212-
document_id = utils.get_input_media_from_file_id(document.file_id).id
217+
document_id = utils.get_input_media_from_file_id(document.file_id, document.file_ref).id
213218

214219
await self.send(
215220
functions.messages.SaveGif(

pyrogram/client/methods/messages/send_audio.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ async def send_audio(
3030
self,
3131
chat_id: Union[int, str],
3232
audio: str,
33+
file_ref: str = None,
3334
caption: str = "",
3435
parse_mode: Union[str, None] = object,
3536
duration: int = 0,
@@ -63,6 +64,10 @@ async def send_audio(
6364
pass an HTTP URL as a string for Telegram to get an audio file from the Internet, or
6465
pass a file path as string to upload a new audio file that exists on your local machine.
6566
67+
file_ref (``str``, *optional*):
68+
A valid file reference obtained by a recently fetched media message.
69+
To be used in combination with a file id in case a file reference is needed.
70+
6671
caption (``str``, *optional*):
6772
Audio caption, 0-1024 characters.
6873
@@ -173,7 +178,7 @@ def progress(current, total):
173178
url=audio
174179
)
175180
else:
176-
media = utils.get_input_media_from_file_id(audio, 9)
181+
media = utils.get_input_media_from_file_id(audio, file_ref, 9)
177182

178183
while True:
179184
try:

pyrogram/client/methods/messages/send_cached_media.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ async def send_cached_media(
2828
self,
2929
chat_id: Union[int, str],
3030
file_id: str,
31+
file_ref: str = None,
3132
caption: str = "",
3233
parse_mode: Union[str, None] = object,
3334
disable_notification: bool = None,
@@ -56,6 +57,10 @@ async def send_cached_media(
5657
Media to send.
5758
Pass a file_id as string to send a media that exists on the Telegram servers.
5859
60+
file_ref (``str``, *optional*):
61+
A valid file reference obtained by a recently fetched media message.
62+
To be used in combination with a file id in case a file reference is needed.
63+
5964
caption (``bool``, *optional*):
6065
Media caption, 0-1024 characters.
6166
@@ -92,7 +97,7 @@ async def send_cached_media(
9297
r = await self.send(
9398
functions.messages.SendMedia(
9499
peer=await self.resolve_peer(chat_id),
95-
media=utils.get_input_media_from_file_id(file_id),
100+
media=utils.get_input_media_from_file_id(file_id, file_ref),
96101
silent=disable_notification or None,
97102
reply_to_msg_id=reply_to_message_id,
98103
random_id=self.rnd_id(),

0 commit comments

Comments
 (0)