§
    °õ¬j�  ã            	       ó,  — 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ZddlZddl	m
Z
mZmZ ddlmZ  G d„ d¦  «        Z G d„ d¦  «        Zdd
ej        dedeee
f         fd„Zddededeee
f         fd„Zedk    re                     ¦   «          dS dS )uÏ  
AutoPOE2 - Isolated WinOCR Worker & Client (Doc 50 / Rule 1 / Rule 6)
=====================================================================
Cháº¡y WinOCR bÃªn trong má»™t tiáº¿n trÃ¬nh con cÃ´ láº­p (Isolated Subprocess).
Kháº¯c phá»¥c triá»‡t Ä‘á»ƒ lá»—i Windows SEH Access Violation 0xc0000005 trong
_winrt_windows_storage_streams.cp311-win_amd64.pyd, Ä‘áº£m báº£o tiáº¿n trÃ¬nh chÃ­nh
(Coordinator / Game Loop) khÃ´ng bao giá»� bá»‹ sáº­p (Crash-Proof 100%).
é    N)ÚAnyÚDictÚOptional)ÚImagec                   ó(   — e Zd ZdZed„ ¦   «         ZdS )ÚIsolatedOcrWorkeru7   Entry point cháº¡y bÃªn trong tiáº¿n trÃ¬nh con worker.c                  ó
  — 	 t          t          j        d¦  «        r t          j                             d¬¦  «         t          t          j        d¦  «        r t          j                             d¬¦  «         n# t
          $ r Y nw xY wdd l} 	 t          j                             ¦   «         }|sd S |                     ¦   «         }|sŒ:	 t          j
        |¦  «        }|                     d¦  «        }|                     dd¦  «        }|rct          j                             |¦  «        rDt          j        |¦  «        5 }|                      ||¬	¦  «        }d d d ¦  «         n# 1 swxY w Y   ng d
ddœ}n*# t
          $ r}g d
t%          |¦  «        dœ}Y d }~nd }~ww xY w	 t          j        |d¬¦  «        }	t          j                             |	dz   ¦  «         t          j                             ¦   «          n# t
          $ r Y nw xY w�Œy)NÚreconfigureúutf-8)Úencodingr   TÚpathÚlangÚen©r   Ú Úfile_not_found©ÚlinesÚtextÚerrorF)Úensure_asciiú
)ÚhasattrÚsysÚstdoutr
   ÚstdinÚ	ExceptionÚwinocrÚreadlineÚstripÚjsonÚloadsÚgetÚosr   Úexistsr   ÚopenÚrecognize_pil_syncÚstrÚdumpsÚwriteÚflush)
r   ÚlineÚline_strÚreqr   r   ÚimgÚresÚeÚout_lines
             ú0C:\Projects\AutoPOE2\src\common\winocr_worker.pyÚrunzIsolatedOcrWorker.run   so  € ð	Ý•s”z =Ñ1Ô1ð 9Ý”
×&Ò&°Ð&Ñ8Ô8Ð8Ý•s”y -Ñ0Ô0ð 8Ý”	×%Ò%¨wÐ%Ñ7Ô7Ð7øøÝð 	ð 	ð 	ØˆDð	øøøð 	ˆˆˆð	Ý”9×%Ò%Ñ'Ô'ˆDØð Ø�Ø—z’z‘|”|ˆHØð Øð
AÝ”j Ñ*Ô*�Ø—w’w˜v‘”�Ø—w’w˜v tÑ,Ô,�Øð O�BœGŸNšN¨4Ñ0Ô0ð OÝœ DÑ)Ô)ð H¨SØ$×7Ò7¸À$Ð7ÑGÔG˜ðHð Hð Hñ Hô Hð Hð Hð Hð Hð Hð Høøøð Hð Hð Hð Høð %'°Ð=MÐNÐN�CøøÝð Að Að AØ "¨B½¸Q¹¼Ð@Ð@������øøøøðAøøøðÝœ: c¸Ð>Ñ>Ô>�Ý”
× Ò  ¨D¡Ñ1Ô1Ð1Ý”
× Ò Ñ"Ô"Ð"Ð"øÝð ð ð Ø�ðøøøñ1	sb   ‚A4A7 Á7
BÂBÃA4E1 Ä:EÅE1 ÅE"Å"E1 Å%E"Å&
E1 Å1
FÅ;FÆFÆAG3 Ç3
H Ç?H N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústaticmethodr4   © ó    r3   r   r      s3   € € € € € ØAÐAàð$ð $ñ „\ð$ð $ð $r;   r   c            	       óº   — e Zd ZdZdZ ej        ¦   «         Zd„ Ze	dd„¦   «         Z
defd„Zddej        d	edeeef         fd
„Zdded	edeeef         fd„Zd„ ZdS )ÚIsolatedOcrClientu\   Client luá»“ng Ä‘Æ¡n/Ä‘a luá»“ng giao tiáº¿p vá»›i IsolatedOcrWorker qua Stdin/Stdout pipes.Nc                 óô   — d | _         t          j        ¦   «         | _        t          j                             t          j        ¦   «         d¦  «        | _	        t	          j
        | j	        d¬¦  «         d| _        d S )NÚautopoe2_ocr_tempT)Úexist_okr   )Ú_procÚ	threadingÚLockÚ
