
    b6i*                     2   d dl 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  ej"                  ej$                  d      Z ej(                  e      Ze G d	 d
             Ze G d d             Z G d de      Z G d de
      Z	y)    N)	dataclass)RequestOptions)AsyncMusicClient)MusicClient)AllowedOutputFormats)MusicPrompt.c                   t    e Zd ZU eed<   eed<   ej                  e   ed<   ej                  e   ed<   eed<   y)SongMetadatatitledescriptiongenres	languagesis_explicitN)__name__
__module____qualname__str__annotations__typingListbool     b/root/.openclaw/workspace/visionaryfx/venv/lib/python3.12/site-packages/elevenlabs/music_custom.pyr
   r
      s1    JKK{{3r   r
   c                   ^    e Zd ZU ej                  eej                  f   ed<   eed<   eed<   y)MultipartResponsejsonaudiofilenameN)	r   r   r   r   Dictr   Anyr   bytesr   r   r   r   r      s#    
++c6::o
&&LMr   r   c                       e Zd ZdZdeeeeeedddej                  e   dej                  e   dej                  e	   dej                  e
   dej                  ej                  d	      d
ej                  e   dej                  e   dej                  e   dej                  def fdZdej"                  e   defdZ xZS )r   z
    A client to handle ElevenLabs music-related functionality
    Extends the autogenerated client to include custom music methods
    Noutput_formatpromptcomposition_planmusic_length_msmodel_idwith_timestampssign_with_c2parequest_optionsr%   r&   r'   r(   r)   music_v1r*   r+   r,   kwargsreturnc                V    t        |   d||||||||d|	}
| j                  |
      S )"  
        Compose a song from a prompt or a composition plan with detailed response parsing.
        This method calls the original compose_detailed and then parses the stream response.

        Returns a MultipartResponse containing parsed JSON metadata, audio bytes, and filename.
        r%   r&   r'   r(   r)   r*   sign_with_c_2_par,   r   )supercompose_detailed_parse_multipartselfr%   r&   r'   r(   r)   r*   r+   r,   r.   stream	__class__s              r   r5   zMusicClient.compose_detailed)   sN    ( ) 

'-++++

 

 $$V,,r   r9   c                    g }|D ]  }|j                  |        dj                  |      }|j                  dd      }|j                  d      }|st	        d      |d   j                         }d}d	}	t        t        d
t        |                  D ]^  }
d||
   v s|
dz   t        |      k  s||
dz      }|j                         s6|j                  d      sH	 t        j                  |      } n t        t        dt        |                  D ]8  }
d||
   v st        j                   d||
         }|s'|j#                  d      }	 n |j%                  d      }d}d}t        t        |      t        |      z
  dz         D ](  }
||
|
t        |      z    |k(  s|dk(  r|
} |dk(  s&|
} n |dk(  rt	        d      |t        |      z   }|t        |      dz
  k  r0||   d
k(  r||dz      d
k(  r|dz  }n|dz  }|t        |      dz
  k  r0||d }|st	        d      t'        |||	      S # t        j                  $ r#}t        j                  d|        Y d}~od}~ww xY w)a+  
        Reads a byte stream containing multipart data and parses it into JSON and audio parts.

        Args:
            stream: Iterator of bytes from ElevenLabs music API response

        Returns:
            MultipartResponse containing parsed JSON metadata, audio bytes, and filename
        r   utf-8ignoreerrors
