botapi-py 1.4.9__tar.gz → 1.4.10__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: botapi-py
3
- Version: 1.4.9
3
+ Version: 1.4.10
4
4
  Summary: A simple and flexible Python library to conveniently build fast Telegram bots using the Bot API.
5
5
  Requires-Dist: httpx>=0.28.1
6
6
  Requires-Dist: pydantic>=2.12.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "botapi-py"
3
- version = "1.4.9"
3
+ version = "1.4.10"
4
4
  description = "A simple and flexible Python library to conveniently build fast Telegram bots using the Bot API."
5
5
  # readme = "README.md"
6
6
  # authors = [
@@ -49,7 +49,19 @@ class BaseBot:
49
49
  url += 'test/'
50
50
  url += method
51
51
  return url
52
-
52
+
53
+ def _compose_api_file_url(self, file_path: str) -> str:
54
+ '''
55
+ Composes the URL for file downloads from the Telegram Bot API.
56
+ '''
57
+ # https://api.telegram.org/file/bot<token>/<file_path>
58
+ # https://api.telegram.org/file/bot<token>/test/<file_path>
59
+ url = f'{self.api_url}/file/bot{self.token}/'
60
+ if self.test_server:
61
+ url += 'test/'
62
+ url += file_path
63
+ return url
64
+
53
65
  def _convert_data(self, data: dict[str, Any]) -> tuple[dict[str, Any], MultipartFiles]:
54
66
  new_data: dict[str, Any] = {}
55
67
  files: MultipartFiles = {} # (filename, file_content, mime_type)
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Optional, Union, List, cast
3
+ from typing import Optional, Union, List, cast, overload
4
4
 
5
5
  from . import enums
6
6
  from . import types
@@ -243,3 +243,51 @@ class BotShortcuts:
243
243
  case _:
244
244
  raise ValueError(f'Unknown media type: {file_type}')
245
245
 
246
+ @overload
247
+ async def download_file(
248
+ self,
249
+ file: types.File,
250
+ destination_path: str
251
+ ) -> None: ...
252
+
253
+ @overload
254
+ async def download_file(
255
+ self,
256
+ file: types.File,
257
+ destination_path: None = None
258
+ ) -> bytes: ...
259
+
260
+ async def download_file(
261
+ self,
262
+ file: types.File,
263
+ destination_path: Optional[str] = None
264
+ ) -> bytes | None:
265
+ '''
266
+ Convenience method to download a file from Telegram servers.
267
+
268
+ Call this method with a `File` object obtained via `get_file`.
269
+
270
+ :param file: File object to download.
271
+ :param destination_path: Optional path to save the downloaded file. If not provided, the file content will be returned as bytes.
272
+ :return: The file content as bytes if destination_path is not provided, otherwise None.
273
+ '''
274
+ self = cast(methods.Bot, self)
275
+
276
+ file_path = file.file_path
277
+ if not file_path:
278
+ raise ValueError('The file does not have a valid file_path to download.')
279
+
280
+ # https://api.telegram.org/file/bot<token>/<file_path>
281
+ # https://api.telegram.org/file/bot<token>/test/<file_path>
282
+ url = self._compose_api_file_url(file_path=file_path) # pyright: ignore[reportPrivateUsage]
283
+
284
+ response = await self.session.get(url)
285
+ content = response.content
286
+
287
+ if destination_path:
288
+ with open(destination_path, 'wb') as f:
289
+ f.write(content)
290
+ return None
291
+
292
+ return content
293
+