Ë
    ÌUåjo  ã                   óÎ  — d Z ddlZddl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	 ej                  j                  dd¬«        e	e«      j                  «       j                  j                  Zedz  d	z  Z e	d
«      Zej$                  j'                  d e e	e«      j                  «       j                  «      «       ddlmZ d„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)uÇ  
CLI de indices de personaje.

Usa la MISMA logica de claves que PromptBuilder (importa compute_character_keys),
asÃ­ que lo que imprime aqui es exactamente lo que acepta el menu de plumloom_engine.

    python Engine/character_keys.py --list
    python Engine/character_keys.py --random 5
    python Engine/character_keys.py --random 5 --out Archivos/selected_chars.txt
    python Engine/character_keys.py --check        # colisiones / LoRAs sin fichero
é    N)Údatetime)ÚPathúutf-8Úbackslashreplace)ÚencodingÚerrorsÚArchivoszpersonajes.txtz?D:\Data\Packages\Stable Diffusion WebUI Forge - Neo\models\Lora)Úcompute_character_keysc                  óâ   — t         j                  d¬«      D � cg c]A  } | j                  «       r/| j                  «       j                  d«      s| j                  «       ‘ŒC }} t	        |«      S c c} w )Nz	utf-8-sig)r   Ú#)Ú	CHAR_FILEÚopenÚstripÚ
startswithr
   )ÚlÚrowss     ú6C:\Users\Usuario\Downloads\SD\Engine\character_keys.pyÚloadr      s\   € Ü(Ÿ~™~°{˜~ÔCó <ÑC˜!Ø�w‰wŒy §¡£×!5Ñ!5°cÔ!:ð �G‰G�IÐC€Dð <ä! $Ó'Ð'ùò<s   ™AA,c                 ó2  — |j                   r2t        |j                  r| d |j                   n| |j                   «       y t        | d«      D ]J  \  }\  }}}t	        |d›d|› �«       |j
                  sŒ(t	        d|xs d› �«       t	        d|d d › �«       ŒL y )Né   Ú3z. z     lora: z
(sin LoRA)ú     én   )ÚoutÚ	write_outÚlimitÚ	enumerateÚprintÚverbose)ÚitemsÚargsÚiÚkeyÚlineÚloras         r   Úcmd_listr&   %   s�   € Ø‡x‚xÜ¨¯
ª
�%˜˜Ÿ™Ñ$¸¸t¿x¹xÔHØÜ )¨%°Ö 3ÑˆÑˆC��tÜ��1��R˜�uˆoÔØ�<‹<Ü�K Ò 4¨Ð5Ð6Ô7Ü�E˜$˜t ˜*˜Ð&Õ'ñ	 !4ó    c                 óü  — t        |«      }|j                  «       s	t        |z  }|j                  j	                  dd¬«       t        j                  «       j                  d«      }|j                  ddd¬«      5 }|j                  dt        | «      › d	|› d�«       |j                  d
«       | D ]  \  }}}|j                  |› d|› d�«       Œ 	 d d d «       t        dt        | «      › d|› �«       y # 1 sw Y   Œ$xY w)NT)ÚparentsÚexist_okz%Y-%m-%d %H:%M:%SÚwr   Ú
)r   Únewlinez# z personajes | generado z-# formato: <clave>|<linea de personajes.txt>
Ú|z
Guardados z en )r   Úis_absoluteÚBASE_DIRÚparentÚmkdirr   ÚnowÚstrftimer   ÚwriteÚlenr   )r    Úout_pathr   ÚstampÚfr#   r$   Ú_s           r   r   r   0   sß   € Ü
ˆx‹.€CØ�?‰?ÔÜ˜‰nˆØ‡J�J×Ñ˜T¨DÐÔ1Ü�L‰L‹N×#Ñ#Ð$7Ó8€EØ	�‰�# °ˆÔ	6¸!Ø	�‰�"”S˜“Z�LÐ 7¸°w¸bÐAÔBØ	�‰Ð@ÔAÛ!‰LˆC��qØ�G‰G�s�e˜1˜T˜F "Ð%Õ&ñ "÷ 
7ô
 
