o
    ZzjÆ=  ã                   @   s¨   d Z ddlZddlmZ ddlmZ ddlmZ ddl	m
Z
mZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZmZmZ e
rJddlmZ G dd„ deƒZdS )z?This module contains an object that represents a Telegram File.é    N)Ú	b64decode)ÚPath)ÚTYPE_CHECKINGÚBinaryIO)Údecrypt)ÚTelegramObject)ÚDEFAULT_NONE)Úis_local_file)ÚFilePathInputÚJSONDictÚODVInput)ÚFileCredentialsc                       sF  e Zd ZdZdZ		d#ddœdedededB dedB d	edB f
‡ fd
d„Zdefdd„Z	de
de
fdd„Z	d$eeeedœdedB dee dee dee dee defdd„Zeeeedœdedee dee dee dee ddfdd„Z	d$eeeedœdedB dee dee dee dee defdd„Zd%d!d"„Z‡  ZS )&ÚFilea´  
    This object represents a file ready to be downloaded. The file can be e.g. downloaded with
    :attr:`download_to_drive`. It is guaranteed that the link will be valid for at least 1 hour.
    When the link expires, a new one can be requested by calling :meth:`telegram.Bot.get_file`.

    Objects of this class are comparable in terms of equality. Two objects of this class are
    considered equal, if their :attr:`file_unique_id` is equal.

    .. versionchanged:: 20.0
        ``download`` was split into :meth:`download_to_drive` and :meth:`download_to_memory`.

    Note:
        * Maximum file size to download is
          :tg-const:`telegram.constants.FileSizeLimit.FILESIZE_DOWNLOAD`.
        * If you obtain an instance of this class from :attr:`telegram.PassportFile.get_file`,
          then it will automatically be decrypted as it downloads when you call e.g.
          :meth:`download_to_drive`.

    Args:
        file_id (:obj:`str`): Identifier for this file, which can be used to download
            or reuse the file.
        file_unique_id (:obj:`str`): Unique identifier for this file, which
            is supposed to be the same over time and for different bots.
            Can't be used to download or reuse the file.
        file_size (:obj:`int`, optional): File size in bytes, if known.
        file_path (:obj:`str`, optional): File path. Use e.g. :meth:`download_to_drive` to get the
            file.

    Attributes:
        file_id (:obj:`str`): Identifier for this file, which can be used to download
            or reuse the file.
        file_unique_id (:obj:`str`): Unique identifier for this file, which
            is supposed to be the same over time and for different bots.
            Can't be used to download or reuse the file.
        file_size (:obj:`int`): Optional. File size in bytes, if known.
        file_path (:obj:`str`): Optional. File path. Use e.g. :meth:`download_to_drive` to get the
            file.
    )Ú_credentialsÚfile_idÚ	file_pathÚ	file_sizeÚfile_unique_idN©Ú
api_kwargsr   r   r   r   r   c                   sJ   t ƒ j|d� t|ƒ| _t|ƒ| _|| _|| _d | _| jf| _|  	¡  d S )Nr   )
ÚsuperÚ__init__Ústrr   r   r   r   r   Ú	_id_attrsÚ_freeze)Úselfr   r   r   r   r   ©Ú	__class__© úO/var/www/kodo/tsheker/venv/lib/python3.10/site-packages/telegram/_files/file.pyr   U   s   	


zFile.__init__Úreturnc              	   C   s8   t  t| jƒ¡}t  t  |j|jt  |j	¡|j
|j¡¡S )zPConvert any UTF-8 char in :obj:`File.file_path` into a url encoded ASCII string.)Úurllib_parseÚurlsplitr   r   Ú
urlunsplitÚSplitResultÚschemeÚnetlocÚquoteÚpathÚqueryÚfragment)r   Úsresr   r   r   Ú_get_encoded_urlm   s   ÿÿzFile._get_encoded_urlÚbufc                 C   s   t t| jjƒt| jjƒ|ƒS ©N)r   r   r   ÚsecretÚhash)r   r-   r   r   r   Ú_prepare_decryptv   s   zFile._prepare_decrypt©Úread_timeoutÚwrite_timeoutÚconnect_timeoutÚpool_timeoutÚcustom_pathr3   r4   r5   r6   c                Ã   s  �| j stdƒ‚t| j ƒ}|rdn|  ¡ }|rB| jrBt| j ƒ}|  | ¡ ¡}	|dur/t|ƒ}
ntt|j	ƒd |j
 ƒ}
|
 |	¡ |