_proc_lockr$   r   ÚjoinÚtempfileÚ
gettempdirÚ	_temp_dirÚmakedirsÚ_req_counter©Úselfs    r3   Ú__init__zIsolatedOcrClient.__init__G   s^   € Ø15ˆŒ
Ý#œ.Ñ*Ô*ˆŒÝœŸš¥hÔ&9Ñ&;Ô&;Ð=PÑQÔQˆŒÝ
Œ�D”N¨TÐ2Ñ2Ô2Ð2ØˆÔÐÐr;   Úreturnc                 óÂ   — | j         5  | j        €1t          ¦   «         | _        t          j        | j        j        ¦  «         | j        cd d d ¦  «         S # 1 swxY w Y   d S )N)Ú_lockÚ	_instancer=   ÚatexitÚregisterÚshutdown)Úclss    r3   Úget_instancezIsolatedOcrClient.get_instanceN   s�   € àŒYð 	!ð 	!ØŒ}Ð$Ý 1Ñ 3Ô 3�”Ý” ¤Ô 6Ñ7Ô7Ð7Ø”=ð		!ð 	!ð 	!ð 	!ñ 	!ô 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!øøøð 	!ð 	!ð 	!ð 	!ð 	!ð 	!s   ˆ?AÁAÁAc                 óÞ  — | j         �| j                              ¦   «         €dS 	 t          j        ddg}t          j        dk    rt          j        nd}t          j        |t          j	        t          j	        t          j
        ddt          t          j                             d¦  «        ¦  «        |¬¦  «        | _         dS # t          $ r&}t          d	|› �d¬
¦  «         d | _         Y d }~dS d }~ww xY w)NTz-mzsrc.common.winocr_workerÚntr   r   ú.)r   r   Ústderrr   r   ÚcwdÚcreationflagsu=   [IsolatedOcrClient Error] KhÃ´ng thá»ƒ khá»Ÿi cháº¡y worker: )r+   F)rA   Úpollr   Ú
executabler$   ÚnameÚ
subprocessÚCREATE_NO_WINDOWÚPopenÚPIPEÚDEVNULLr(   r   Úabspathr   Úprint)rL   ÚcmdÚc_flagsr1   s       r3   Ú_ensure_proczIsolatedOcrClient._ensure_procV   sñ   € ØŒ:Ð! d¤j§o¢oÑ&7Ô&7Ð&?Ø�4ð	Ý”> 4Ð)CÐDˆCÝ57´WÀ²_°_•jÔ1Ð1È!ˆGÝ#Ô)ØÝ ”oÝ!”Ý!Ô)ØØ Ý�œŸš¨Ñ,Ô,Ñ-Ô-Ø%ð	ñ 	ô 	ˆDŒJð �4øÝð 	ð 	ð 	ÝÐUÐRSÐUÐUÐ]aÐbÑbÔbÐbØˆDŒJØ�5�5�5�5�5øøøøð	øøøs   ¤BB< Â<
C,ÃC'Ã'C,r   r/   r   c           	      óˆ  — |€g ddœS | j         5  |                      ¦   «         sg dddœcddd¦  «         S | xj        dz  c_        t          j                             | j        dt          j        ¦   «         › d| j        › d	�¦  «        }	 |                     |d
¦  «         t          j
        ||dœ¦  «        }| j        j                             |dz   ¦  «         | j        j                             ¦   «          | j        j                             ¦   «         }|s^d| _        g dddœ	 t          j                             |¦  «        rt          j        |¦  «         n# t&          $ r Y nw xY wcddd¦  «         S t          j        |                     ¦   «         ¦  «        	 t          j                             |¦  «        rt          j        |¦  «         n# t&          $ r Y nw xY wcddd¦  «         S # t&          $ ru}d| _        g dt-          |¦  «        dœcY d}~	 t          j                             |¦  «        rt          j        |¦  «         n# t&          $ r Y nw xY wcddd¦  «         S d}~ww xY w# 	 t          j                             |¦  «        rt          j        |¦  «         w w # t&          $ r Y w w xY wxY w# 1 swxY w Y   dS )uM   Nháº­n diá»‡n PIL Image thÃ´ng qua tiáº¿n trÃ¬nh con cÃ´ láº­p (Crash-Proof).Nr   )r   r   Úworker_unavailabler   é   Úocr_Ú_z.pngÚPNG©r   r   r   Úworker_terminated)rD   ri   rJ   r$   r   rE   rH   ÚgetpidÚsaver!   r)   rA   r   r*   r+   r   r   r%   Úremover   r"   r    r(   )rL   r/   r   Ú	temp_pathÚreq_jsonÚ	resp_liner1   s          r3   r'   z$IsolatedOcrClient.recognize_pil_syncm   s   € àˆ;Ø¨Ð,Ð,Ð,àŒ_ð 	ð 	Ø×$Ò$Ñ&Ô&ð PØ!#¨RÐ:NÐOÐOð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð ÐÔ Ñ"ÐÔÝœŸš T¤^Ð5a½B¼I¹K¼KÐ5aÐ5aÈ$ÔJ[Ð5aÐ5aÐ5aÑbÔbˆIðØ—’˜ EÑ*Ô*Ð*Ýœ:¨yÀ$Ð&GÐ&GÑHÔH�Ø”
