Ë
    F·j)3  ã                   ó  — 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mZ d dl	m
Z
mZmZ d dlmZmZmZ ddgZ ej$                  e«      Zej+                   ej,                  «       «        G d„ d«      Z G d	„ d«      Z G d
„ de«      Zy)é    N)Ú_fallback_deprecated_langÚ	tts_langs)Ú	TokenizerÚpre_processorsÚtokenizer_cases)Ú_clean_tokensÚ	_minimizeÚ_translate_urlÚgTTSÚ	gTTSErrorc                   ó   — e Zd ZdZdZdZy)ÚSpeedznRead Speed

    The Google TTS Translate API supports two speeds:
        Slow: True
        Normal: None
    TN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚSLOWÚNORMAL© ó    úV/var/www/html/ai-video-generator/backend/venv/lib/python3.12/site-packages/gtts/tts.pyr   r      s   „ ñð €DØ�Fr   r   c                   ó4  — e Zd ZdZdZddddœZdZdd	d
dej                  ej                  ej                  ej                  g eej                  ej                  ej                  ej                   g«      j"                  dfd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)r   ac
  gTTS -- Google Text-to-Speech.

    An interface to Google Translate's Text-to-Speech API.

    Args:
        text (string): The text to be read.
        tld (string): Top-level domain for the Google Translate host,
            i.e `https://translate.google.<tld>`. Different Google domains
            can produce different localized 'accents' for a given
            language. This is also useful when ``google.com`` might be blocked
            within a network but a local or different Google host
            (e.g. ``google.com.hk``) is not. Default is ``com``.
        lang (string, optional): The language (IETF language tag) to
            read the text in. Default is ``en``.
        slow (bool, optional): Reads text more slowly. Defaults to ``False``.
        lang_check (bool, optional): Strictly enforce an existing ``lang``,
            to catch a language error early. If set to ``True``,
            a ``ValueError`` is raised if ``lang`` doesn't exist.
            Setting ``lang_check`` to ``False`` skips Web requests
            (to validate language) and therefore speeds up instantiation.
            Default is ``True``.
        pre_processor_funcs (list): A list of zero or more functions that are
            called to transform (pre-process) text before tokenizing. Those
            functions must take a string and return a string. Defaults to::

                [
                    pre_processors.tone_marks,
                    pre_processors.end_of_line,
                    pre_processors.abbreviations,
                    pre_processors.word_sub
                ]

        tokenizer_func (callable): A function that takes in a string and
            returns a list of string (tokens). Defaults to::

                Tokenizer([
                    tokenizer_cases.tone_marks,
                    tokenizer_cases.period_comma,
                    tokenizer_cases.colon,
                    tokenizer_cases.other_punctuation
                ]).run

        timeout (float or tuple, optional): Seconds to wait for the server to
            send data before giving up, as a float, or a ``(connect timeout,
            read timeout)`` tuple. ``None`` will wait forever (default).

    See Also:
        :doc:`Pre-processing and tokenizing <tokenizer>`

    Raises:
        AssertionError: When ``text`` is ``None`` or empty; when there's nothing
            left to speak after pre-precessing, tokenizing and cleaning.
        ValueError: When ``lang_check`` is ``True`` and ``lang`` is not supported.
        RuntimeError: When ``lang_check`` is ``True`` but there's an error loading
            the languages dictionary.

    éd   zhttp://translate.google.com/znMozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36z/application/x-www-form-urlencoded;charset=utf-8)ÚRefererz
