Ë
    3Ú¯jJ  ã                  ól  — 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ZddlZddl	Z	ddl
Z
ddlmZmZmZ  ej                  e«      j#                  «       j$                  j$                  Zg d¢ZdZ ej,                  d«      Zdd„Zd	„ Z	 	 d	 	 	 	 	 	 	 dd
„Zdd„Zedk(  r ej:                   e«       «       yy)uŠ  Bluesky å�Žé›† (Jetstream = å…¬å¼�ã�®å…¬é–‹ WebSocketã€� èª�è¨¼ä¸�è¦�ã€� 2026-09-21)ã€‚

    python scripts/bluesky.py --dry --duration 30          # å‹•ä½œç¢ºèª� (è¡¨ç¤ºã� ã�‘)
    python scripts/bluesky.py --genre entertainment         # å¸¸é§� (daemon ã�‹ã‚‰ã�¯ platform = "bluesky")

å…¨æŠ•ç¨¿ (app.bsky.feed.post ã�® create) ã�Œæµ�ã‚Œã�¦ã��ã‚‹ã�®ã�§ã€� `langs` ã�« ja ã‚’å�«ã‚€æŠ•ç¨¿ã� ã�‘å�–ã‚‹ã€‚
æœ¬æ–‡ã�¯ YouTube ã�¨å�Œã�˜çµŒè·¯ (mask â†’ NFKC â†’ SqliteAppender)ã€‚ æŠ•ç¨¿è€… DID / URI / æ™‚åˆ»ã�®ç´°éƒ¨ã�¯ä¿�å­˜ã�—ã�ªã�„ã€‚
åˆ‡æ–­ã�•ã‚Œã�Ÿã‚‰æ•°ç§’å¾Œã�«å†�æŽ¥ç¶š (cursor ã�¯æŒ�ã�Ÿã�ªã�„ = å�–ã‚Šã�“ã�¼ã�—ã�¯è¨±å®¹ã€� dedup ã�¯ DB å�´)ã€‚
é    )ÚannotationsN)ÚSqliteAppenderÚmaskÚ	normalize)z/wss://jetstream2.us-east.bsky.network/subscribez/wss://jetstream1.us-east.bsky.network/subscribez/wss://jetstream2.us-west.bsky.network/subscribez/wss://jetstream1.us-west.bsky.network/subscribez%?wantedCollections=app.bsky.feed.postz	@[\w.\-]+c                óV   — t         j                  d| «      } t        t        | «      «      S )NÚ )Ú
MENTION_REÚsubr   r   )Útexts    õM   /var/www/html/é…�ä¿¡ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–/videos/stream-comments/scripts/bluesky.pyÚcleanr   %   s!   € Ü�>‰>˜"˜dÓ#€DÜ”T˜$“ZÓ Ð ó    c              ƒ  ó–  K  — |rd|› d�nd}|rd nt        j                  |dz  «      }|dkD  rt        j                  «       |z   nd }d}	d}
t        |› d|› �d¬«       	 	 |�|j	                  «       r�nˆ|�t        j                  «       |k\  r�nmt
        |
t        t
        «      z     t        z   }	 t        j                  |d	d
¬«      4 ƒd {  –—† }	 |�F|j	                  «       r6	 d d d «      ƒd {  –—†  |�|j                  «        t        |› d|	› �d¬«       y |�Mt        j                  «       |k\  r6	 d d d «      ƒd {  –—†  |�|j                  «        t        |› d|	› �d¬«       y 	 t        j                  |j                  «       d
¬«      ƒ d {  –—† }	 t        j                   |«      }|j%                  d«      xs i }|j%                  d«      dk7  s|j%                  d«      dk7  r�Œ|j%                  d«      xs i }d|j%                  d«      xs g vr�ŒI|j%                  d«      r|r	 |j%                  d«      xs d}|j'                  d«      D ]£  }t)        |«      }t        |«      dk  rŒ|r|	d
k  rCt        d|d d d¬«       n1|j+                  t-        t        j                  «       dz  «      || «       |	dz  }	|	dz  dk(  sŒu|rŒxt        |› d |	› d!|j.                  › d"|j0                  › �d¬«       Œ¥ �Œ*|�|j                  «        t        |› d|	› �d¬«       y 7 �ŒU7 �Œ47 �Œè7 �Œ˜# t        j                  $ r Y �Œrw xY w# t"        $ r Y �Œ‚w xY w# 1 ƒd {  –—†7  sw Y   nxY wn²# t2        $ r¦}|
dz  }
t        |› d#|›d$t
        |