Ô ×&Ò& x°$¡Ñ7Ô7Ð7Ø”
Ô ×&Ò&Ñ(Ô(Ð(à œJÔ-×6Ò6Ñ8Ô8�	Ø ð Sà!%�D”JØ%'°Ð>QÐRÐRðÝ”w—~’~ iÑ0Ô0ð -Ýœ	 )Ñ,Ô,Ð,øøÝ ð ð ð Ø�Dðøøøð5	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	õ$ ”z )§/¢/Ñ"3Ô"3Ñ4Ô4ð
Ý”w—~’~ iÑ0Ô0ð -Ýœ	 )Ñ,Ô,Ð,øøÝ ð ð ð Ø�Dðøøøð5	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	øõ& ð Bð Bð BØ!�”
Ø!#¨R½#¸a¹&¼&ÐAÐAÐAÐAÐAÐAÐAðÝ”w—~’~ iÑ0Ô0ð -Ýœ	 )Ñ,Ô,Ð,øøÝ ð ð ð Ø�Dðøøøð5	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	øøøøð&BøøøøðÝ”w—~’~ iÑ0Ô0ð -Ýœ	 )Ñ,Ô,Ð,Ð,ð-øå ð ð ð Ø�Dðøøøøøøð5	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	sä   �J7¶AJ7Â	BG+Ä#3EÅJ7Å
E$Å!J7Å#E$Å$J7Å4%G+Æ3GÇJ7Ç
GÇJ7ÇGÇJ7Ç+
I*Ç5I%ÈI*ÈI-È3IÉJ7É
IÉJ7ÉIÉJ7É%I*É*I-É-J4É/3J$Ê"J4Ê$
J1	Ê.J4Ê0J1	Ê1J4Ê4J7Ê7J;Ê>J;r   c                 ó   — |rt           j                             |¦  «        sg dddœS | j        5  |                      ¦   «         sg dddœcddd¦  «         S 	 t          j        t           j                             |¦  «        |dœ¦  «        }| j        j	         
                    |dz   ¦  «         | j        j	                             ¦   «          | j        j                             ¦   «         }|sd| _        g dddœcddd¦  «         S t          j        |                     ¦   «         ¦  «        cddd¦  «         S # t           $ r0}d| _        g dt#          |¦  «        dœcY d}~cddd¦  «         S d}~ww xY w# 1 swxY w Y   dS )	u<   Nháº­n diá»‡n áº£nh tá»« Ä‘Æ°á»�ng dáº«n file trá»±c tiáº¿p.r   r   r   rk   Nrp   r   rq   )r$   r   r%   rD   ri   r!   r)   re   rA   r   r*   r+   r   r   r"   r    r   r(   )rL   r   r   rv   rw   r1   s         r3   Úrecognize_path_syncz%IsolatedOcrClient.recognize_path_sync�   s_  € àð 	H�2œ7Ÿ>š>¨$Ñ/Ô/ð 	HØ¨Ð6FÐGÐGÐGàŒ_ð 	Bð 	BØ×$Ò$Ñ&Ô&ð PØ!#¨RÐ:NÐOÐOð	Bð 	Bð 	Bð 	Bñ 	Bô 	Bð 	Bð 	BðBÝœ:­r¬w¯ª¸tÑ/DÔ/DÈdÐ&SÐ&SÑTÔT�Ø”
