§
   £öå±÷<Feã                   ó"  — d Z ddlZddlZddlZddlZddlZ ej        ¦   «         Zdada	da
 ej        ¦   «         Z ej        d¦  «        Zd„ Zd„ Zd„ d„ d	„ gZd
„ Zd„ Zd„ Zd„ Zdd„Zdd„Zdd„Zdd„Zd„ Zdd„Zdd„Zdd„Zg d¢Zd„ Zdd„Z dS )z–
TTS helper for Millionaire game.

Handles text composition, option formatting, and TTS playback
for all game states. Eliminates duplicated TTS code.
é    NÚ aí  \[(?:excited|nervous|frustrated|sorrowful|calm|sad|angry|happily|tired|curious|mischievously|sigh|sighs|laughs|laughing|gasps|gulps|whispers|crying|clears throat|snorts|exhales|panting|hesitates|stammers|pauses|rushed|cheerfully|flatly|deadpan|playfully|dramatically|sarcastically|matter-of-fact|whiny|whispering|shouting|quietly|loudly|gunshot|clapping|explosion|door creaks|pirate voice|evil scientist voice|childlike tone|British accent|Australian accent|Southern US accent|French accent)\]c                 ó”   — | s| S t                                d| ¦  «        }t          j        dd|¦  «                             ¦   «         }|S )z Remove ElevenLabs v3 audio tags from text for UI display.

    Tags like [excited], [laughs], [pauses] are stripped.
    Cleans up resulting double spaces.
    r   z  +ú )Ú_AUDIO_TAG_REÚsubÚreÚstrip)ÚtextÚcleaneds     úg/Users/chudy/Library/Application Support/Kodi/addons/plugin.video.milionar/wcs/games/millionaire_tts.pyÚstrip_audio_tagsr      sJ   € ð ð ØˆÝ×Ò  DÑ)Ô)€GåŒf�V˜S 'Ñ*Ô*×0Ò0Ñ2Ô2€GØ€Nó    c                  óÒ   — t          j        ¦   «         } |                      d¦  «        pd}|dk    rd}n|dk    s|dvrdS |dk    rdS |                      d¦  «        pd	}d