t        t
        «      z     › d%�d¬«       t5        d&«      D ]\  }|�:|j	                  «       r* Y d }~|�|j                  «        t        |› d|	› �d¬«       y t        j6                  d«      ƒ d {  –—†7   Œ^ Y d }~nd }~ww xY w�ŒÁ# |�|j                  «        t        |› d|	› �d¬«       w xY w­w)'Nú[z] z
[bluesky] zcomments.sqliter   z[start] dry=T)Úflushi   é   )Úmax_sizeÚopen_timeoutz[done] seen=)ÚtimeoutÚcommitÚ	operationÚcreateÚ
collectionzapp.bsky.feed.postÚrecordÚjaÚlangsÚreplyr   r   ú
é   z  éP   iè  é   iô  z  seen=z	 touched=z
 rejected=z[ws] u    â†’ reconnect in 5s (ú)é   )r   ÚsharedÚtimeÚprintÚis_setÚ	ENDPOINTSÚlenÚQUERYÚ
websocketsÚconnectÚcloseÚasyncioÚwait_forÚrecvÚTimeoutErrorÚjsonÚloadsÚ
ValueErrorÚgetÚsplitr   ÚwriteÚintÚtouchedÚrejectedÚ	ExceptionÚrangeÚsleep)ÚgenreÚout_dirÚ
stop_eventÚdryÚdurationÚlog_tagÚprefixÚwriterÚdeadlineÚcountÚepÚurlÚwsÚrawÚevÚcÚrecr   ÚlineÚbodyÚeÚ_s                         r   Ú_runrS   *   sJ  è ø€ Ù 'ˆq��	˜‰_¨\€FÙ‰Tœn×3Ñ3°GÐ>OÑ4OÓP€FØ)1°AªŒt�y‰y‹{˜XÒ%¸4€HØ€EØ	
€BÜ	ˆVˆH�L  Ð
&¨dÕ3ð5:ØØÐ%¨*×*;Ñ*;Ô*=ÙØÐ#¬¯	©	«°xÒ(?ÙÜ˜B¤¤Y£Ñ/Ñ0´5Ñ8ˆCð*+Ü%×-Ñ-¨c¸EÐPRÔS÷ "Að "AÐWYØØ%Ð1°j×6GÑ6GÔ6IØ"÷"A÷ "AðV ÐØ�L‰LŒNÜ��˜ U GÐ,°DÖ9ðS $Ð/´D·I±I³KÀ8Ò4KØ"÷"A÷ "AðV ÐØ�L‰LŒNÜ��˜ U GÐ,°DÖ9ðO%Ü(/×(8Ñ(8¸¿¹»ÈBÔ(O×"O˜Cð%Ü!%§¡¨C£˜Bð ŸF™F 8Ó,Ò2°˜ØŸ5™5 Ó-°Ò9¸Q¿U¹UÀ<Ó=PÐThÒ=hÙ$ØŸe™e H›oÒ3°˜Ø¨¯©°Ó(8Ò(>¸BÑ?Ù$ØŸ7™7 7Ô+±Ø Ø"Ÿw™w v›Ò4°"˜Ø$(§J¡J¨tÓ$4ò A˜DÜ#(¨£;˜DÜ" 4›y¨1š}Ø (Ù"Ø#(¨2¢:Ü$)¨$°°S°b°	ÀÖ$Fà &§¡¬S´·±³¸tÑ1CÓ-DÀdÈEÔ RØ! Q™J˜EØ$ s™{¨aÓ/ºÜ %¨¨°¸°w¸iÈÏÉÐGWÐWaÐbh×bqÑbqÐarÐ&sÐ{ö  !AðAñ- ðT ÐØ�L‰LŒNÜ��˜ U GÐ,°DÖ9ð["Aùð "Aùð "Aùð #PúÜ&×3Ñ3ò %Ú$ð%ûô  *ò %Ú$ð%ú÷"A÷ "Añ "Aúð "AøôF ò +Ø�a‘�Ü˜˜  a UÐ*@ÄÈ2ÔPSÔT]ÓP^ÑK^ÑA_Ð@`Ð`aÐbÐjnÕoÜ˜q›ò +�AØ!Ð-°*×2CÑ2CÔ2EÜð ÐØ�L‰LŒNÜ��˜ U GÐ,°DÖ9ô	 "Ÿ-™-¨Ó*×*Ò*õ+ûð+úñU øðd ÐØ�L‰LŒNÜ��˜ U GÐ,°DÖ9üs;  ‚AQ	ÁAP  Â/M, ÃL ÃM, ÃMÃ$M, Ã/L#Ã0M, Ã4%Q	ÄMÄ3M, Ä>L&Ä?M, Å%Q	Å)(L,ÆL)ÆL,ÆMÆ,DMËMË0MË;%Q	Ì M, Ì#M, Ì&M, Ì)L,Ì,MÌ?MÍMÍMÍ	MÍMÍMÍMÍM(ÍMÍM(Í$M, Í+P  Í,	PÍ5APÏP  Ï%Q	Ï1PÐ	PÐ
PÐP  ÐPÐP  Ð &QÑQ	c           
     óJ   — t        j                  t        || ||||«      «       y )N)r.   ÚrunrS   )r?   r>   r@   rA   Úduration_secrC   s         r   Úcollect_blueskyrW   i   s   € ä‡K�K”�U˜G Z°°lÀGÓLÕMr   c                 ó¢  — dd l } | j                  «       }|j                  dd¬«       |j                  dt        d¬«       |j                  dd ¬«       |j                  d	t	        t
        d
