a
    ‹–•j˜Y  ã                   @   s  d Z ddlZddlZddlZddlZej ej e¡¡Z	ej 
e	dd¡Ze d¡Zdd„ Zd7d	d
„Zdd„ Zd8dd„Zdd„ Zdd„ ZdddœdddœdddœdddœdddœdœZd d!d"œZd9d&d'„Zd:d)d*„Zd;d+d,„Zd-d.„ Zd<d/d0„Zd=d2d3„Zd4d5„ Zed6k�reƒ  dS )>u|  
AI æ¼«å‰§ Â· å‰§æœ¬å¯¼å…¥å™¨
=====================
æŠŠå°�è¯´/å‰§æœ¬æ–‡æœ¬ï¼š
  1) æŒ‰ã€Œç¬¬Xç« /å›ž/èŠ‚ã€�æ‹†åˆ†ç« èŠ‚
  2) æ¯�ç« æŒ‰ç›®æ ‡å­—æ•°æ‹†æˆ�è‹¥å¹²ã€Œé›†ã€�
  3) ç”¨ LLM æ��å�–äººç‰©/åœºæ™¯/é�“å…·ç­‰èµ„äº§ï¼ˆæ—  key æ—¶é€€åŒ–ä¸ºè§„åˆ™æ��å�–ï¼‰
  4) ç”Ÿæˆ�å�¯å¯¼å…¥ç”»å¸ƒçš„ JSONï¼ˆ{cards, view}ï¼‰

ç”¨æ³•:
  python3 aicomic-import.py å°�è¯´.txt                 # é»˜è®¤è¾“å‡º aicomic-import.json
  python3 aicomic-import.py å°�è¯´.txt -o out.json     # æŒ‡å®šè¾“å‡º
  python3 aicomic-import.py å°�è¯´.txt --target 1500   # æ¯�é›†ç›®æ ‡å­—æ•°
  python3 aicomic-import.py å°�è¯´.txt --no-llm        # å�ªç”¨è§„åˆ™ï¼Œä¸�è°ƒ AI
é    NZmanjuzapi_config.jsonuÏ   ^\s*(ç¬¬\s*[0-9ä¸€äºŒä¸‰å››äº”å…­ä¸ƒå…«ä¹�å��ç™¾å�ƒé›¶ä¸¤]+\s*[ç« å›žèŠ‚å�·]|æ¥”å­�|åº�ç« |åº�è¨€|å¼•å­�|å°¾å£°|ç•ªå¤–|ç»ˆç« |å�Žè®°|å¤§ç»“å±€|(?:CHAPTER|Chapter)\s+[0-9IVXLC]+)[\s:ï¼šã€�.ï¼Ž]*([^\n]{0,30})?c                 C   sì   |   d¡}g }d}g }|D ]ˆ}t dd|¡}t | ¡ ¡}|r˜|dur`| |d |¡ ¡ dœ¡ | d¡ ¡ | d¡rˆd| d¡ ¡  nd  ¡ }g }q| |¡ q|durÆ| |d |¡ ¡ dœ¡ |sÚd	|  ¡ dœg}d
d„ |D ƒ}|S )uO   æŒ‰ç« èŠ‚æ ‡é¢˜æ‹†ç« ã€‚æ— æ ‡é¢˜æ—¶æ•´ç¯‡ç®—ä¸€ç« ã€‚è¿”å›ž [{title, content}]Ú
Nz^#+\s*Ú )ÚtitleÚcontenté   é   ú u   æ­£æ–‡c                 S   s   g | ]}|d    ¡ r|‘qS )r   ©Ústrip©Ú.0Úc© r   úaicomic_import.pyÚ
<listcomp>7   ó    z"split_chapters.<locals>.<listcomp>)	ÚsplitÚreÚsubÚHEAD_REÚmatchr
   ÚappendÚjoinÚgroup)ÚtextÚlinesÚchaptersZ	cur_titleÚcurÚlnÚmr   r   r   Úsplit_chapters#   s&    
2r    éÜ  c                 C   s°   dd„ t  d| ¡D ƒ}|s,dd„ |  ¡ D ƒ}g g d  }}}|D ]@}|rj||krj| d |¡¡ g d }}| |¡ |t|ƒ7 }q@|r–| d |¡¡ |p®|  ¡ r¬|  ¡ gS g S )uG   æŒ‰æ®µè�½è¾¹ç•ŒæŠŠä¸€ç« æ‹†æˆ�è‹¥å¹²é›†ï¼Œæ¯�é›†ç›®æ ‡ target_chars å­—c                 S   s   g | ]}|  ¡ r|  ¡ ‘qS r   r	   ©r   Úpr   r   r   r   >   r   z"split_episodes.<locals>.<listcomp>z\n\s*\nc                 S   s   g | ]}|  ¡ r|  ¡ ‘qS r   r	   r"   r   r   r   r   @   r   r   r   )r   r   Ú
splitlinesr   r   Úlenr
   )r   Útarget_charsZparasÚepisodesr   Zcurlenr#   r   r   r   Úsplit_episodes<   s    

r(   c               	   C   s.  i } t j t¡r>zt ttdd�¡} W n ty<   i } Y n0 g }|  d¡rt| 	d|  dd¡| d |  dd¡d	œ¡ t j
 d
¡rš| 	ddt j
d
 dd	œ¡ t j d¡}t j |¡�r*z`t|dd�D ]N}| d
