
    [Th;                     B   d Z ddlZddl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 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 	 ddlmZ ddlmZ  ej4                  d      Z G d d      Z G d dej:                        Zy# e$ r ddlmZ ddlmZ Y Ew xY w)z%[Experimental] Live Music API client.    N)AsyncIterator   )_api_module)_common)_transformers)types)BaseApiClient)set_value_by_path)_live_converters)_Content_to_mldev)_Content_to_vertex)ClientConnection)connectzgoogle_genai.live_musicc                       e Zd ZdZdedefdZdeej                     ddfdZ
d	ej                  ddfd
Zdej                  ddfdZddZddZddZddZdeej(                     fdZdej(                  fdZddZy)AsyncMusicSessionz![Experimental] AsyncMusicSession.
api_client	websocketc                      || _         || _        y )N)_api_client_ws)selfr   r   s      \/home/www/backend.miabetepe.com/venv/lib/python3.12/site-packages/google/genai/live_music.py__init__zAsyncMusicSession.__init__/   s     "DDH    promptsreturnNc                    K   | j                   j                  rt        d      t        j                  d|i      }| j
                  j                  t        j                  d|i             d {    y 7 w)N4Live music generation is not supported in Vertex AI.weighted_promptsfrom_objectclientContent)	r   vertexaiNotImplementedErrorlive_converters _LiveMusicClientContent_to_mldevr   sendjsondumps)r   r   client_content_dicts      r   set_weighted_promptsz&AsyncMusicSession.set_weighted_prompts5   sc         VWW+LL)73 ((--

O5H#IJ
KKKs   A-A7/A50A7configc                    K   | j                   j                  rt        d      t        j                  |      }| j
                  j                  t        j                  d|i             d {    y 7 w)Nr   r    musicGenerationConfig)	r   r#   r$   r%   #_LiveMusicGenerationConfig_to_mldevr   r'   r(   r)   )r   r,   config_dicts      r   set_music_generation_configz-AsyncMusicSession.set_music_generation_configA   s]         VWW#GGk ((--

$;[#IJ
KKK   A+A5-A3.A5playback_controlc                    K   | j                   j                  rt        d      t        j                  d|i      }| j
                  j                  t        j                  |             d {    y 7 w)Nr   r3   r    )	r   r#   r$   r%    _LiveMusicClientMessage_to_mldevr   r'   r(   r)   )r   r3   playback_control_dicts      r   _send_control_signalz&AsyncMusicSession._send_control_signalM   s_         VWW-NN)+;< HHMM$**%:;<<<r2   c                 p   K   | j                  t        j                  j                         d{   S 7 w)z0Sends playback signal to start the music stream.N)r7   r   LiveMusicPlaybackControlPLAYr   s    r   playzAsyncMusicSession.playY   s)     **5+I+I+N+NOOOO   -646c                 p   K   | j                  t        j                  j                         d{   S 7 w)z2Sends a playback signal to pause the music stream.N)r7   r   r9   PAUSEr;   s    r   pausezAsyncMusicSession.pause]   s)     **5+I+I+O+OPPPPr=   c                 p   K   | j                  t        j                  j                         d{   S 7 w)zSends a playback signal to stop the music stream.

    Resets the music generation context while retaining the current config.
    N)r7   r   r9   STOPr;   s    r   stopzAsyncMusicSession.stopa   s+     
 **5+I+I+N+NOOOOr=   c                 p   K   | j                  t        j                  j                         d{   S 7 w)zKReset the context (prompts retained) without stopping the music generation.N)r7   r   r9   RESET_CONTEXTr;   s    r   reset_contextzAsyncMusicSession.reset_contexth   s2     **&&44   r=   c                   K   | j                          d{   x}r!| | j                          d{   x}r yy7 (7 w)zbReceive model responses from the server.

    Yields:
      The audio chunks from the server.
    N)_receive)r   results     r   receivezAsyncMusicSession.receiven   s>      --/)
)&
)l --/)
)&
)))s#   A?AAAAAc                 B  K   t        j                         }	 | j                  j                  d       d {   }|r	 t        j                  |      }ni }| j                  j                  rt        d      t        j                  |      }t         j                  j                  ||j!                               S 7 # t        $ r& | j                  j                          d {  7  }Y w xY w# t
        j                  j                  $ r t        d|      w xY ww)NFdecodezFailed to parse response: r   )responsekwargs)r   LiveMusicServerMessager   recv	TypeErrorr(   loadsdecoderJSONDecodeError
ValueErrorr   r#   r$   r%   "_LiveMusicServerMessage_from_mldev_from_response
model_dump)r   parameter_modelraw_responserN   response_dicts        r   rH   zAsyncMusicSession._receivex   s    224O+88===66l H::l+ h   VWW%HH
m ''66'A'A'C 7  % 7 +88==?**l+
 \\)) H5l5EFGGHs[   DB> B<B> DC0 A(D<B> >&C-$C'%C-*D,C--D0,DDc                 T   K   | j                   j                          d{    y7 w)z<Closes the bi-directional stream and terminates the session.N)r   closer;   s    r   r^   zAsyncMusicSession.close   s     
((..
s   (&()r   N)__name__
__module____qualname____doc__r	   r   r   listr   WeightedPromptr+   LiveMusicGenerationConfigr1   r9   r7   r<   r@   rC   rF   r   rP   rJ   rH   r^    r   r   r   r   ,   s    )%2B
L5''(
L 
L
L,,
L 
L
=66
= 
=PQP]5+G+GH e:: 2r   r   c                   n    e Zd ZdZ ej
                  d      ej                  dede	e
   fd              Zy)AsyncLiveMusicz_[Experimental] Live music module.

  Live music can be accessed via `client.aio.live.music`.
  zLRealtime music generation is experimental and may change in future versions.modelr   c               J  K   | j                   j                         }t        |t              r|j	                  d      }t        j                  | j                   |      }| j                   j                  r| j                   j                  }| j                   j                  j                  }| d| d| }| j                   j                  j                  }t        j                  t        j                  t        j                   |      j#                  d                  }t%        |dd	g|       t'        j(                  |      }	nt+        d
      	 t-        ||      4 d{   }