z  «      ¬«       |j                  «       }t        t        j                  |j                  «      |j                  d |j                  |j                  «       y)Nr   z--dryÚ
store_true)Úactionz
--duration)ÚtypeÚdefaultz--genre)r\   z	--out-dirÚdata)ÚargparseÚArgumentParserÚadd_argumentr8   ÚstrÚROOTÚ
parse_argsrW   ÚpathlibÚPathr?   r>   rA   rB   )r^   ÚapÚas      r   Úmainrh   n   s•   € Ûà	×	 Ñ	 Ó	"€BØ‡O�O�G L€OÔ1Ø‡O�O�L¤s°A€OÔ6Ø‡O�O�I t€OÔ,Ø‡O�O�K¬¬T°F©]Ó);€OÔ<Ø
�‰‹€AÜ”G—L‘L §¡Ó+¨Q¯W©W°d¸A¿E¹EÀ1Ç:Á:ÔNØr   Ú__main__)r   ra   Úreturnra   )NNFr   r   )r?   zpathlib.Pathr>   z
str | Noner@   zthreading.Event | NonerA   ÚboolrV   r8   rC   ra   rj   ÚNone)rj   r8   )Ú__doc__Ú
__future__r   r.   r2   rd   ÚreÚsysÚ	threadingr%   r+   Úimport_youtube_liver   r   r   re   Ú__file__ÚresolveÚparentrb   r(   r*   Úcompiler	   r   rS   rW   rh   Ú__name__Úexit© r   r   ú<module>rz      sÓ   ðñõ #ã Û Û Û 	Û 
Û Û ã ç ?Ñ ?à€w‡|�|�HÓ×%Ñ%Ó'×.Ñ.×5Ñ5€ò€	ð 	0€ØˆR�Z‰Z˜Ó%€
ó!ò
<:ð~ koØMOðNØðNØ58ðNØGJðNØTXóNó

ð ˆzÒØ€C‡H�H‰T‹VÕð r   