Ô ×&Ò& x°$¡Ñ7Ô7Ð7Ø”
Ô ×&Ò&Ñ(Ô(Ð(à œJÔ-×6Ò6Ñ8Ô8�	Ø ð SØ!%�D”JØ%'°Ð>QÐRÐRð	Bð 	Bð 	Bð 	Bñ 	Bô 	Bð 	Bð 	Bõ ”z )§/¢/Ñ"3Ô"3Ñ4Ô4ð	Bð 	Bð 	Bð 	Bñ 	Bô 	Bð 	Bð 	Bøõ ð Bð Bð BØ!�”
Ø!#¨R½#¸a¹&¼&ÐAÐAÐAÐAÐAÐAÐAð#	Bð 	Bð 	Bð 	Bñ 	Bô 	Bð 	Bð 	BøøøøðBøøøð	Bð 	Bð 	Bð 	Bøøøð 	Bð 	Bð 	Bð 	Bð 	Bð 	BsB   ¯E3ÁB D6Ä%D6Ä6
E0Å E+ÅE0ÅE3Å+E0Å0E3Å3E7Å:E7c                 ó*  — | j         5  | j        �k	 | j        j                             ¦   «          | j                             ¦   «          | j                             d¬¦  «         n# t          $ r Y nw xY wd | _        d d d ¦  «         d S # 1 swxY w Y   d S )Ng      ð?)Útimeout)rD   rA   r   ÚcloseÚ	terminateÚwaitr   rK   s    r3   rT   zIsolatedOcrClient.shutdown§   sæ   € ØŒ_ð 	"ð 	"ØŒzÐ%ðØ”JÔ$×*Ò*Ñ,Ô,Ð,Ø”J×(Ò(Ñ*Ô*Ð*Ø”J—O’O¨C�OÑ0Ô0Ð0Ð0øÝ ð ð ð Ø�Dðøøøà!�”
ð	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"s5   ˆB‘AA$Á#BÁ$
A1Á.BÁ0A1Á1
BÂBÂB)rN   r=   ©r   )r5   r6   r7   r8   rQ   rB   rC   rP   rM   ÚclassmethodrV   Úboolri   r   r(   r   r   r'   ry   rT   r:   r;   r3   r=   r=   A   sÿ   € € € € € ØfÐfà€IØˆIŒNÑÔ€Eðð ð ð ð!ð !ð !ñ „[ð!ð˜dð ð ð ð ð. ð   e¤kð  ¸ð  ÈÈSÐRUÈXÌð  ð  ð  ð  ðDBð B¨ð B°3ð BÀ$ÀsÈCÀxÄ.ð Bð Bð Bð Bð0	"ð 	"ð 	"ð 	"ð 	"r;   r=   r   r/   r   rN   c                 ó^   — t                                ¦   «                              | |¬¦  «        S ©Nr   )r=   rV   r'   )r/   r   s     r3   Úsafe_ocr_pilr„   ´   s'   € Ý×)Ò)Ñ+Ô+×>Ò>¸sÈÐ>ÑNÔNÐNr;   r   c                 ó^   — t                                ¦   «                              | |¬¦  «        S rƒ   )r=   rV   ry   rp   s     r3   Úsafe_ocr_pathr†   ·   s'   € Ý×)Ò)Ñ+Ô+×?Ò?ÀÈ4Ð?ÑPÔPÐPr;   Ú__main__r   )r8   r$   r   r!   ÚtimerR   rF   rB   r`   Útypingr   r   r   ÚPILr   r   r=   r(   r„   r†   r5   r4   r:   r;   r3   ú<module>r‹      s”  ððð ð 
€	€	€	Ø 
€
€
€
Ø €€€Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ø &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ø Ð Ð Ð Ð Ð ð(ð (ð (ð (ð (ñ (ô (ð (ðVo"ð o"ð o"ð o"ð o"ñ o"ô o"ð o"ðfOð O�e”kð O¨ð O¸¸SÀ#¸X¼ð Oð Oð Oð OðQð Q˜ð Q 3ð Q°$°s¸C°x´.ð Qð Qð Qð Qð ˆzÒÐØ×ÒÑÔÐÐÐð Ðr;   