o
    ib                     @  s   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dG dd dZG dd deeZeedd ZdS )    )annotationsN)ABC)	dataclass)NoneType)Any   )RequestHandlerregister_preferenceRequest)UnsupportedRequest   )classpropertyjoin_nonempty)std_headersHTTPHeaderDictT)orderfrozenc                   @  sj   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d	 Z	dddZ
dd Zed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                 C  s0   | 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   self r   Q/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/networking/impersonate.py__post_init__"   s
   zImpersonateTarget.__post_init__targetc                 C  s   t |tsdS | jd u s|jd u s| j|jkoF| jd u p&|jd u p&| j|jkoF| jd u p6|jd u p6| j|jkoF| jd u pF|jd u pF| j|jkS )NF)
isinstancer   r   r   r   r   r   r   r   r   r   __contains__(   s   
 zImpersonateTarget.__contains__c                 C  s(   t | j| j dt | j| j dS )N:)r   r   r   r   r   rstripr   r   r   r   __str__2   s   (zImpersonateTarget.__str__strc                 C  s2   t d|}|std| d| di | S )Nze(?:(?P<client>[^:-]+)(?:-(?P<version>[^:-]+))?)?(?::(?:(?P<os>[^:-]+)(?:-(?P<os_version>[^:-]+))?)?)?zInvalid impersonate target ""r   )re	fullmatchr   	groupdict)clsr   mobjr   r   r   from_str5   s   zImpersonateTarget.from_strr   r   )r   r%   )__name__
__module____qualname____doc__r   __annotations__r   r   r   r   r!   r$   classmethodr,   r   r   r   r   r      s   
 

r   c                      s   e Zd ZU dZi Zded< ddd& fdd	Zd'ddZ fddZ fddZ	d(ddZ
ed)ddZd'ddZdd Zd*d!d"Zd+d$d%Z  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)impersonater6   r   c                  s   t  jdi | || _d S )Nr   )super__init__r6   )r   r6   kwargs	__class__r   r   r8   S   s   
z"ImpersonateRequestHandler.__init__r   c                 C  s@   t |ttfs	J |d u s| jsd S | |std| d S )Nz Unsupported impersonate target: )r   r   r   supported_targetsis_supported_targetr   r    r   r   r   _check_impersonate_targetW   s   
z3ImpersonateRequestHandler._check_impersonate_targetc                   s,   t  | d|v r| |d d S d S )Nr6   )r7   _check_extensionsr>   get)r   
extensionsr:   r   r   r?   ^   s   z+ImpersonateRequestHandler._check_extensionsc                   s   t  | | | j d S N)r7   	_validater>   r6   r   requestr:   r   r   rC   c   s   z#ImpersonateRequestHandler._validateImpersonateTarget | Nonec                 C  sP   |du rdS | j D ]}||v r%| jr!| j| j d| d|  |  S q	dS )z'Resolve a target to a supported target.Nz: resolved impersonate target z to )r<   verbose_loggerstdoutRH_NAME)r   r   supported_targetr   r   r   _resolve_targetg   s   
z)ImpersonateRequestHandler._resolve_targetreturntuple[ImpersonateTarget, ...]c                 C  s   t | j S rB   )tupler5   keys)r*   r   r   r   r<   r   s   z+ImpersonateRequestHandler.supported_targetsc                 C  s   t |tsJ | |d uS rB   )r   r   rL   r    r   r   r   r=   v   s   z-ImpersonateRequestHandler.is_supported_targetc                 C  s   |  |jdp
| jS )z(Get the requested target for the requestr6   )rL   rA   r@   r6   rD   r   r   r   _get_request_targetz   s   z-ImpersonateRequestHandler._get_request_targetrE   r
   headersr   Nonec                 C  s   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   rE   rR   r   r   r   _prepare_impersonate_headers~   s    z6ImpersonateRequestHandler._prepare_impersonate_headersdict[str, str]c                 C  sl   |  |j}| |dur"t D ]\}}|||kr!|| q| || |jdr2|	 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_headersrR   rQ   r   itemsr@   poprT   rA   	sensitivedict)r   rE   rR   kvr   r   r   _get_impersonate_headers   s   
z2ImpersonateRequestHandler._get_impersonate_headers)r6   r   r-   )r   rF   )rM   rN   )rE   r
   rR   r   rM   rS   )rE   r
   rM   rU   )r.   r/   r0   r1   r5   r2   r8   r>   r?   rC   rL   r   r<   r=   rQ   rT   r^   __classcell__r   r   r:   r   r4   =   s   
 



r4   c                 C  s   |j ds	| jrdS dS )Nr6   i  r   )rA   r@   r6   )rhrE   r   r   r   impersonate_preference   s   ra   )
__future__r   r'   abcr   dataclassesr   typesr   typingr   commonr   r	   r
   
exceptionsr   utilsr   r   utils.networkingr   r   r   r4   ra   r   r   r   r   <module>   s    
-Z