User-AgentzContent-TypeÚjQ1olcÚcomÚenFTNc	                 óŽ  — t        t        «       «      j                  «       D ]"  \  }	}
|	dk(  rŒt        j	                  d|	|
«       Œ$ |sJ d«       ‚|| _        || _        || _        || _        | j                  r8t        |«      | _        	 t        «       }| j                  |vrt        d|z  «      ‚	 |rt        j                   | _        nt        j$                  | _        || _        || _        || _        y # t        $ rH}t        j	                  t        |«      d¬«       t        j                  t        |«      «       Y d }~Œ�d }~ww xY w)NÚselfz%s: %szNo text to speakzLanguage not supported: %sT)Úexc_info)ÚdictÚlocalsÚitemsÚlogÚdebugÚtextÚtldÚ
lang_checkÚlangr   r   Ú
ValueErrorÚRuntimeErrorÚstrÚwarningr   r   Úspeedr   Úpre_processor_funcsÚtokenizer_funcÚtimeout)r   r&   r'   r)   Úslowr(   r/   r0   r1   ÚkÚvÚlangsÚes                r   Ú__init__zgTTS.__init__f   s  € ô2 œ›“N×(Ñ(Ó*ò 	&‰DˆAˆqØ�FŠ{ØÜ�I‰I�h  1Õ%ð	&ñ Ð'Ð'Ó'ˆtØˆŒ	ð ˆŒð %ˆŒØˆŒ	à�?Š?ä1°$Ó7ˆDŒIð$Ü!›�Ø—9‘9 EÑ)Ü$Ð%AÀDÑ%HÓIÐIð *ñ ÜŸ™ˆD�JäŸ™ˆDŒJð $7ˆÔ Ø,ˆÔàˆ�øô  ò $Ü—	‘	œ#˜a›&¨4�	Ô0Ü—‘œC ›F×#Ñ#ûð$ús   Â	&C3 Ã3	EÃ<>D?Ä?Ec                 ó¸  — |j                  «       }| j                  D ]   }t        j                  d|«        ||«      }Œ" t	        |«      | j
                  k  rt        |g«      S t        j                  d| j                  «       | j                  |«      }t        |«      }g }|D ]  }|t        |d| j
                  «      z  }Œ |D �cg c]  }|sŒ|‘Œ	 }}|S c c}w )Nzpre-processing: %sztokenizing: %sú )	Ústripr/   r$   r%   ÚlenÚGOOGLE_TTS_MAX_CHARSr   r0   r	   )r   r&   ÚppÚtokensÚ
min_tokensÚts         r   Ú	_tokenizezgTTS._tokenize§   sâ   € à�z‰z‹|ˆð ×*Ñ*ò 	ˆBÜ�I‰IÐ*¨BÔ/Ù�d“8‰Dð	ô ˆt‹9˜×1Ñ1Ò1Ü  $ Ó(Ð(ô 	�	‰	Ð" D×$7Ñ$7Ô8Ø×$Ñ$ TÓ*ˆô ˜vÓ&ˆð ˆ
Øò 	GˆAØœ) A s¨D×,EÑ,EÓFÑF‰Jð	Gð (Ö-˜ª1’!Ð-ˆÐ-àˆùò .s   ÃCÃCc                 óö  — t        | j                  d¬«      }| j                  | j                  «      }t        j                  dt        |«      «       t        j                  dt        |«      «       |sJ d«       ‚g }t        |«      D ]o  \  }}| j                  |«      }t        j                  d||«       t        j                  d||| j                  ¬«      }|j                  |j                  «       «       Œq |S )	zÒCreated the TTS API the request(s) without sending them.

        Returns:
            list: ``requests.PreparedRequests_``. <https://2.python-requests.org/en/master/api/#requests.PreparedRequest>`_``.
        z(_/TranslateWebserverUi/data/batchexecute)r'   Úpathztext_parts: %sztext_parts: %izNo text to send to TTS APIzdata-%i: %sÚPOST)ÚmethodÚurlÚdataÚheaders)r
   r'   rA   r&   r$   r%   r,   r;   Ú	enumerateÚ_package_rpcÚrequestsÚRequestÚGOOGLE_TTS_HEADERSÚappendÚprepare)r   Útranslate_urlÚ