ˆJ”s˜5“z�l $ s eÐ
,Õ-÷ 
7Ð	6ús   Á9AC2Ã2C;c                 ó@  — t        |j                  t        | «      «      }t        j                  | |«      }|j
                  xs t        dz  dz  }t        ||«       t        «        t        d|› d�«       |D ]%  \  }}}t        d|› �«       t        d|d d › �«       Œ' y )Nr	   zselected_chars.txtz=== z3 PERSONAJES (pasa la CLAVE al menu [1]/[2]/[3]) ===ú  z      éd   )	ÚminÚcountr6   ÚrandomÚsampler   r0   r   r   )r    r!   ÚnÚpickedr   r#   r$   r%   s           r   Ú
cmd_randomrD   >   s“   € ÜˆD�J‰Jœ˜E›
Ó#€AÜ�]‰]˜5 !Ó$€FØ
�(‰(Ò
D”x *Ñ,Ð/CÑC€CÜˆf�cÔÜ	„GÜ	ˆD��ÐFÐ
GÔHÛ!‰ˆˆT�4Ü��3�%ˆjÔÜ��t˜D˜S�z�lÐ#Õ$ñ "r'   c                  óˆ  — i } t         j                  «       s| S t         j                  d«      D ]‘  }| j                  |j                  j                  «       |j                  «       t        j                  dd|j                  «      }||j                  k7  sŒh| j                  |j                  «       |j                  «       Œ“ | S )z™Nombres de LoRA disponibles. Forge/kohya anade sufijos tipo -10 o -1234,
    asi que se indexa tanto el stem exacto como el stem sin ese sufijo numerico.z*.safetensorsz-\d+$Ú )	ÚLORA_DIRÚexistsÚrglobÚ
setdefaultÚstemÚlowerÚnameÚreÚsub)r   ÚpÚbases      r   Ú
lora_stemsrR   J   s‡   € ð €CÜ�?‰?ÔØˆ
Ü�^‰^˜OÖ,ˆØ�‰�q—v‘v—|‘|“~ q§v¡vÔ.Ü�v‰v�h  A§F¡FÓ+ˆØ�1—6‘6‹>Ø�N‰N˜4Ÿ:™:›<¨¯©Õ0ð	 -ð
 €Jr'   c                 ó`  ‡— t        dt        | «      › dt        t        d„ | D «       «      «      › �«       t        «       Št        dt        ‰«      › d�«       ‰st        dt        › �«       y | D ���cg c]   \  }}}|sŒ
|j                  «       ‰vsŒ||f‘Œ" }}}}|r¯t        dt        |«      › d�«       t        d	«       t        «        |D ]|  \  }}t        d
|› �«       t        j                  |j                  «       t        ‰«      dd¬«      }|r&t        ddj                  ˆfd„|D «       «      › �«       t        d|d d › �«       Œ~ nt        d«       | D ���cg c]  \  }}}|rŒ
|‘Œ }}}}|r.t        dt        |«      › d�«       |D ]  }t        d
|› �«       Œ y y c c}}}w c c}}}w )Nzlineas: z | claves unicas: c              3   ó(   K  — | ]
  \  }}}|–— Œ y ­w©N© )Ú.0Úkr:   s      r   Ú	<genexpr>zcmd_check.<locals>.<genexpr>Y   s   è ø€ Ð:RÉEÁÀÀAÀq¼1ÉEùs   ‚zLoRAs en disco: z nombreszAVISO: no se encuentra z