S |durU|rUt | j t|ƒ¡ t|ƒS |r\t|ƒ}n|rct| j ƒS tt| j ƒj
ƒ}|  ¡ jj|||||d�I dH }	| jrƒ|  |	¡}	| |	¡ |S )aó  
        Download this file. By default, the file is saved in the current working directory with
        :attr:`file_path` as file name. If :paramref:`custom_path` is supplied as a :obj:`str` or
        :obj:`pathlib.Path`, it will be saved to that path.

        Note:
            If :paramref:`custom_path` isn't provided and :attr:`file_path` is the path of a
            local file (which is the case when a Bot API Server is running in local mode), this
            method will just return the path.

            The only exception to this are encrypted files (e.g. a passport file). For these, a
            file with the prefix `decrypted_` will be created in the same directory as the
            original file in order to decrypt the file without changing the existing one
            in-place.

        .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>`

        .. versionchanged:: 20.0

            * :paramref:`custom_path` parameter now also accepts :class:`pathlib.Path` as argument.
            * Returns :class:`pathlib.Path` object in cases where previously a :obj:`str` was
              returned.
            * This method was previously called ``download``. It was split into
              :meth:`download_to_drive` and :meth:`download_to_memory`.

        .. versionchanged:: 21.7
            Raises :exc:`RuntimeError` if :attr:`file_path` is not set. Note that files without
            a :attr:`file_path` could never be downloaded, as this attribute is mandatory for that
            operation.

        Args:
            custom_path (:class:`pathlib.Path` | :obj:`str` , optional): The path where the file
                will be saved to. If not specified, will be saved in the current working directory
                with :attr:`file_path` as file name or the :attr:`file_id` if :attr:`file_path`
                is not set.

        Keyword Args:
            read_timeout (:obj:`float` | :obj:`None`, optional): Value to pass to
                :paramref:`telegram.request.BaseRequest.post.read_timeout`. Defaults to
                :attr:`~telegram.request.BaseRequest.DEFAULT_NONE`.
            write_timeout (:obj:`float` | :obj:`None`, optional): Value to pass to
                :paramref:`telegram.request.BaseRequest.post.write_timeout`. Defaults to
                :attr:`~telegram.request.BaseRequest.DEFAULT_NONE`.
            connect_timeout (:obj:`float` | :obj:`None`, optional): Value to pass to
                :paramref:`telegram.request.BaseRequest.post.connect_timeout`. Defaults to
                :attr:`~telegram.request.BaseRequest.DEFAULT_NONE`.
            pool_timeout (:obj:`float` | :obj:`None`, optional): Value to pass to
                :paramref:`telegram.request.BaseRequest.post.pool_timeout`. Defaults to
                :attr:`~telegram.request.BaseRequest.DEFAULT_NONE`.

        Returns:
            :class:`pathlib.Path`: Returns the Path object the file was downloaded to.

        Raises:
            RuntimeError: If :attr:`file_path` is not set.

        ú9No `file_path` available for this file. Can not download.Nz/decrypted_r2   )r   ÚRuntimeErrorr	   r,   r   r   r1   Ú
read_bytesr   ÚparentÚnameÚwrite_bytesÚshutilÚcopyfileÚget_botÚrequestÚretrieve)r   r7   r3   r4   r5   r6   Ú
local_fileÚurlÚfile_to_decryptr-   r(   Úfilenamer   r   r   Údownload_to_drivey   s@   €B







û

zFile.download_to_driveÚoutc          
      Ã   sˆ   �| j stdƒ‚t| j ƒ}|rdn|  ¡ }|rt| j ƒnd}|r%| ¡ }	n|  ¡ jj|||||d�I dH }	| j	r=|  
|	¡}	| |	¡ dS )aÕ  
        Download this file into memory. :paramref:`out` needs to be supplied with a
        :obj:`io.BufferedIOBase`, the file contents will be saved to that object using the
        :obj:`out.write<io.BufferedIOBase.write>` method.

        .. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>`

        Hint:
            If you want to immediately read the data from ``out`` after calling this method, you
            should call ``out.seek(0)`` first. See also :meth:`io.IOBase.seek`.

        .. versionadded:: 20.0

        .. versionchanged:: 21.7
            Raises :exc:`RuntimeError` if :attr:`file_path` is not set. Note that files without
            a :attr:`file_path` could never be downloaded, as this attribute is mandatory for that
            operation.

        Args:
            out (:obj:`io.BufferedIOBase`): A file-like object. Must be opened for writing in
                binary mode.

        Keyword Args:
            read_timeout (:obj:`float` | :obj:`None`, optional): Value to pass to
                :paramref:`telegram.request.BaseRequest.post.read_timeout`. Defaults to
                :attr:`~telegram.request.BaseRequest.DEFAULT_NONE`.
            write_timeout (:obj:`float` | :obj:`None`, optional): Value to pass to
                :paramref:`telegram.request.BaseRequest.post.write_timeout`. Defaults to
                :attr:`~telegram.request.BaseRequest.DEFAULT_NONE`.
            connect_timeout (:obj:`float` | :obj:`None`, optional): Value to pass to
                :paramref:`telegram.request.BaseRequest.post.connect_timeout`. Defaults to
                :attr:`~telegram.request.BaseRequest.DEFAULT_NONE`.
            pool_timeout (:obj:`float` | :obj:`None`, optional): Value to pass to
                :paramref:`telegram.request.BaseRequest.post.pool_timeout`. Defaults to
                :attr:`~telegram.request.BaseRequest.DEFAULT_NONE`.

        Raises:
            RuntimeError: If :attr:`file_path` is not set.
        r8   Nr2   )r   r9   r	   r,   r   r:   r@   rA   rB   r   r1   Úwrite)
