Ë
    3Ú¯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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dZ ej,                  d«      Z ej,                  d«      Zddd„Zdd	„Zdd
„Z	 	 d	 	 	 	 	 	 	 	 	 dd„Zdd„Zedk(  r ej>                   e«       «       yy)uþ  Fediverse å�Žé›† (Misskey / Mastodon ã�®å…¬é–‹ãƒ­ãƒ¼ã‚«ãƒ«ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ã€� èª�è¨¼ä¸�è¦�ã€� 2026-09-21)ã€‚

    python scripts/fediverse.py https://misskey.io --dry --duration 20
    python scripts/fediverse.py https://mstdn.jp --dry --duration 20
    daemon: platform = "fediverse", id = "https://misskey.io" (ç¨®åˆ¥ã�¯ API ã‚’å�©ã�„ã�¦è‡ªå‹•åˆ¤å®š)

polling (æ—¢å®š 60 ç§’) ã�§æ–°ç�€ã� ã�‘å�–ã‚Šã€� æœ¬æ–‡ã�® HTML ã‚’å‰¥ã�Œã�—ã�¦ mask â†’ NFKC â†’ SqliteAppenderã€‚ æŠ•ç¨¿è€…ãƒ»URL ã�¯ä¿�å­˜ã�—ã�ªã�„ã€‚
é    )ÚannotationsN)ÚSqliteAppenderÚmaskÚ	normalizezFMozilla/5.0 (Windows NT 10.0; Win64; x64) Gecko/20100101 Firefox/120.0z@[\w.\-]+(?:@[\w.\-]+)?z
:[\w+\-]+:c                ó:  — |�#t        j                  |«      j                  «       nd }t        j                  j                  | |t        ddœ¬«      }t        j                  j                  |d¬«      5 }t        j                  |«      cd d d «       S # 1 sw Y   y xY w)Nzapplication/json)z
User-AgentzContent-Type)ÚdataÚheadersé   )Útimeout)	ÚjsonÚdumpsÚencodeÚurllibÚrequestÚRequestÚUAÚurlopenÚload)Úurlr   ÚbodyÚreqÚrs        õO   /var/www/html/é…�ä¿¡ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–/videos/stream-comments/scripts/fediverse.pyÚhttpr      sz   € Ø(,Ð(8Œ4�:‰:�dÓ×"Ñ"Ô$¸d€DÜ
�.‰.×
 Ñ
  ¨4ÌÐ\nÑ9oÐ
 Ó
p€CÜ	�‰×	Ñ	 ¨RÐ	Ó	0ð °AÜ�y‰y˜‹|÷÷ ò ús   Á2BÂBc                óF   — 	 t        | dz   ddi«       y# t        $ r Y yw xY w)Nz	/api/metaÚdetailFÚmisskeyÚmastodon)r   Ú	Exception)Úbases    r   Úkindr!   $   s0   € ðÜˆT�KÑ (¨EÐ!2Ô3ØøÜò Ùðús   ‚ ”	 Ÿ c                ó\  — |dk(  rbddddœ}|r||d<   t        | dz   |«      }|D �cg c]:  }|j                  d«      sŒ|j                  d«      |j                  d«      xs d	f‘Œ< }}n©| d
z   |rd|› �nd	z   }t        |«      }g }|D ]ˆ  }	t        j                  dd|	j                  d«      xs d	t        j                  ¬«      }
t        j                  t        j                  dd	|
«      «      }
|j                  |	j                  d«      |
f«       ŒŠ t        d„ |D «       |¬«      }||fS c c}w )u>   æ–°ç�€ (id é™�é †) ã�®ãƒ†ã‚­ã‚¹ãƒˆåˆ—ã�¨æœ€æ–° id ã‚’è¿”ã�™ã€‚r   éd   F)ÚlimitÚwithRepliesÚ	withFilesÚsinceIdz/api/notes/local-timelineÚtextÚidÚ z,/api/v1/timelines/public?local=true&limit=40z
&since_id=z<br\s*/?>|</p>ú
Úcontent)Úflagsz<[^>]+>c              3  ó,   K  — | ]  \  }}|sŒ	|–— Œ y ­w©N© )Ú.0ÚiÚ_s      r   ú	<genexpr>zfetch.<locals>.<genexpr><   s   è ø€ Ò+™˜˜1ª”!Ñ+ùs   ‚
�©Údefault)	r   ÚgetÚreÚsubÚIÚhtmlÚunescapeÚappendÚmax)r    ÚkÚsinceÚdÚnotesÚnÚtextsr   ÚstÚsÚtÚnewests               r   ÚfetchrI   ,   s%  € àˆI‚~Ø¨%¸eÑDˆÙØ ˆAˆi‰LÜ�TÐ7Ñ7¸Ó;ˆØ=BÖT¸ÀaÇeÁeÈFÅm�!—%‘%˜“+˜qŸu™u V›}Ò2°Ò3ÐTˆÑTàÐCÑCÑ_dÈÐTYÐSZÑG[ÐjlÑmˆÜ�#‹YˆØˆØò 	+ˆAÜ—‘Ð(¨$°·±°iÓ0@Ò0FÀBÌbÏdÉdÔSˆAÜ—‘œbŸf™f Z°°QÓ7Ó8ˆAØ�L‰L˜!Ÿ%™% ›+ qÐ)Õ*ð	+ô Ñ+ Ô+°UÔ;€FØ�&ˆ=Ðùò Us
   ¦D)½(D)c                ól  — |rd|› d�nd| › d�}t        | «      }	|rd nt        j                  |dz  «      }