|
j/                  |	       d{    t0        j3                  |
j5                  d       d{          t7        | j                   |
       ddd      d{    y7 u7 ^7 77 # 1 d{  7  sw Y   yxY w# t8        $ r t-        ||      4 d{  7  }
|
j/                  |	       d{  7   t0        j3                  |
j5                          d{  7         t7        | j                   |
       ddd      d{  7   Y y# 1 d{  7  sw Y   Y yxY ww xY ww)z0[Experimental] Connect to the live music server.zutf-8z!/ws/google.ai.generativelanguage.z).GenerativeService.BidiGenerateMusic?key=)ri   T)exclude_noner    setupri   r   )additional_headersNFrL   )r   r   )extra_headers)r   _websocket_base_url
isinstancebytesrM   tt_modelapi_key_http_optionsapi_versionheadersr   convert_to_dictr%   $_LiveMusicConnectParameters_to_mldevr   LiveMusicConnectParametersrY   setvr(   r)   r$   r   r'   loggerinforQ   r   rR   )r   ri   base_urltransformed_modelrt   versionurirw   request_dictrequestwss              r   r   zAsyncLiveMusic.connect   s3     335H(E")h		$"2"2E:  ((g  ..::gj9'Bklsktuc  ..66g ,,

>
>::'

-l <'7+->?

<(g VWWK9 K KRggg"'''//04+;+;rJJ	K K K/K K K K
  KG4 K Kggg"'')OO$4+;+;rJJ	K K K K KKs   EJ#G6 #G$G6 'G!<G=(G!%G
&"G!G6 GG6 J#G6 G!G!G6 !G3'G*(G3/G6 2J#3G6 6J HJ J	*H-+'J	I#J	6J JJ J#	J	JJ	J J#J  J#N)r_   r`   ra   rb   r   experimental_warning
contextlibasynccontextmanagerstrr   r   r   rf   r   r   rh   rh      sS    
  7T !!(KC (KM:K,L (K "(Kr   rh   )rb   r   r(   loggingtypingr    r   r   r   rr   r   r   r	   r
   r{   r   r%   modelsr   r   websockets.asyncio.clientr   r   ModuleNotFoundErrorwebsockets.client	getLoggerr|   r   
BaseModulerh   rf   r   r   <module>r      s     ,           & . 1 % &(8/
 
		4	5g gT2K[++ 2Kc  (0'(s   B
 
BB