
    VGhk                        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mZ ddl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y)    )annotationsN)ABC)	dataclass)Any   )RequestHandlerregister_preferenceRequest)UnsupportedRequest   )NoneType)classpropertyjoin_nonempty)std_headersHTTPHeaderDictT)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    f/var/www/it7/html/youtubeDownloader/venv/lib/python3.12/site-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)   classmethodr2   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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)impersonatec               2    t        |   di | || _        y )Nr,   )super__init__r>   )r   r>   kwargs	__class__s      r   rA   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_extensionsrG   get)r   
extensionsrC   s     r   rI   z+ImpersonateRequestHandler._check_extensions^   s4    !*-J&**:>>-+HI 'r    c                Z    t         |   |       | j                  | j                         y N)r@   	_validaterG   r>   )r   requestrC   s     r   rN   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 )rE   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 rM   )tupler=   keys)r0   s    r   rE   z+ImpersonateRequestHandler.supported_targetsr   s    S::??ABBr    c                L    t        |t              sJ | j                  |      d uS rM   )r"   r   rV   r#   s     r   rF   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>   )rV   rK   rJ   r>   )r   rO   s     r   _get_request_targetz-ImpersonateRequestHandler._get_request_targetz   s/    ##G$6$6$:$:=$I$]TM]M]^^r    c                     y)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   headerss      r   _prepare_impersonate_headersz6ImpersonateRequestHandler._prepare_impersonate_headers~   s    r    c                n   | j                  |j                        }| j                  |      Bt        j                         D ]+  \  }}|j                  |      |k(  s|j                  |       - | j                  ||       |j                  j                  d      r|j                         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.
        keep_header_casing)_merge_headersr^   r\   r   itemsrJ   popr_   rK   	sensitivedict)r   rO   r^   kvs        r   _get_impersonate_headersz2ImpersonateRequestHandler._get_impersonate_headers   s    
 %%goo6##G,8 $))+ #1;;q>Q&KKN# 	))'7;!!"67$$&&G}r    )r>   r   r3   )r$   zImpersonateTarget | None)returnztuple[ImpersonateTarget, ...])rO   r
   r^   r   rj   None)rO   r
   rj   zdict[str, str])r5   r6   r7   r8   r=   r9   rA   rG   rI   rN   rV   r   rE   rF   r\   r_   ri   __classcell__)rC   s   @r   r<   r<   =   sa    & GI%'CH;? 'RJ
9	( C C8_r    r<   c                T    |j                   j                  d      s| j                  ryy)Nr>   i  r   )rK   rJ   r>   )rhrO   s     r   impersonate_preferencero      s"    m,r    )
__future__r   r-   abcr   dataclassesr   typingr   commonr   r	   r
   
exceptionsr   compat.typesr   utilsr   r   utils.networkingr   r   r   r<   ro   r,   r    r   <module>ry      sr    " 	  !  @ @ * # 0 : d#*' *' $*'ZW Wt ./ 0r    