o
    PhE'                     @   s   d Z ddlmZm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 ddlmZmZ dd	lmZ ed
ZG dd deZG dd dZG dd dZG dd deZdS )u.  
DeepL

About the translation and the language endpoints:
    This implementation of DeepL follows Marocco2's implementation of DeepL's JSONRPC API

    Arrangements and optimizations have been made

    Refer to Issue Animenosekai/translate#7 on GitHub for further details

© Anime no Sekai — 2021
    )timesleep)compile)randint)BeautifulSoup)Language)BaseTranslatorBaseTranslateException)TupleList)Requestz(?<=[.!:?]) +c                   @   s   e Zd ZdZddiZdS )DeeplTranslateExceptionz+
    Default DeepL Translate exception
    i zToo many requests.N)__name__
__module____qualname____doc__error_codes r   r   X/var/www/html/env_mimamsha/lib/python3.10/site-packages/translatepy/translators/deepl.pyr      s    r   c                   @   s:   e Zd ZdZdefddZdefddZdefdd	Z	d
S )GetClientStatez'
    DeepL Translate state manager
    requestc                 C   s   t ddd | _|| _d S )N  '  '  )r   	id_numbersessionselfr   r   r   r   __init__'   s   
zGetClientState.__init__returnc                 C   s(   |  j d7  _ dddi d| j d}|S )N   2.0getClientState20180814)v
clientVarsjsonrpcmethodparamsidr   )r   datar   r   r   dump+   s   	zGetClientState.dumpc                 C   s.   | j jddddd|  d}| }|d S )z/
        Returns a new Client State ID
        zhttps://w.deepl.com/webr'   Er"   )request_typeilr(   )r)   jsonr*   )r   postr-   r1   )r   r   responser   r   r   get8   s   zGetClientState.getN)
r   r   r   r   r   r   dictr-   intr4   r   r   r   r   r   #   s
    r   c                   @   s2   e Zd ZdZdeddfddZdd Zd	d
 ZdS )JSONRPCRequestz+
    JSON RPC Request Sender for DeepL
    r   r   Nc                 C   sR   t || _z| j | _W n ty    tddd d | _Y nw || _d| _d S )Nr   r   r   r    r   )r   client_stater4   r   	Exceptionr   r   last_accessr   r   r   r   r   E   s   

zJSONRPCRequest.__init__c                 C   s"   |  j d7  _ d||| j d}|S )Nr    r!   r&   r+   )r   r(   r)   r,   r   r   r   r-   N   s   zJSONRPCRequest.dumpc                 C   s~   t  | j dk rdt  | j  }t|dkr|nd | jjd| ||d}t  | _| }|jdkr7|d S t|d d )	N   r   zhttps://www2.deepl.com/jsonrpc)r1      resulterrorcode)	r   r:   r   r   r2   r-   r1   status_coder   )r   r(   r)   distancer   r3   r   r   r   send_jsonrpcX   s   
zJSONRPCRequest.send_jsonrpc)r   r   r   r   r   r   r-   rB   r   r   r   r   r7   A   s
    	
r7   c                
   @   s   e Zd Zh dZe ddgfdededdfdd	Zd
edededeee ef fddZ	d
edededefddZ
d
edefddZd
edededefddZdddZdd Zdd ZdefddZdS )DeeplTranslate>   BGCSDADEELENESETFIFRHUITJALTLVNLPLPTRORUSKSLSVZHAUTOrI   rW   r   preferred_langsr   Nc                 C   s   || _ t|| _|| _d S )N)r   r7   r'   user_preferred_langs)r   r   r]   r   r   r   r   k   s   

zDeeplTranslate.__init__textdestination_languagesource_languagec                 C   sb   d}|du rt |df | g|tt| j|g dd}| jd|}|d d |d fS )	z
        Split a string into sentences using the DeepL API.

        Fallbacks to a simple Regex splitting if an error occurs or no result is found

        Returned tuple: (Result, Computed Language (None if same as source_language))
        TN)lang_user_selectedr^   )textslangLMT_split_into_sentencessplitted_textsr   rd   )SENTENCES_SPLITTING_REGEXsplitstriplistsetr^   r'   rB   )r   r_   r`   ra   REGEX_SPLITr)   respr   r   r   _split_into_sentencesp   s   z$DeeplTranslate._split_into_sentencesc                 C   s  d}d}|  |||\}}| ||}d}	|D ]	}