Empty response from music APIr   Ngenerated_music.mp3
   Content-Type: application/json   {z'Failed to parse composition plan JSON:    	filename=filename="([^"]+)"   "Could not find audio part boundaryCould not parse JSON datar   r   r   appendjoindecodesplit
ValueErrorstriprangeminlen
startswithr   loadsJSONDecodeErrorloggererrorresearchgroupencoder   r8   r9   chunkschunkresponse_bytesresponse_textlinesboundary	json_datar   i	json_lineematchboundary_bytesfirst_boundarysecond_boundaryaudio_startaudio_buffers                      r   r6   zMusicClient._parse_multipartL   s     	!EMM% 	! &) '--gh-G##D)<==8>># 	( s2s5z*+ 	A/58;AE
@R!!a%L	??$)=)=c)BT$(JJy$9	 	 s2s5z*+ 	AeAh&		"7qB${{1~H	 "1s>*S-@@1DE 	AaC$7 78NJ!R'%&N$*&'O	 b ABB &N(;; C/!33{+t3{Q/47q 1K C/!33 &kl3899 
 	
]  // T'Nqc%RSSTs   H..I$II$)r   r   r   __doc__OMITr   Optionalr   r   r   intLiteralr   r   r!   r   r5   Iteratorr"   r6   __classcell__r:   s   @r   r   r   #   s    @D'+9=04@D1504;?!- ';<!- $	!-
 !//+6!-  -!- //&.."<=!-  .!- -!-  8!- **!- 
!-FX
vu'= X
BS X
r   r   c                       e Zd ZdZdeeeeeedddej                  e   dej                  e   dej                  e	   dej                  e
   dej                  ej                  d	      d
ej                  e   dej                  e   dej                  e   dej                  def fdZdej"                  e   defdZ xZS )r   z
    An async client to handle ElevenLabs music-related functionality
    Extends the autogenerated async client to include custom music methods
    Nr$   r%   r&   r'   r(   r)   r-   r*   r+   r,   r.   r/   c                r   K   t        |   d||||||||d|	}
| j                  |
       d{   S 7 w)r1   r2   Nr   )r4   r5   _parse_multipart_asyncr7   s              r   r5   z!AsyncMusicClient.compose_detailed   sX     ( ) 

'-++++

 

 008888s   -757r9   c                   K   g }|2 3 d{   }|j                  |       7 6 dj                  |      }|j                  dd      }|j                  d      }|st	        d      |d   j                         }d}d	}	t        t        d
t        |                  D ]  }
d||
   v s|
dz   t        |      k  s||
dz      }|j                         s6|j                  d      sH	 t        j                  |      }n8# t        j                  $ r"}t        j                  d|        Y d}~nd}~ww xY w n t        t        dt        |                  D ]8  }
d||
   v st        j                   d||
         }|s'|j#                  d      }	 n |j%                  d      }d}d}t        t        |      t        |      z
  dz         D ](  }
||
|
t        |      z    |k(  s|dk(  r|
} |dk(  s&|
} n |dk(  rt	        d      |t        |      z   }|t        |      dz
  k  r0||   d
k(  r||dz      d
k(  r|dz  }n|dz  }|t        |      dz
  k  r0||d }|st	        d      t'        |||	      S w)a7  
        Reads an async byte stream containing multipart data and parses it into JSON and audio parts.

        Args:
            stream: AsyncIterator of bytes from ElevenLabs music API response

        Returns:
            MultipartResponse containing parsed JSON metadata, audio bytes, and filename
        Nr   r<   r=   r>   r@   rA   r   rB   rC   rD   rE   rF   zFailed to parse JSON: rG   rH   rI   rJ   rK   rL   rM   rN   rO   rb   s                      r   r}   z'AsyncMusicClient._parse_multipart_async   s     ! 	! 	!%MM% 	!6 &) '--gh-G##D)<==8>># 	( s2s5z*+ 	A/58;AE
@R!!a%L	??$)=)=c)BC$(JJy$9	// C'=aS%ABBC	 s2s5z*+ 	AeAh&		"7qB${{1~H	 "1s>*S-@@1DE 	AaC$7 78NJ!R'%&N$*&'O	 b ABB &N(;; C/!33{+t3{Q/47q 1K C/!33 &kl3899 
 	
s|   I1$"$I1$BI1'I19I1I1%C;:I1;D0D+&I1+D00.I1I1;A#I1I1-A#I1 I1)r   r   r   rs   rt   r   ru   r   r   r   rv   rw   r   r   r!   r   r5   AsyncIteratorr"   r}   ry   rz   s   @r   r   r      s    @D'+9=04@D1504;?!9 ';<!9 $	!9
 !//+6!9  -!9 //&.."<=!9  .!9 -!9  8!9 **!9 
!9FX
63G3G3N X
Sd X
r   r   )r   loggingr^   r   dataclassesr   elevenlabs.core.request_optionsr   elevenlabs.music.clientr   AutogeneratedAsyncMusicClientr   AutogeneratedMusicClient'elevenlabs.types.allowed_output_formatsr   elevenlabs.types.music_promptr   castr!   rt   	getLoggerr   r\   r
   r   r   r   r   <module>r      s      	  ! : U K H 5 v{{6::s#			8	$      A
* A
HA
4 A
r   