
    i;                         S r SSKJrJr  SSKJrJrJr  SSKrSr	 " S S	\5      r
 " S
 S\
5      r " S S\
5      r " S S\
5      r " S S\
5      r " S S\
5      r " S S\
5      r " S S5      rg)z%Extractors for https://www.boosty.to/   )	ExtractorMessage   )textutil	exception    Nz(?:https?://)?boosty\.toc                   R    \ rS rSrSrSrSrSrSrSr	Sr
S	rS
 rS rS rS rS rSrg)BoostyExtractor   z Base class for boosty extractorsboostyzhttps://www.boosty.to)
{category}{user[blogUrl]} ({user[id]})z${post[date]:%Y-%m-%d} {post[int_id]}z {num:>02} {file[id]}.{extension}z
{file[id]}
.boosty.to)authc                    [        U 5      U l        U R                  S5      (       a  S OSU l        U R                  SS5      U l        U R                  S5      U l        U R                  S5      nUb  U(       aD  [        U[        5      (       a  UR                  S5      nO[        U[        [        45      (       d  SnXl        g )	NmetadataFallowedTboughtvideos,)ultra_hdquad_hdfull_hdhighmediumlowlowesttiny)	BoostyAPIapiconfig_useronly_allowedonly_bought
isinstancestrsplitlisttupler   )selfr   s     H/app/mltbenv/lib/python3.13/site-packages/gallery_dl/extractor/boosty.py_initBoostyExtractor._init   s    T?![[44T%
 KK	48;;x0X&>V&#&&c*u66E    c              #   X  #    U R                   R                  R                  5       nUS	 U R                  5        H  nUR	                  S5      (       d!  U R
                  R                  SUS   5        M:  U R                  U5      nU R                  (       a  U R                  US'   UUR                  SS 5      [        U5      US.n[        R                  SU4v   [        US5       H;  u  US	'   nXTS
'   US   n[        R                  U[        R                   " Xd5      4v   M=     M     g 7f)NAccept	hasAccesszNot allowed to access post %siduser)postr4   count_http_headers r   numfileurl)r!   headerscopypostsgetlogwarning_extract_filesr#   poplenr   	Directory	enumerateUrlr   nameext_from_url)r+   r<   r5   filesdatar:   r;   s          r,   itemsBoostyExtractor.items3   s    ((""'')HJJLD88K((  !@$t*M''-Ezz#zzV&$/U!(	D ##R--%.ua%8!UT#V5kkk3(=(=c(HHH &9! !s   D(D*c                     g)z(Yield JSON content of all relevant postsN )r+   s    r,   r>   BoostyExtractor.postsL   s    r/   c                 ^   / n/ =US'   n/ =US'   nSU;   a  U R                  US   5      US'   US    GH  n US   nUS:X  a:  US   S	:X  a  M  [        R                  " US   5      nUR                  US
   5        MJ  US:X  a"  UR                  U R	                  X5      5        Mr  US:X  a  U R
                  (       d%  U R                  R                  SUS   US   5        M  US    Vs0 s H  nUS   (       d  M  US   US   _M     n	nU R
                   Vs/ s H  nX;   d  M
  X   PM     n
nU
(       a1  [        U
5      n
[        U
5      US'   XS'   UR                  U5        GM3  U R                  R                  SUS   US   5        GMY  US:X  a*  US   nUR                  U5        UR                  U5        GM  US:X  a#  UR                  U R	                  X5      5        GM  US:X  a#  UR                  U R	                  X5      5        GM  US:X  a  UR                  SUS   -   S-   5        GM  U R                  R                  SUS   U5        GM!     US	 U$ s  snf s  snf ! [         a=  nU R                  R                  SUR                  R                  U5         S nAGMt  S nAff = f)Ncontentlinks	createdAtdaterJ   typer   modificator	BLOCK_ENDr	   imageok_videoz%s: Skipping video %sr3   
playerUrlsr;   	_fallbackz)%s: Found no suitable video format for %slink
audio_filer:   smile:namez%s: Unsupported data type '%s'z%s: %s)parse_timestampr   
json_loadsappend_update_urlr   r@   debugiternextrA   	Exception	__class____name__)r+   r5   rI   rQ   rR   blockrU   cfmtfmtsformatsr;   excs                r,   rB   BoostyExtractor._extract_filesO   s   $&&Y' ""W$//[0ABDL&\E6FV}6>]+{: i(89ANN1Q4(W_LL!1!1$!>?Z';;'>'+Dz5;@  $)#6#6Cu: 0FSZ/#6   $(;;#.C; "	#.  
 "&w-'+G}e-4k*U+((G Jd5 V^,CLL%NN3'\)LL!1!1$!>?V^LL!1!1$!>?W_NN3v#6#<= HHNN#C#':t5i "r LS
@  Fx)?)?EEFs}   I%-I%=&I%%:I%!I%(I:II%	I $I ,7I%&#I%-I%<&I%%&I% I%1 I%
I%%
J,/1J''J,c                     US   nSU;   a  SOSnUR                  S5      =n(       a  X4USS  -   -  nSnUR                  S5      nUb!  X4S-   [        U5      R                  5       -   -  nX2S'   U$ )Nr;   ?&signedQueryr   
isMigratedzis_migrated=)r?   r'   lower)r+   r5   rk   r;   sepsigned_querymigrateds          r,   rd   BoostyExtractor._update_url   s    ElCZcS88M22<2ab)))CC88L)'#h-*=*=*???Cer/   )r#   r!   r$   r%   r   N)rj   
__module____qualname____firstlineno____doc__categoryrootdirectory_fmtfilename_fmtarchive_fmtcookies_domaincookies_namesr-   rK   r>   rB   rd   __static_attributes__rN   r/   r,   r   r      sF    *H"D=M5LK!NM0I27BHr/   r   c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	BoostyUserExtractor   z%Extractor for boosty.to user profilesr4   z/([^/?#]+)(?:\?([^#]+))?$zhttps://boosty.to/USERc                     U R                   u  p[        R                  " U5      nU R                  c   U R                  R                  U5      U l        U R                  R                  X5      $ N)groupsr   parse_queryr#   r!   r4   
blog_posts)r+   r4   queryparamss       r,   r>   BoostyUserExtractor.posts   sP    kk!!%(::t,DJxx""400r/   r#   Nrj   r|   r}   r~   r   subcategoryBASE_PATTERNpatternexampler>   r   rN   r/   r,   r   r      s    /K99G&G1r/   r   c                   8    \ rS rSrSrSrSrSr\S-   r	Sr
S rS	rg
)BoostyMediaExtractor   z"Extractor for boosty.to user mediamedia)r   r   r   z{post[id]}_{num}.{extension}z(/([^/?#]+)/media/([^/?#]+)(?:\?([^#]+))?z https://boosty.to/USER/media/allc                     U R                   u  pn[        R                  " U5      nU R                  R	                  U5      U l        U R                  R                  XU5      $ r   )r   r   r   r!   r4   r#   blog_media_album)r+   r4   r   r   r   s        r,   r>   BoostyMediaExtractor.posts   sK    ![[U!!%(XX]]4(
xx((f==r/   r   N)rj   r|   r}   r~   r   r   r   r   r   r   r   r>   r   rN   r/   r,   r   r      s)    ,KIM1LHHG0G>r/   r   c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	BoostyFeedExtractor   z.Extractor for your boosty.to subscription feedfeedz/(?:\?([^#]+))?(?:$|#)zhttps://boosty.to/c                 ~    [         R                  " U R                  S   5      nU R                  R	                  U5      $ )Nr	   )r   r   r   r!   
feed_posts)r+   r   s     r,   r>   BoostyFeedExtractor.posts   s/    !!$++a.1xx""6**r/   rN   Nr   rN   r/   r,   r   r      s    8K66G"G+r/   r   c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	BoostyPostExtractor   zExtractor for boosty.to postsr5   z/([^/?#]+)/posts/([0-9a-f-]+)z?https://boosty.to/USER/posts/01234567-89ab-cdef-0123-456789abcdc                     U R                   u  pU R                  c   U R                  R                  U5      U l        U R                  R	                  X5      4$ r   )r   r#   r!   r4   r5   )r+   r4   post_ids      r,   r>   BoostyPostExtractor.posts   sA    ::t,DJd,..r/   r   Nr   rN   r/   r,   r   r      s    'K==GOG/r/   r   c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	BoostyFollowingExtractor   z-Extractor for your boosty.to subscribed users	followingz/app/settings/subscriptionsz,https://boosty.to/app/settings/subscriptionsc              #      #    U R                   R                  5        H7  nU R                   SUS   S    3n[        US'   [        R
                  X!4v   M9     g 7f)N/blogblogUrl
_extractor)r!   user_subscriptionsr   r   r   Queue)r+   r4   r;   s      r,   rK   BoostyFollowingExtractor.items   sS     HH//1DYYKqfi!8 9:C!4D--** 2s   AArN   N)rj   r|   r}   r~   r   r   r   r   r   rK   r   rN   r/   r,   r   r      s    7K;;G<G+r/   r   c                   4    \ rS rSrSrSrSr\S-   rSr	S r
Srg	)
BoostyDirectMessagesExtractor   z'Extractor for boosty.to direct messageszdirect-messages)r   r   zDirect Messagesz/app/messages/?\?dialogId=(\d+)z-https://boosty.to/app/messages?dialogId=12345c              #     #    U R                   S   nU R                  R                  U5      nUR                  S5      n US   S   nUS   S   n U R                  R                  US   S   5      nUR                  5         [        R                  " UU R                  R                  XS	95       H  nX7S'   U R                  U5      nUU[        U5      S
.n	[        R                  SU	4v   [        US5       H;  u  U	S'   n
XS'   U
S   n[        R                  U[         R"                  " X5      4v   M=     M     g! [         a     gf = f! [         a    Sn Nf = f7f)z-Yield direct messages from a given dialog ID.r	   ru   messagesrJ   r3   Nchatmater;   )offset)r5   r4   r6   r8   r   r9   r:   )r   r!   dialogr?   rh   r4   reverse	itertoolschaindialog_messagesrB   rD   r   rE   rF   rG   r   rH   )r+   	dialog_idresponsery   r   r   r4   messagerI   rJ   r:   r;   s               r,   rK   #BoostyDirectMessagesExtractor.items   s_    KKN	88??9-||M2	
+F3Ha[&F	88==*!5e!<=D 	 HH$$Y$>
G &2M"''0EUD ##R--%.ua%8!UT#V5kkk3(=(=c(HHH &9
  		
  	D	sG   <ED; !E 1C
E;
EEEEEEEErN   N)rj   r|   r}   r~   r   r   r   r   r   r   rK   r   rN   r/   r,   r   r      s'    1#K(M??G=G"Ir/   r   c                       \ rS rSrSrSrSS jrS rSS jrS r	S	 r
SS
 jrS rSS jrS rSS jrSS jrS rS rSS jrS rSrg)r    i  zInterface for the Boosty APIzhttps://api.boosty.toNc                    Xl         SUR                  S.U l        U(       d  U R                   R                  R	                  SSS9=n(       a  [
        R                  " U5      n[
        R                  " USS5      n[
        R                  " USS	5      =n(       aJ  S
S Kn[
        R                  " U5      UR                  5       S-  :  a  UR                  R                  S5        U(       a  SU-   U R                  S'   g g )Nz!application/json, text/plain, */*)r1   Originr   r   )domainz"accessToken":""z"expiresAt":r   r	   i  z'auth' cookie tokens expiredzBearer Authorization)	extractorr   r<   cookiesr?   r   unquoteextrtime	parse_intr@   rA   )r+   r   access_tokenr   expiresr   s         r,   __init__BoostyAPI.__init__  s    "9nn

 ~~--11&1NNtN||D)#yy/@#F"iincBB7B~~g.t1CC!--.LM,5,DDLL) r/   c                 ^    SU S3nU R                  USS SSS.5      nU R                  X25      $ )N	/v1/blog//post/521)limitr   comments_limitreply_limit)_merge_params_pagination)r+   usernamer   endpoints       r,   r   BoostyAPI.blog_posts(  sF    xj/##F!"!!	-
  11r/   c                     SU S3nU R                  UUR                  S5      SSS S.5      nU R                  XCU R                  5      $ )Nr   z/media_album/s15r   )rU   r   limit_byr   )r   rstripr   _transform_media_posts)r+   r   rU   r   r   s        r,   r   BoostyAPI.blog_media_album2  sW    xj6##FC(	-
  $2M2MNNr/   c                 ^    / nUS    H!  nUS   nUS   US'   UR                  U5        M#     U$ )N
