
    i-              	          S r SSKJrJr  SSKJrJr  SSKr " S S\5      r\R                  S	S
S.SSS.SSS.SSS.SSS.S.5      r
\
S-   r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      rS  rg)!zExtractors for Nitter instances   )BaseExtractorMessage   )textutil    Nc                   n    \ rS rSrSrSrSrSrSr\	R                  rSrS rS	 rS
 rS rS rS rS rSrg)NitterExtractor   z Base class for nitter extractorsnitterr   z{user[name]}{tweet_id}_{num}.{extension}{tweet_id}_{num})g      ?g      ?c                     U R                   R                  S5      S   U l        [        R                  " X5        U R
                  S   U l        U R
                  S   U l        S U l        g )Nz://r   )	root	partitioncookies_domainr   __init__groupsuseruser_iduser_obj)selfmatchs     H/app/mltbenv/lib/python3.13/site-packages/gallery_dl/extractor/nitter.pyr   NitterExtractor.__init__   sQ    "ii11%8;t+KKO	{{2    c           	   #     #    U R                  SS5      nU R                  SS5      =n(       a,  US:H  nSnU R                  R                  SSU R                  S9  U R	                  5        GH  nU(       d+  US	   (       a!  U R
                  R                  S
US   5        M6  UR                  SS5      =n(       GaZ  / n[        R                  " USS5       H  nSU;   a  U R
                  R                  SU5        M'  SU;   aI  [        R                  " UR                  S5      S   5      R                  5       R                  S5      S   nOUR                  S5      S   nUS   S:X  a  U R                  U-   nU[        S.n	UR                  S5      u  U	S'   oS'   UR!                  U	5        M     U(       Ga]  U(       GdU  W(       a+  SU R                   SUS    3nUR!                  USS.5        GO&[        R                  " USS5       H  nSU;   aI  [        R                  " UR                  S5      S   5      R                  5       R                  S5      S   nOUR                  S5      S   nUS   S:X  a  U R                  U-   nUR!                  SU-   UR                  S5      S   SS .5        M     [        R                  " US!S5       HC  nUS   S:X  a  U R                  U-   nUR!                  [        R"                  " US"U05      5        ME     OS#n[%        U5      US$'   [&        R(                  SU4v   [+        US%5       H3  u  US&'   n	U	S"   nU	R-                  U5        [&        R.                  Xy4v   M5     GM     g 7f)'NretweetsFvideosTytdlhlsPlaybackon)domainretweetzSkipping %s (retweet)tweet_id_attach href=""z/i/broadcasts/z#Skipping unsupported broadcast '%s'/enc//r   %2Fr   )url_http_retry.filename	extensionzytdl:
/i/status/mp4)r0   r4   z
data-url=")r0   r3   r4   z<source src="r0    countr   num)configcookiessetr   tweetslogdebugpopr   extract_iterbinascii
a2b_base64
rpartitiondecoder   _retry_on_404appendnameext_from_urllenr   	Directory	enumerateupdateUrl)r   r!   r"   r#   tweetattachmentsfilesr0   namefile_s              r   itemsNitterExtractor.items!   sB    ;;z51[[40060f$DFLL]D9L9LM[[]Ei 06j8IJ#ii	266{6,,#Xs4C (3.A3H #~'223>>4!!"4$  %%+VXjjoa A  #~~e4Q71v}"ii#o#&}ED, ;D$ak):LL&'4* % %dii[
5;L:MNSu%EF#'#4#4 +\3$@C  '#~'/':':3>>$'<))*<, (--3VXjjoa(I (+~~e'<Q'?"1v}&*ii#o!LL-4s]-1__S-A!-D-2* $@" $(#4#4 +_c$CC"1v}&*ii#o!LL $ 5 5cE3< HJ	$C  ZE'N##R..&/q&9"ed5kE"kk3,, ': #s   N Nc                    [         R                  " U5      nU" SS5      U" SS5      S.nU" SS5        U" SS5      nUU R                  =(       d    UU R                  U" SS5      S5      UR	                  S	5      S
   R                  S5      S   U" SS5      R                  S5      S
   U" SS5      [         R                  " U" SS5      R	                  S5      S
   5      [         R                  " U" SS5      R	                  S5      S
   5      [         R                  " U" SS5      R	                  S5      S
   5      [         R                  " U" SS5      R	                  S5      S
   5      SU;   SS.$ )Nclass="fullname" href="/r,   title="rQ   nick<span class="tweet-dater*   r+      %b %d, %Y · %I:%M %p %Zr.   r   #r   zclass="tweet-content</div>class="attachmentszclass="tweet-statszclass="icon-commentz</div>zclass="icon-retweetzclass="icon-quotezclass="icon-heartzclass="retweet-headerF)authorr   dater(   contentr)   commentsr!   quoteslikesr'   quoted)r   extract_fromr   parse_datetimerD   r   	parse_intr   htmlextrra   links        r   _tweet_from_html NitterExtractor._tweet_from_htmll   sw     &3S9C(
 	&+Hc"/++Y$&@B,Q/99#>qA2G<FFsKAN13GHt%x(11;C(D Et%x(11;C(D Et#X(//9z#q(B Ct#X(//9z#q(B C/47#
 	
r   c           	      j   [         R                  " U5      nU" SS5      U" SS5      S.nU" SS5        U" SS5      nUU R                  =(       d    UU R                  U" SS5      S5      UR	                  S	5      S
   R                  S5      S   U" SS5      R                  S5      S
   U" SS5      SSS.$ )NrW   r,   rX   rY   r[   r*   r+   r\   r.   r   r]   r   zclass="quote-textr^   r_   r`   z
                </div>FT)ra   r   rb   r(   rc   r)   r'   rg   )r   rh   r   ri   rD   r   rk   s        r   _tweet_from_quote!NitterExtractor._tweet_from_quote   s      &3S9C(
 	&+Hc"/++Y$&@B,Q/99#>qA0':DDSI!L1 4 
 	
r   c                 v   [         R                  " XR                  S5      5      nU" SS5      n SU;   aI  [        R                  " UR                  S5      S   5      R                  5       R                  S5      S   nOUR                  S5      S   n UU(       a  U R                  U-   OS
U R                  U" SS5      -   U" SS5      U" SS5      U" SS5      U R                  U" SS5      S5      [         R                  " U" SS5      R                  SS
5      5      [         R                  " U" SS5      R                  SS
5      5      [         R                  " U" SS5      R                  SS
5      5      [         R                  " U" SS5      R                  SS
5      5      SU;   S.$ ! [         a    S	n GN#f = f)Nzclass="profile-tabsz class="profile-banner"><a href="r,   r-   r.   r      r/   r   r*   z"class="profile-card-avatar" href="rX   ztitle="@z<p dir="auto"><z&class="profile-joindate"><span title="z%I:%M %p - %d %b %Yzclass="profile-stat-num">,ztitle="Verified account")idprofile_bannerprofile_imagerZ   rQ   descriptionrb   statuses_countfriends_countfollowers_countfavourites_countverified)r   rh   indexrB   rC   rD   rE   split	Exceptionr   ri   rj   replace)r   rl   rm   banneruids        r   _user_from_htmlNitterExtractor._user_from_html   s     zz2G'HI8#>	& ))&*;*;++ #VXeeCj4 ll5)!,
 !$6<		F 2" $		D4c-; !; $Y 4 $Z 5 $%5s ; $ 3 3=sC%!' !%t+S0229'#r2B!D $t+S0229'#r2B!D $t+S0229'#r2B!D $t+S0229'#r2B!D :d B'
 	
  	C	s   AF( ?F( (F87F8c                 t    UR                  S5      u  pnU(       a  UR                  S5      u  p2nX-   U4$ US 4$ )Nzclass="quotezclass="tweet-published)r   )r   rl   rS   quotetails        r   _extract_quoteNitterExtractor._extract_quote   sA    7"__-EFNEdK''d|r   c              #     #    U R                  SS5      nU R                  (       aM  U R                  U R                   SU R                   3SS9R                  S   R                  S5      S   U l        U R                   SU R                   U 3=p4 U R                  U5      R                  R                  S5      nU R                  c  U R                  US	   5      U l	        [        U R                  US
S  5       HK  u  pgU R                  U5      nUS   (       d  M"  Uv   U(       d  M/  U(       d  M8  U R                  U5      v   MM     [        R                  " US   SS5      n	U	(       d  g US-   [        R                   " U	5      -   nM  7f)Nrg   Fz/i/user/)allow_redirectslocationr.   r   z<div class="timeline-itemr   r   rb   r   z!<div class="show-more"><a href="?r,   ?)r:   r   requestr   headersrD   r   r   r   r   r   mapr   ro   rr   rm   unescape)
r   pathrg   base_urlr0   tweets_htmlrl   r   rN   mores
             r   _paginationNitterExtractor._pagination   sj    Xu-<<99+Xdll^4 % %  gj" #-*S/!5DI !II;a		{4&99,,s+0066+-K }}$ $ 4 4[^ D"4#6#6ABH--d3V}6ee0077  I 99B!DcKDS.4==#66C' s   D$F*F3AF)r   r   r   r   N)__name__
__module____qualname____firstlineno____doc__basecategorydirectory_fmtfilename_fmtarchive_fmtr   USERAGENT_GALLERYDL	useragentrequest_intervalr   rT   ro   rr   r   r   r   __static_attributes__r7   r   r   r
   r
      sP    *L.M1L$K((I!I-V
8
*!
F7r   r
   zhttps://nitter.netz(?:www\.)?nitter\.net)r   patternzhttps://nitter.spacez(?:www\.)?nitter\.spacezhttps://nitter.tiekoetterz!(?:www\.)?nitter\.tiekoetter\.comzhttps://xcancel.comz(?:www\.)?xcancel\.comzhttps://lightbrd.comz(?:www\.)?lightbrd\.com)z
nitter.netznitter.spaceznitter.tiekoetterxcancellightbrdz/(i(?:/user/|d:)(\d+)|[^/?#]+)c                   ,    \ rS rSrSr\S-   rSrS rSr	g)NitterTweetsExtractori  r=   z(?:/tweets)?(?:$|\?|#)zhttps://nitter.net/USERc                 $    U R                  S5      $ )Nr*   r   r   s    r   r=   NitterTweetsExtractor.tweets  s    ##r   r7   N
r   r   r   r   subcategoryUSER_PATTERNr   exampler=   r   r7   r   r   r   r     s    K66G'G$r   r   c                   ,    \ rS rSrSr\S-   rSrS rSr	g)NitterRepliesExtractori
  replies/with_repliesz$https://nitter.net/USER/with_repliesc                 $    U R                  S5      $ )Nr   r   r   s    r   r=   NitterRepliesExtractor.tweets  s    00r   r7   Nr   r7   r   r   r   r   
  s    K--G4G1r   r   c                   ,    \ rS rSrSr\S-   rSrS rSr	g)NitterMediaExtractori  media/mediazhttps://nitter.net/USER/mediac                 $    U R                  S5      $ )Nr   r   r   s    r   r=   NitterMediaExtractor.tweets  s    ))r   r7   Nr   r7   r   r   r   r     s    KY&G-G*r   r   c                   ,    \ rS rSrSr\S-   rSrS rSr	g)NitterSearchExtractori  search/searchzhttps://nitter.net/USER/searchc                 $    U R                  S5      $ )Nr   r   r   s    r   r=   NitterSearchExtractor.tweets!  s    	**r   r7   Nr   r7   r   r   r   r     s    KZ'G.G+r   r   c                   <    \ rS rSrSrSrSrSrSr\	S-   r
SrS	 rS
rg)NitterTweetExtractori%  zExtractor for nitter tweetsrN   r   r   r   z/(i/web|[^/?#]+)/status/(\d+())z$https://nitter.net/USER/status/12345c                 \   U R                    SU R                   3n[        R                  " U R	                  U5      R                  SS5      nU R                  U5      u  p#U R                  U5      nU(       a3  U R                  SS5      (       a  U R                  U5      nUS   US'   XE4$ U4$ )Nr5   zclass="main-tweetz7                </div>
              </div></div></div>rg   Fr   )	r   r   r   rm   r   r   ro   r:   rr   )r   r0   rl   r   rN   rg   s         r   r=   NitterTweetExtractor.tweets.  s    :dii[1yyc*//1D G$ % ))$/%%d+T[[511++E2F"6]F6N?"xr   r7   N)r   r   r   r   r   r   r   r   r   BASE_PATTERNr   r   r=   r   r7   r   r   r   r   %  s.    %K.M1L$K??G4Gr   r   c                      U R                   S:H  $ )Ni  )status_code)responses    r   rF   rF   <  s    3&&r   )r   commonr   r   r*   r   r   rB   r
   rL   r   r   r   r   r   r   r   rF   r7   r   r   <module>r      s    & *  T7m T7n %%$+
 '-
 ,7
 &,
 '-#' . ??$O $1_ 1*? *+O +? .'r   