
    Şib                       d dl m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
 ddlmZmZmZ dd	lmZ d
dlmZmZ d
dlmZmZ  edd           G d d                      Z G d dee          Z ee          d             ZdS )    )annotationsN)ABC)	dataclass)NoneType)Any   )RequestHandlerregister_preferenceRequest)UnsupportedRequest   )classpropertyjoin_nonempty)std_headersHTTPHeaderDictT)orderfrozenc                  x    e Zd ZU dZdZded<   dZded<   dZded<   dZded<   d Z	dd
Z
d Zedd            ZdS )ImpersonateTargeta<  
    A target for browser impersonation.

    Parameters:
    @param client: the client to impersonate
    @param version: the client version to impersonate
    @param os: the client OS to impersonate
    @param os_version: the client OS version to impersonate

    Note: None is used to indicate to match any.

    Nz
str | Noneclientversionos
os_versionc                ~    | j         r| j        st          d          | j        r| j        st          d          d S d S )Nz$client is required if version is setz#os is required if os_version is set)r   r   
ValueErrorr   r   selfs    bC:\Users\betacode\Desktop\descargarYoutube\venv\Lib\site-packages\yt_dlp/networking/impersonate.py__post_init__zImpersonateTarget.__post_init__"   sb    < 	E 	ECDDD? 	D47 	DBCCC	D 	D 	D 	D    targetc                @   t          |t                    sdS | j        d u s|j        d u s| j        |j        k    oe| j        d u p|j        d u p| j        |j        k    oC| j        d u p|j        d u p| j        |j        k    o!| j        d u p|j        d u p| j        |j        k    S )NF)
isinstancer   r   r   r   r   r   r!   s     r   __contains__zImpersonateTarget.__contains__(   s    &"344 	5[D YFMT$9YT[FM=Y o%a4)?a4<SYSaCaoDMFI$5MFI9Mo D(mF,=,Em\b\mIm		
r    c                    t          | j        | j                   dt          | j        | j                                       d          S )N:)r   r   r   r   r   rstripr   s    r   __str__zImpersonateTarget.__str__2   sC    T\::ff]47TXTc=d=dffmmnqrrrr    strc                    t          j        d|          }|st          d| d           | di |                                S )Nze(?:(?P<client>[^:-]+)(?:-(?P<version>[^:-]+))?)?(?::(?:(?P<os>[^:-]+)(?:-(?P<os_version>[^:-]+))?)?)?zInvalid impersonate target "" )re	fullmatchr   	groupdict)clsr!   mobjs      r   from_strzImpersonateTarget.from_str5   se    |  E  GM  N  N 	GEFEEEFFFs&&T^^%%&&&r    r!   r   )r!   r*   )__name__
__module____qualname____doc__r   __annotations__r   r   r   r   r%   r)   classmethodr3   r-   r    r   r   r      s           FGB!J!!!!D D D
 
 
 
s s s ' ' ' [' ' 'r    r   c                       e Zd ZU dZi Zded<   ddd fdZdd
Z fdZ fdZ	ddZ
edd            ZddZd Zd dZd!dZ xZS )"ImpersonateRequestHandlera<  
    Base class for request handlers that support browser impersonation.

    This provides a method for checking the validity of the impersonate extension,
    which can be used in _check_extensions.

    Impersonate targets consist of a client, version, os and os_ver.
    See the ImpersonateTarget class for more details.

    The following may be defined:
     - `_SUPPORTED_IMPERSONATE_TARGET_MAP`: a dict mapping supported targets to custom object.
                Any Request with an impersonate target not in this list will raise an UnsupportedRequest.
                Set to None to disable this check.
                Note: Entries are in order of preference

    Parameters:
    @param impersonate: the default impersonate target to use for requests.
                        Set to None to disable impersonation.
    zdict[ImpersonateTarget, Any]!_SUPPORTED_IMPERSONATE_TARGET_MAPN)impersonater>   r   c               H     t                      j        di | || _        d S )Nr-   )super__init__r>   )r   r>   kwargs	__class__s      r   rA   z"ImpersonateRequestHandler.__init__S   s.    ""6"""&r    r!   c                    t          |t          t          f          sJ || j        sd S |                     |          st          d|           d S )Nz Unsupported impersonate target: )r#   r   r   supported_targetsis_supported_targetr   r$   s     r   _check_impersonate_targetz3ImpersonateRequestHandler._check_impersonate_targetW   si    &#4h"?@@@@@>!7>F''// 	R$%P%P%PQQQ	R 	Rr    c                    t                                          |           d|v r*|                     |                    d                     d S d S )Nr>   )r@   _check_extensionsrG   get)r   
