o
    lWi)                     @   s   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ejdZeeZeG d	d
 d
ZeG dd dZG dd deZG dd de
Z	dS )    N)	dataclass)RequestOptions)AsyncMusicClient)MusicClient)'MusicComposeDetailedRequestOutputFormat)MusicPrompt.c                   @   sB   e Zd ZU eed< eed< eje ed< eje ed< eed< dS )SongMetadatatitledescriptiongenres	languagesis_explicitN)__name__
__module____qualname__str__annotations__typingListbool r   r   [/var/www/html/asistente-voz-ia/venv/lib/python3.10/site-packages/elevenlabs/music_custom.pyr      s   
 r   c                   @   s2   e Zd ZU ejeejf ed< eed< eed< dS )MultipartResponsejsonaudiofilenameN)	r   r   r   r   Dictr   Anyr   bytesr   r   r   r   r      s   
 r   c                          e Zd ZdZd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f fddZdeje defddZ  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request_optionsr!   r"   r#   r$   r%   music_v1r&   returnc                   s"   t  j||||||d}| |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    )supercompose_detailed_parse_multipartselfr!   r"   r#   r$   r%   r&   stream	__class__r   r   r+   )   s   

zMusicClient.compose_detailedr/   c                 C   s6  g }|D ]}| | qd|}|jddd}|d}|s#td|d  }d}d	}	ttd
t|D ]D}
d||
 v rz|
d t|k rz||
d  }| rz|	drzzt
|}W n t
jyw } ztd|  W Y d}~nd}~ww  nq6ttdt|D ]}
d||
 v rtd||
 }|r|d}	 nq|d}d}d}tt|t| d D ]}
||
|
t|  |kr|dkr|
}q|dkr|
} nq|dkrtd|t| }|t|d k r|| d
kr||d  d
kr|d7 }n|d7 }|t|d k s||d }|stdt|||	dS )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
            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   r.   r/   chunkschunkresponse_bytesresponse_textlinesboundary	json_datar   i	json_lineematchboundary_bytesfirst_boundarysecond_boundaryaudio_startaudio_bufferr   r   r   r,   F   sv   



	zMusicClient._parse_multipart)r   r   r   __doc__OMITr   Optionalr   r   r   intLiteralr   r   r+   Iteratorr   r,   __classcell__r   r   r0   r   r   #   0    	 r   c                       r   )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(   c                   s*   t  j||||||d}| |I dH S )r)   r    N)r*   r+   _parse_multipart_asyncr-   r0   r   r   r+      s   
z!AsyncMusicClient.compose_detailedr/   c                    sF  g }|2 z3 dH W }| | q6 d|}|jddd}|d}|s)td|d  }d}d	}	ttd
t|D ]D}
d||
 v r|
d t|k r||
d  }| r|	drzt
|}W n t
jy} } ztd|  W Y d}~nd}~ww  nq<ttdt|D ]}
d||
 v rtd||
 }|r|d}	 nq|d}d}d}tt|t| d D ]}
||
|
t|  |kr|dkr|
}q|dkr|
} nq|dkrtd|t| }|t|d k r|| d
kr||d  d
kr|d7 }n|d7 }|t|d k s||d }|stdt|||	dS )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
        Nr2   r3   r4   r5   r7   r8   r   r9   r:   r;   r<   r=   zFailed to parse JSON: r>   r?   r@   rA   rB   rC   rD   rE   rF   rY   r   r   r   rr      sz   



	z'AsyncMusicClient._parse_multipart_async)r   r   r   rj   rk   r   rl   r   r   r   rm   rn   r   r   r+   AsyncIteratorr   rr   rp   r   r   r0   r   r      rq   r   )r   loggingrU   r   dataclassesr   elevenlabs.core.request_optionsr   elevenlabs.music.clientr   AutogeneratedAsyncMusicClientr   AutogeneratedMusicClientCelevenlabs.music.types.music_compose_detailed_request_output_formatr   elevenlabs.types.music_promptr   castr   rk   	getLoggerr   rS   r   r   r   r   r   r   <module>   s$    
~