Ë
    ª«ëjâ!  ã                  óî   — d Z ddlm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mZmZ  ej                  e«      Zg d¢ZdZd	Zd
ZdZdZdZdZdZdZdZdZdZdd„Zdd„Zdd„Z dd„Z!	 d	 	 	 	 	 dd„Z"y)a  Ingest worker: deduplication, classification, sorting of claimed files.

Takes files from processing/<batch_id>/ (claimed by claim_batch), deduplicates
by sha256 against manifest, classifies by extension/content, moves to
sorted/<category>/ or duplicates/, and updates the manifest.
é    )ÚannotationsN)ÚPath)Úuuid4)Úmanifest_writeÚresolve_shared_root)Úclassify_fileÚcompute_sha256Úis_ai_exportÚprocess_batchÚread_manifest_entriesz	ai-exportÚnoteÚdocÚcodeÚmediaÚarchiveÚother)
ÚconversationsÚchatÚuserÚ	assistantÚmessagesÚ
perplexityÚgeminiÚclaudeÚgptÚopenai)z.mdz.txtz.rstz.org)z.pdfz.docz.docxz.odtz.rtf)z.pyz.jsz.tsz.javaz.cppz.cz.hz.goz.rsz.shz.batz.ps1ú.jsonz.yamlz.ymlz.tomlz.iniz.cfgz.conf)z.jpgz.jpegz.pngz.gifz.bmpz.svgz.webpz.icoz.mp4z.movz.aviz.mkvz.mp3z.wavz.flacz.oggú.zipú.tarú.gzú.bz2ú.7zú.rarc                ó  ‡— t        j                  «       }| j                  d«      5 Št        ˆfd„d«      D ]  }|j	                  |«       Œ 	 ddd«       |j                  «       S # 1 sw Y   |j                  «       S xY w)u!   VypoÄ�Ã­tÃ¡ SHA-256 hash souboru.Úrbc                 ó&   •— ‰ j                  d«      S )Ni   )Úread)Úfs   €úH/home/oem/CyberBrain26-unified/src/cyberbrain26/product/ingest_worker.pyú<lambda>z compute_sha256.<locals>.<lambda>7   s   ø€  !§&¡&¨£-€ ó    r+   N)ÚhashlibÚsha256ÚopenÚiterÚupdateÚ	hexdigest)ÚpathÚhÚchunkr(   s      @r)   r	   r	   3   sj   ø€ ä�‰Ó€AØ	�‰�4‹ð ˜AÜÓ/°Ó5ò 	ˆEØ�H‰H�U�Oñ	÷ð �;‰;‹=Ð÷ð �;‰;‹=Ðús   §&A&Á&A>c                ó6  — | dz  dz  }|j                  «       sg S g }t        |d¬«      5 }|D ]:  }|j                  «       }|sŒ	 |j                  t	        j
                  |«      «       Œ< 	 ddd«       |S # t        j                  $ r Y Œ]w xY w# 1 sw Y   |S xY w)uK   PÅ™eÄ�te vÅ¡echny zÃ¡znamy z manifestu (prÃ¡zdnÃ½ seznam pokud neexistuje).Úmanifestzingest-manifest.jsonlúutf-8)ÚencodingN)Úexistsr.   ÚstripÚappendÚjsonÚloadsÚJSONDecodeError)Úshared_rootÚmpathÚentriesr(   Úlines        r)   r   r   <   s    € à˜*Ñ$Ð'>Ñ>€EØ�<‰<Œ>Øˆ	Ø€GÜ	ˆe˜gÔ	&ð ¨!Øò 	ˆDØ—:‘:“<ˆDÚðØ—N‘N¤4§:¡:¨dÓ#3Õ4ñ		÷ð €Nøô ×+Ñ+ò Ùðú÷ð €Nús/   ªBÁ$A5Á(BÁ5BÂBÂ
