Ë
    Áþ×jå&  ã                   ód  — d Z 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Zddl	Z	ddl
mZ ddlmZ ej                  j                  dd¬	«        ee«      j#                  «       j$                  j$                  Zed
z  dz  Zedz  dz  ZdZdZdZefd„Zd„ Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)aþ  
pose_calibrate: renderiza poses candidatas para revisarlas antes de promoverlas.

Fase 2 del plan de ampliacion: cada candidata se genera con varias seeds y un
fondo neutro para juzgar la pose, no el tema. La salida es compatible con
`pose_harvest.py --promote`:

    python Engine/pose_calibrate.py --dry-run
    python Engine/pose_calibrate.py
    python Engine/pose_harvest.py --promote Output/pose_calibrate/<stamp>/candidates.json

Las candidatas viven en Archivos/pose_candidates.jsonl (una por linea).
é    N)Údatetime)ÚPath)ÚPromptBuilder)Úbuild_promptúutf-8Úbackslashreplace)ÚencodingÚerrorsÚArchivoszpose_candidates.jsonlÚOutputÚpose_calibratezhttp://127.0.0.1:7860)Ú	sugerenteÚspicyÚ	explicitoz#simple_background, white_backgroundc                 ó  — g }t        t        | «      j                  d¬«      j                  «       d«      D ]É  \  }}|j	                  «       }|r|j                  d«      rŒ*t        j                  |«      }|j                  d«      t        vr$t        d| › d|› d|j                  d«      › d	�«      ‚|j                  d
«      st        d| › d|› d�«      ‚|j                  d«      xs d|d›�|d<   |j                  |«       ŒË |S )Nr   ©r	   é   Ú#Únivelz[!] Ú:z: nivel invalido 'Ú'Ú	pose_linez: falta pose_lineÚidÚcandÚ02d)Ú	enumerater   Ú	read_textÚ
splitlinesÚstripÚ
startswithÚjsonÚloadsÚgetÚLEVELSÚ
SystemExitÚappend)ÚpathÚoutÚnÚlineÚrecs        úEngine\pose_calibrate.pyÚload_candidatesr-   %   s÷   € Ø
€CÜœT $›Z×1Ñ1¸7Ð1ÓC×NÑNÓPÐRSÖT‰ˆˆ4Ø�z‰z‹|ˆÙ�t—‘ sÔ+ØÜ�j‰j˜ÓˆØ�7‰7�7Ó¤6Ñ)Ü˜t D 6¨¨1¨#Ð-?ÀÇÁÈÓ@PÐ?QÐQRÐSÓTÐTØ�w‰w�{Ô#Ü˜t D 6¨¨1¨#Ð->Ð?Ó@Ð@Ø—G‘G˜D“MÒ3 t¨A¨c¨7 ^ˆˆD‰	Ø�
‰
�3�ð Uð €Jó    c                  óä   — 	 t        j                  t        › d�d¬«      } | j                  dk(  | j	                  «       j                  dd«      fS # t
        $ r}dt        |«      fcY d }~S d }~ww xY w)Nz/sdapi/v1/optionsé
   )ÚtimeoutéÈ   Úsd_model_checkpointÚ?F)Úrequestsr#   ÚFORGEÚstatus_coder!   Ú	ExceptionÚstr)ÚrÚes     r,   Úforge_readyr<   5   sc   € ðÜ�L‰LœE˜7Ð"3Ð4¸bÔAˆØ�}‰} Ñ# Q§V¡V£X§\¡\Ð2GÈÓ%MÐMÐMøÜò Ø”c˜!“fˆ}Õûðús   ‚AA Á	A/ÁA*Á$A/Á*A/c                 ó|  — | |ddddddd|ddddd	œ}t        j                  t        › d