|	|
d7 }	qtt d d d }|||gd|||	||	   d}|d	krQ||d
 d< |d
 d | n||d
 d< | jd|}z|d }W n   |}Y |d ur|d }|ddd |D fS d S )Nr     i
   d   r   target_langr^   jobsrd   priority	timestampautord   source_lang_computedr^   source_lang_user_selectedLMT_handle_jobssource_langtranslations c                 s   s(    | ]}|d  r|d  d d V  qdS )beamsr   postprocessed_sentenceNr   ).0objr   r   r   	<genexpr>   s   & z,DeeplTranslate._translate.<locals>.<genexpr>)	rn   _build_jobscountr6   r   appendr'   rB   join)r   r_   r`   ra   rw   quality	sentencescomputed_langrv   i_countsentencetsr)   results_detected_languager~   r   r   r   
_translate   s8   
zDeeplTranslate._translatec                 C   s   d}d}|  |dd\}}| ||}d}|D ]	}||d7 }qtt d d d }	|ddgd	||	||	|   d
}
|d urQ||
d d< |
d d | nd|
d d< | jd|
}|d urf|d S d S )Nr    ro   rI   r\   rp   rq   rr   r   rs   ru   rd   rz   r^   r{   r|   r}   )rn   r   r   r6   r   r   r'   rB   )r   r_   rw   r   r   r   rv   r   r   r   r)   r   r   r   r   	_language   s.   
zDeeplTranslate._languagec                 C   s   |dkr	|  |}t|j }t|j }| jjd| d | d | d d|id}|jdk r[t|jd	}g }|	d
D ]}|
drVd|d v rV||jdd q?||fS d S )Nr\   zhttps://dict.deepl.com/-z/search?ajax=1&source=zo&onlyDictEntries=1&translator=dnsof7h3k2lgh3gda&delay=800&jsStatus=0&kind=full&eventkind=keyup&forleftside=truequery)r,   i  zhtml.parseraclassdictLink
ro   )r   r   namelowerr   r2   r@   r   r_   find_allhas_attrr   replace)r   r_   r`   ra   r   r3   _resultelementr   r   r   _dictionary   s   
,

zDeeplTranslate._dictionaryro   c           	   	   C   s   g }t |D ]`\}}|dkr'zg }||d  g}W n4 ty&   g }g }Y n(w t|dkr2|d |||d  g |t|d krGg }n||d  g}d| | |d}|dkra||d< || q|S )	z:
        Builds a job for each sentence for DeepL
        r   r          default)kindraw_en_context_afterraw_en_context_beforeraw_en_sentencero   r   )	enumerate
IndexErrorlenpopextendcopyr   )	r   r   r   rv   indexr   beforeafterjobr   r   r   r      s2   
zDeeplTranslate._build_jobsc                 C   s   |j dkrdS |j S )Nzhor[   )r*   alpha2upper)r   languager   r   r   _language_normalize  s   

z"DeeplTranslate._language_normalizec                 C   s    t | dv rtdS t|S )N>   zh-cnzhr   )strr   r   )r   language_coder   r   r   _language_denormalize  s   z$DeeplTranslate._language_denormalizec                 C   s   dS )NDeepLr   )r   r   r   r   __str__  s   zDeeplTranslate.__str__)ro   )r   r   r   _supported_languagesr   r   r   r   r
   rn   r   r   r   r   r   r   r   r   r   r   r   rC   g   s    "&,&
"rC   N)r   r   r   rer   randomr   bs4r   translatepy.languager   translatepy.translators.baser   r	   translatepy.utils.annotationsr
   r   translatepy.utils.requestr   rg   r   r   r7   rC   r   r   r   r   <module>   s    
&