|dkD  rt        j                  «       |z   nd }d }d}t	        |› d|	› d|› �d¬	«       	 	 |�|j                  «       r�n:|�t        j                  «       |k\  r�n	 t        | |	|«      \  }}|D ]µ  \  }}|j                  d«      D ]œ  }t        t        t        j                  dt        j                  d|«      «      «      «      }t        |«      dk  rŒN|r|dk  rCt	        d|d d d¬	«       n1|
j                  t!        t        j                  «       dz  «      ||«       |dz  }Œž Œ· t#        |«      D ]D  }|�|j                  «       s|�t        j                  «       |k\  r nt        j$                  d«       ŒF �ŒN|
�|
j'                  «        t	        |› d|› �d¬	«       y # t        $ r}t	        |› d
|›�d¬	«       g }Y d }~�ŒVd }~ww xY w# |
�|
j'                  «        t	        |› d|› �d¬	«       w xY w)Nú[z] z[fedi zcomments.sqliter   z[start] kind=z dry=T)Úflushz[err] r+   ú r*   é   é   z  éP   iè  é   z[done] seen=)r!   r   ÚsharedÚtimeÚprintÚis_setrI   r   Úsplitr   r   ÚEMOJI_REr9   Ú
MENTION_REÚlenÚwriteÚintÚrangeÚsleepÚclose)r    Úout_dirÚgenreÚ
stop_eventÚdryÚduration_secÚlog_tagÚintervalÚprefixr?   ÚwriterÚdeadliner@   ÚcountrD   Úer3   r(   Úliner   s                       r   Úcollect_fediverserl   @   s4  € á 'ˆq��	˜‰_¨v°d°V¸2Ð->€FÜˆT‹
€AÙ‰Tœn×3Ñ3°GÐ>OÑ4OÓP€FØ-9¸AÒ-=Œt�y‰y‹{˜\Ò)À4€HØ€EØ€EÜ	ˆVˆH�M !  E¨#¨Ð
/°tÕ<ð:ØØÐ%¨*×*;Ñ*;Ô*=ÙØÐ#¬¯	©	«°xÒ(?ÙðÜ$ T¨1¨eÓ4‘��uð !ò 
‘��4Ø ŸJ™J tÓ,ò 	�DÜ$¤T¬(¯,©,°s¼J¿N¹NÈ2ÈtÓ<TÓ*UÓ%VÓW�DÜ˜4“y 1’}Ø ÙØ  2š:Ü! $¨¨S¨b¨	¸Ö>àŸ™¤S¬¯©«°tÑ);Ó%<¸dÀEÔJØ˜Q‘J‘Eñ	ð
ô ˜8“_ò �ØÐ*¨z×/@Ñ/@Ô/BÈÐH\Ôae×ajÑajÓalÐpxÒaxÙÜ—
‘
˜1•ðñ+ ð4 ÐØ�L‰LŒNÜ��˜ U GÐ,°DÖ9øô+ ò Ü˜˜  q eÐ,°DÕ9Ø–ûðûð& ÐØ�L‰LŒNÜ��˜ U GÐ,°DÖ9ús7   Á.0H ÂG" Â/DH Ç"	H
Ç+HÇ?H ÈH
È
H È&H3c            	     ó@  — dd l } | j                  «       }|j                  d«       |j                  dd¬«       |j                  dt        d¬«       |j                  dd ¬	«       |j                  d
t        d¬«       |j                  dt	        t
        dz  «      ¬	«       |j                  «       }t        |j                  j                  d«      t        j                  |j                  «      |j                  d |j                  |j                  |j                   ¬«       y)Nr   r    z--dryÚ
store_true)Úactionz
--duration)Útyper6   z--genrer5   z
--intervalé<   z	--out-dirr   ú/)re   )ÚargparseÚArgumentParserÚadd_argumentr[   ÚstrÚROOTÚ
parse_argsrl   r    ÚrstripÚpathlibÚPathr_   r`   rb   Údurationre   )rs   ÚapÚas      r   Úmainr   i   sÑ   € Ûà	×	 Ñ	 Ó	"€BØ‡O�O�FÔØ‡O�O�G L€OÔ1Ø‡O�O�L¤s°A€OÔ6Ø‡O�O�I t€OÔ,Ø‡O�O�L¤s°B€OÔ7Ø‡O�O�K¬¬T°F©]Ó);€OÔ<Ø
�‰‹€AÜ�a—f‘f—m‘m CÓ(¬'¯,©,°q·y±yÓ*AÀ1Ç7Á7ÈDÐRS×RWÑRWÐYZ×YcÑYcÐno×nxÑnxÕyØó    Ú__main__r/   )r   rv   r   zdict | NoneÚreturnÚobject)r    rv   r‚   rv   )r    rv   r?   rv   r@   ú
str | None)NNFr   r*   rq   )r    rv   r_   zpathlib.Pathr`   r„   ra   zthreading.Event | Nonerb   Úboolrc   r[   rd   rv   re   r[   r‚   ÚNone)r‚   r[   ) Ú__doc__Ú
__future__r   r;   r   rz   r8   ÚsysÚ	threadingrS   Úurllib.requestr   Úimport_youtube_liver   r   r   r{   Ú__file__ÚresolveÚparentrw   r   ÚcompilerX   rW   r   r!   rI   rl   r   Ú__name__Úexitr0   r€   r   ú<module>r“      sã   ðñõ #ã Û Û Û 	Û 
Û Û Û ç ?Ñ ?à€w‡|�|�HÓ×%Ñ%Ó'×.Ñ.×5Ñ5€ØM€ØˆR�Z‰ZÐ2Ó3€
Øˆ2�:‰:�mÓ$€ôóóð( x|Øceð&:Øð&:Ø7:ð&:ØILð&:Ø]`ð&:Øjnó&:óRð ˆzÒØ€C‡H�H‰T‹VÕð r€   