�|d¬«      }|j                  «        |j	                  «       }|j                  dd«      }t        |t        «      r	 t	        j                  |«      }|d   d   |j                  d|«      fS # t        j                  $ r i }Y Œ1w xY w)Ni@  iÀ  é   g      @zDPM++ 2M Karrasr   é   F)ÚpromptÚnegative_promptÚwidthÚheightÚstepsÚ	cfg_scaleÚsampler_nameÚ
batch_sizeÚn_iterÚseedÚ	clip_skipÚrestore_facesÚtilingÚ	enable_hrz/sdapi/v1/txt2imgéð   )r!   r1   Úinfoz{}Úimagesr   rI   )
r5   Úpostr6   Úraise_for_statusr!   r#   Ú
isinstancer9   r"   ÚJSONDecodeError)r@   ÚnegativerI   Úpayloadr:   ÚdatarO   s          r,   ÚrenderrX   =   sÐ   € àØ#ØØØØØ)ØØØØØØØñ€Gô  	�‰œ˜Ð0Ð1¸ÈÔM€AØ×ÑÔØ�6‰6‹8€DØ�8‰8�F˜DÓ!€DÜ�$œÔð	Ü—:‘:˜dÓ#ˆDð �‰>˜!Ñ˜dŸh™h v¨tÓ4Ð4Ð4øô ×#Ñ#ò 	ØŠDð	ús   Á4B# Â#B;Â:B;c                 ó  — i d| d   “d| d   “d|j                  t        «      j                  «       “d|j                  “dd“d|j                  “d|“d	|“d
g “d|“dd“dd“dg “d| j	                  dd«      “d| d   “d|“S )Nr   r   ÚsourceÚsource_nameÚrunr   ÚfilerI   ÚcharÚdroppedÚindexÚapprovedFÚ	blacklistÚmotivosÚnotasÚnotesÚ Úcandidate_idr   r@   )Úrelative_toÚBASE_DIRÚas_posixÚnamer#   )r   r`   rZ   rI   r@   r^   s         r,   Úbuild_candidaterl   Z   sý   € ðØ��g‘ðà�T˜+Ñ&ðð 	�&×$Ñ$¤XÓ.×7Ñ7Ó9ðð 	�v—{‘{ð	ð
 	Ððð 	�—‘ðð 	�ðð 	�ðð 	�2ðð 	�ðð 	�Eðð 	�Uðð 	�2ðð 	�—‘˜' 2Ó&ðð 	˜˜T™
ðð  	�&ð!ð r.   c                 óÀ  — i }t         D ]D  }| D �cg c]  }|d   |k(  sŒ|‘Œ }}|sŒt        j                  ||d|› d�z  «      sŒ<d|› d�||<   ŒF g }t         D �]
  }| D �cg c]  }|d   |k(  sŒ|‘Œ }}|sŒg }|D ]�  }|j                  d|d   › dt	        j
                  |d   «      › dt	        j
                  |d   «      › d	t	        j
                  |d
   «      › dt	        j
                  |d   «      › dt	        j
                  |d   «      › d|d   › d�«       ŒŸ ||v r	d||   › d�nd}	|j                  d|› dt        |«      › d|	› d�dj                  |«      z   dz   «       �Œ dt	        j
                  |d   «      › dt	        j
                  |d   «      › d|d   › d|d    › d!|d"   › d#dj                  |«      › d$�}