dlm} ||v S )z3Check if ElevenLabs v3 model is currently selected.Úmilionar_tts_providerÚOpenAIÚ1Ú
ElevenLabsÚ0©r   r   FÚmilionar_tts_model_elevenlabsr   r   )ÚELEVENLABS_AUDIO_TAG_MODELS)Ú	xbmcaddonÚAddonÚ
getSettingÚwcs.ai.model_catalogr   )ÚaddonÚproviderÚmodelr   s       r   Úis_elevenlabs_v3_activer   (   s˜   € åŒOÑÔ€EØ×ÒÐ 7Ñ8Ô8ÐD¸H€HØ�3‚€ØˆˆØ	�SŠˆ˜HÐ,DÐDÐDØˆuØ�<ÒÐØˆuØ×ÒÐ<Ñ=Ô=ÐCÀ€EØ@Ð@Ð@Ð@Ð@Ð@ØÐ/Ð/Ð/r   c                 ó`   — d                      d„ t          g d¢| ¦  «        D ¦   «         ¦  «        S )Nú, c              3   óL   K  — | ]\  }}|¯d                       ||¦  «        V — Œ dS )z	za {}: {}N©Úformat©Ú.0Úletterr
   s      r   ú	<genexpr>z<lambda>.<locals>.<genexpr>=   sP   è è € ð ð áˆF�DØðØ×Ò˜6 4Ñ(Ô(ðð ð ð ð ð r   ©ÚAÚBÚCÚD©ÚjoinÚzip©Úoptss    r   ú<lambda>r3   =   óA   € �—’ð ð åÐ 4Ð 4Ð 4°dÑ;Ô;ðñ ô ñ ô € r   c                 ó`   — d                      d„ t          g d¢| ¦  «        D ¦   «         ¦  «        S )Nr!   c              3   óL   K  — | ]\  }}|¯d                       ||¦  «        V — Œ dS )z{}: {}Nr#   r%   s      r   r(   z<lambda>.<locals>.<genexpr>C   sN   è è € ð ð áˆF�DØðØ�Š˜ Ñ%Ô%ðð ð ð ð ð r   r)   r.   r1   s    r   r3   r3   C   r4   r   c                 ó@   — d                      d„ | D ¦   «         ¦  «        S )Nr!   c              3   ó   K  — | ]}|¯|V — Œ	d S ©N© )r&   r
   s     r   r(   z<lambda>.<locals>.<genexpr>I   s'   è è € Ð9Ð9 D°DÐ9˜4Ð9Ð9Ð9Ð9Ð9Ð9r   )r/   r1   s    r   r3   r3   I   s!   € �—’Ð9Ð9¨DÐ9Ñ9Ô9Ñ9Ô9€ r   c                 óJ   — t          j        t          ¦  «        } || ¦  «        S )z·Format answer options using a randomly selected style.

    Args:
        options: List of 4 option strings [A, B, C, D].

    Returns:
        Formatted string with all options.
    )ÚrandomÚchoiceÚOPTION_STYLES)ÚoptionsÚstyles     r   Úformat_optionsrA   M   s!   € õ ŒM�-Ñ(Ô(€EØˆ5�‰>Œ>Ðr   c                  ó¢  — t          j        ¦   «         } |                      d¦  «        pd}|dk    rd}n|dk    s|dvrd}|dk    r/|                      d¦  «        pd}|                      d	¦  «        pd
}n.|                      d¦  «        pd}|                      d¦  «        pd}|                      d¦  «        dk    |                      d¦  «        dk    |                      d¦  «        dk    |                      d¦  «        dk    |                      d¦  «        dk    |                      d¦  «        dk    |                      d¦  «        dk    |||dœ
S )z/Load all TTS settings from addon. Returns dict.r   r   r   r   r   r   Úmilionar_tts_voice_elevenlabsÚAdamr   Úeleven_flash_v2_5Úmilionar_tts_voiceÚalloyÚmilionar_tts_modelzgpt-4o-mini-ttsÚmilionar_tts_welcomeÚtrueÚmilionar_tts_introÚmilionar_tts_questionÚmilionar_tts_optionsÚmilionar_tts_resultÚmilionar_tts_transitionÚmilionar_tts_explanation)
Útts_welcomeÚ	tts_introÚtts_questionÚtts_optionsÚ
tts_resultÚtts_transitionÚtts_explanationr   Úvoicer   )r   r   r   )r   r   rX   r   s       r   Ú_load_tts_settingsrY   ^   s  € åŒOÑÔ€EØ×ÒÐ 7Ñ8Ô8ÐD¸H€Hà�3‚€ØˆˆØ	�SŠˆ˜HÐ,DÐDÐDØˆà�<ÒÐØ× Ò Ð!@ÑAÔAÐKÀVˆØ× Ò Ð!@ÑAÔAÐXÐEXˆˆà× Ò Ð!5Ñ6Ô6ÐA¸'ˆØ× Ò Ð!5Ñ6Ô6ÐKÐ:Kˆð ×'Ò'Ð(>Ñ?Ô?À6ÒIØ×%Ò%Ð&:Ñ;Ô;¸vÒEØ×(Ò(Ð)@ÑAÔAÀVÒKØ×'Ò'Ð(>Ñ?Ô?À6ÒIØ×&Ò&Ð'<Ñ=Ô=ÀÒGØ×*Ò*Ð+DÑEÔEÈÒOØ ×+Ò+Ð,FÑGÔGÈ6ÒQØØØðð ð r   c                 ó:   ‡ — t          ˆ fd„|D ¦   «         ¦  «        S )z+Check if any of the given keys are enabled.c              3   óD   •K  — | ]}‰                      |d ¦  «        V — ŒdS )FN)Úget)r&   ÚkÚsettingss     €r   r(   z_any_enabled.<locals>.<genexpr>   s1   øè è € Ð4Ð4¨!ˆx�|Š|˜A˜uÑ%Ô%Ð4Ð4Ð4Ð4Ð4Ð4r   )Úany)r^   Úkeyss   ` r   Ú_any_enabledra   }   s&   ø€ åÐ4Ð4Ð4Ð4¨tÐ4Ñ4Ô4Ñ4Ô4Ð4r   c                 ó\  — g }| d         r-|r+|                      |                     d¦  «        dz   ¦  «         | d         r-|r+|                      |                     d¦  «        dz   ¦  «         | d         r$|r"|                      t          |¦  «        ¦  «         d                     |¦  «        S )a�  Compose TTS text for question display.

    Combines enabled parts with natural pauses (periods, commas).

    Args:
        settings: TTS settings dict from _load_tts_settings().
        moderator_intro: Moderator intro text (str or empty).
        question_text: Question text.
        options: List of 4 option strings.

    Returns:
        Combined TTS string, or empty if nothing enabled.
    rR   ú.rS   ú?rT   ú ... )ÚappendÚrstriprA   r/   )r^   Úmoderator_introÚquestion_textr?   Úpartss        r   Úcompose_question_ttsrk   †   s»   € ð €Eà�Ôð 8 ð 8Ø�Š�_×+Ò+¨CÑ0Ô0°3Ñ6Ñ7Ô7Ð7à�Ôð 6 Mð 6Ø�Š�]×)Ò)¨#Ñ.Ô.°Ñ4Ñ5Ô5Ð5à�Ôð . 7ð .Ø�Š•^ GÑ,Ô,Ñ-Ô-Ð-à�<Š<˜ÑÔÐr   c                 óB  — g }| d         r-|r+|                      |                     d¦  «        dz   ¦  «         | d         r-|r+|                      |                     d¦  «        dz   ¦  «         | d         r|r|                      |¦  «         d                     |¦  «        S )a&  Compose TTS text for feedback/game over display.

    Args:
        settings: TTS settings dict.
        result_text: Result announcement from AI.
        transition_text: Transition text from AI.
        explanation: Explanation text (fallback).

    Returns:
        Combined TTS string.
    rW   rc   rU   rV   re   ©rf   rg   r/   )r^   Úresult_textÚtransition_textÚexplanationrj   s        r   Úcompose_feedback_ttsrq   ¢   sµ   € ð €EàÐ!Ô"ð 4 {ð 4Ø�Š�[×'Ò'¨Ñ,Ô,¨sÑ2Ñ3Ô3Ð3à�Ôð 4 +ð 4Ø�Š�[×'Ò'¨Ñ,Ô,¨sÑ2Ñ3Ô3Ð3àÐ Ô!ð & oð &Ø�Š�_Ñ%Ô%Ð%à�<Š<˜ÑÔÐr   c                 óÐ   — | d         sdS g }|r+|                      |                     d¦  «        dz   ¦  «         |r|                      |¦  «         d                     |¦  «        }|S )zÚCompose TTS text for welcome screen.

    Args:
        settings: TTS settings dict.
        welcome_text: Moderator welcome text.
        rules_text: Rules summary text.

    Returns:
        Combined TTS string.
    rQ   r   rc   re   rm   )r^   Úwelcome_textÚ
rules_textrj   Úresults        r   Úcompose_welcome_ttsrv   ¼   sx   € ð �MÔ"ð Øˆrà€EØð 5Ø�Š�\×(Ò(¨Ñ-Ô-°Ñ3Ñ4Ô4Ð4Øð !Ø�Š�ZÑ Ô Ð Ø�\Š\˜%Ñ Ô €FØ€Mr   c                 óÀ  ‡ ‡‡‡‡— ‰ r‰                       ¦   «         sdS t          ¦   «         }|d         Št          5  t          dz  at          Š|adat                               ¦   «          ddd¦  «         n# 1 swxY w Y   |                     dd¦  «        Š|                     dd¦  «        Šˆˆˆˆ ˆfd„}t          j
        |d	¬
¦  «                             ¦   «          dS )a!  Play TTS in background thread using TTSClient.

    Loads settings, composes nothing -- expects ready text.
    Runs in daemon thread, never blocks caller.
    Sets _tts_active event before launch, clears after playback.

    Args:
        text: Text to speak. If empty, does nothing.
    NrX   é   r   r   r   r   c                  óz  •— 	 ‰dk    r1ddl m}  |                      ‰                     ¦   «         ‰	‰¬¦  «        }n/ddl m} |                     ‰                     ¦   «         ‰	¬¦  «        }t
          5  ‰t          k    rR	 d d d ¦  «         t
          5  ‰t          k    rt                               ¦   «          d d d ¦  «         d S # 1 swxY w Y   d S |a	t          j        d                     |¦  «        ¦  «         d d d ¦  «         n# 1 swxY w Y   dd l}|                     d¦  «         t          j        d	¦  «        r)|                     d
¦  «         t          j        d	¦  «        °)nJ# t           $ r=}t          j        d                     |¦  «        t          j        ¬¦  «         Y d }~nd }~ww xY wt
          5  ‰t          k    rt                               ¦   «          d d d ¦  «         d S # 1 swxY w Y   d S # t
          5  ‰t          k    rt                               ¦   «          d d d ¦  «         w # 1 swxY w Y   w xY w)Nr   r   )ÚElevenLabsTTSClient)Ú
voice_nameÚmodel_id)Ú	TTSClient)rX   zPlayMedia("{}", noresume)g      à?úPlayer.Playingç333333Ó?z%[plugin.video.milionar] TTS chyba: {})Úlevel)Úwcs.airz   Úgenerate_ttsr	   r}   Ú	_tts_lockÚ_tts_serialÚ_tts_activeÚclearÚ	_tts_pathÚxbmcÚexecutebuiltinr$   ÚtimeÚsleepÚgetCondVisibilityÚ	ExceptionÚlogÚ
LOGWARNING)
Úel_ttsÚ
audio_pathÚ
openai_ttsrŠ   Úer   r   Úserialr
   rX   s
        €€€€€r   Ú_tts_workerzplay_tts.<locals>._tts_workerô   s¢  ø€ ð 	(Ø˜<Ò'Ð'Ø@Ð@Ð@Ð@Ð@Ð@Ø#×0Ò0Ø—J’J‘L”LØ$Ø"ð 1ñ ô �
�
ð ;Ð:Ð:Ð:Ð:Ð:Ø'×4Ò4Ø—J’J‘L”LØð 5ñ ô �
õ ð Tð TØ�[Ò(Ð(ØðTð Tð Tñ Tô Tð Tõ  ð (ð (Ø�[Ò(Ð(Ý×%Ò%Ñ'Ô'Ð'ð(ð (ð (ñ (ô (ð (ð (ð (ð (ð (ð (ð (øøøð (ð (ð (ð (ð (ð (ð '�	ÝÔ#Ð$?×$FÒ$FÀzÑ$RÔ$RÑSÔSÐSð	Tð Tð Tñ Tô Tð Tð Tð Tð Tð Tð Tøøøð Tð Tð Tð Tð ˆKˆKˆKØ�JŠJ�s‰OŒOˆOÝÔ(Ð)9Ñ:Ô:ð  Ø—
’
˜3‘”�õ Ô(Ð)9Ñ:Ô:ð  øøåð 	ð 	ð 	ÝŒHØ7×>Ò>¸qÑAÔAÝ”oðñ ô ð ð ð ð ð ð øøøøð	øøøõ ð (ð (Ø�[Ò(Ð(Ý×%Ò%Ñ'Ô'Ð'ð(ð (ð (ñ (ô (ð (ð (ð (ð (ð (ð (ð (øøøð (ð (ð (ð (ð (ð (ø•ð (ð (Ø�[Ò(Ð(Ý×%Ò%Ñ'Ô'Ð'ð(ð (ð (ñ (ô (ð (ð (ð (ð (ð (ð (øøøð (ð (ð (ð (ð (øøøs©   ƒA-E% Á0DÁ=E% Â%CÃCÃCÃ)DÃ7E% ÄDÄE% Ä
DÄAE% Å$G5 Å%
F,Å/3F'Æ"G5 Æ'F,Æ,G5 Æ6%G(Ç(G,Ç/G,Ç5H:Ç=%H.È"H:È.H2È2H:È5H2È6H:T)ÚtargetÚdaemon)r	   rY   rƒ   r„   Ú
_tts_ownerr‡   r…   Úsetr\   Ú	threadingÚThreadÚstart)r
   Úownerr^   r•   r   r   r”   rX   s   `   @@@@r   Úplay_ttsrž   ×   sB  øøøøø€ ð ð �t—z’z‘|”|ð Øˆõ "Ñ#Ô#€HØ�WÔ€Eõ 