extensionsrC   s     r   rI   z+ImpersonateRequestHandler._check_extensions^   sT    !!*---J&&**:>>-+H+HIIIII '&r    c                ~    t                                          |           |                     | j                   d S N)r@   	_validaterG   r>   )r   requestrC   s     r   rN   z#ImpersonateRequestHandler._validatec   s8    '"""&&t'788888r    ImpersonateTarget | Nonec                    |dS | j         D ]8}||v r2| j        r'| j                            | j         d| d|            |c S 9dS )z'Resolve a target to a supported target.Nz: resolved impersonate target z to )rE   verbose_loggerstdoutRH_NAME)r   r!   supported_targets      r   _resolve_targetz)ImpersonateRequestHandler._resolve_targetg   s    >F $ 6 	( 	()))< gL''<eeveeSceeg g g''''	 *	( 	(r    returntuple[ImpersonateTarget, ...]c                N    t          | j                                                  S rM   )tupler=   keys)r1   s    r   rE   z+ImpersonateRequestHandler.supported_targetsr   s    S:??AABBBr    c                ^    t          |t                    sJ |                     |          d uS rM   )r#   r   rW   r$   s     r   rF   z-ImpersonateRequestHandler.is_supported_targetv   s2    &"344444##F++477r    c                j    |                      |j                            d          p| j                  S )z(Get the requested target for the requestr>   )rW   rK   rJ   r>   )r   rO   s     r   _get_request_targetz-ImpersonateRequestHandler._get_request_targetz   s/    ##G$6$:$:=$I$I$]TM]^^^r    rO   r   headersr   Nonec                    dS )zAdditional operations to prepare headers before building. To be extended by subclasses.
        @param request: Request object
        @param headers: Merged headers to prepare
        Nr-   )r   rO   r`   s      r   _prepare_impersonate_headersz6ImpersonateRequestHandler._prepare_impersonate_headers~   s      r    dict[str, str]c                   |                      |j                  }|                     |          Gt          j                    D ]3\  }}|                    |          |k    r|                    |           4|                     ||           |j                            d          r|	                                S t          |          S )z
        Get headers for external impersonation use.
        Subclasses may define a _prepare_impersonate_headers method to modify headers after merge but before building.
        Nkeep_header_casing)_merge_headersr`   r_   r   itemsrJ   poprc   rK   	sensitivedict)r   rO   r`   kvs        r   _get_impersonate_headersz2ImpersonateRequestHandler._get_impersonate_headers   s    
 %%go66##G,,8 $)++ # #1;;q>>Q&&KKNNN))'7;;;!!"677 	'$$&&&G}}r    )r>   r   r4   )r!   rP   )rX   rY   )rO   r   r`   r   rX   ra   )rO   r   rX   rd   )r5   r6   r7   r8   r=   r9   rA   rG   rI   rN   rW   r   rE   rF   r_   rc   rn   __classcell__)rC   s   @r   r<   r<   =   sA         & GI%HHHH;? ' ' ' ' ' ' ' 'R R R RJ J J J J
9 9 9 9 9	( 	( 	( 	( C C C ]C8 8 8 8_ _ _          r    r<   c                L    |j                             d          s| j        rdS dS )Nr>   i  r   )rK   rJ   r>   )rhrO   s     r   impersonate_preferencerr      s.    m,,  t1r    )
__future__r   r.   abcr   dataclassesr   typesr   typingr   commonr	   r
   r   
exceptionsr   utilsr   r   utils.networkingr   r   r   r<   rr   r-   r    r   <module>r|      st   " " " " " " 				       ! ! ! ! ! !             @ @ @ @ @ @ @ @ @ @ * * * * * * 0 0 0 0 0 0 0 0 : : : : : : : : d###*' *' *' *' *' *' *' $#*'ZW W W W W W W Wt .//  0/  r    