§
    	Êj’  ã                  ó2  — d dl mZ d dlZd dlZd dlZd dlmZ d dlmZm	Z	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mZmZ ddlmZmZ ddlmZ ddlmZ ddlmZm Z m!Z! ddl"m#Z#  edg e	e!¦  «        g¬¦  «        Z$dZ%dZ&d2d„Z'd3d!„Z(d4d(„Z)d4d)„Z*d5d*„Z+e$ ,                    d+¦  «         e	e¦  «        fd6d,„¦   «         Z-e$ ,                    d-¦  «         e	e¦  «        fd7d.„¦   «         Z.e$ /                    d/¦  «         e	e¦  «        fd8d1„¦   «         Z0dS )9é    )ÚannotationsN)Úreplace)Ú	APIRouterÚDependsÚRequest)ÚValidationError)Ú
UploadFileé   )Úload_image_ref)Úresolve_model)ÚImageRequestÚ
InputImageÚMediaResult)ÚInvalidRequestÚNotFound)ÚServices)ÚTaské   )Úget_servicesÚpublic_baseÚrequire_api_key)ÚImageGenerationRequestÚimages)ÚtagsÚdependenciesé   z;Isolated subject on a plain, uncluttered studio background.Úrr   ÚfmtÚstrÚsvcr   ÚbaseÚreturnÚdictc                óä   — d| j         i}|dk    r/t          j        | j        ¦  «                             ¦   «         |d<   n1|j                             | j        | j        d¬¦  «        }|› d|› �|d<   |S )NÚrevised_promptÚb64_jsonÚimg)Úprefixz
/v1/media/Úurl)r%   Úbase64Ú	b64encodeÚdataÚdecodeÚmediaÚsaveÚmime)r   r   r    r!   ÚitemÚnames         ú6C:\Projects\Muse2API\src\muse2api\api\routes\images.pyÚ_image_itemr4      sy   € Ø" AÔ$4Ð5€DØ
ˆjÒÐÝ!Ô+¨A¬FÑ3Ô3×:Ò:Ñ<Ô<ˆˆZÑÐàŒy�~Š~˜aœf a¤f°Uˆ~Ñ;Ô;ˆØÐ/Ð/¨Ð/Ð/ˆˆU‰Ø€Kó    Útaskr   c           	     ó¨   — | j         d| j        j        | j        t	          | j        ¦  «        | j                             d¦  «        | j        | j	        dœS )Nz
image.taskÚmodel)ÚidÚobjectÚstatusÚprogressÚ
created_atr8   ÚresultÚerror)
r9   r;   Úvaluer<   Úintr=   ÚrequestÚgetr>   r?   )r6   s    r3   Ú
_task_viewrD   )   sP   € àŒgØØ”+Ô#Ø”MÝ˜$œ/Ñ*Ô*Ø”×!Ò! 'Ñ*Ô*Ø”+Ø”ð	ð 	ð 	r5   Úbodyr   Úrefsúlist[InputImage]rB   r   c              ƒ  ó8  K  — | j         pt          | j         d¦  «        j        |j        _         t	          |¦  «        t
          k    rt          dt
          › d�¦  «        ‚| j        rt          | |||¦  «        S t          | |t          |¦  «        |¦  «        ƒ d {V —†S )NÚimagezat most z reference images are supported)r8   r   r9   ÚstateÚlenÚMAX_REFERENCE_IMAGESr   Úasync_Ú_submitÚ_runr   )rE   rF   rB   r    s       r3   Ú	_generaterP   6   sŸ   è è € àœ*ÐM­°d´jÀ'Ñ(JÔ(JÔ(M€G„MÔÝ