text_partsÚprepared_requestsÚidxÚpartrG   Úrs           r   Ú_prepare_requestszgTTS._prepare_requestsÄ   sà   € ô 'Ø—‘ÐIô
ˆð —^‘^ D§I¡IÓ.ˆ
Ü�	‰	Ð"¤C¨
£OÔ4Ü�	‰	Ð"¤C¨
£OÔ4ÙÐ7Ð7Ó7ˆzàÐÜ" :Ó.ò 	2‰IˆC�Ø×$Ñ$ TÓ*ˆDä�I‰I�m S¨$Ô/ô × Ñ ØØ!ØØ×/Ñ/ô	ˆAð ×$Ñ$ Q§Y¡Y£[Õ1ð	2ð  !Ð r   c                 ó  — || j                   | j                  dg}t        j                  |d¬«      }| j                  |d dggg}t        j                  |d¬«      }dj                  t        j                  j                  |«      «      S )NÚnull)ú,ú:)Ú
separatorsÚgenericz	f.req={}&)	r)   r.   ÚjsonÚdumpsÚGOOGLE_TTS_RPCÚformatÚurllibÚparseÚquote)r   r&   Ú	parameterÚescaped_parameterÚrpcÚespaced_rpcs         r   rJ   zgTTS._package_rpcç   st   € Ø˜4Ÿ9™9 d§j¡j°&Ð9ˆ	Ü ŸJ™J y¸ZÔHÐà×$Ñ$Ð&7¸¸yÐIÐJÐKˆÜ—j‘j °Ô<ˆØ×!Ñ!¤&§,¡,×"4Ñ"4°[Ó"AÓBÐBr   c                 ó\   — | j                  «       D �cg c]  }|j                  ‘Œ c}S c c}w )z—Get TTS API request bodies(s) that would be sent to the TTS API.

        Returns:
            list: A list of TTS API request bodies to make.
        )rV   Úbody)r   Úprs     r   Ú
get_bodieszgTTS.get_bodiesï   s%   € ð #'×"8Ñ"8Ó":Ö;˜B�—“Ò;Ð;ùÒ;s   “)c              #   ó^  K  — 	 t         j                  j                  j                  t         j                  j                  j                  j
                  «       | j                  «       }t        |«      D �]…  \  }}	 t        j                  «       5 }|j                  |dt        j                  j                  «       | j                  ¬«      }ddd«       t        j                  d|j                  j                   «       t        j                  d||j                  j"                  «       t        j                  d||j$                  «       |j'                  «        |j1                  d	¬
«      D ]t  }|j3                  d«      }d|v sŒt5        j6                  d|«      }	|	r8|	j9                  d«      j;                  d«      }
t=        j>                  |
«      –— Œit-        | |¬«      ‚ t        j                  d|«       �Œˆ y#  Y �ŒªxY w# 1 sw Y   �Œ<xY w# t         j                  j(                  $ r0}t        j                  t+        |«      «       t-        | ¬«      ‚d}~wt         j                  j.                  $ r/}t        j                  t+        |«      «       t-        | ¬«      ‚d}~ww xY w­w)z‘Do the TTS API request(s) and stream bytes

        Raises:
            :class:`gTTSError`: When there's an error with the API request.

        F)ÚrequestÚverifyÚproxiesr1   Nzheaders-%i: %sz