¡rÂ| dd¡d  ¡  tdƒ¡ tdƒ¡}|rÂ| 	dd|dd	œ¡ qÂW n t�y(   Y n0 |S )Núutf-8©ÚencodingZapi_keyZagnesZbase_urlzhttps://apihub.agnes-ai.com/v1Z	llm_modelzagnes-2.5-flash)ÚnameÚbaseÚkeyÚmodelZDEEPSEEK_API_KEYZdeepseekzhttps://api.deepseek.com/v1zdeepseek-chatz~/.dsh/.credentials.yamlú:r   é"   é'   )ÚosÚpathÚexistsÚCONFIG_PATHÚjsonÚloadÚopenÚ	ExceptionÚgetr   ÚenvironÚ
expanduserÚ
startswithr   r
   Úchr)ZcfgÚ	providersZcredr   Úkr   r   r   Ú_load_llm_configN   s>    

þ
þ
(þrB   éÄ	  c                 C   s6  dd l }g }| D �]}t |d d|dœd|dœg|ddœ¡ d¡}|jj|d	  d
¡d |dd|d  dœd�}zb|jj|dd��>}	t |	 	¡  
d¡¡}
|
d d d d W  d   ƒ W   S 1 sÈ0    Y  W q t�y } z.| d|d t|ƒd d… f ¡ W Y d }~qd }~0 0 qtdd |¡ ƒ‚d S )Nr   r/   Úsystem)Úroler   Úuserg333333Ó?)r/   ZmessagesÚ
max_tokensZtemperaturer)   r-   ú/z/chat/completionszapplication/jsonzBearer r.   )zContent-TypeZAuthorization)ÚdataZheaderséx   )ZtimeoutÚchoicesÚmessager   z%s: %sr,   é–   u   LLM å…¨éƒ¨ä¸�å�¯ç”¨: z | )Zurllib.requestr7   ÚdumpsÚencodeZrequestZRequestÚrstripZurlopenÚloadsÚreadÚdecoder:   r   ÚstrÚRuntimeErrorr   )r@   rD   rF   rG   ZurllibZerrsr#   ÚbodyZreqÚrÚdÚer   r   r   Ú	_llm_chatm   s2    
ÿüü
þÿ<:rZ   c                 C   sÌ   |   ¡ } |  tdƒd ¡rVt dtdƒd  d d| ¡} t dtdƒd  d d| ¡} zt | ¡W S  tyt   Y n0 |  d¡|  	d	¡ }}|d
krÈ||krÈzt | ||d … ¡W S  tyÆ   Y n0 dS )u,   ä»Ž LLM å›žå¤�é‡Œå®½å®¹åœ°æŠ å‡º JSON å¯¹è±¡é`   é   ú^z
[a-zA-Z]*
r   r   ú$ú{ú}r   r   N)
r
   r>   r?   r   r   r7   rQ   r:   ÚfindÚrfind)r   ÚsrY   r   r   r   Ú_extract_jsonƒ   s    rd   c                 C   s„  g }| D ]8}t t|d ƒdƒ}| |d d |d d|…  ¡ qd |¡dd… }d}d	| d
 }t|||ƒ}t|ƒpzi }	|	 dg ¡ |	 dg ¡ |	 dg ¡ |	 dd¡ t|	 d¡t	ƒ�r€g }
|	d D ]¬}t|t
ƒ�rJ| d¡�rJ|
 t|d ƒ ¡ t| dd¡ƒ ¡ t| dd¡ƒ ¡ t| dd¡ƒ ¡ t| dd¡ƒ ¡ dœ¡ qÊt|tƒrÊ| ¡ rÊ|
 | ¡ dddddœ¡ qÊ|
|	d< |	S )u¨   LLM æ��å�–èµ„äº§ï¼Œè¿”å›ž {'title','characters':[...],'scenes':[...],'props':[...]}
    é€šè¯»æ¯�ç« å¼€å¤´è¾ƒå¤šå†…å®¹ï¼ˆå�ˆè®¡æœ€å¤šçº¦10ä¸‡å­—ï¼‰ï¼Œä¿�è¯�ä¸�é�—æ¼�ã€‚r   i@œ  r   r   Nz

i † u·   ä½ æ˜¯èµ„æ·±ç½‘æ–‡ç¼–è¾‘ä¸Žæ¼«å‰§åˆ¶ä½œäººã€‚è¯·é€šè¯»ä¸‹é�¢å°�è¯´èŠ‚é€‰ï¼Œå®Œæ•´æ��å�–åˆ¶ä½œæ¼«å‰§æ‰€éœ€çš„ç»“æž„åŒ–ä¿¡æ�¯ã€‚å�ªè¾“å‡ºä¸€ä¸ª JSON å¯¹è±¡ï¼Œä¸�è¦�ä»»ä½•å…¶ä»–æ–‡å­—ã€‚uI   å°�è¯´èŠ‚é€‰ï¼ˆè¾ƒé•¿ï¼Œè¯·é€šè¯»å…¨éƒ¨å†…å®¹ï¼Œä¸�è¦�å�ªçœ‹å¼€å¤´ï¼‰ï¼š
u?  

è¯·è¾“å‡º JSONï¼Œå­—æ®µå¦‚ä¸‹ï¼š
{
  "title": "å°�è¯´/å‰§æœ¬å��",
  "characters": [{"name": "è§’è‰²å��", "role": "ä¸»è§’/é‡�è¦�é…�è§’/å��æ´¾/è·¯äººç­‰", "description": "å¤–è²Œä¸Žæ€§æ ¼ï¼Œ20å­—å†…", "outfit": "æ ‡å¿—æ€§æœ�è£…ï¼Œå¦‚ï¼šç�°è‰²å�«è¡£+ç‰›ä»”è£¤", "feature": "æ ‡å¿—ç‰¹å¾�ï¼Œå¦‚ï¼šå·¦çœ¼è§’æ³ªç—£"}],
  "scenes": ["åœºæ™¯å��ï¼Œå¦‚ï¼šæž—åºœå¤§é—¨Â·æ¸…æ™¨"],
  "props": ["å…³é”®é�“å…·å��ï¼Œå¦‚ï¼šæœ¨å‰‘"]
}
è¦�æ±‚ï¼š
1. å®Œæ•´æ��å�–ï¼šæ‰€æœ‰å‡ºåœºè¿‡ä¸”æœ‰å��å­—/æœ‰æˆ�ä»½çš„è§’è‰²éƒ½è¦�åˆ—å…¥ï¼Œé…�è§’ã€�å��æ´¾ã€�å…³é”®è·¯äººä¹Ÿä¸�è¦�é�—æ¼�ï¼›
2. æ‰€æœ‰å‡ºçŽ°è¿‡çš„ä¸»è¦�åœ°ç‚¹éƒ½è¦�åˆ—å…¥åœºæ™¯ï¼›
3. å��å¤�å‡ºçŽ°æˆ–æŽ¨åŠ¨å‰§æƒ…çš„å…³é”®é�“å…·éƒ½è¦�åˆ—å…¥ï¼›
4. ä¸Šé™�ï¼šcharacters æœ€å¤š25ä¸ªï¼Œscenes æœ€å¤š25ä¸ªï¼Œprops æœ€å¤š20ä¸ªï¼Œå®�å¤šå‹¿æ¼�ï¼›
5. è§’è‰²å��å¿…é¡»ä»Žæ–‡ä¸­å‡ºçŽ°çš„äººå��æ��å�–ï¼Œä¸�è¦�ç¼–é€ ã€‚Ú
charactersÚscenesÚpropsõ   æœªå‘½å��å‰§æœ¬r,   rE   r   ÚdescriptionÚoutfitÚfeature)r,   rE   ri   rj   rk   )Úminr%   r   r   rZ   rd   Ú
setdefaultÚ
isinstancer;   ÚlistÚdictrT   r
   )r   r@   Úpartsr   ZtakeÚcontextrD   rF   ÚrawrX   Zfixedr   r   r   Úextract_assets_llm–   s6    $ü
rt   u   æ—¥ç³»èµ›ç’�ç’�ï¼ˆé»˜è®¤ï¼‰z«japanese anime cel-shaded key visual, clean bold lineart, vibrant flat colors, cinematic rim lighting, soft shadows, expressive anime eyes, professional anime illustration)r,   Úenu   å›½æ¼«åŽšæ¶‚z¤chinese manhua thick-paint style, rich painterly brushwork, dramatic chiaroscuro, vivid saturated colors, expressive character art, professional manhua illustrationu   æ°´å¢¨ä»™ä¾ z‹chinese ink-wash painting style, ethereal mist, flowing sumi-e brushstrokes, xianxia fantasy atmosphere, poetic negative space, high detailu   å†™å®žç”µå½±æ„Ÿz�cinematic photorealistic style, dramatic volumetric lighting, film grain, shallow depth of field, 8k, hyper-detailed, professional film stillu   3Dæ¸²æŸ“z{high quality 3d render, soft global illumination, subsurface scattering, detailed character model, octane render, cinematic)ÚcelZguomanZinkZ	realisticZ3dz#high quality, detailed, sharp focuszwmasterpiece, best quality, ultra-detailed, intricate details, 8k, sharp focus, professional illustration, award winning)ZstdÚhighr   rv   rw   c                 C   s  |pg }| pd  ¡ dd… } t |¡p,td }|d }t |td ¡}	g }
|D ]œ}| dd¡}g }| d¡r~| d	|d  ¡ | d
¡rš| d|d
  ¡ | d¡r¶| d|d  ¡ |rØ|rØ|
 d|d |¡f ¡ qN|rN|
 d| ¡ qNd}tƒ }|�r’d| �pd|
�rdd |
¡ nd|�r*d| ndf }zFt|d|dd�}|�pLd  ¡   d¡  d¡}|�rvt|ƒdk�rv|}W n t	�y�   d}Y n0 |�sÊ| �pÈ|�rÆd|�r¼|d  dd¡nd d nd}|g}| d| ¡ | |	¡ | d¡ d  d!d"„ |D ƒ¡S )#u¢   æŠŠä¸­æ–‡åˆ†é•œæ”¹å†™æˆ�è‹±æ–‡ç”»é�¢æ��è¿°ï¼ˆLLMï¼‰ï¼Œå¹¶ç”±ç³»ç»Ÿç»Ÿä¸€è¿½åŠ ç²¾ä¿®ç”»é£ŽåŒ…+è´¨é‡�è¯�ï¼Œ
    ä¿�è¯�å¤šé•œå¤´ç”»é£Žç¨³å®šã€�äººç‰©ç»†èŠ‚å‡ºè‰²ã€‚r   Né,  rv   ru   rw   r,   Ú
appearanceu	   å¤–è²Œï¼šrj   u	   æœ�è£…ï¼šrk   u   æ ‡å¿—ç‰¹å¾�ï¼šu   è§’è‰²ã€Œ%sã€�ï¼š%su   ï¼Œu   è§’è‰²ã€Œ%sã€�ué  è¯·æŠŠä¸‹é�¢çš„æ¼«å‰§åˆ†é•œä¿¡æ�¯æ”¹å†™æˆ�ä¸€æ®µç”¨äºŽ AI ç”Ÿå›¾çš„è‹±æ–‡ç”»é�¢æ��è¿°ï¼ˆ2~4å�¥ï¼Œå�ªå†™ç”»é�¢æœ¬èº«ï¼šäººç‰©å¤–è²Œä¸ŽåŠ¨ä½œã€�æ™¯åˆ«ï¼ˆè¿‘æ™¯/ä¸­æ™¯/å…¨æ™¯ï¼‰ã€�å…‰çº¿ã€�æ°›å›´ã€�æž„å›¾ï¼‰ã€‚å‡ºåœºè§’è‰²çš„å¤–è²Œ/æœ�è£…/æ ‡å¿—ç‰¹å¾�å¿…é¡»å‡†ç¡®å†™è¿›æ��è¿°ä¸­ï¼Œå�Œä¸€è§’è‰²æ¯�æ¬¡æ��è¿°ä¿�æŒ�ä¸€è‡´ã€‚ä¸�è¦�åŠ ç”»é£Žè¯�ã€�ä¸�è¦�åŠ è´¨é‡�è¯�ã€�ä¸�è¦�åŠ "vertical composition"ç­‰è¯�ï¼Œè¿™äº›ç”±ç³»ç»Ÿç»Ÿä¸€è¿½åŠ ã€‚ç›´æŽ¥è¾“å‡ºè‹±æ–‡ï¼Œä¸�è¦�ä»»ä½•è§£é‡Šã€‚

åœºæ™¯ï¼š%s
%s%su   ï¼ˆæœªæ��è¿°ï¼‰r   u   
åŠ¨ä½œ/å…‰çº¿ç»†èŠ‚ï¼šu!   ä½ æ˜¯èµ„æ·±åŠ¨æ¼«åˆ†é•œç”»å¸ˆã€‚iô  ©rG   ú"ú'é   u	   è§’è‰²ã€Œr   u   ã€�zstyle: z0vertical 9:16 composition, no text, no watermarkú, c                 S   s   g | ]}|r|  ¡ r|‘qS r   r	   ©r   Úxr   r   r   r     r   z)optimize_image_prompt.<locals>.<listcomp>)
r
   ÚSTYLE_PACKSr;   ÚQUALITY_TOKENSr   r   rB   rZ   r%   r:   )ÚsceneZdetailÚcharsÚmoveZstyleZ
style_packZqualityZpackZstyle_enZ
quality_enZ	char_infor   Znmrq   Zvisualr@   rF   rs   r   r   r   Úoptimize_image_promptÛ   sN    þú	
2

r†   é   c                 C   sü   |  dg ¡}dd„ |D ƒ}d}d||| dd… d |¡p:d	f }	t|||	d
d�}
t|
ƒpZi }g }|  d¡plg D ]ˆ}t|tƒs~qnt|  dd¡ƒ ¡ }|s˜qn| |t|  dd¡ƒ ¡ t|  dd¡ƒ ¡ t|  dd¡ƒ ¡ pØddd„ |  d¡pêg D ƒdœ¡ qn|S )u\   æŠŠä¸€é›†å‰§æƒ…ç”¨ LLM æ‹†æˆ� 3~5 ä¸ªåˆ†é•œé•œå¤´ï¼Œè¿”å›ž [{scene,prompt,lines,move,chars}]re   c                 S   s"   g | ]}|  d ¡r|  d d¡‘qS )r,   r   ©r;   r   r   r   r   r     r   z&storyboard_episode.<locals>.<listcomp>ua   ä½ æ˜¯æ¼«å‰§èµ„æ·±åˆ†é•œå¸ˆã€‚æŠŠç»™å®šçš„å°�è¯´/å‰§æœ¬ç‰‡æ®µæ‹†æˆ�ä¸€ç»„è¿žè´¯çš„åˆ†é•œé•œå¤´ã€‚uO  ç« èŠ‚ï¼š%sï¼Œç¬¬%dé›†
å‰§æƒ…ç‰‡æ®µï¼š
%s

å‡ºåœºè§’è‰²æ± ï¼š%s

è¯·å�ªè¾“å‡º JSONï¼š{"shots":[{"scene":"ç”»é�¢æ��è¿°ï¼ˆè§†è§‰åŒ–ï¼Œå�«äººç‰©åŠ¨ä½œ/æ™¯åˆ«/å…‰çº¿/æƒ…ç»ªï¼Œå�¯ç›´æŽ¥ç”¨äºŽAIç”Ÿå›¾ï¼‰","prompt":"ç”»é�¢è¡¥å……ï¼ˆæž„å›¾/æ°›å›´/ç»†èŠ‚ï¼Œå�¯ä¸ºç©ºå­—ç¬¦ä¸²ï¼‰","lines":"æœ¬é•œå¤´å�°è¯�æˆ–æ—�ç™½ï¼Œæ ¼å¼�ï¼šæ—�ç™½ï¼šxxx æˆ– è§’è‰²å��ï¼šxxxï¼›æ— å�°è¯�å†™ï¼šæ— ","move":"æŽ¨é•œ/æ‹‰é•œ/æ‘‡é•œ/é�™æ­¢","chars":["å‡ºåœºè§’è‰²å��"]}]}
è¦�æ±‚ï¼šæ‹†æˆ� 3~5 ä¸ªé•œå¤´ï¼›é•œå¤´é¡ºåº�ä¸Žå‰§æƒ…è¿žè´¯ï¼›chars å�ªä»Žè§’è‰²æ± é‡Œé€‰ï¼›lines å�£è¯­åŒ–å¸¦æƒ…ç»ªï¼›move å››é€‰ä¸€ï¼›å�ªè¾“å‡º JSONã€‚Nip  r~   u	   ï¼ˆæ— ï¼‰i¬  rz   Úshotsrƒ   r   Úpromptr   r…   õ   é�™æ­¢c                 S   s    g | ]}t |ƒ ¡ rt |ƒ‘qS r   )rT   r
   r   r   r   r   r   /  r   r„   ©rƒ   rŠ   r   r…   r„   )	r;   r   rZ   rd   rn   rp   rT   r
   r   )ÚepZch_titleÚidxÚassetsr@   Ztarget_shotsr„   Z
char_namesrD   rF   rs   rX   r‰   Zshrƒ   r   r   r   Ústoryboard_episode  s.    	÷

û
r�   c           	   
   C   sš   |du rt ƒ }i }|s|S t| ƒD ]r\}}tt| |g ¡ƒƒD ]T}|| | }z$t||d |d ||ƒ|||f< W q> ty�   g |||f< Y q>0 q>q"|S )uC   ç»™æ‰€æœ‰é›†ç”Ÿæˆ�åˆ†é•œï¼Œè¿”å›ž {(ç« åº�å�·, é›†åº�å�·): [shots]}Nr   r   )rB   Ú	enumerateÚranger%   r;   r�   r:   )	r   Úepisodes_mapr�   r@   ÚboardÚiÚchÚjr�   r   r   r   Ústoryboard_all4  s    $r˜   c           
      C   s@  d  dd„ | D ƒ¡}i }t d|¡D ]6}| d¡}t|ƒdkr$|dvr$| |d¡d ||< q$d	d
„ | ¡ D ƒdd… }g }t d|¡D ](}| d¡ ¡ }|r†||vr†| |¡ q†g }t d|¡D ](}| d¡ ¡ }	|	rÀ|	|vrÀ| |	¡ qÀtt	j
ƒdk�rtj t	j
d ¡ dd¡d nddd
„ |D ƒ|dd… |dd… dœS )uU   è§„åˆ™å…œåº•ï¼šå¯¹è¯�å½’å±ž+è¯�é¢‘æ��äººç‰©ï¼›åœ°ç‚¹å�Žç¼€æ��åœºæ™¯ï¼›é‡�è¯�æ��é�“å…·r   c                 s   s   | ]}|d  V  qdS )r   Nr   r   r   r   r   Ú	<genexpr>G  r   z+extract_assets_heuristic.<locals>.<genexpr>ui   ([\u4e00-\u9fa5]{1,4})(?:è¯´|é�“|é—®|å–Š|ç­”|å¿ƒæƒ³|ä½Žè¯­|å�¹|å–�|æƒŠ|æ€’é�“|ç¬‘é�“|æ²‰å£°é�“|æ·¡æ·¡é�“)r   r   )u   ä»–è¯´u   å¥¹è¯´u   ä¼—äººu   å¤§å®¶u   å…¶ä¸­r   c                 S   s   g | ]\}}|d kr|‘qS )r\   r   )r   Únr   r   r   r   r   M  r   z,extract_assets_heuristic.<locals>.<listcomp>Né   uÑ   (?:æ�¥åˆ°|èµ°è¿›|å›žåˆ°|ç¦»å¼€|ç«™åœ¨|ä½�äºŽ|åœ¨|èµ¶å¾€|é€ƒåˆ°)([^ï¼Œã€‚ï¼�ï¼Ÿï¼›]{0,10}?)(?:çš„)?(?:å±±|åŸŽ|åºœ|æ®¿|å®«|é™¢|é•‡|æ�‘|æ´ž|æž—|è°·|å¡”|æ¥¼|é˜�|æ²³|æ¹–|é—¨|åº™|åŽ…|æˆ¿|å±‹|å ¡|è�¥|å¯¨|å ‚|åœº|åœ°)u®   (?:ä¸€æŠŠ|ä¸€æŸ„|ä¸€æžš|ä¸€é¢—|ä¸€åŒ…|ä¸€ä»¶|ä¸€ç“¶|ä¸€å�·|ä¸€å�—|ä¸€é¡¶|ä¸€èº«|ä¸€æ ¹|ä¸€å†Œ|ä¸€é¡µ|ä¸€ä¸ª|ä¸€å�ª|ä¸€æ”¯|ä¸€å¼ |ä¸€æ�¡|ä¸€ç›�|ä¸€ä»½)([^ï¼Œã€‚ï¼�ï¼Ÿ\s]{1,6})Ú.rh   c                 S   s   g | ]}|d d dœ‘qS )r   )r,   rE   ri   r   ©r   rš   r   r   r   r   Z  r   é   é
   )r   re   rf   rg   )r   r   Úfinditerr   r%   r;   Úitemsr
   r   ÚsysÚargvr3   r4   ÚbasenameÚrsplit)
r   Zfullr„   r   rš   Únamesrf   rc   rg   r#   r   r   r   Úextract_assets_heuristicE  s,    
0

ür§   c                    s  ˆ pi ‰ g }dg‰‡fdd„‰‡fdd„}‡‡fdd„}‡fdd	„}‡fd
d„}	t dd„ | ¡ D ƒƒ}
d}tt|ƒƒD ]<‰tt| ˆg ¡ƒƒD ]"}|ttˆ  ˆ|fg ¡ƒdƒ7 }qŽqv| |ddd| t|ƒ|
|t| dg ¡ƒt| dg ¡ƒt| dg ¡ƒf ƒ¡ t| dg ¡ƒD ]$\}}| |dd|d  |ƒ¡ �qi ‰|D ](}|d dk�r>|d ˆ|d d < �q>d}t|ƒD �]&\‰}| ˆg ¡}| ||dd|d t|ƒd ‡ ‡fd d„tt|ƒƒD ƒ¡f ƒ¡ tt|ƒƒD ]¢}ˆ  ˆ|f¡�p ||  	¡ d d!… d"d#||  	¡ d d$…  d%g d&œg}t|ƒD ]L\}}d'|d |d |d f }| ||d( |d  d|d  ||ƒ¡ �q*�qØ|d(tt|ƒdƒd  d) 7 }�qtd*d d+d„ | dg ¡D ƒ¡ d, d d-d„ | dg ¡D ƒ¡ }| |	|dd.|ƒ¡ |dddd/œd0œS )1Niè  c                      s    ˆ d  d7  < dt ˆ d ƒ S )Nr   r   r   )rT   r   )Úuidr   r   Úcidf  s    zbuild_canvas_json.<locals>.cidc                    s   ˆ ƒ d| |dd|idœS )NÚnoter   r   ©ÚidÚtyper€   ÚyZstatusrI   r   )r€   r®   r   ©r©   r   r   rª   j  s    zbuild_canvas_json.<locals>.notec                    sX   ˆ ƒ d| |d||  dd¡‡fdd„|  dg ¡D ƒ|  dd¡|  dd¡|  d	d
¡dœdœS )Nrƒ   r   r   c                    s   g | ]}|ˆ v rˆ | ‘qS r   r   r�   )Úname_idr   r   r   q  r   z4build_canvas_json.<locals>.scene.<locals>.<listcomp>r„   rŠ   r   r…   r‹   )r�   rƒ   ZcharIdsrŠ   r   r…   r«   rˆ   )r€   r®   r�   Úshot)r©   r°   r   r   rƒ   m  s    



ûÿz build_canvas_json.<locals>.scenec                    sB   ˆ ƒ d| |d|  dd¡|  dd¡|  dd¡|  dd¡dd	d
œdœS )NÚcharr   r,   u   è§’è‰²ri   r   rj   rk   u6   ç”±å‰§æœ¬å¯¼å…¥æ��å�–ï¼Œå�¯å†�è¡¥ä¸€å¼ å�‚è€ƒå›¾æ›´ç¨³)r,   ry   rj   rk   ZrefImgZrefNoter«   rˆ   )r€   r®   r   r¯   r   r   r²   v  s    



ûÿzbuild_canvas_json.<locals>.charc                    s   ˆ ƒ d| |d||dœdœS )NÚtoolr   )r   rV   r«   r   )r€   r®   ÚtÚbr¯   r   r   r³     s    ÿzbuild_canvas_json.<locals>.toolc                 s   s   | ]}t |ƒV  qd S )N©r%   )r   Úvr   r   r   r™   ƒ  r   z$build_canvas_json.<locals>.<genexpr>r   r   é(   u�  ðŸ“– å‰§æœ¬å¯¼å…¥æ€»è§ˆ

ã€Š%sã€‹
ç« èŠ‚ï¼š%d ç« 
é›†æ•°ï¼š%d é›†
åˆ†é•œé•œå¤´ï¼šçº¦ %d ä¸ª
äººç‰©ï¼š%d ä½�
åœºæ™¯ï¼š%d ä¸ª
é�“å…·ï¼š%d ä»¶

â–  å·¦ä¾§ï¼šè§’è‰²èµ„äº§åº“ï¼ˆæœ�è£…/ç‰¹å¾�å·²è‡ªåŠ¨æ��å�–ï¼‰
â–  ä¸­é—´ï¼šæ¯�ç« ä¸€åˆ—ï¼Œæ¯�é›†ä¸€æŽ’åˆ†é•œé•œå¤´å�¡ï¼ˆå·²å¡«ç”»é�¢/å�°è¯�/è¿�é•œï¼‰
â–  å�³ä¸Šï¼šåœºæ™¯/é�“å…·æ¸…å�•
â–  ç›´æŽ¥ç‚¹é•œå¤´å�¡ã€ŒðŸŽ¨ ç”Ÿå›¾ã€�å‡ºå›¾ï¼Œå¤�åˆ¶ã€Œå�°è¯�ã€�åŽ»é…�éŸ³re   rf   rg   i@  ih  r­   r²   r¬   rI   r,   i0  u   ðŸ“š %s

å…±æ‹†ä¸º %d é›†ï¼š
%sr   r   c                 3   s2   | ]*}d |d t ˆ  ˆ|fg ¡ƒp$df V  qdS )u   Â· ç¬¬%dé›†ï¼ˆ%dä¸ªé•œå¤´ï¼‰r   N)r%   r;   )r   r—   )r”   Úcir   r   r™   ™  r   éÈ   r   u	   æ—�ç™½ï¼šéP   r‹   rŒ   u   %s Â· ç¬¬%dé›† Â· é•œå¤´%drx   é<   u   ã€�åœºæ™¯ã€‘
c                 s   s   | ]}d | V  qdS ©u   Â· Nr   )r   rc   r   r   r   r™   ¡  r   u   

ã€�é�“å…·ã€‘
c                 s   s   | ]}d | V  qdS r½   r   r"   r   r   r   r™   ¡  r   u   ðŸ§° åœºæ™¯ / é�“å…·èµ„äº§)ZtxZtyÚz©ÚcardsÚview)
ÚsumÚvaluesr’   r%   r;   Úmaxr   r‘   r   r
   )r   r   r“   r�   r”   rÀ   rª   rƒ   r²   r³   Z	total_epsZtotal_shotsZejr•   r   r€   r–   Zepsr—   r‰   rA   r±   Zep_titlerV   r   )r”   r¹   r©   r°   r¨   r   Úbuild_canvas_jsona  sT    		"*ÿþ þ
$ÿ0"@rÅ   Tc                    s>  t | ƒ}i ‰ t|ƒD ]\}}t|d |ƒˆ |< qd }|rhtƒ }|rhzt||ƒ}W n tyf   d }Y n0 |d u rxt|ƒ}i }tƒ }|r˜|r˜t|ˆ ||ƒ}t| 	dd¡|ˆ ||ƒ}	i }
t|ƒD ]J\}}t
tˆ  	|g ¡ƒƒD ],}t| 	||fg ¡ƒ|
d|d |d f < qØq¼d| 	dd¡‡ fdd„t|ƒD ƒ||
|	d	 |	d
 dœS )Nr   r   rh   u   %sÂ·ç¬¬%dé›†r   Tc                    s&   g | ]\}}|d  t ˆ | ƒdœ‘qS )r   )r   r'   r¶   )r   r•   r   ©r“   r   r   r   Â  r   zrun_import.<locals>.<listcomp>rÀ   rÁ   )Úokr   r   r�   r‰   rÀ   rÁ   )r    r‘   r(   rB   rt   r:   r§   r˜   rÅ   r;   r’   r%   )r   r&   Úuse_llmr   r•   r–   r�   r@   r”   ZcanvasZshots_summaryr—   r   rÆ   r   Ú
run_import§  s>    
,
ùrÉ   c                  C   sØ  t jdd … } | s$ttƒ t  d¡ | d }d}d}d}d| v rR| |  d¡d  }d| v rpt| |  d¡d  ƒ}d| v r|d	}tj 	|¡sžtd
| ƒ t  d¡ t
|dd� ¡ }t|||d�}t
|ddd��0}tj|d |d dœ|d	dd� W d   ƒ n1 �s0    Y  tdƒ td|d ƒ tdt|d ƒdtdd„ |d D ƒƒƒ tdt|d  dg ¡ƒdd  d!d„ |d  dg ¡D ƒ¡d d"… ƒ td#t|d  d$g ¡ƒd%t|d  d&g ¡ƒƒ td'tj |¡ƒ td(ƒ d S ))Nr   r   zaicomic-import.jsonr!   Tz-oz--targetz--no-llmFu   æ–‡ä»¶ä¸�å­˜åœ¨: %sr)   r*   )r&   rÈ   ÚwrÀ   rÁ   r¿   r   )Zensure_asciiÚindentu   âœ… å¯¼å…¥å®Œæˆ�u	     æ ‡é¢˜:r   u	     ç« èŠ‚:r   u   ç«  / é›†æ•°:c                 s   s   | ]}|d  V  qdS )r'   Nr   r   r   r   r   r™   â  r   zmain.<locals>.<genexpr>u	     äººç‰©:r�   re   u   ä½� ->r~   c                 s   s   | ]}|d  V  qdS )r,   Nr   r   r   r   r   r™   ã  r   r»   u	     åœºæ™¯:rf   u   ä¸ª / é�“å…·:rg   u	     è¾“å‡º:u<     æ��ç¤º: æ‰“å¼€ç”»å¸ƒ â†’ ç‚¹ã€Œâ¬† å¯¼å…¥ã€�é€‰è¿™ä¸ª json)r¢   r£   ÚprintÚ__doc__ÚexitÚindexÚintr3   r4   r5   r9   rR   rÉ   r7   Údumpr%   rÂ   r;   r   Úabspath)Úargsr4   ÚoutÚtargetrÈ   r   ÚresÚfr   r   r   ÚmainÊ  s8    

@(B.rØ   Ú__main__)r!   )rC   )r   r   Nr   r   rv   rw   )r‡   )N)N)r!   T)rÍ   r7   r3   r   r¢   r4   ÚdirnamerÒ   Ú__file__ZBASE_DIRr   r6   Úcompiler   r    r(   rB   rZ   rd   rt   r�   r‚   r†   r�   r˜   r§   rÅ   rÉ   rØ   Ú__name__r   r   r   r   Ú<module>   sZ   ÿ

.ÿÿÿÿÿóþ  ÿ
7
"

F
#