ˆ4�y„yÕ'Ò'Ð'ÝÐ]Õ(<Ð]Ð]Ð]Ñ^Ô^Ð^Ø„{ð 1Ý�t˜T 7¨CÑ0Ô0Ð0Ý�d˜D¥+¨gÑ"6Ô"6¸Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<r5   c                ó^  ‡ ‡‡‡— t          ‰ j        d¦  «        }‰                      ddi¬¦  «        Š t          |¦  «        Šd	ˆˆ ˆˆfd„}|j        ‰ j        ‰ j        ‰ j        t          ‰¦  «        dœ}‰j	         
                    d||¦  «        }|j        |j        _        t          |¦  «        S )
zJRun the generation as a background task; results are stored as media URLs.rI   Úresponse_formatr)   )Úupdater"   r#   c              “  ó8   •K  — t          ‰‰‰‰¦  «        ƒ d {V —†S ©N)rO   )r<   r!   rE   rF   r    s    €€€€r3   Úrunnerz_submit.<locals>.runnerG   s-   øè è € Ý˜$  d¨CÑ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0r5   )r8   ÚpromptÚsizeÚnÚ
references)r"   r#   )r   r8   Ú
model_copyr   r9   rW   rX   rY   rK   ÚtasksÚsubmitrJ   Útask_idrD   )	rE   rF   rB   r    ÚspecrV   Úmetar6   r!   s	   `` `    @r3   rN   rN   @   sÇ   øøøø€ õ ˜œ WÑ-Ô-€DØ�?Š?Ð#4°eÐ"<ˆ?Ñ=Ô=€DÝ�wÑÔ€Dð1ð 1ð 1ð 1ð 1ð 1ð 1ð 1ð 1ð ”W¨¬¸T¼YÈTÌVÝ˜d™)œ)ð%ð %€DàŒ9×Ò˜G T¨6Ñ2Ô2€DØ œG€G„MÔÝ�dÑÔÐr5   c              ƒ  óÐ  ‡ ‡‡K  — t          ‰ j        d¦  «        }‰ j        dk    }|r$‰ j                             d¦  «        › dt
          › �n‰ j        }t          ||j        ‰ j        ‰ j	        |‰j
        j        ¬¦  «        }‰j                             |¦  «        ƒ d {V —†}|rˆfd„|D ¦   «         ƒ d {V —†}t          t          j        ¦   «         ¦  «        ˆˆ ˆfd„|D ¦   «         dœS )NrI   Útransparentz. )rW   r8   rX   rY   Úreference_imagesÚtimeoutc              “  ó~   •K  — g | ]7}t          |‰j                             |j        ¦  «        ƒ d {V —†d¬¦  «        ‘Œ8S )Nú	image/png©r,   r0   )r   ÚmattingÚremover,   )Ú.0r   r    s     €r3   ú
<listcomp>z_run.<locals>.<listcomp>[   s`   øè è € ð %ð %ð %Øõ ˜1¨¬×);Ò);¸A¼FÑ)CÔ)CÐ#CÐ#CÐ#CÐ#CÐ#CÐ#CÈ+ÐVÑVÔVð %ð %ð %r5   c                ó>   •— g | ]}t          |‰j        ‰‰¦  «        ‘ŒS © )r4   rR   )rj   r   r!   rE   r    s     €€€r3   rk   z_run.<locals>.<listcomp>^   s*   ø€ ÐVÐVÐVÈ•[  DÔ$8¸#¸tÑDÔDÐVÐVÐVr5   )Úcreatedr,   )r   r8   Ú
backgroundrW   ÚrstripÚ_CUTOUT_HINTr   r9   rX   rY   ÚsettingsÚimage_timeoutÚgatewayÚgenerate_imagerA   Útime)	rE   rF   r!   r    r_   rb   rW   ÚreqÚresultss	   ` ``     r3   rO   rO   Q   s9  øøøè è € å˜œ WÑ-Ô-€DØ”/ ]Ò2€KØ>IÐZ�”×"Ò" 4Ñ(Ô(Ð:Ð:­LÐ:Ð:Ð:ÈtÌ{€FÝ
˜f¨D¬G¸$¼)ÀtÄvØ(,°c´lÔ6PðRñ Rô R€Cà”K×.Ò.¨sÑ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3€GØð %ð%ð %ð %ð %Ø#ð%ñ %ô %ð %ð %ð %ð %ð %ð %ˆå�4œ9™;œ;Ñ'Ô'ØVÐVÐVÐVÐVÐVÈgÐVÑVÔVðXð Xð Xr5   z/v1/images/generationsc              ƒ  ó¾   K  — t          | j        t          ¦  «        r| j        n| j        r| j        gng }d„ |D ¦   «         ƒ d {V —†}t          | |||¦  «        ƒ d {V —†S )Nc              “  óJ   K  — g | ]}t          t          |¦  «        ƒ d {V —†Ž ‘ŒS rU   )r   r   )rj   Úrefs     r3   rk   z#generate_images.<locals>.<listcomp>e   s;   è è € ÐGÐGÐG¸3�j¥°Ñ!4Ô!4Ð4Ð4Ð4Ð4Ð4Ð4Ð6ÐGÐGÐGr5   )Ú
isinstancerI   ÚlistrP   )rE   rB   r    rF   Úloadeds        r3   Úgenerate_imagesr   a   s   è è € õ $ D¤JµÑ5Ô5Ð]ˆ4Œ:ˆ:È4Ì:Ð;]¸D¼J¸<¸<Ð[]€DØGÐGÀ$ÐGÑGÔGÐGÐGÐGÐGÐGÐG€FÝ˜4 ¨°#Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6Ð6r5   z/v1/images/editsc              ƒ  óî  ‡	K  — |                       ¦   «         ƒ d{V —†Š	‰	                     d¦  «        �t          d¦  «        ‚ˆ	fd„dD ¦   «         }|st          d¦  «        ‚d„ ‰	                     ¦   «         D ¦   «         }	 t	          di |¤Ž}nN# t
          $ rA}t          |                     ¦   «         d                              d	d
¦  «        ¦  «        |‚d}~ww xY wg }|D ]}|j        pd}|                     d¦  «        s#t          j
        |j        pd¦  «        d         pd}|                     t          |                     ¦   «         ƒ d{V —†|¬¦  «        ¦  «         Œ€t          ||| |¦  «        ƒ d{V —†S )zÙOpenAI-style multipart edit: ``image`` / ``image[]`` files plus a prompt.

    muse.ai has no inpainting, so the images act as references for a new image
    and ``mask`` is rejected rather than silently ignored.
    NÚmaskz6mask is not supported; muse.ai cannot inpaint a regionc                ón   •— g | ]1}‰                      |¦  «        D ]}t          |t          ¦  «        ¯|‘ŒŒ2S rm   )Úgetlistr|   r	   )rj   ÚkeyÚfÚforms      €r3   rk   zedit_images.<locals>.<listcomp>s   sV   ø€ ð +ð +ð +�3¸¿ºÀSÑ8IÔ8Ið +ð +°1Ý˜1�jÑ)Ô)ð+ˆQð +ð +ð +ð +r5   ©rI   zimage[]z@at least one image file is required (field 'image' or 'image[]')c                óL   — i | ]!\  }}t          |t          ¦  «        ¯|d v¯||“Œ"S )r‡   )r|   r   )rj   ÚkÚvs      r3   ú
<dictcomp>zedit_images.<locals>.<dictcomp>w   s8   € ÐdÐdÐd‘t�q˜!­z¸!½SÑ/AÔ/AÐdÀaÐOcÐFcÐFcˆa�ÐFcÐFcÐFcr5   r   Úmsgzinvalid requestÚ zimage/rf   rg   rm   )r†   rC   r   Úitemsr   r   ÚerrorsÚcontent_typeÚ
startswithÚ	mimetypesÚ
guess_typeÚfilenameÚappendr   ÚreadrP   )
rB   r    ÚfilesÚfieldsrE   ÚexcrF   r…   r0   r†   s
            @r3   Úedit_imagesrš   i   sÄ  øè è € ð —’‘”ÐÐÐÐÐÐ€DØ‡x‚x�ÑÔÐ#ÝÐUÑVÔVÐVð+ð +ð +ð +Ð.ð +ñ +ô +€Eàð aÝÐ_Ñ`Ô`Ð`ØdÐd˜tŸzšz™|œ|ÐdÑdÔd€FðUÝ%Ð/Ð/¨Ð/Ð/ˆˆøÝð Uð Uð UÝ˜SŸZšZ™\œ\¨!œ_×0Ò0°Ð8IÑJÔJÑKÔKÐQTÐTøøøøðUøøøà€DØð @ð @ˆØŒ~Ð# ˆØ�Š˜xÑ(Ô(ð 	LÝÔ'¨¬
