o
    "hR                     @   sd  d Z ddlmZ ddlmZmZmZmZmZm	Z	m
Z
mZ ddlmZmZ er.ddlmZmZ ede	edeedf d	Zed
ee deee ef fddZed
ededef fddZd
ee deee e	edeedf f fddZd
edee fddZd
ee defddZ				dde	edf deed  dee dedede	edef fddZdS )a  This module contains helper functions related to handling of files.

.. versionchanged:: 20.0
   Previously, the contents of this module were available through the (no longer existing)
   module ``telegram._utils.helpers``.

Warning:
    Contents of this module are intended to be used internally by the library and *not* by the
    user. Changes to this module are not considered breaking changes and may not be documented in
    the changelog.
    )Path)IOTYPE_CHECKINGAnyOptionalTypeVarUnioncastoverload)	FileInputFilePathInput)	InputFileTelegramObject_Tr   N)boundobjreturnc                 C      d S N r   r   r   H/var/www/html/venv/lib/python3.10/site-packages/telegram/_utils/files.py	load_file*      r   c                 C   r   r   r   r   r   r   r   r   .   r   c                 C   sJ   | du rdS z|   }W n ty   dtd| f Y S w t| }||fS )ztIf the input is a file handle, read the data and name and return it. Otherwise, return
    the input unchanged.
    N)NNz"Union[bytes, InputFile, str, Path])readAttributeErrorr	   guess_file_name)r   contentsfilenamer   r   r   r   2   s   c                 C   s&   t | drt| jtst| jjS dS )zgIf the input is a file handle, read name and return it. Otherwise, return
    the input unchanged.
    nameN)hasattr
isinstancer   intr   r   r   r   r   r   E   s   r   c                 C   s4   | du rdS t | }z| W S  ty   Y dS w )zw
    Checks if a given string is a file on local system.

    Args:
        obj (:obj:`str`): The string to check.
    NF)r   is_file	Exception)r   pathr   r   r   is_local_fileO   s   
r&   F
file_inputr   tg_typer   attach
local_modec                 C   s   ddl m} t| tr| dr|std| S t| ttfr<t| r:t| }|r/| 	 S ||j
dd||dS | S t| trH|| ||dS t| drW|td	| ||dS |rat| |ra| jS | S )
a  
    Parses input for sending files:

    * For string input, if the input is an absolute path of a local file:

        * if ``local_mode`` is ``True``, adds the ``file://`` prefix. If the input is a relative
        path of a local file, computes the absolute path and adds the ``file://`` prefix.
        * if ``local_mode`` is ``False``, loads the file as binary data and builds an
          :class:`InputFile` from that

      Returns the input unchanged, otherwise.
    * :class:`pathlib.Path` objects are treated the same way as strings.
    * For IO and bytes input, returns an :class:`telegram.InputFile`.
    * If :attr:`tg_type` is specified and the input is of that type, returns the ``file_id``
      attribute.

    Args:
        file_input (:obj:`str` | :obj:`bytes` | :term:`file object` | :class:`~telegram.InputFile`            | Telegram media object): The input to parse.
        tg_type (:obj:`type`, optional): The Telegram media type the input can be. E.g.
            :class:`telegram.Animation`.
        filename (:obj:`str`, optional): The filename. Only relevant in case an
            :class:`telegram.InputFile` is returned.
        attach (:obj:`bool`, optional): Pass :obj:`True` if the parameter this file belongs to in
            the request to Telegram should point to the multipart data via an ``attach://`` URI.
            Defaults to `False`. Only relevant if an :class:`telegram.InputFile` is returned.
        local_mode (:obj:`bool`, optional): Pass :obj:`True` if the bot is running an api server
            in ``--local`` mode.

    Returns:
        :obj:`str` | :class:`telegram.InputFile` | :obj:`object`: The parsed input or the untouched
        :attr:`file_input`, in case it's no valid file input.
    r   )r   zfile://zBSpecified file input is a file URI, but local mode is not enabled.rb)mode)r   r)   r   r   )telegramr   r!   str
startswith
ValueErrorr   r&   absoluteas_uriopenbytesr    r	   file_id)r'   r(   r   r)   r*   r   r%   r   r   r   parse_file_input`   s&   )

r6   )NNFF)__doc__pathlibr   typingr   r   r   r   r   r   r	   r
   telegram._utils.typesr   r   r-   r   r   r4   r.   r   tupler   r   boolr&   typer6   r   r   r   r   <module>   sF   ($