url-%i: %szstatus-%i: %s)ÚttsÚresponse)rp   i   )Ú
chunk_sizezutf-8r   zjQ1olc","\[\\"(.*)\\"]é   Úasciizpart-%i created) rK   ÚpackagesÚurllib3Údisable_warningsÚ
exceptionsÚInsecureRequestWarningrV   rI   ÚSessionÚsendra   rm   Ú
getproxiesr1   r$   r%   rH   rF   Ústatus_codeÚraise_for_statusÚ	HTTPErrorr,   r   ÚRequestExceptionÚ
iter_linesÚdecodeÚreÚsearchÚgroupÚencodeÚbase64Ú	b64decode)r   rR   rS   rj   ÚsrU   r6   ÚlineÚdecoded_lineÚaudio_searchÚas_bytess              r   ÚstreamzgTTS.stream÷   s  è ø€ ð	Ü×Ñ×%Ñ%×6Ñ6Ü×!Ñ!×)Ñ)×4Ñ4×KÑKôð !×2Ñ2Ó4ÐÜ Ð!2Ó3ó %	.‰GˆC�ð*Ü×%Ñ%Ó'ð ¨1àŸ™Ø "Ø$Ü &§¡× 9Ñ 9Ó ;Ø $§¡ð	 ó �A÷ô —	‘	Ð*¨C°·±×1BÑ1BÔCÜ—	‘	˜,¨¨Q¯Y©Y¯]©]Ô;Ü—	‘	˜/¨3°·±Ô>à×"Ñ"Ô$ð Ÿ™°˜Ó5ò 
>�Ø#Ÿ{™{¨7Ó3�Ø˜|Ò+Ü#%§9¡9Ð-FÈÓ#U�LÙ#Ø#/×#5Ñ#5°aÓ#8×#?Ñ#?ÀÓ#H˜Ü$×.Ñ.¨xÓ8Ó8ô (¨D¸1Ô=Ð=ð
>ô �I‰IÐ'¨Ö-ñK%	.øð		Úú÷
ñ ûô ×&Ñ&×0Ñ0ò 6ä—	‘	œ#˜a›&Ô!Ü D°1Ô5Ð5ûÜ×&Ñ&×7Ñ7ò *ä—	‘	œ#˜a›&Ô!Ü DÔ)Ð)ûð*üsm   ‚J-„AG> Á"J-Á<HÂ<HÃBHÅ*J-ÆA8J-Ç>HÈ J-ÈH	ÈHÈJ*È0+IÉ J*É;*J%Ê%J*Ê*J-c                 óô   — 	 t        | j                  «       «      D ]-  \  }}|j                  |«       t        j	                  d||«       Œ/ y# t
        t        f$ r}t        dt        |«      z  «      ‚d}~ww xY w)aQ  Do the TTS API request(s) and write bytes to a file-like object.

        Args:
            fp (file object): Any file-like object to write the ``mp3`` to.

        Raises:
            :class:`gTTSError`: When there's an error with the API request.
            TypeError: When ``fp`` is not a file-like object that takes bytes.

        zpart-%i written to %sz<'fp' is not a file-like object or it does not take bytes: %sN)rI   rŽ   Úwriter$   r%   ÚAttributeErrorÚ	TypeErrorr,   )r   ÚfprS   Údecodedr6   s        r   Úwrite_to_fpzgTTS.write_to_fp/  su   € ð	Ü )¨$¯+©+«-Ó 8ò <‘��WØ—‘˜Ô!Ü—	‘	Ð1°3¸Õ;ñ<øô ¤	Ð*ò 	ÜØNÔQTÐUVÓQWÑWóð ûð	ús   ‚A	A ÁA7ÁA2Á2A7c                 óÆ   — t        t        |«      d«      5 }| j                  |«       |j                  «        t        j                  d|«       ddd«       y# 1 sw Y   yxY w)zôDo the TTS API request and write result to file.

        Args:
            savefile (string): The path and file name to save the ``mp3`` to.

        Raises:
            :class:`gTTSError`: When there's an error with the API request.

        ÚwbzSaved to %sN)Úopenr,   r•   Úflushr$   r%   )r   ÚsavefileÚfs      r   Úsavez	gTTS.saveD  sN   € ô ”#�h“- Ó&ð 	/¨!Ø×Ñ˜QÔØ�G‰GŒIÜ�I‰I�m XÔ.÷	/÷ 	/ñ 	/ús   –8AÁA )r   r   r   r   r<   rM   r_   r   Ú
