o
    êiO2                     @   sv   d Z ddlmZmZmZ ddlmZmZmZm	Z	 ddl
mZmZmZ dedefdd	ZG d
d dZG dd dZdS )z"Voice management namespace client.    )ListOptionalUnion   )OMITAsyncClientWrapperClientWrapperRequestOptions)PaginatedResponse
VisibilityVoicedreturnc                 C   s   dd |   D S )z,Remove None and OMIT values from dictionary.c                 S   s&   i | ]\}}|d ur|t ur||qS N)r   ).0kv r   N/home/ubuntu/.local/lib/python3.10/site-packages/fishaudio/resources/voices.py
<dictcomp>   s   & z _filter_none.<locals>.<dictcomp>)items)r   r   r   r   _filter_none	   s   r   c                   @     e Zd ZdZdefddZddeedeeedd	d

dededee	 dee
ee	 e	f  dedee	 dee
ee	 e	f  dee
ee	 e	f  de	dee dee fddZd	dde	dee defddZeeeedddd	dde	d ee d!ee	 d"eee	  deee	  d#ee d$ed%e	d&edee defd'd(Zeeeeed	d)de	dee	 d!ee	 d#ee d$ee deee	  dee dd	fd*d+Zd	dde	dee dd	fd,d-Zd	S ).VoicesClientz(Synchronous voice management operations.client_wrapperc                 C   
   || _ d S r   _clientselfr   r   r   r   __init__      
zVoicesClient.__init__
      F
task_countN
	page_sizepage_numbertitletags	self_only	author_idlanguagetitle_languagesort_byrequest_optionsr&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r   c       
         C   sB   t |||||||||	d	}| jjdd||
d}tt | S )a&  
        List available voices/models.

        Args:
            page_size: Number of results per page
            page_number: Page number (1-indexed)
            title: Filter by title
            tags: Filter by tags (single tag or list)
            self_only: Only return user's own voices
            author_id: Filter by author ID
            language: Filter by language(s)
            title_language: Filter by title language(s)
            sort_by: Sort field ("task_count" or "created_at")
            request_options: Request-level overrides

        Returns:
            Paginated response with total count and voice items

        Example:
            ```python
            client = FishAudio(api_key="...")

            # List all voices
            voices = client.voices.list(page_size=20)
            print(f"Total: {voices.total}")
            for voice in voices.items:
                print(f"{voice.title}: {voice.id}")

            # Filter by tags
            tagged = client.voices.list(tags=["male", "english"])
            ```
        	r&   r'   r(   tagr   r+   r,   r-   r.   GET/modelparamsr/   r   r   requestr
   r   model_validatejsonr   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r5   responser   r   r   list   s&   /zVoicesClient.listr/   voice_idc                C   s&   | j jdd| |d}t| S )a  
        Get voice by ID.

        Args:
            voice_id: Voice model ID
            request_options: Request-level overrides

        Returns:
            Voice model details

        Example:
            ```python
            client = FishAudio(api_key="...")
            voice = client.voices.get("voice_id_here")
            print(voice.title, voice.description)
            ```
        r2   /model/r=   r   r7   r   r8   r9   r   r>   r/   r;   r   r   r   get\   s   zVoicesClient.getprivatefastTdescriptiontextsr)   cover_image
visibility
train_modeenhance_audio_qualityr/   voicesrF   rG   rH   rI   rJ   rK   c       
      
   C   sr   t |||d||p	g |pg |	d}dd |D }|tur'|dur'|d|f | jjdd|||
d	}t| S )
aa  
        Create/clone a new voice.

        Args:
            title: Voice model name
            voices: List of audio file bytes for training
            description: Voice description
            texts: Transcripts for voice samples
            tags: Tags for categorization
            cover_image: Cover image bytes
            visibility: Visibility setting (public, unlist, private)
            train_mode: Training mode (currently only "fast" supported)
            enhance_audio_quality: Whether to enhance audio quality
            request_options: Request-level overrides

        Returns:
            Created voice model

        Example:
            ```python
            client = FishAudio(api_key="...")

            with open("voice1.wav", "rb") as f1, open("voice2.wav", "rb") as f2:
                voice = client.voices.create(
                    title="My Voice",
                    voices=[f1.read(), f2.read()],
                    description="Custom voice clone",
                    tags=["custom", "english"]
                )
            print(f"Created: {voice.id}")
            ```
        ttsr(   rF   rI   typerJ   rG   r)   rK   c                 S      g | ]}d |fqS rL   r   r   voicer   r   r   