|d%z  j                  |
d&¬'«       y c c}w c c}w )(Nr   Úcontact_z.jpgz<article><div class="idx">[r`   z]</div><a href="rZ   z"><img loading="lazy" src="z" alt="r[   z	"></a><p>r   z</p><small>rg   u	    Â· seed rI   z</small></article>z<a class="sheet" href="z">hoja de contacto</a>rf   z<h2>z (z) z</h2><div class="grid">z</div>uŸ   <!DOCTYPE html>
<html lang="es"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Poses Â· calibraciÃ³n Ú	generatedu¬  </title>
<style>
 body{margin:0;background:#0b0e14;color:#e6edf3;font:15px system-ui,Segoe UI,Arial}
 .wrap{max-width:1280px;margin:0 auto;padding:28px 20px 60px}
 h1{margin:0 0 6px} h2{margin:30px 0 12px;border-bottom:1px solid #23304a;padding-bottom:8px;text-transform:capitalize}
 .sheet{float:right;color:#6ee7ff;font-size:13px;font-weight:400}
 .grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:14px}
 article{background:#121826;border:1px solid #23304a;border-radius:12px;padding:10px;position:relative}
 img{width:100%;height:330px;object-fit:contain;background:#0a0f18;border-radius:8px}
 .idx{position:absolute;top:16px;left:16px;background:rgba(11,14,20,.82);border:1px solid #23304a;border-radius:999px;padding:2px 9px;color:#6ee7ff;font-weight:700}
 p{font-size:13px;line-height:1.4;overflow-wrap:anywhere} small{color:#93a4b8}
</style></head><body><div class="wrap">
<h1>CalibraciÃ³n de poses Â· z	</h1>
<p>Úposesu    poses candidatas Ã— Úseedsú	 seeds = rP   uî    imÃ¡genes.
Edita <code>candidates.json</code>: deja <code>approved: true</code> en la mejor imagen
de cada pose y descarta el resto. DespuÃ©s:
<code>python Engine/pose_harvest.py --promote &lt;esta carpeta&gt;/candidates.json</code></p>
z
</div></body></html>úreview.htmlr   r   )	r$   Úpose_harvestÚ_contact_sheetr&   ÚhtmlÚescapeÚlenÚjoinÚ
write_text)ÚcandsÚout_dirÚsummaryÚsheetsÚlevelÚcÚsubsetÚsectionsÚcardsÚlinkÚdocs              r,   Úwrite_reviewr†   o   sY  € Ø€FßˆÙ"Ó:™U˜ a¨¡j°EÓ&9’!˜UˆÐ:Ú”l×1Ñ1°&¸'ÀhÈuÈgÐUYÐDZÑ:ZÕ[Ø& u g¨TÐ2ˆF�5ŠMð ð
 €Hß�ˆÙ"Ó:™U˜ a¨¡j°EÓ&9’!˜UˆÐ:ÙØØˆÛˆAØ�L‰LØ-¨a°©j¨\ð :Ü ŸK™K¨¨(©Ó4Ð5ð 6ÜŸ™ A h¡KÓ0Ð1°¼¿¹ÀQÀ}ÑEUÓ9VÐ8Wð XÜ—k‘k ! K¡.Ó1Ð2ð 3ÜŸ+™+ a¨Ñ&7Ó8Ð9¸À1ÀVÁ9À+ÐM_ð	aõð ð ˜F‘?ð *¨&°©-¨Ð8NÑOØ(*ð 	à�‰Ø�5�'˜œC ›K˜=¨¨4¨&Ð0GÐHØ�g‰g�e‹nñØ'ñ(ö	
ð ð(ô #Ÿk™k¨'°+Ñ*>Ó?Ð@ð Aô #Ÿk™k¨'°+Ñ*>Ó?Ð@ð AØˆGÑÐÐ*¨7°7Ñ+;Ð*<¸IÀgÈhÑFWÐEXð Yð ‡�ˆÓÐ ð ð)€Cð, ˆ}Ñ×(Ñ(¨°wÐ(Õ?ùò_ ;ùò ;s   �GžGÁ GÁ.Gc                  ó  — t        j                  d¬«      } | j                  ddd¬«       | j                  dd¬	«       | j                  d
d¬	«       | j                  dd d¬«       | j                  dd ¬	«       | j                  «       }t	        «       }|j
                  r^|j
                  j                  d«      D �ch c]#  }|j                  «       sŒ|j                  «       ’Œ% }}|D �cg c]  }|d   |v sŒ|‘Œ }}|j                  j                  d«      D �cg c],  }|j                  «       sŒt        |j                  «       «      ‘Œ. }}|r|st        d«      ‚t        t        t        «      «      }|j                  |j                  «      }|st        d|j                  › d�«      ‚|j                   }	|j"                  }
t%        j&                  «       j)                  d«      }|j*                  rt-        |j*                  «      nt.        |z  }|dz  }t1        dt3        |«      › dt3        |«      › dt3        |«      t3        |«      z  › d�«       t1        d|j                  › d|› �«       |j4                  ro|D ]i  }|d   › dt6        › �}t9        |	|d   |d ¬!«      }t1        d"|d   › d#|d$   › d%|d   › �«       t1        d&|d'd  j;                  t=        d(«      d%«      › �«       Œk y t?        «       \  }}|st        d)t@        › d*|› �«      ‚t1        d+|› �«       |jC                  d,d,¬-«       g }g }d.}|D �]  }|d   › dt6        › �}t9        |	|d   |d ¬!«      }|D ]ê  }|d/z  }|d0›d1|d$   › d1|d   › d2|› d3�}t1        d4|d0›d#|d   › d5|› �d6d,¬7«       	 tE        ||
|«      \  }}d.d l#}||z  jI                  |jK                  |«      «       ||z  }|jO                  tQ        ||||||j                  «      «       |jO                  |jS                  t        «      jU                  «       |d   |d$   |||
d9œ«       t1        d:|› �«       Œì �Œ |jC                  d,d,¬-«       t%        j&                  «       j)                  d;«      |j                  |t3        |«      t3        |«      t3        |«      d<œ|d=œ}|d>   |d?   d><   |d@z  jW                  tY        jZ                  |dAd/¬B«      dC¬D«       |dEz  jW                  tY        jZ                  |dAd/¬B«      dC¬D«       t]        |||d?   «       t1        dFt3        |«      › dG|› �«       t1        dH|dIz  › dJ�«       y c c}w c c}w c c}w # tL        $ r}t1        d8|› �«       Y d }~�Œ!d }~ww xY w)KNz(Renderiza poses candidatas para calibrar)Údescriptionz	--dry-runÚ
store_truezsolo imprime prompts)ÚactionÚhelpz--charÚ	Makima_v2)Údefaultz--seedsz
42,123,777z--onlyz$ids de candidata, separados por coma)r�   r‹   z--outÚ,r   z[!] no hay candidatas o seedsz[!] personaje 'z' no encontradoz%Y%m%d_%H%M%SÚimgz[-] z	 poses x rr   z	 imagenesz[-] personaje: z | salida: r   z, ÚbaseÚalways)Ú
force_nudez
[z] r   z | z    iþÿÿr0   z[!] Forge no responde en z: z[-] Forge OK | checkpoint: T)ÚparentsÚexist_okr   r   r   Ú_Ú_sz.pngÚ[z seed=z ... )ÚendÚflushzFALLO: )r]   rg   r   rI   r@   rU   zOK sz%Y-%m-%d %H:%M:%S)rp   rq   rP   )ro   r^   rq   r}   Ú
candidatesro   r}   zcandidates.jsonF)Úensure_asciiÚindentr   r   zmanifest.jsonz[OK] z imagenes -> z     revisa rs   z y edita candidates.json)/ÚargparseÚArgumentParserÚadd_argumentÚ
parse_argsr-   ÚonlyÚsplitr   rq   Úintr%   r   r9   ri   Úget_characterr^   Úmaster_promptrA   r   ÚnowÚstrftimer(   r   ÚOUT_ROOTÚprintrx   Údry_runÚCALIBRATION_EXTRAr   ÚreplaceÚchrr<   r6   ÚmkdirrX   Úbase64Úwrite_bytesÚ	b64decoder8   r&   rl   rh   rj   rz   r!   Údumpsr†   )ÚpÚargsr{   ÚxÚwantedr€   rq   ÚBr^   ÚmasterrU   Ústampr|   Úimg_dirÚblockr@   ÚokÚckptÚrecordsÚmanifestr`   rI   rk   Úb64Ú	used_seedr¯   r;   rZ   rV   s                                r,   ÚmainrÂ   ¤   sP  € Ü×ÑÐ,VÔW€AØ‡N�N�; |Ð:P€NÔQØ‡N�N�8 [€NÔ1Ø‡N�N�9 l€NÔ3Ø‡N�N�8 TÐ0V€NÔWØ‡N�N�7 D€NÔ)Ø�<‰<‹>€DäÓ€EØ‡y‚yØ%)§Y¡Y§_¡_°SÔ%9ÓGÑ%9 ¸Q¿W¹W½Y�!—'‘'•)Ð%9ˆÐGÙ!Ó7™E�q Q t¡W°Ò%6’˜EˆÐ7Ø%)§Z¡Z×%5Ñ%5°cÔ%:ÓHÑ%: ¸a¿g¹g½iŒS�—‘“�^Ð%:€EÐHÙ™ÜÐ8Ó9Ð9ä”cœ(“mÓ$€AØ�?‰?˜4Ÿ9™9Ó%€DÙÜ˜?¨4¯9©9¨+°_ÐEÓFÐFØ�_‰_€FØ× Ñ €HÜ�L‰L‹N×#Ñ# OÓ4€EØ $§¢Œd�4—8‘8Œn¬h¸Ñ.>€GØ˜‰o€Gä	ˆD”�U“�˜I¤c¨%£j \°¼3¸u»:ÄcÈ%ÃjÑ;PÐ:QÐQZÐ
[Ô\Ü	ˆO˜DŸI™I˜; k°'°Ð
;Ô<à‡|‚|ÛˆAØ˜‘~Ð& bÔ):Ð(;Ð<ˆEÜ! &¨$¨v©,¸È(ÔSˆFÜ�C˜˜$™�y  1 W¡: ,¨c°!°K±.Ð1AÐBÔCÜ�D˜  ˜×.Ñ.¬s°2«w¸Ó>Ð?Ð@ÕAð	 ð
 	ä‹}�H€BˆÙÜÐ4´U°G¸2¸d¸VÐDÓEÐEÜ	Ð'¨ vÐ
.Ô/à‡M�M˜$¨€MÔ.Ø€GØ€HØ€EÜˆØ�[‘>Ð" "Ô%6Ð$7Ð8ˆÜ˜f d¨6¡l°EÀhÔOˆÛˆDØ�Q‰JˆEØ˜C�[  ! G¡* ¨Q¨q°©w¨i°r¸$¸¸tÐDˆDÜ�A�e˜C�[  1 T¡7 )¨6°$°Ð8¸gÈTÕRðÜ!'¨°¸$Ó!?‘��YÛØ˜4‘×,Ñ,¨V×-=Ñ-=¸cÓ-BÔCð ˜t‘^ˆFØ�N‰Nœ?¨1¨e°V¸YÈÐPT×PYÑPYÓZÔ[Ø�O‰OØ×*Ñ*¬8Ó4×=Ñ=Ó?Ø ! $¡Ø˜7™Ø!Ø Ø$ñô ô �D˜˜Ð$Õ%ò+ ð ð4 ‡M�M˜$¨€MÔ.ä—\‘\“^×,Ñ,Ð-@ÓAØ—	‘	ØÜ  ›Z´#°e³*ÌÈGËÑUØñ€Gð '.¨kÑ&:€GˆIÑ�{Ñ#ØÐ Ñ ×,Ñ,Ü�
‰
�7¨°qÔ9ÀGð -ô MàˆÑ×*Ñ*Ü�
‰
�8¨%¸Ô:ÀWð +ô Nä�˜' 7¨9Ñ#5Ô6Ü	ˆE”#�g“,�˜}¨W¨IÐ
6Ô7Ü	ˆL˜ =Ñ0Ð1Ð1IÐ
JÕKùò[ HùÚ7ùÚHøôZ ò Ü˜ ˜s�mÔ$Ýûðús<   Â;UÃUÃ)UÃ6UÄUÄ/UÎ7UÕ	U>Õ%U9Õ9U>Ú__main__) Ú__doc__r�   rv   r!   Úsysr   Úpathlibr   r5   rt   Úprompt_builderr   Útest_blocksr   ÚstdoutÚreconfigureÚ__file__ÚresolveÚparentri   Ú
CANDIDATESr¨   r6   r$   r«   r-   r<   rX   rl   r†   rÂ   Ú__name__© r.   r,   Ú<module>rÑ      sÌ   ðñó Û Û Û 
Ý Ý ã ã Ý (Ý $à ‡
�
× Ñ  Ð0BÐ Ô Cá�‹>×!Ñ!Ó#×*Ñ*×1Ñ1€Ø˜
Ñ"Ð%<Ñ<€
Ø�hÑÐ!1Ñ1€Ø€Ø	,€Ø9Ð ð $ó ò ò5ò:ò*2@òjXLðv ˆzÒÙ…Fð r.   