ð ð Ý�qÑˆÝˆØˆ
Øˆ	Ý�ŠÑÔÐðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð �|Š|˜J¨Ñ1Ô1€HØ�LŠL˜ "Ñ%Ô%€Eð"(ð "(ð "(ð "(ð "(ð "(ð "(ð "(ð "(õH Ô˜K°Ð5Ñ5Ô5×;Ò;Ñ=Ô=Ð=Ð=Ð=s   »/A6Á6A:Á=A:c                 ó>  — t           5  | �| t          ur	 ddd¦  «         dS t          dz  at          ot	          j        d¦  «        t          k    }| �|rt	          j        d¦  «         dadat                               ¦   «          ddd¦  «         dS # 1 swxY w Y   dS )z%Stop any currently playing TTS audio.Nrx   zPlayer.FilenameandpathzPlayerControl(Stop)r   )	rƒ   r˜   r„   r‡   rˆ   ÚgetInfoLabelr‰   r…   r†   )r�   Úplaying_owneds     r   Ústop_ttsr¢     s  € õ 
ð 
ð 
ØÐ ­jÐ!8Ð!8Øð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
õ 	�qÑˆå!Ð^¥dÔ&7Ð8PÑ&QÔ&QÕU^Ò&^ˆØˆ=˜Mˆ=ÝÔÐ 5Ñ6Ô6Ð6Øˆ	Øˆ
Ý×ÒÑÔÐð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð 
ð 
s   ˆB¢A#BÂBÂBc                  ó*   — t          j        d¦  «        S )z-Check if Kodi is currently playing TTS audio.r~   )rˆ   rŒ   r:   r   r   Úis_tts_playingr¤   +  s   € åÔ!Ð"2Ñ3Ô3Ð3r   é   c                 ó  — ddl }|                      ¦   «         }t                               ¦   «         rM|                      ¦   «         |z
  | k    rdS |                     d¦  «         t                               ¦   «         °KdS dS )zÞBlock until TTS playback finishes. For autoplay sync.

    Uses _tts_active event (set by play_tts, cleared after playback).
    Falls back to Player.Playing check.

    Args:
        timeout: Maximum seconds to wait.
    r   Nr   )rŠ   r…   Úis_setr‹   )ÚtimeoutrŠ   rœ   s      r   Úwait_for_tts_completionr©   0  s„   € ð €K€K€KØ�IŠI‰KŒK€Eå
×
Ò
Ñ
Ô
ð Ø�9Š9‰;Œ;˜Ñ Ò(Ð(ØˆEØ�
Š
�3‰Œˆõ ×
Ò
Ñ
Ô
ð ð ð ð ð r   c                 ón   — t          ¦   «         }t          || |¦  «        }|rt          ||¬¦  «         dS dS )z*Trigger TTS for welcome screen if enabled.©r�   N)rY   rv   rž   )rs   rt   r�   r^   r
   s        r   rQ   rQ   F  sI   € å!Ñ#Ô#€HÝ˜x¨°zÑBÔB€DØð $Ý�˜UÐ#Ñ#Ô#Ð#Ð#Ð#ð$ð $r   c                 óœ   — t          ¦   «         }g d¢}t          ||¦  «        sdS t          || ||¦  «        }|rt          ||¬¦  «         dS dS )z=Trigger TTS for question display if any question TTS enabled.)rR   rS   rT   Nr«   )rY   ra   rk   rž   )rh   ri   r?   r�   r^   r`   r
   s          r   rS   rS   N  sm   € å!Ñ#Ô#€HØ7Ð7Ð7€DÝ˜ $Ñ'Ô'ð ØˆÝ ¨/¸=È'ÑRÔR€DØð $Ý�˜UÐ#Ñ#Ô#Ð#Ð#Ð#ð$ð $r   )rU   rV   rW   c                  óD   — t          t          ¦   «         t          ¦  «        S )zLTrue when any feedback part (result, transition, explanation) is read aloud.)ra   rY   ÚFEEDBACK_KEYSr:   r   r   Úfeedback_enabledr¯   \  s   € åÕ*Ñ,Ô,­mÑ<Ô<Ð<r   c                 óž   — t          ¦   «         }t          |t          ¦  «        sdS t          || ||¦  «        }|rt	          ||¬¦  «         dS dS )z<Trigger TTS for answer feedback if any feedback TTS enabled.Nr«   )rY   ra   r®   rq   rž   )rn   ro   rp   r�   r^   r
   s         r   Útts_feedbackr±   a  sb   € å!Ñ#Ô#€HÝ˜¥-Ñ0Ô0ð ØˆÝ ¨+°ÈÑTÔT€DØð $Ý�˜UÐ#Ñ#Ô#Ð#Ð#Ð#ð$ð $r   )r   r9   )r¥   )r   N)!Ú__doc__r<   r   rš   rˆ   r   ÚEventr…   r„   r˜   r‡   ÚRLockrƒ   Úcompiler   r   r   r>   rA   rY   ra   rk   rq   rv   rž   r¢   r¤   r©   rQ   rS   r®   r¯   r±   r:   r   r   ú<module>r¶      sè  ððð ð €€€Ø 	€	€	€	Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð ð ˆiŒoÑÔ€Ø€Ø€
Ø€	ØˆIŒOÑÔ€	ð �”
ð  Lñ  Mô  M€ðð ð ð0ð 0ð 0ð*ð ðð ð :Ð9ð€ð$
ð 
ð 
ð"ð ð ð>5ð 5ð 5ðð ð ð8ð ð ð ð4ð ð ð ð6A>ð A>ð A>ð A>ðHð ð ð ð 4ð 4ð 4ð
ð ð ð ð,$ð $ð $ð $ð$ð $ð $ð $ð DÐCÐC€ð=ð =ð =ð
$ð $ð $ð $ð $ð $r   