<listcomp>       z'VoicesClient.create.<locals>.<listcomp>NrH   POSTr3   datafilesr/   r   r   appendr   r7   r   r8   r9   r   r(   rL   rF   rG   r)   rH   rI   rJ   rK   r/   rX   rY   r;   r   r   r   createz   s,   /zVoicesClient.creater(   rF   rH   rI   r)   r/   c          
      C   s\   t ||||d}g }	|tur|dur|	d|f | jjdd| ||	r'|	nd|d dS )aR  
        Update voice metadata.

        Args:
            voice_id: Voice model ID
            title: New title
            description: New description
            cover_image: New cover image bytes
            visibility: New visibility setting
            tags: New tags
            request_options: Request-level overrides

        Example:
            ```python
            client = FishAudio(api_key="...")
            client.voices.update(
                "voice_id_here",
                title="Updated Title",
                visibility="public"
            )
            ```
        r(   rF   rI   r)   NrH   PATCHr?   rW   r   r   r[   r   r7   
r   r>   r(   rF   rH   rI   r)   r/   rX   rY   r   r   r   update   s"   "


zVoicesClient.updatec                C   s   | j jdd| |d dS )a"  
        Delete a voice.

        Args:
            voice_id: Voice model ID
            request_options: Request-level overrides

        Example:
            ```python
            client = FishAudio(api_key="...")
            client.voices.delete("voice_id_here")
            ```
        DELETEr?   r=   Nr   r7   r   r>   r/   r   r   r   delete   s
   
zVoicesClient.delete)__name__
__module____qualname____doc__r   r    r   intr   strr   r   boolr	   r
   r   r<   rB   bytesr   r]   rc   rg   r   r   r   r   r      s    	

L
#

	

P
	

=r   c                   @   r   ).AsyncVoicesClientz)Asynchronous voice management operations.r   c                 C   r   r   r   r   r   r   r   r      r!   zAsyncVoicesClient.__init__r"   r#   Fr$   Nr%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r   c       
            sJ   t |||||||||	d	}| jjdd||
dI dH }tt | S )zCList available voices/models (async). See sync version for details.r0   r2   r3   r4   Nr6   r:   r   r   r   r<     s(   zAsyncVoicesClient.listr=   r>   c                   s.   | j jdd| |dI dH }t| S )z6Get voice by ID (async). See sync version for details.r2   r?   r=   Nr@   rA   r   r   r   rB   E  s   zAsyncVoicesClient.getrC   rD   TrE   rL   rF   rG   rH   rI   rJ   rK   c       
      
      sz   t |||d||p
g |pg |	d}dd |D }|tur(|dur(|d|f | jjdd|||
d	I dH }t| S )
z?Create/clone a new voice (async). See sync version for details.rM   rN   c                 S   rP   rQ   r   rR   r   r   r   rT   o  rU   z,AsyncVoicesClient.create.<locals>.<listcomp>NrH   rV   r3   rW   rZ   r\   r   r   r   r]   S  s.   zAsyncVoicesClient.creater^   c          
         sd   t ||||d}g }	|tur|dur|	d|f | jjdd| ||	r(|	nd|dI dH  dS )z<Update voice metadata (async). See sync version for details.r_   NrH   r`   r?   rW   ra   rb   r   r   r   rc   }  s$   	
zAsyncVoicesClient.updatec                   s$   | j jdd| |dI dH  dS )z5Delete a voice (async). See sync version for details.rd   r?   r=   Nre   rf   r   r   r   rg     s   zAsyncVoicesClient.delete)rh   ri   rj   rk   r   r    r   rl   r   rm   r   r   rn   r	   r
   r   r<   rB   ro   r   r]   rc   rg   r   r   r   r   rp     s    	

*


	

.
	

%rp   N)rk   typingr   r   r   corer   r   r   r	   typesr
   r   r   dictr   r   rp   r   r   r   r   <module>   s      