r   rH   r3   r4   r5   r6   rC   rD   r(   r-   r   r   r   Údownload_to_memoryã   s$   €0


û
zFile.download_to_memoryc                Ã   s„   �| j stdƒ‚|du rtƒ }t| j ƒrt| j ƒ ¡ }n|  ¡ jj|  	¡ ||||d�I dH }| j
r;| |  |¡¡ |S | |¡ |S )a  Download this file and return it as a bytearray.

        .. versionchanged:: 21.7
            Raises :exc:`RuntimeError` if :attr:`file_path` is not set. Note that files without
            a :attr:`file_path` could never be downloaded, as this attribute is mandatory for that
            operation.

        Args:
            buf (:obj:`bytearray`, optional): Extend the given bytearray with the downloaded data.

        Keyword Args:
            read_timeout (:obj:`float` | :obj:`None`, optional): Value to pass to
                :paramref:`telegram.request.BaseRequest.post.read_timeout`. Defaults to
                :attr:`~telegram.request.BaseRequest.DEFAULT_NONE`.

                .. versionadded:: 20.0
            write_timeout (:obj:`float` | :obj:`None`, optional): Value to pass to
                :paramref:`telegram.request.BaseRequest.post.write_timeout`. Defaults to
                :attr:`~telegram.request.BaseRequest.DEFAULT_NONE`.

                .. versionadded:: 20.0
            connect_timeout (:obj:`float` | :obj:`None`, optional): Value to pass to
                :paramref:`telegram.request.BaseRequest.post.connect_timeout`. Defaults to
                :attr:`~telegram.request.BaseRequest.DEFAULT_NONE`.

                .. versionadded:: 20.0
            pool_timeout (:obj:`float` | :obj:`None`, optional): Value to pass to
                :paramref:`telegram.request.BaseRequest.post.pool_timeout`. Defaults to
                :attr:`~telegram.request.BaseRequest.DEFAULT_NONE`.

                .. versionadded:: 20.0

        Returns:
            :obj:`bytearray`: The same object as :paramref:`buf` if it was specified. Otherwise a
            newly allocated :obj:`bytearray`.

        Raises:
            RuntimeError: If :attr:`file_path` is not set.

        r8   Nr2   )r   r9   Ú	bytearrayr	   r   r:   r@   rA   rB   r,   r   Úextendr1   )r   r-   r3   r4   r5   r6   Ú
bytes_datar   r   r   Údownload_as_bytearray'  s&   €1

û
ÿzFile.download_as_bytearrayÚcredentialsr   c                 C   s
   || _ dS )z‘Sets the passport credentials for the file.

        Args:
            credentials (:class:`telegram.FileCredentials`): The credentials.
        N)r   )r   rO   r   r   r   Úset_credentialsn  s   
zFile.set_credentials)NNr.   )rO   r   r    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r   Úintr   r   r,   Úbytesr1   r   r
   r   Úfloatr   rG   r   rJ   rK   rN   rP   Ú__classcell__r   r   r   r   r   %   s˜    'ûùþýüûù	þùþüûúù
ønùþüûúù
øFþùþüûúù
øGr   )rT   r>   Úurllib.parseÚparser!   Úbase64r   Úpathlibr   Útypingr   r   Útelegram._passport.credentialsr   Útelegram._telegramobjectr   Útelegram._utils.defaultvaluer   Útelegram._utils.filesr	   Útelegram._utils.typesr
   r   r   Útelegramr   r   r   r   r   r   Ú<module>   s   