
    yf                        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
mZ ddlmZ d	d
lmZ d	dlmZmZ d	dlmZ  edd       G d d             Z G d de
e      Z ee      d        Zy)    )annotationsN)ABC)	dataclass)Any   )RequestHandlerregister_preference)UnsupportedRequest   )NoneType)classpropertyjoin_nonempty)std_headersT)orderfrozenc                  p    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y)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      y y )Nz$client is required if version is setz#os is required if os_version is set)r   r   
ValueErrorr   r   selfs    ?/usr/lib/python3/dist-packages/yt_dlp/networking/impersonate.py__post_init__zImpersonateTarget.__post_init__"   s;    <<CDD??477BCC $+?    c                   t        |t              sy| j                  d u xs) |j                  d u xs | j                  |j                  k(  xr | j                  d u xs) |j                  d u xs | j                  |j                  k(  xrt | j                  d u xs) |j                  d u xs | j                  |j                  k(  xr9 | j
                  d u xs) |j
                  d u xs | j
                  |j
                  k(  S )NF)
isinstancer   r   r   r   r   r   targets     r   __contains__zImpersonateTarget.__contains__(   s    &"34[[D YFMMT$9YT[[FMM=Y o%a4)?a4<<SYSaSaCaoDMFII$5MFII9Mo D(mF,=,=,Em\b\m\mIm		
r   c                    t        | j                  | j                         dt        | j                  | j                         j                  d      S )N:)r   r   r   r   r   rstripr   s    r   __str__zImpersonateTarget.__str__2   sB    T\\:;1]477TXTcTc=d<efmmnqrrr   c                |    t        j                  d|      }|st        d| d       | di |j                         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   sK    ||  E  GM  N;F81EFF&T^^%&&r   r"   r   )r"   str)__name__
__module____qualname____doc__r   __annotations__r   r   r   r   r#   r'   classmethodr0   r*   r   r   r   r      sV     FJGZB
!J
!D
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 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)impersonatec               2    t        |   di | || _        y )Nr*   )super__init__r<   )r   r<   kwargs	__class__s      r   r?   z"ImpersonateRequestHandler.__init__S   s    "6"&r   c                    t        |t        t        f      sJ || j                  sy | j	                  |      st        d|       y )Nz Unsupported impersonate target: )r    r   r   supported_targetsis_supported_targetr
   r!   s     r   _check_impersonate_targetz3ImpersonateRequestHandler._check_impersonate_targetW   sN    &#4h"?@@@>!7!7''/$'Gx%PQQ 0r   c                n    t         |   |       d|v r!| j                  |j                  d             y y )Nr<   )r>   _check_extensionsrE   get)r   
extensionsrA   s     r   rG   z+ImpersonateRequestHandler._check_extensions^   s4    !*-J&**:>>-+HI 'r   c                Z    t         |   |       | j                  | j                         y N)r>   	_validaterE   r<   )r   requestrA   s     r   rL   z#ImpersonateRequestHandler._validatec   s$    '"&&t'7'78r   c                    |y| j                   D ]C  }||v s| j                  r-| j                  j                  | j                   d| d|        |c S  y)z'Resolve a target to a supported target.Nz: resolved impersonate target z to )rC   verbose_loggerstdoutRH_NAME)r   r"   supported_targets      r   _resolve_targetz)ImpersonateRequestHandler._resolve_targetg   sd    > $ 6 6 	())<<LL''<<.(FvhdScRdeg''	(r   c                H    t        | j                  j                               S rK   )tupler;   keysr   s    r   rC   z+ImpersonateRequestHandler.supported_targetsr   s    T;;@@BCCr   c                L    t        |t              sJ | j                  |      d uS rK   )r    r   rT   r!   s     r   rD   z-ImpersonateRequestHandler.is_supported_targetv   s)    &"3444##F+477r   c                r    | j                  |j                  j                  d      xs | j                        S )z(Get the requested target for the requestr<   )rT   rI   rH   r<   )r   rM   s     r   _get_request_targetz-ImpersonateRequestHandler._get_request_targetz   s/    ##G$6$6$:$:=$I$]TM]M]^^r   c                    | j                  |j                        }| j                  |      Bt        j                         D ]+  \  }}|j                  |      |k(  s|j                  |       - |S rK   )_merge_headersheadersrZ   r   itemsrH   pop)r   rM   r]   kvs        r   _get_impersonate_headersz2ImpersonateRequestHandler._get_impersonate_headers~   sg    %%goo6##G,8 $))+ #1;;q>Q&KKN# r   )r<   r   r1   )r"   zImpersonateTarget | None)returnztuple[ImpersonateTarget, ...])r3   r4   r5   r6   r;   r7   r?   rE   rG   rL   rT   r   rC   rD   rZ   rb   __classcell__)rA   s   @r   r:   r:   =   s\    & GI%'CH;? 'RJ
9	( D D8_r   r:   c                T    |j                   j                  d      s| j                  ryy)Nr<   i  r   )rI   rH   r<   )rhrM   s     r   impersonate_preferencerg      s"    m,r   )
__future__r   r+   abcr   dataclassesr   typingr   commonr   r	   
exceptionsr
   compat.typesr   utilsr   r   utils.networkingr   r   r:   rg   r*   r   r   <module>rq      so    " 	  !  7 * # 0 * d#*' *' $*'ZI IX ./ 0r   