
    V|hk                        S SK Jr  S SKrS SKJr  S SKJr  S SKJr  SSK	J
r
JrJr  SSKJr  S	S
KJr  S	SKJrJr  S	SKJrJr  \" SSS9 " S S5      5       r " S S\
\5      r\" \5      S 5       rg)    )annotationsN)ABC)	dataclass)Any   )RequestHandlerregister_preferenceRequest)UnsupportedRequest   )NoneType)classpropertyjoin_nonempty)std_headersHTTPHeaderDictT)orderfrozenc                  |    \ rS rSr% SrSrS\S'   SrS\S'   SrS\S'   Sr	S\S'   S	 r
SS
 jrS r\SS j5       rSrg)ImpersonateTarget   a  
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                    U R                   (       a  U R                  (       d  [        S5      eU R                  (       a  U R                  (       d  [        S5      eg g )Nz$client is required if version is setz#os is required if os_version is set)r   r   
ValueErrorr   r   selfs    W/home/james-whalen/.local/lib/python3.13/site-packages/yt_dlp/networking/impersonate.py__post_init__ImpersonateTarget.__post_init__"   s;    <<CDD??477BCC $+?    c                p   [        U[        5      (       d  gU R                  S L =(       d.    UR                  S L =(       d    U R                  UR                  :H  =(       a    U R                  S L =(       d.    UR                  S L =(       d    U R                  UR                  :H  =(       a    U R                  S L =(       d.    UR                  S L =(       d    U R                  UR                  :H  =(       aC    U R
                  S L =(       d.    UR
                  S L =(       d    U R
                  UR
                  :H  $ )NF)
isinstancer   r   r   r   r   r   targets     r   __contains__ImpersonateTarget.__contains__(   s    &"34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                    [        U R                  U R                  5       S[        U R                  U R                  5       3R                  S5      $ )N:)r   r   r   r   r   rstripr   s    r   __str__ImpersonateTarget.__str__2   sB    T\\:;1]477TXTcTc=d<efmmnqrrr"   c                    [         R                  " SU5      nU(       d  [        SU S35      eU " S0 UR                  5       D6$ )Nze(?:(?P<client>[^:-]+)(?:-(?P<version>[^:-]+))?)?(?::(?:(?P<os>[^:-]+)(?:-(?P<os_version>[^:-]+))?)?)?zInvalid impersonate target "" )re	fullmatchr   	groupdict)clsr&   mobjs      r   from_strImpersonateTarget.from_str5   sK    ||  E  GM  N;F81EFF&T^^%&&r"   r0   r&   r   )r&   str)__name__
__module____qualname____firstlineno____doc__r   __annotations__r   r   r   r    r'   r,   classmethodr6   __static_attributes__r0   r"   r   r   r      sV     FJGZB
!J
!D
s ' 'r"   r   c                     ^  \ rS rSr% Sr0 rS\S'   SS.SU 4S jjjrSS jrU 4S	 jr	U 4S
 jr
SS jr\SS j5       rSS jrS rSS jrSS jrSrU =r$ )ImpersonateRequestHandler=   a  
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U ]  " S0 UD6  Xl        g )Nr0   )super__init__rF   )r   rF   kwargs	__class__s      r   rI   "ImpersonateRequestHandler.__init__S   s    "6"&r"   c                    [        U[        [        45      (       d   eUb  U R                  (       d  g U R	                  U5      (       d  [        SU 35      eg )Nz Unsupported impersonate target: )r$   r   r   supported_targetsis_supported_targetr   r%   s     r   _check_impersonate_target3ImpersonateRequestHandler._check_impersonate_targetW   sT    &#4h"?@@@@>!7!7''//$'Gx%PQQ 0r"   c                r   > [         TU ]  U5        SU;   a!  U R                  UR                  S5      5        g g )NrF   )rH   _check_extensionsrP   get)r   
extensionsrK   s     r   rS   +ImpersonateRequestHandler._check_extensions^   s4    !*-J&**:>>-+HI 'r"   c                Z   > [         TU ]  U5        U R                  U R                  5        g N)rH   	_validaterP   rF   )r   requestrK   s     r   rY   #ImpersonateRequestHandler._validatec   s$    '"&&t'7'78r"   c                    Uc  gU R                    HJ  nX;   d  M
  U R                  (       a-  U R                  R                  U R                   SU SU 35        Us  $    g)z'Resolve a target to a supported target.Nz: resolved impersonate target z to )rN   verbose_loggerstdoutRH_NAME)r   r&   supported_targets      r   _resolve_target)ImpersonateRequestHandler._resolve_targetg   s\    > $ 6 6)<<LL''<<.(FvhdScRdeg'' !7r"   c                H    [        U R                  R                  5       5      $ rX   )tuplerE   keys)r4   s    r   rN   +ImpersonateRequestHandler.supported_targetsr   s    S::??ABBr"   c                V    [        U[        5      (       d   eU R                  U5      S L$ rX   )r$   r   rb   r%   s     r   rO   -ImpersonateRequestHandler.is_supported_targetv   s,    &"34444##F+477r"   c                |    U R                  UR                  R                  S5      =(       d    U R                  5      $ )z(Get the requested target for the requestrF   )rb   rU   rT   rF   )r   rZ   s     r   _get_request_target-ImpersonateRequestHandler._get_request_targetz   s/    ##G$6$6$:$:=$I$]TM]M]^^r"   c                    g)zAdditional operations to prepare headers before building. To be extended by subclasses.
@param request: Request object
@param headers: Merged headers to prepare
Nr0   )r   rZ   headerss      r   _prepare_impersonate_headers6ImpersonateRequestHandler._prepare_impersonate_headers~   s    r"   c                   U R                  UR                  5      nU R                  U5      bF  [        R                  " 5        H-  u  p4UR                  U5      U:X  d  M  UR                  U5        M/     U R                  X5        UR                  R                  S5      (       a  UR                  5       $ [        U5      $ )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_headersrn   rk   r   itemsrT   popro   rU   	sensitivedict)r   rZ   rn   kvs        r   _get_impersonate_headers2ImpersonateRequestHandler._get_impersonate_headers   s    
 %%goo6##G,8 $))+;;q>Q&KKN , 	))';!!"677$$&&G}r"   )rF   r   r8   )r&   zImpersonateTarget | None)returnztuple[ImpersonateTarget, ...])rZ   r
   rn   r   r|   None)rZ   r
   r|   zdict[str, str])r:   r;   r<   r=   r>   rE   r?   rI   rP   rS   rY   rb   r   rN   rO   rk   ro   rz   rA   __classcell__)rK   s   @r   rC   rC   =   sk    & GI%'CH;? ' 'RJ
9	( C C8_ r"   rC   c                h    UR                   R                  S5      (       d  U R                  (       a  gg)NrF   i  r   )rU   rT   rF   )rhrZ   s     r   impersonate_preferencer      s%    m,,r"   )
__future__r   r1   abcr   dataclassesr   typingr   commonr   r	   r
   
exceptionsr   compat.typesr   utilsr   r   utils.networkingr   r   r   rC   r   r0   r"   r   <module>r      sr    " 	  !  @ @ * # 0 : d#*' *' $*'ZW Wt ./ 0r"   