o
    b                  	   @   s  d dl mZmZ d dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZ zd dlmZmZmZ d dlmZ eefZeZW n" eyd   d dlmZmZ d dlmZ d dlmZ efZeZY nw zd dlZd dlZejejju r|d dlmZ nd dlmZ W n eefy   d dlmZ Y nw ze ej!Z"W n ey   e#ej$Z"Y nw d	e"v Z%d!ddZ&d!ddZ'd!ddZ(d"ddZ)dd Z*dd Z+dd Z,dd Z-d"ddZ.d"ddZ/d dl0m1Z1 d d l2m3Z3 dS )#    )absolute_importunicode_literalsN)logger)urlopenRequestURLError)
quote_plus)r   r   )r   )sleepcontextTc              
   C   s  d}	 t | }|d7 }zMtr8|st }nd }tt|tj|d}|	 W  d    W S 1 s2w   Y  ntt|tjd}|	 W  d    W S 1 sRw   Y  W n1 t
tfy } z#tjd| |d |tjkrstdtd	tj ttj W Y d }~nd }~ww q)
Nr   T   )timeoutr
   )r   z!Error occurred during fetching %sexc_infoz!Maximum amount of retries reachedzSleeping for %s seconds)r   urlopen_has_ssl_contextssl_create_unverified_context
contextlibclosingr   settingsZHTTP_TIMEOUTreadr   OSErrorr   debugZHTTP_RETRIESFakeUserAgentErrorZ
HTTP_DELAYr	   )url
verify_sslattemptrequestr
   responseexc r   ?/usr/local/lib/python3.10/dist-packages/fake_useragent/utils.pyget1   sR   
$"
r!   c                 C   sx   t tj| d}|d}|dd }|dd }d}t||tj}dd	 |D }d
}t||tj}tt	||S )G
    very very hardcoded/dirty re/split stuff, but no dependencies
    r   utf-8z(<table class="w3-table-all notranslate">r   z</table>r   z\.asp">(.+?)<c                 S   s   g | ]	}t j||qS r   )r   Z	OVERRIDESr!   ).0browserr   r   r    
<listcomp>i   s    z get_browsers.<locals>.<listcomp>ztd\sclass="right">(.+?)\s)
r!   r   ZBROWSERS_STATS_PAGEdecodesplitrefindallUNICODElistzip)r   htmlpatternbrowsersZbrowsers_statisticsr   r   r    get_browsers]   s   
r2   c                 C   s   t tjjt| d|d}|d}|dd }|dd }d}t||tj	}g }|D ]} d	| 
d v r:q.|| 
d t|tjkrK nq.|sVtd
j| d|S )r"   )r&   r#   z
iso-8859-1z<div id='liste'>r   z</div>r   z\?id=\d+\'>(.+?)</amorez'No browsers version found for {browser})r!   r   ZBROWSER_BASE_PAGEformatr   r(   r)   r*   finditerr,   grouplowerappendlenZBROWSERS_COUNT_LIMITr   )r&   r   r/   r0   Zbrowsers_iterr1   r   r   r    get_browser_versionst   s,   

r:   c                 C   st  i }i }zAt |dD ]9}|\}}|}tj D ]
\}}	|||	}q| }t||d||< ttt	|d D ]
}
||t
t|< q8q
W n< ty } z0| sQ|tjdtj|d ztttj|dd}W n ttfyv   tdw W Y d }~n
d }~ww ||d}t|tstd|dD ]$}||vrtd	|t|| tstd
|| || std|| q|S )Nr#   
   zAError occurred during loading data. Trying to use cache server %sr   r$   z#Can not load data from cache server)r1   Z	randomizezData is not dictionary zMissing data param: zData param is not dictionaryzData param is empty)r2   r   ZREPLACEMENTSitemsreplacer7   r:   rangeintfloatstrr9   	Exceptionr   warningZCACHE_SERVERjsonloadsr!   r(   	TypeError
ValueErrorr   
isinstancedict)use_cache_serverr   Zbrowsers_dictZrandomize_dictitemr&   percentZbrowser_keyvaluereplacement_r   retparamr   r   r    load   sh   




rR   c                 C   s^   t j| ddd}t|}t|ts|d}|| W d    d S 1 s(w   Y  d S )Nr$   wtencodingmode)ioopenrD   dumpsrH   textr(   write)pathdatafpZdumpedr   r   r    r[      s   


"r[   c                 C   sB   t j| ddd}t| W  d    S 1 sw   Y  d S )Nr$   rtrT   )rW   rX   rD   rE   r   )r\   r^   r   r   r    r      s   $r   c                 C   s   t j| S N)osr\   isfiler\   r   r   r    exist   s   rd   c                 C   s   t | rt|  d S d S r`   )rd   ra   removerc   r   r   r    rm   s   rf   c                 C   s   t |  t| t||d d S N)rJ   r   )rf   r[   rR   r\   rJ   r   r   r   r    update   s   ri   c                 C   s   t | st| ||d t| S rg   )rd   ri   r   rh   r   r   r    load_cached   s   rj   )r   )r   )T)TT)4
__future__r   r   r   inspectrW   rD   ra   r*   r   Zfake_useragent.logr   urllib2r   r   r   urllibr   unicoderA   Z	str_typesrZ   ImportErrorurllib.requesturllib.parseurllib.errorsocketZgevent.socketZgeventr	   timeAttributeErrorgetfullargspec
kwonlyargsZurlopen_args
getargspecargsr   r!   r2   r:   rR   r[   r   rd   rf   ri   rj   Zfake_useragentr   Zfake_useragent.errorsr   r   r   r   r    <module>   sb   	

,

!E