tone_marksÚend_of_lineÚabbreviationsÚword_subr   r   Úperiod_commaÚcolonÚother_punctuationÚrunr7   rA   rV   rJ   rk   rŽ   r•   rœ   r   r   r   r   r   !   sÍ   „ ñ8ðt Ðà1ð-ð JñÐð €Nð
 ØØØà×%Ñ%Ø×&Ñ&Ø×(Ñ(Ø×#Ñ#ð	
ñ !à×*Ñ*Ø×,Ñ,Ø×%Ñ%Ø×1Ñ1ð	ó
÷ ‰#Øó+?òBò:!!òFCò<ò6.òpó*/r   c                   ó,   ‡ — e Zd ZdZdˆ fd„	Zdd„Zˆ xZS )r   zAException that uses context to present a meaningful error messagec                 ó.  •— |j                  dd «      | _        |j                  dd «      | _        |r|| _        n?| j                  �,| j	                  | j                  | j                  «      | _        nd | _        t
        t        | �  | j                  «       y )Nrp   rq   )Úpoprp   ÚrspÚmsgÚ	infer_msgÚsuperr   r7   )r   r©   ÚkwargsÚ	__class__s      €r   r7   zgTTSError.__init__W  so   ø€ Ø—:‘:˜e TÓ*ˆŒØ—:‘:˜j¨$Ó/ˆŒÙØˆD�HØ�X‰XÐ!Ø—~‘~ d§h¡h°·±Ó9ˆD�HàˆDŒHÜŒi˜Ñ'¨¯©Õ1r   c                 óÈ  — d}|€9d}|j                   dk7  r¼t        |j                   ¬«      }dj                  |«      }n”|j                  }|j                  }dj                  ||«      }|dk(  rd}nb|d	k(  r+|j                   dk7  rd
j                  |j                   «      }n2|dk(  r&|j
                  sd| j                  j                  z  }n|dk\  rd}dj                  ||«      S )zyAttempt to guess what went wrong by using known
        information (e.g. http response) and observed behaviour

        ÚUnknownzFailed to connectr   )r'   zHost '{}' is not reachablez{:d} ({}) from TTS APIi“  z!Bad token or upstream API changesi”  zUnsupported tld '{}'éÈ   z6No audio stream in response. Unsupported language '%s'iô  z$Upstream API error. Try again later.z{}. Probable cause: {})r'   r
   r`   r}   Úreasonr(   rp   r)   )r   rp   r¨   ÚcauseÚpremiseÚhostÚstatusr±   s           r   rª   zgTTSError.infer_msgb  sÛ   € ð
 ˆàˆ;Ø)ˆGà�w‰w˜%ÒÜ%¨#¯'©'Ô2�Ø4×;Ñ;¸DÓA‘ð
 —_‘_ˆFØ—Z‘ZˆFà.×5Ñ5°f¸fÓEˆGà˜Š}Ø;‘Ø˜3’ 3§7¡7¨eÒ#3Ø.×5Ñ5°c·g±gÓ>‘Ø˜3’ s§~¢~àLØ—h‘h—m‘mñ$ñ ð ˜3’Ø>�à'×.Ñ.¨w¸Ó>Ð>r   )N)r   r   r   r   r7   rª   Ú__classcell__)r­   s   @r   r   r   T  s   ø„ ÙKõ	2÷"?r   )r‡   r]   Úloggingrƒ   ra   rK   Ú	gtts.langr   r   Úgtts.tokenizerr   r   r   Ú
gtts.utilsr   r	   r
   Ú__all__Ú	getLoggerr   r$   Ú
addHandlerÚNullHandlerr   r   Ú	Exceptionr   r   r   r   ú<module>rÀ      s   ðã Û Û Û 	Û ã ç :ß EÑ Eß ?Ñ ?à�;Ð
€ð €g×Ñ˜Ó!€Ø ‡�Ð"ˆw×"Ñ"Ó$Ô %÷	ñ 	÷p/ñ p/ôf	0?�	õ 0?r   