
    di=                         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
rddlmZ  G 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                       e Zd ZdZdZ	 	 ddddedededz  dedz  d	edz  f
 fd
ZdefdZ	de
de
fdZ	 deeeeddedz  dee         dee         dee         dee         def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Z	 deeeeddedz  dee         dee         dee         dee         defdZddZ x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                   t                                          |           t          |          | _        t          |          | _        || _        || _        d | _        | j        f| _        | 	                                 d S )Nr   )
super__init__strr   r   r   r   r   	_id_attrs_freeze)selfr   r   r   r   r   	__class__s         Q/root/projects/qq-shell/venv/lib/python3.11/site-packages/telegram/_files/file.pyr   zFile.__init__U   ss     	J///  LL#&~#6#6%.%.48-/    returnc           	          t          j        t          | j                            }t          j        t          j        |j        |j        t          j        |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   sress     r    _get_encoded_urlzFile._get_encoded_urlm   sc    $S%8%899&$T[,*<TY*G*GUYUb 
 
 	
r!   bufc                     t          t          | j        j                  t          | j        j                  |          S N)r   r   r   secrethash)r   r0   s     r    _prepare_decryptzFile._prepare_decryptv   s1    y!2!9::IdFWF\<]<]_bcccr!   read_timeoutwrite_timeoutconnect_timeoutpool_timeoutcustom_pathr7   r8   r9   r:   c                  K   | j         st          d          t          | j                   }|rdn|                                 }|r| j        rt          | j                   }|                     |                                          }	|t          |          }
n,t          t          |j	                  dz   |j
        z             }
|
                    |	           |
S |8|r6t          j        | j         t          |                     t          |          S |rt          |          }n<|rt          | j                   S t          t          | j                   j
                  }|                                 j                            |||||           d{V }	| 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_r6   )r   RuntimeErrorr
   r/   r   r   r5   
read_bytesr   parentnamewrite_bytesshutilcopyfileget_botrequestretrieve)r   r;   r7   r8   r9   r:   
local_fileurlfile_to_decryptr0   r+   filenames               r    download_to_drivezFile.download_to_drivey   s     D ~ 	\Z[[["4>22
 =ddd&;&;&=&=  	$+ 	"4>22O''(B(B(D(DEEC&K((C 677-G/J^^__S!!!K"z"ODNC,<,<===$$$ 	7K((HH 	7'''D00566HLLNN*33%'+% 4 
 
 
 
 
 
 
 
  	-'',,CS!!!r!   outc                  K   | j         st          d          t          | j                   }|rdn|                                 }|rt	          | j                   nd}|r|                                }	n7|                                 j                            |||||           d{V }	| 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.
        r=   Nr6   )r   r>   r
   r/   r   r?   rE   rF   rG   r   r5   write)
r   rM   r7   r8   r9   r:   rH   rI   r+   r0   s
             r    download_to_memoryzFile.download_to_memory   s     ` ~ 	\Z[[["4>22
 =ddd&;&;&=&='1;tDN###t 		//##CC.77)+ /) 8        C  	-'',,C		#r!   c                  K   | j         st          d          |t                      }t          | j                   r't	          | j                                                   }nI|                                 j                            | 	                                ||||           d{V }| j
        r)|                    |                     |                     n|                    |           |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.

        r=   Nr6   )r   r>   	bytearrayr
   r   r?   rE   rF   rG   r/   r   extendr5   )r   r0   r7   r8   r9   r:   
bytes_datas          r    download_as_bytearrayzFile.download_as_bytearray'  s     b ~ 	\Z[[[;++C(( 		dn--88::JJ#||~~5>>%%'')+ /)  ?          J  	#JJt,,Z889999JJz"""
r!   credentialsr   c                     || _         dS )zSets the passport credentials for the file.

        Args:
            credentials (:class:`telegram.FileCredentials`): The credentials.
        N)r   )r   rV   s     r    set_credentialszFile.set_credentialsn  s     (r!   )NNr2   )rV   r   r"   N)__name__
__module____qualname____doc__	__slots__r   intr   r   r/   bytesr5   r	   r   r   floatr   rL   r   rP   rR   rU   rX   __classcell__)r   s   @r    r   r   %   s       % %NI !% $ '+    :	
 : tO     0
# 
 
 
 
dE de d d d d
 -1h )5)5+7(4h h h"T)h uo	h
  h "%h uoh 
h h h h\ )5)5+7(4B B BB uo	B
  B "%B uoB 
B B B BL !%E )5)5+7(4E E EE uo	E
  E "%E uoE 
E E E EN( ( ( ( ( ( ( (r!   r   )r\   rC   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    <module>rn      s#  & F E  # # # # # #             * * * * * * * * 2 2 2 2 2 2 3 3 3 3 3 3 5 5 5 5 5 5 / / / / / / C C C C C C C C C C )((((((O( O( O( O( O(> O( O( O( O( O(r!   