BÂBÂBc                óf  — | j                   j                  «       }t        D ]  }||v sŒ y | j                  j                  «       dk(  rN	 t	        | dd¬«      5 }|j                  d«      j                  «       }dD ]  }||v sŒ ddd«       y 	 ddd«       y	y	# 1 sw Y   y	xY w# t        $ r Y y	w xY w)
zODetekuje zda je soubor AI export (konverzace z ChatGPT/Gemini/Perplexity atd.).Tr   r7   Úreplace)r8   Úerrorsi   )Úconversationr   r   r   r   r   ÚchatgptNF)ÚnameÚlowerÚAI_EXPORT_PATTERNSÚsuffixr.   r'   ÚOSError)r2   rH   Úpatr(   Úheads        r)   r
   r
   M   s¾   € à�9‰9�?‰?Ó€Dä!ò ˆØ�$Š;Ùðð ‡{�{×ÑÓ˜gÒ%ð	Ü�d W°YÔ?ð $À1Ø—v‘v˜d“|×)Ñ)Ó+�Øoò $�CØ˜d’{Ø#÷	$ð $ñ$÷$ñ ÷$ð ûô ò 	ØØð	úsB   Á
B$ Á)BÂBÂB$ ÂBÂB$ ÂB!ÂB$ Â!B$ Â$	B0Â/B0c                óè   — t        | «      rt        S | j                  j                  «       }|t        v rt
        S |t        v rt        S |t        v rt        S |t        v rt        S |dv rt        S t        S )u>   Klasifikuje soubor podle pÅ™Ã­pony a obsahu. VracÃ­ kategorii.)r   r   r    r!   r"   r#   )r
   ÚCATEGORY_AI_EXPORTrK   rI   ÚEXT_NOTEÚCATEGORY_NOTEÚEXT_DOCÚCATEGORY_DOCÚEXT_CODEÚCATEGORY_CODEÚ	EXT_MEDIAÚCATEGORY_MEDIAÚCATEGORY_ARCHIVEÚCATEGORY_OTHER)r2   Úexts     r)   r   r   a   sl   € ä�DÔÜ!Ð!Ø
�+‰+×
Ñ
Ó
€CØ
Œh�ÜÐØ
Œg�~ÜÐØ
Œh�ÜÐØ
ŒiÑÜÐØ
Ð<Ñ<ÜÐÜÐr+   c                ó^	  — |r't        |«      j                  «       j                  «       n	t        «       }|dz  | z  }|dz  }|dz  }|j	                  «       s| ddg dœS t        |«      }|D �ch c]7  }|j                  d«      r$|j                  d«      dv r|j                  d«      ’Œ9 }}g }	g }
g }t        |j                  «       «      D �]2  }|j                  «       sŒt        |«      }t        |«      }||v �rv||j                  z  }|j	                  «       rL|j                  }|j                  }d	}|j	                  «       r"||› d
|› |› �z  }|d	z  }|j	                  «       rŒ"	 |j                  |«       |
j!                  t#        |j%                  |«      «      t#        |j%                  |«      «      ||dœ«       t'        t)        «       j*                  | t-        j,                  «       t#        |j%                  |«      «      t#        |j%                  |«      «      ||j/                  «       j0                  |j                  j3                  «       |ddd|ddœ|¬«       |j5                  |«       �Œ¦||z  }|j=                  ddd¬«       ||j                  z  }|j	                  «       rL|j                  }|j                  }d	}|j	                  «       r"||› d
|› |› �z  }|d	z  }|j	                  «       rŒ"	 |j                  |«       |	j!                  t#        |j%                  |«      «      t#        |j%                  |«      «      ||dœ«       t'        t)        «       j*                  | t-        j,                  «       t#        |j%                  |«      «      t#        |j%                  |«      «      ||j/                  «       j0                  |j                  j3                  «       |ddddddœ|¬«       |j5                  |«       �Œ5 | t?        |	«      t?        |
«      |	|
|dœS c c}w # t6        $ r<}t8        j;                  d||«       |j!                  t#        |«      «       Y d}~�Œ–d}~ww xY w# t6        $ r<}t8        j;                  d||«       |j!                  t#        |«      «       Y d}~�ŒÞd}~ww xY w)uL  Zpracuje vÅ¡echny soubory v processing/<batch_id>/.

    Pro kaÅ¾dÃ½ soubor:
    1. VypoÄ�Ã­tÃ¡ sha256
    2. Zkontroluje deduplikaci proti existujÃ­cÃ­m zÃ¡znamÅ¯m v manifestu
    3. Klasifikuje
    4. PÅ™esune do sorted/<kategorie>/ nebo duplicates/ (pokud duplikÃ¡t)
    5. Aktualizuje manifest

    VracÃ­ dict s vÃ½sledky.
    Ú