LO RAs SIN FICHERO EN DISCO (z): el prompt NO cargara el LoRAzA  (el personaje saldra con el aspecto por defecto del checkpoint)r<   é   g333333ã?)rB   Úcutoffu        Â¿quizas quisiste decir? z, c              3   ó(   •K  — | ]	  }‰|   –— Œ y ­wrU   rV   )rW   ÚcÚ	availables     €r   rY   zcmd_check.<locals>.<genexpr>j   s   øè ø€ Ð@]ÑW\ÐRSÀÈ1ÅÑW\ùs   ƒr   r=   z#OK: todos los LoRA existen en discoz
LINEAS SIN LoRA (z'): responden por defecto del checkpoint)
r   r6   ÚsetrR   rG   rL   ÚdifflibÚget_close_matchesÚlistÚjoin)	r    r!   rX   r:   r   ÚmissingÚcloseÚsin_lorar^   s	           @r   Ú	cmd_checkrg   X   s”  ø€ Ü	ˆH”S˜“Z�LÐ 2´3´sÑ:RÉEÓ:RÓ7RÓ3SÐ2TÐ
UÔVä“€IÜ	ÐœS ›^Ð,¨HÐ
5Ô6ÙÜÐ'¬ zÐ2Ô3Øá%*ÕO¡U™'˜!˜Q ªa°A·G±G³IÀYÒ4N��1Šv U€GÒOÙÜÐ/´°G³¨~Ð=\Ð]Ô^ÜÐQÔRÜŒÛ‰DˆAˆqÜ�B�q�c�(ŒOÜ×-Ñ-¨a¯g©g«i¼¸i»ÈAÐVYÔZˆEÙÜÐ6°t·y±yÓ@]ÑW\Ó@]Ó7]Ð6^Ð_Ô`Ü�E˜!˜D˜S˜'˜Ð#Õ$ñ ô 	Ð3Ô4á!&Õ0¡‘g�a˜˜Aªa’ €HÒ0ÙÜÐ#¤C¨£M ?Ð2YÐZÔ[ÛˆAÜ�B�q�c�(�Oñ ð ùô Pùô 1s   Á2F"Á>F"ÂF"ÅF)Å)F)c                  ó  — t        j                  d¬«      } | j                  ddd¬«       | j                  dt        dd	d
¬«       | j                  ddd¬«       | j                  dd¬«       | j                  dt        d¬«       | j                  dddd¬«       | j	                  «       }t        «       }|j                  rt        ||«       y |j                  rt        ||«       y |j                  rt        ||«       y | j                  «        y )Nz Indices de personaje de PlumLoom)Údescriptionz--listÚ
store_truezlista todas las claves)ÚactionÚhelpz--randomÚNr?   zselecciona N al azar)ÚtypeÚmetavarÚdestrl   z--checkzcolisiones y LoRAs ausentesz--outz9fichero destino (por defecto Archivos/selected_chars.txt))rl   z--limitz+limita el numero de lineas con --list --out)rn   rl   z	--verbosez-vzmuestra lora y linea)ÚargparseÚArgumentParserÚadd_argumentÚintÚ
parse_argsr   Úcheckrg   r?   rD   rb   r&   Ú
print_help)rP   r!   r    s      r   Úmainrx   v   sÜ   € Ü×ÑÐ,NÔO€AØ‡N�N�8 LÐ7O€NÔPØ‡N�N�:¤C°¸7Ø.ð ô 0à‡N�N�9 \Ð8U€NÔVØ‡N�N�7Ð!\€NÔ]Ø‡N�N�9¤3Ð-Z€NÔ[Ø‡N�N�; ¨\Ð@V€NÔWØ�<‰<‹>€Dä‹F€EØ‡z‚zÜ�%˜ÕØ	�ŠÜ�5˜$ÕØ	�ŠÜ�˜Õà	�‰�r'   Ú__main__)Ú__doc__rq   r`   Úosr@   rN   Úsysr   Úpathlibr   ÚstdoutÚreconfigureÚ__file__Úresolver1   r0   r   rG   ÚpathÚinsertÚstrÚprompt_builderr
   r   r&   r   rD   rR   rg   rx   Ú__name__rV   r'   r   Ú<module>r‡      sÙ   ðñ
ó Û Û 	Û Û 	Û 
Ý Ý à ‡
�
× Ñ  Ð0BÐ Ô Cá�‹>×!Ñ!Ó#×*Ñ*×1Ñ1€Ø�zÑ!Ð$4Ñ4€	ÙÐRÓS€à ‡�‡��‘3‘t˜H“~×-Ñ-Ó/×6Ñ6Ó7Ô 8Ý 1ò(ò(ò.ò	%òòò<ð, ˆzÒÙ…Fð r'   