Ð(8°bÑ9Ô9¸!Ô<ÐKÀˆDØ�Š•J¨!¯&ª&©(¬( N N N N N N¸Ð>Ñ>Ô>Ñ?Ô?Ð?Ð?Ý˜4  w°Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4s   Â B Â
CÂ<CÃCz /v1/images/generations/{task_id}r^   c              ƒ  óà   K  — |j                              | ¦  «        }|�|j        dk    rt          d| › d�¦  «        ‚|j                             d¦  «        |j        _        t          |¦  «        S )NrI   zimage task 'z' not foundr8   )r\   rC   Úkindr   rB   rJ   r8   rD   )r^   rB   r    r6   s       r3   Úget_image_taskr�   …   sn   è è € ð Œ9�=Š=˜Ñ!Ô!€DØ€|�t”y GÒ+Ð+ÝÐ: gÐ:Ð:Ð:Ñ;Ô;Ð;Øœ,×*Ò*¨7Ñ3Ô3€G„MÔÝ�dÑÔÐr5   )
r   r   r   r   r    r   r!   r   r"   r#   )r6   r   r"   r#   )
rE   r   rF   rG   rB   r   r    r   r"   r#   )
rE   r   rF   rG   r!   r   r    r   r"   r#   )rE   r   rB   r   r    r   r"   r#   )rB   r   r    r   r"   r#   )r^   r   rB   r   r    r   r"   r#   )1Ú
__future__r   r*   r’   rv   Údataclassesr   Úfastapir   r   r   Úpydanticr   Ústarlette.datastructuresr	   Ú
core.mediar   Úcore.modelsr   Údrivers.baser   r   r   r�   r   r   Úservices.containerr   Úservices.tasksr   Údepsr   r   r   Úschemasr   ÚrouterrL   rq   r4   rD   rP   rN   rO   Úpostr   rš   rC   r�   rm   r5   r3   ú<module>r¬      sœ  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð à /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ø $Ð $Ð $Ð $Ð $Ð $Ø /Ð /Ð /Ð /Ð /Ð /à (Ð (Ð (Ð (Ð (Ð (Ø (Ð (Ð (Ð (Ð (Ð (Ø AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AØ .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø *Ð *Ð *Ð *Ð *Ð *Ø "Ð "Ð "Ð "Ð "Ð "Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,à	ˆ˜˜
°'°'¸/Ñ2JÔ2JÐ1KÐ	LÑ	LÔ	L€ð Ð ð M€ðð ð ð ð
ð 
ð 
ð 
ð=ð =ð =ð =ðð ð ð ð"Xð Xð Xð Xð  ‡‚Ð%Ñ&Ô&à*1¨'°,Ñ*?Ô*?ð7ð 7ð 7ð 7ñ 'Ô&ð7ð ‡‚ÐÑ Ô Ø8?¸ÀÑ8MÔ8Mð 5ð 5ð 5ð 5ñ !Ô ð5ð6 ‡‚Ð.Ñ/Ô/à)0¨°Ñ)>Ô)>ðð ð ð ñ 0Ô/ðð ð r5   