diff --git a/docs/source/pyrogram/Client.rst b/docs/source/pyrogram/Client.rst index 98dc7959..e879db71 100644 --- a/docs/source/pyrogram/Client.rst +++ b/docs/source/pyrogram/Client.rst @@ -50,9 +50,12 @@ Client change_cloud_password remove_cloud_password add_contacts + get_contacts delete_contacts get_inline_bot_results send_inline_bot_result + answer_callback_query get_users + get_chat get_messages - answer_callback_query \ No newline at end of file + get_history \ No newline at end of file diff --git a/pyrogram/client/client.py b/pyrogram/client/client.py index 72259d8f..561b70ec 100644 --- a/pyrogram/client/client.py +++ b/pyrogram/client/client.py @@ -1259,100 +1259,3 @@ class Client(Methods, BaseClient): pass # Don't stop sessions, they are now cached and kept online # session.stop() TODO: Remove this branch - def download_media(self, - message: pyrogram_types.Message or str, - file_name: str = "", - block: bool = True, - progress: callable = None, - progress_args: tuple = None): - """Use this method to download the media from a Message. - - Args: - message (:obj:`Message ` | ``str``): - Pass a Message containing the media, the media itself (message.audio, message.video, ...) or - the file id as string. - - file_name (``str``, *optional*): - A custom *file_name* to be used instead of the one provided by Telegram. - By default, all files are downloaded in the *downloads* folder in your working directory. - You can also specify a path for downloading files in a custom location: paths that end with "/" - are considered directories. All non-existent folders will be created automatically. - - block (``bool``, *optional*): - Blocks the code execution until the file has been downloaded. - Defaults to True. - - progress (``callable``): - Pass a callback function to view the download progress. - The function must take *(client, current, total, \*args)* as positional arguments (look at the section - below for a detailed description). - - progress_args (``tuple``): - Extra custom arguments for the progress callback function. Useful, for example, if you want to pass - a chat_id and a message_id in order to edit a message with the updated progress. - - Other Parameters: - client (:obj:`Client `): - The Client itself, useful when you want to call other API methods inside the callback function. - - current (``int``): - The amount of bytes downloaded so far. - - total (``int``): - The size of the file. - - *args (``tuple``): - Extra custom arguments as defined in the *progress_args* parameter. - You can either keep *\*args* or add every single extra argument in your function signature. - - Returns: - On success, the absolute path of the downloaded file as string is returned, None otherwise. - - Raises: - :class:`Error ` - """ - if isinstance(message, pyrogram_types.Message): - if message.photo: - media = message.photo[-1] - elif message.audio: - media = message.audio - elif message.document: - media = message.document - elif message.video: - media = message.video - elif message.voice: - media = message.voice - elif message.video_note: - media = message.video_note - elif message.sticker: - media = message.sticker - else: - return - elif isinstance(message, ( - pyrogram_types.PhotoSize, - pyrogram_types.Audio, - pyrogram_types.Document, - pyrogram_types.Video, - pyrogram_types.Voice, - pyrogram_types.VideoNote, - pyrogram_types.Sticker - )): - media = message - elif isinstance(message, str): - media = pyrogram_types.Document( - file_id=message, - file_size=0, - mime_type="" - ) - else: - return - - done = Event() - path = [None] - - self.download_queue.put((media, file_name, done, progress, progress_args, path)) - - if block: - done.wait() - - return path[0] diff --git a/pyrogram/client/methods/__init__.py b/pyrogram/client/methods/__init__.py index ea249e3f..396fd3c2 100644 --- a/pyrogram/client/methods/__init__.py +++ b/pyrogram/client/methods/__init__.py @@ -20,6 +20,7 @@ from .bots import Bots from .chats import Chats from .contacts import Contacts from .decorators import Decorators +from .download_media import DownloadMedia from .messages import Messages from .password import Password from .users import Users @@ -31,6 +32,7 @@ class Methods( Password, Chats, Users, + DownloadMedia, Messages, Decorators ): diff --git a/pyrogram/client/methods/download_media.py b/pyrogram/client/methods/download_media.py new file mode 100644 index 00000000..d878cc62 --- /dev/null +++ b/pyrogram/client/methods/download_media.py @@ -0,0 +1,122 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-2018 Dan Tès +# +# This file is part of Pyrogram. +# +# Pyrogram is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Pyrogram is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Pyrogram. If not, see . + +from threading import Event + +from pyrogram.client import types as pyrogram_types +from ..ext import BaseClient + + +class DownloadMedia(BaseClient): + def download_media(self, + message: pyrogram_types.Message or str, + file_name: str = "", + block: bool = True, + progress: callable = None, + progress_args: tuple = None): + """Use this method to download the media from a Message. + + Args: + message (:obj:`Message ` | ``str``): + Pass a Message containing the media, the media itself (message.audio, message.video, ...) or + the file id as string. + + file_name (``str``, *optional*): + A custom *file_name* to be used instead of the one provided by Telegram. + By default, all files are downloaded in the *downloads* folder in your working directory. + You can also specify a path for downloading files in a custom location: paths that end with "/" + are considered directories. All non-existent folders will be created automatically. + + block (``bool``, *optional*): + Blocks the code execution until the file has been downloaded. + Defaults to True. + + progress (``callable``): + Pass a callback function to view the download progress. + The function must take *(client, current, total, \*args)* as positional arguments (look at the section + below for a detailed description). + + progress_args (``tuple``): + Extra custom arguments for the progress callback function. Useful, for example, if you want to pass + a chat_id and a message_id in order to edit a message with the updated progress. + + Other Parameters: + client (:obj:`Client `): + The Client itself, useful when you want to call other API methods inside the callback function. + + current (``int``): + The amount of bytes downloaded so far. + + total (``int``): + The size of the file. + + *args (``tuple``): + Extra custom arguments as defined in the *progress_args* parameter. + You can either keep *\*args* or add every single extra argument in your function signature. + + Returns: + On success, the absolute path of the downloaded file as string is returned, None otherwise. + + Raises: + :class:`Error ` + """ + if isinstance(message, pyrogram_types.Message): + if message.photo: + media = message.photo[-1] + elif message.audio: + media = message.audio + elif message.document: + media = message.document + elif message.video: + media = message.video + elif message.voice: + media = message.voice + elif message.video_note: + media = message.video_note + elif message.sticker: + media = message.sticker + else: + return + elif isinstance(message, ( + pyrogram_types.PhotoSize, + pyrogram_types.Audio, + pyrogram_types.Document, + pyrogram_types.Video, + pyrogram_types.Voice, + pyrogram_types.VideoNote, + pyrogram_types.Sticker + )): + media = message + elif isinstance(message, str): + media = pyrogram_types.Document( + file_id=message, + file_size=0, + mime_type="" + ) + else: + return + + done = Event() + path = [None] + + self.download_queue.put((media, file_name, done, progress, progress_args, path)) + + if block: + done.wait() + + return path[0]