processingÚsortedÚ
duplicatesr   )Úbatch_idÚ	processedr_   rE   r-   Ústatus)Ú
classifiedÚindexedÚ	duplicateé   Ú_)ÚsrcÚdstr-   Úcategoryre   Úingest_workerÚduplicate_content)Úidr`   ÚtsÚsrc_path_relÚdst_path_relr-   ÚsizeÚmime_or_extÚtyperb   ÚworkerÚreasonÚdup_of_sha256Ú	task_hits)r?   zCould not move duplicate %s: %sNTiÀ  )ÚparentsÚexist_okÚmoderc   zCould not move %s: %s)r`   ra   r_   Úprocessed_filesÚduplicate_filesrE   ) r   Ú
expanduserÚresolver   r9   r   Úgetr^   ÚiterdirÚis_filer	   r   rH   ÚstemrK   rD   r;   ÚstrÚrelative_tor   r   ÚhexÚtimeÚstatÚst_sizerI   ÚaddrL   ÚloggerÚwarningÚmkdirÚlen)r`   r?   ÚrootÚprocessing_dirÚ
sorted_dirÚduplicates_dirÚexisting_entriesÚeÚexisting_hashesra   r_   rE   Úentryr-   rj   ri   r‚   rK   ÚiÚexcÚcat_dirs                        r)   r   r   s   sN  € ñ 8CŒ4�Ó×'Ñ'Ó)×1Ñ1Ô3ÔH[ÓH]€DØ˜LÑ(¨8Ñ3€NØ˜‘€JØ˜LÑ(€Nà× Ñ Ô"Ø$°1ÀAÐQSÑTÐTä,¨TÓ2Ðà!1öØØ�5‰5�Œ?˜qŸu™u X›Ð2XÑXð 	
�‰ˆh�ð€Oð ð
 €IØ€JØ€Fä˜×.Ñ.Ó0Ó1ó ^&ˆØ�}‰}ŒØä Ó&ˆÜ  Ó'ˆð �_Ò$à  5§:¡:Ñ-ˆCà�z‰zŒ|Ø—z‘z�ØŸ™�Ø�Ø—j‘j”lØ(¨d¨V°1°Q°C¸°xÐ+@Ñ@�CØ˜‘F�Að —j‘j•lð Ø—‘˜cÔ"Ø×!Ñ!Ü˜u×0Ñ0°Ó6Ó7Ü˜sŸ™¨tÓ4Ó5Ø$Ø (ñ	#ô ô ä#›gŸk™kØ$,Ü"Ÿi™i›kÜ(+¨E×,=Ñ,=¸dÓ,CÓ(DÜ(+¨C¯O©O¸DÓ,AÓ(BØ"(Ø #§¡£
× 2Ñ 2Ø',§|¡|×'9Ñ'9Ó';Ø (Ø"-Ø"1Ø"5Ø)/Ø%&ñð  !%õ#ð&  ×#Ñ# FÔ+Ùð ˜xÑ'ˆØ�‰˜d¨T¸ˆÔ>Ø˜Ÿ
™
Ñ"ˆØ�:‰:Œ<Ø—:‘:ˆDØ—\‘\ˆFØˆAØ—*‘*”,Ø 4 &¨¨!¨¨V¨HÐ 5Ñ5�Ø�Q‘�ð —*‘*•,ð	&Ø�M‰M˜#ÔØ×ÑÜ˜5×,Ñ,¨TÓ2Ó3Ü˜3Ÿ?™?¨4Ó0Ó1Ø Ø$ñ	ô ô ä›'Ÿ+™+Ø (ÜŸ)™)›+Ü$'¨×(9Ñ(9¸$Ó(?Ó$@Ü$'¨¯©¸Ó(=Ó$>Ø$ØŸH™H›J×.Ñ.Ø#(§<¡<×#5Ñ#5Ó#7Ø$Ø*Ø-Ø"Ø%)Ø!"ñð  !õ#ð& ×Ñ Ö'ðw^&ðB Ü˜“^Ü˜*“oØ$Ø%Øñð ùòSøôr ò Ü—‘Ð@À%ÈÔMØ—‘œc %›jÔ)ÝûðûôX ò 	&Ü�N‰NÐ2°E¸3Ô?Ø�M‰Mœ#˜e›*×%Ò%ûð	&ús8   Á,<PÅ%DPË4DQ'Ð	Q$Ð(1QÑQ$Ñ'	R,Ñ01R'Ò'R,)r2   r   Úreturnrƒ   )r?   r   r™   z
list[dict])r2   r   r™   Úbool)N)r`   rƒ   r?   zstr | Path | Noner™   Údict)#Ú__doc__Ú
__future__r   r,   r<   Úloggingr†   Úpathlibr   Úuuidr   Ú cyberbrain26.product.shared_rootr   r   Ú	getLoggerÚ__name__rŠ   Ú__all__rP   rR   rT   rV   rX   rY   rZ   rJ   rQ   rS   rU   rW   r	   r   r
   r   r   © r+   r)   ú<module>r¦      sÄ   ðñõ #ã Û Û Û Ý Ý ç Pà	ˆ×	Ñ	˜8Ó	$€ò€ð !Ð Ø€Ø€Ø€Ø€ØÐ Ø€ðÐ ð +€Ø
3€ð _€ð ~€	óóó"ó(ð( &*ðHØðHà"ðHð 
ôHr+   