mediaPostsr5   r   rJ   )rc   )r+   rJ   r>   objr5   s        r,   r    BoostyAPI._transform_media_posts<  s?    %Cv;Dw<DLLL &
 r/   c                 4    SU SU 3nU R                  U5      $ )Nr   r   _call)r+   r   r   r   s       r,   r5   BoostyAPI.postF  s#    xjwi8zz(##r/   c                     SnU R                  USS SS.5      nSU;  a   U R                  R                  (       a  SUS'   SU;  a   U R                  R                  (       a  SUS'   U R	                  X!SS	9$ )
Nz/v1/feed/post/r   r   )r   r   r   r$   truer%   r>   )key)r   r   r$   r%   r   r+   r   r   s      r,   r   BoostyAPI.feed_postsJ  s{    ###F!"!-
 
 'DNN,G,G%+F>"&4>>+E+E$*F=!g>>r/   c                 H    SU-   nU R                  U5      nUS   S   US'   U$ )Nr   ownerr3   r   )r+   r   r   r4   s       r,   r4   BoostyAPI.userW  s1    )zz(#']4(T
r/   c                 T    SnU R                  USSS S.5      nU R                  X!5      $ )Nz/v1/user/subscriptions30r   )r   with_followr   )r   _pagination_usersr   s      r,   r   BoostyAPI.user_subscriptions]  s:    +##F!-
 
 %%h77r/   c                 ~    U(       a5  SSSSS.nUR                  5        H  u  pEUR                  XD5      nXRU'   M     U$ )Nis_only_allowedtags_idsfrom_tsto_ts)isOnlyAllowedPostspostsTagsIds	postsFrompostsTo)rK   r?   )r+   
params_web
params_api
web_to_apir`   values         r,   r   BoostyAPI._merge_paramsf  sM    &7&0&/&-	J  *//1!~~d1#(4   2 r/   c                    U R                   U-   n U R                  R                  X2U R                  S SS9nUR                  S:  a  UR                  5       $ UR                  S:  a  [        R                  " S5      eUR                  S:X  a  U R                  R                  SS9  OEU R                  R                  R                  UR                  5        [        R                  " S	5      eM  )
NF)r   r<   fatalallow_redirects,  i  zInvalid API access tokeni  iX  )secondszAPI request failed)r   r   requestr<   status_codejsonr   AuthenticationErrorwaitr@   re   r   AbortExtraction)r+   r   r   r;   r   s        r,   r   BoostyAPI._calls  s    ii("~~--DLLE . 3H ##c)}}&%%+334NOO%%,##C#0 ""((7//0DEE! r/   c              #     #    SU;  a%  U R                   R                  (       a
  SUS'   SUS'    U R                  X5      nU(       a  U" US   5       S h  vN   O%U(       a  US   U    S h  vN   OUS    S h  vN   US   nUR                  S5      (       a  g UR                  S5      nU(       d  g XrS'   M   Ne NO NC7f)Nr  r   r$   rJ   extraisLastr   )r   r$   r   r?   )r+   r   r   	transformr   rJ   r  r   s           r,   r   BoostyAPI._pagination  s     F*t~~/J/J%+F>"(.F$%::h/D$T&\222<,,,<''MEyy""YYx(F%8!  3,'s7   ACB;C-B=.C;B?<A C=C?Cc              #      #     U R                  X5      nUS    S h  vN   US   US   -   nXCS   :  a  g XBS'   M8   N7f)NrJ   r   r   totalr   )r+   r   r   rJ   r   s        r,   r  BoostyAPI._pagination_users  sT     ::h/DF|##(^d7m3FW%%8  $s   ><>c                 .    SU-   nU R                  U5      $ )N/v1/dialog/r   )r+   r   r   s      r,   r   BoostyAPI.dialog  s     9,zz(##r/   c                 <    SU S3nUSUS.nU R                  XE5      $ )Nr&  z	/message/r   )r   r   r   )_pagination_dialog)r+   r   r   r   r   r   s         r,   r   BoostyAPI.dialog_messages  s3     95

 &&x88r/   c              #      #     U R                  X5      nUS    S h  vN    US   nUR                  S5      (       a  g US   =US'   nU(       d  g  MP   N6! [         a     g f = f7f)NrJ   r  r  r   )r   r?   rh   )r+   r   r   rJ   r  r   s         r,   r)  BoostyAPI._pagination_dialog  s~     ::h/DF|##W99X&&,1(O;x 6   $  s<   A&AA&A A&A A&
A# A&"A##A&)r   r<   r   )allrN   )NN)r  N)rj   r|   r}   r~   r   r   r   r   r   r   r5   r   r4   r   r   r   r   r  r   r   r)  r   rN   r/   r,   r    r      sX    &"DE$2O$?8F*&.	&$9r/   r    )r   commonr   r   r8   r   r   r   r   r   r   r   r   r   r   r   r   r    rN   r/   r,   <module>r/     s    , & $ $ *Pi Pf1/ 1>? >+/ +
// 
/
+ 
+*IO *IZs sr/   