ó
    Òj4  ã            	       ó~  • S r SSKrSSKrSSKrSSKrSSKJr  SSKrSSK	r	Sr
SrSr\R                  R                  \R                  R                  \R                  R                  \R                  R!                  \5      5      5      SS5      rSrS	S
SSS.rSSSSSSS.rS rS rS rS rS r\S:X  a  \" 5         gg)a—  OCR the Level-4 books with the local Dolf OCR Platform (http://localhost:10010).

Each PDF is split into chunks of CHUNK pages (uploads stay small, progress is resumable).
Output: Book/L4/<slug>/pNNN-MMM.md with '# Page N' headings using the book's own page numbers.
The API key is read from LOCALAPIKEY in the OCR project's .env and never printed.

  python tools/ocr_level4.py [slug ...] [--max-chunks N]
é    Nz1D:/OneDrive - DolfTech/SABIS-EBooks/EBooks/Frenchz.F:/Solutions/AI/pdf_datasets_ocr-enhanced/.envzhttp://localhost:10010ÚBookÚL4é   zExercices de Conjugaison 4zGRAMMAIRE 4u   Ã€ vos marques prÃªts parlez 3u   Ã€ vos marques prÃªts parlez 5)Úconjugaison4Ú
grammaire4Úparlez3Úparlez5ÚfrÚfalseÚtrueÚ3000)Ú	lang_modeÚhandwritingÚextract_imagesÚocr_image_captionsÚ	use_cacheÚ
max_tokensc                  ó  • [        [        SS9 H\  n U R                  S5      (       d  M  U R                  SS5      S   R	                  5       R	                  S5      R	                  S5      s  $    [
        R                  " S5        g )	Núutf-8©ÚencodingzLOCALAPIKEY=Ú=é   Ú"Ú'zLOCALAPIKEY not found)ÚopenÚOCR_ENVÚ
startswithÚsplitÚstripÚsysÚexit)Úlines    Ú(F:\Yaseen\AI\French2\tools\ocr_level4.pyÚapi_keyr%      sf   € Ü”W wÔ/ˆØ�?‰?˜>×*Ó*Ø—:‘:˜c 1Ó% aÑ(×.Ñ.Ó0×6Ñ6°sÓ;×AÑAÀ#ÓFÒFñ 0ô ‡H‚HÐ$Õ%ó    c           	      ót  ^^• SSK mTR                  S[        U    5      m[        UU4S j[        R
                  " [        5       5       5      n[        S [        R
                  " [        R                  R                  [        U5      5       5       5      n[        R                  R                  [        X5      $ )uY   The folder names on disk may use a different Unicode form (Ã€ as one or two code points).r   NÚNFCc              3   óX   >#   • U  H  nTR                  S U5      T:X  d  M  Uv •  M!     g7f)r(   N)Ú	normalize)Ú.0ÚdÚuÚwants     €€r$   Ú	<genexpr>Úbook_pdf.<locals>.<genexpr>%   s%   øé € ÐNš_˜°·±¸EÀ1Ó0EÈÑ0M—!‘!š_ùs   ƒ*¡	*c              3   óp   #   • U  H,  oR                  5       R                  S 5      (       d  M(  Uv •  M.     g7f)ú.pdfN)ÚlowerÚendswith)r+   Úfs     r$   r/   r0   &   s&   é € Ð^Ò?�QÇ7Á7Ã9×CUÑCUÐV\×C]�q‰qÒ?ùs   ‚'6­	6)	Úunicodedatar*   ÚBOOKSÚnextÚosÚlistdirÚSRCÚpathÚjoin)ÚslugÚfolderÚpdfr-   r.   s      @@r$   Úbook_pdfrA   !   so   ù€ ãØ�;‰;�uœe D™kÓ*€DÜÕNœRŸZšZ¬œ_ÓNÓN€FÜ
Ñ^œ"Ÿ*š*¤R§W¡W§\¡\´#°vÓ%>Ô?Ó^Ó
^€CÜ�7‰7�<‰<œ˜VÓ)Ð)r&   c              #   ó8  #   • [        U 5      n[        R                  " U5      n[        SUR                  [
        5       HV  n[        U[
        -   UR                  5      nX#U[        R                  R                  [        U SUS-   S SUS S35      4v •  MX     g 7f)Nr   Úpr   Ú03dÚ-z.md)rA   Úfitzr   ÚrangeÚ
page_countÚCHUNKÚminr9   r<   r=   ÚOUT)r>   r@   ÚdocÚstartÚends        r$   ÚchunksrO   *   s|   é € Ü
�4‹.€CÜ
�)Š)�C‹.€CÜ�q˜#Ÿ.™.¬%Ö0ˆÜ�%œ%‘- §¡Ó0ˆØ˜#œrŸw™wŸ|™|¬C°¸¸5À1¹9ÀS¸/ÈÈ3ÈsÈ)ÐSVÐ7WÓXÐXÔXò 1ùs   ‚BBc                 óÎ  • [         R                  R                  [        R                  " 5       S[         R
                  " 5        SU S35      n[        R                  " 5       nUR                  XUS-
  S9  UR                  USSS9  UR                  5         [        R                  " 5       n[        R                  " 5       n[        S	5       H—  n	[        US
5       n
UR                  [          S3SU 0S[         R                  R#                  U5      S S S-   U
40[$        SS9nS S S 5        WR&                  S:X  a  [        R(                  " S5        M‡  UR+                  5           O   WR-                  5       n[         R.                  " U5        UR1                  S5      (       a  US   nOåUS   n [        R(                  " S	5        UR1                  [          SU 3SU 0SS9R-                  5       nUR1                  S5      S:X  a  UR1                  S5      =(       d    / nOoUR1                  S5      S;  a1  [3        U SUR1                  S5       SUR1                  S5       35      e[        R                  " 5       U-
  S:”  a  [5        U5      eMß  [7        [9        US S 95       VVs/ s H<  u  nnS!UUR1                  S"US-   5      -    S#UR1                  S$5      =(       d    S% 3PM>     nnn[         R:                  " [         R                  R=                  U5      SS&9  [        US'-   S(S)S*9 nUR?                  S+R                  U5      S,-   5        S S S 5        [         R@                  " US'-   U5        [         R                  RC                  U[D        5       S[G        U5       S-[        R                  " 5       U-
  S. S/3$ ! , (       d  f       GN¢= fs  snnf ! , (       d  f       N�= f)0NÚl4_Ú_r2   r   )Ú	from_pageÚto_pageé   T)ÚgarbageÚdeflateé   Úrbz/api/ocrz	X-API-KeyÚfileéýÿÿÿé´   )ÚheadersÚfilesÚdataÚtimeouti­  é<   ÚcachedÚresultÚtask_idz/api/status/)r]   r`   ÚstatusÚdone)Ú
processingNz: Ú Úerrori  c                 ó&   • U R                  SS5      $ )NÚpager   )Úget)rC   s    r$   Ú<lambda>Úocr_chunk.<locals>.<lambda>O   s,   € ð  BC÷  BGñ  BGð  HNð  PQô  BRr&   )Úkeyz# Page rk   z

ÚtextÚ )Úexist_okz.tmpÚwr   r   z

---

Ú
z
 pages in z.0fÚs)$r9   r<   r=   ÚtempfileÚ
gettempdirÚgetpidrF   r   Ú
insert_pdfÚsaveÚcloseÚrequestsÚSessionÚtimerG   ÚpostÚBASEÚbasenameÚOPTIONSÚstatus_codeÚsleepÚraise_for_statusÚjsonÚremoverl   ÚRuntimeErrorÚTimeoutErrorÚ	enumerateÚsortedÚmakedirsÚdirnameÚwriteÚreplaceÚrelpathrK   Úlen)ro   rL   rM   rN   ÚdstÚtmpÚpartru   Út0ÚattemptÚfhÚrr,   ÚpagesÚtidÚstÚirC   Úpartsr5   s                       r$   Ú	ocr_chunkrž   2   sR  € Ü
�'‰'�,‰,”x×*Ò*Ó,°´B·I²I³K°=ÀÀ%ÀÈÐ.MÓ
N€CÜ�9Š9‹;€DØ‡O�O�C°#¸±'€OÑ:Ø‡I�Iˆc˜1 d€IÑ+Ø‡J�J„LÜ×ÒÓ€AÜ	�Š‹€BÜ˜–8ˆÜ�#�tŒ_ Ø—‘œ$˜˜xÐ(°;ÀÐ2DÈVÔVX×V]ÑV]×VfÑVfÐgjÓVkÐloÐmoÐVpÐsyÑVyÐ{}ÐU~ÐLô  GNð  X[�ð  \ˆA÷ à�=‰=˜CÓÜ�JŠJ�rŒN™HØ	×ÑÔ™eñ ð 	
�‰‹€AÜ‡I‚Iˆc„NØ‡u�uˆX‡�Ø�(‘‰à�	‰lˆØÜ�JŠJ�qŒMØ—‘œ$˜˜|¨C¨5Ð1¸KÈÐ;MÐWY�ÐZ×_Ñ_ÓaˆBØ�v‰v�hÓ 6Ó)ØŸ™˜xÓ(×.¨B�°Ø�v‰v�hÓÐ';Ó;Ü" c U¨"¨R¯V©V°HÓ-=Ð,>¸aÀÇÁÀwÃÐ?PÐ#QÓRÐRÜ�yŠy‹{˜RÑ $Ó&Ü" 3Ó'Ð'ñ ô \eÔekÐlqñ  xRñ  fSô  \Tô  Uò  \TÑSWÐSTÐVWˆw�u˜qŸu™u V¨Q°©UÓ3Ñ3Ð4°D¸¿¹¸v»×9LÈ"Ð8MÓNñ  \T€Eñ  UÜ‡K‚K”—‘—‘ Ó$¨tÒ4Ü	ˆc�F‰l˜C¨'Ò	2°aØ	�‰�×"Ñ" 5Ó)¨DÑ0Ô1÷ 
3ä‡J‚Jˆs�V‰|˜SÔ!Ü�g‰g�o‰o˜c¤3Ó'Ð(¨¬3¨u«:¨,°jÄÇÂÃÈrÑAQÐRUÐ@VÐVWÐXÐX÷3 Ž_üó( Uç	2Õ	2ús    ÃAN>Ê%AOÌ+$OÎ>
O	Ï
O$c            	      óš  • [         R                  [         R                  4 H  n U R                  SSS9  M     [         R                  SS   Vs/ s H  oR                  S5      (       a  M  UPM     nnS[         R                  ;   a<  [        [         R                  [         R                  R                  S5      S-      5      OSnUS:w  a"  U Vs/ s H  o[        U5      :w  d  M  UPM     nn[        5       nU=(       d    [         VVs/ s HA  n[        U5        H.  n[        R                  R                  US   5      (       a  M,  UPM0     MC     snnS U n[        [!        U5       S	3S
S9  ["        R$                  " SS9 n/ n	U H@  nU	R'                  UR(                  " [*        U/UQ76 5        [,        R.                  " S5        MB     ["        R0                  " U	5       H  n
 [        U
R3                  5       S
S9  M     S S S 5        g s  snf s  snf s  snnf ! [4         a  n[        SUS
S9   S nAMT  S nAff = f! , (       d  f       g = f)Nr   r�   )r   Úerrorsr   z--z--max-chunksi@B rU   z chunk(s) to OCRT)Úflushé   )Úmax_workersé   ÚFAILED)r!   ÚstdoutÚstderrÚreconfigureÚargvr   ÚintÚindexÚstrr%   r7   rO   r9   r<   ÚexistsÚprintr‘   ÚcfÚThreadPoolExecutorÚappendÚsubmitrž   r~   r„   Úas_completedrc   Ú	Exception)r›   ÚaÚargsÚmaxcro   r>   ÚcÚtodoÚexÚfutsr5   Úes               r$   Úmainr½   W   s·  € Ü�z‰zœ3Ÿ:™:Ó&ˆØ
�‰ °	ˆÓ:ñ 'ä—x‘x  ‘|Ó>’|�!¯<©<¸×+=�A‘|€DÐ>Ø@NÔRU×RZÑRZÓ@ZŒ3Œs�x‰xœŸ™Ÿ™ ~Ó6¸Ñ:Ñ;Ô<Ð`g€DØˆwƒÙÓ2š4�a¬¨D«	¡>—™4ˆÐ2Ü
‹)€CØŸ=¤5˜=Ô\š=�$´6¸$·<¨aÄrÇwÁwÇ~Á~ÐVWÐXYÑVZ×G[�A±<‰A™=Ò\Ð]bÐ^bÐc€DÜ	ŒS�‹YˆKÐ'Ð
(°Ò5Ü	×	Ò	¨1Ò	-°ØˆÛˆAØ�K‰K˜Ÿ	š	¤)¨SÐ5°1Ò5Ô6¼¿
º
À1¾ñ ä—’ Ö&ˆAð/Ü�a—h‘h“j¨Ô-ñ '÷	 
.Ð	-ùò ?ùò 3ùã\øô ó /Ü�h ¨×.Ð.ûð/ú÷ 
.Õ	-ús[   ÁH	Á*H	ÃHÃ$HÄ:HÅ
HÆA"H<Ç$HÇ<H<È
H9È#H4È.H<È4H9È9H<È<
I
Ú__main__)Ú__doc__r9   r!   r~   rv   Úconcurrent.futuresÚfuturesr¯   rF   r|   r;   r   r€   r<   r=   r�   ÚabspathÚ__file__rK   rI   r7   r‚   r%   rA   rO   rž   r½   Ú__name__© r&   r$   Ú<module>rÆ      sÐ   ðñ÷ 9× 8Õ 8ß à:€Ø
;€Ø€Ø‡g�g‡l�l�2—7‘7—?‘? 2§7¡7§?¡?°2·7±7·?±?À8Ó3LÓ#MÓNÐPVÐX\Ó]€Ø
€à0ØØ/Ø/ñ		€ð ¨WÈÐfmð  }Cð  SYñ  Z€ò&ò*òYò"YòJ/ð* ˆzÓÙ…Fð r&   