
    i0                         S r SSKJr  SSKJr  SSKJrJrJr  SSK	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S9S 5       rg)z#Extractors for https://sankaku.app/   )BooruExtractor)Message   )textutil	exception)cache    Nzp(?:https?://)?(?:(?:chan|www|beta|black|white)\.sankakucomplex\.com|sankaku\.app)(?:/[a-z]{2}(?:[-_][A-Z]{2})?)?c                   v    \ rS rSrSrSrSrSrSrSr	SS	S
SSSSSSSS.
r
S rS rS rS rS rS rS rS rSrg)SankakuExtractor   z)Base class for sankaku channel extractorsboorusankakuzhttps://sankaku.appz!{category}_{id}_{md5}.{extension}Tgeneralartiststudio	copyright	charactergenre mediummeta)
r
   r   r                     	   c                     gNr
    )selfnums     I/app/mltbenv/lib/python3.13/site-packages/gallery_dl/extractor/sankaku.pyskipSankakuExtractor.skip+   s        c                     [        U 5      U l        U R                  S5      S:X  a7  U R                  U l        [
        R                  " S5      R                  U l        g g )Ntagsextendedz'tag-type-([^\"' ]+).*?\?tags=([^\"'&]+))	
SankakuAPIapiconfig_tags_extended_tagsr   refindall_tags_findallr#   s    r%   _initSankakuExtractor._init.   sM    d#;;v*,,,DJ!%:"<<CG  -r(   c                    US   nU(       dg  US   S:w  a%  U R                   R                  SUS   US   5        U$ U R                  (       a&  U R                   R                  S5        S[        l        U$ US   S	:w  a  S
USS  -   nU$ )Nfile_urlstatusactivezUnable to download post %s (%s)idz6Login required to download 'contentious_content' postsFr   shttps)logwarning_warningr   )r#   posturls      r%   	_file_urlSankakuExtractor._file_url5   s    :H~)  5JX0 
   LN,1 ) 
 Vs]CG#C
r(   c                     US   S   US'   U R                  US   5      US'   UR                  SS5      US'   SR                  US   5      US'   U R                  US	'   g )
N
created_atr<   date	tag_namesr"   r*    
tag_string_http_validate)parse_timestamppopjoin_check_expired)r#   rA   s     r%   _prepareSankakuExtractor._prepareD   sk    !,/4\++D,>?VxxR0V XXd6l3\!%!4!4r(   c                 P    UR                   (       + =(       d    SUR                  ;  $ )Nz.com/expired.png)historyrB   )r#   responses     r%   rO   SankakuExtractor._check_expiredK   s     ###M'9'MMr(   c                    [         R                  " [        5      nU R                  R	                  US   5       HE  nUS   =n(       d  M  X4S      R                  UR                  5       R                  SS5      5        MG     U R                  nUR                  5        H'  u  pxXg   nXSU-   '   SR                  U5      USU-   '   M)     g )Nr;   nametyperI   _tags_tag_string_)collectionsdefaultdictlistr-   r*   appendlowerreplace	TAG_TYPESitemsrN   )	r#   rA   pager*   tagrW   typesrX   valuess	            r%   r0   SankakuExtractor._tagsN   s    &&t,88==d,C6{"t"[!(()=)=c3)GH -  JJLLD;D#)4 ),&)9D%& )r(   c                 d    SUS   -   nSU0nU R                  X4S9R                  n[        R                  " [        5      n[        R                  " USS5      nU R                  U5       H@  u  pXh   R                  [        R                  " [        R                  " U	5      5      5        MB     UR                  5        H#  u  pXSU
-   '   S	R!                  U5      US
U
-   '   M%     g ! [         a?  nU R                  R	                  SUS   UR
                  R                  U5      s S nA$ S nAff = f)Nz&https://chan.sankakucomplex.com/posts/r;   Referer)headersz6%s: Failed to extract extended tag categories (%s: %s)z<ul id="tag-sidebar"z</ul>rZ   rI   r[   )requestr   	Exceptionr>   r?   	__class____name__r\   r]   r^   extrr3   r_   unescapeunquoterc   rN   )r#   rA   rd   rB   rk   excr*   tag_sidebartag_typetag_namerX   rg   s               r%   r/   SankakuExtractor._tags_extendedY   s   	9:T$ZGC #&G<<<5::D &&t,ii&<gF"&"4"4["AHN!!$--X0F"GH #B JJLLD#)4 ),&)9D%& )  	988##HT
CMM22C9 9	9s   %C& &
D/04D*$D/*D/c                     UR                  S5      (       aD  U R                  R                  US   5      US'   US    H  nUS   S   US'   US   S   US'   M     g SUS'   g )N	has_notesr;   notesrF   r<   
updated_atr"   )getr-   rz   )r#   rA   rd   notes       r%   _notesSankakuExtractor._notesk   sl    88K   HHNN4:6DMW%),%7%<\"%),%7%<\" & DMr(   )r0   r3   r-   N)ro   
__module____qualname____firstlineno____doc__basecategorycategoryrootfilename_fmtr@   rb   r&   r5   rC   rP   rO   r0   r/   r~   __static_attributes__r"   r(   r%   r   r      so    3LH D6LH ID5N	::$r(   r   c                   D    \ 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)SankakuTagExtractoru   z4Extractor for images from sankaku.app by search-tagsre   )
{category}z{search_tags}zt_{search_tags}_{id}z(?:/posts)?/?\?([^#]*)zhttps://sankaku.app/?tags=TAGc                    [         R                  X5        [        R                  " US   5      n[        R                  " UR                  SS5      R                  SS5      5      U l        SU R                  ;   ak  [        R                  " S5      R                  SU R                  5      U l        [        R                  " S	5      R                  S
U R                  5      U l        g g )Nr   r*   r   +rI   zdate:z(date:(\d\d)[.-](\d\d)[.-](\d\d\d\d)(?!T)zdate:\3-\2-\1T00:00z(date:(\d\d\d\d)[.-](\d\d)[.-](\d\d)(?!T)zdate:\1-\2-\3T00:00)
r   __init__r   parse_queryrr   r|   ra   r*   r1   subr#   matchquerys      r%   r   SankakuTagExtractor.__init__}   s    !!$.  q*LL62!6!>!>sC!HI	dii;==@S&		>3 I ;==@S&		>3 I  r(   c                     SU R                   0$ )Nsearch_tagsr*   r4   s    r%   metadataSankakuTagExtractor.metadata   s    tyy))r(   c                 4   U R                   R                  SU R                  05      nSU R                  ;   a`  SS KnU R                   R                  S[        R
                  " S5      R                  SU R                  5      05      nUR                  X15      nU$ )Nr*   zparent:r
   z\bparent:(\w+)zid_range:\1)r-   posts_keysetr*   	itertoolsr   r1   r   chain)r#   postsr   parents       r%   r   SankakuTagExtractor.posts   s|    %%vtyy&9:		!XX**FDGG!5##&3~tyy#A,C DFOOF2Er(   r   N)ro   r   r   r   r   subcategorydirectory_fmtarchive_fmtBASE_PATTERNpatternexampler   r   r   r   r"   r(   r%   r   r   u   s3    >K3M(K66G-G3*	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)SankakuPoolExtractor   z3Extractor for image pools or books from sankaku.apppool)r   r   z{pool[id]} {pool[name_en]}zp_{pool}_{id}z/(?:books|pools?/show)/(\w+)zhttps://sankaku.app/books/12345c                 L   U R                   R                  U R                  S   5      nUS    Vs/ s H  o"S   PM	     snUS'   US    Vs/ s H  o"S   PM	     snUS'   UR                  S5      U l        [        U R                  S5       H	  u  p4X4S'   M     SU0$ s  snf s  snf )	Nr
   r*   rW   artist_tagsr   r   r$   r   )r-   poolsgroupsrM   _posts	enumerate)r#   r   re   r$   rA   s        r%   r   SankakuPoolExtractor.metadata   s    xx~~dkk!n-/3F|<|F|<V6:=6IJ6Is6{6IJ]hhw'"4;;2ICK 3 ~ =Js   BB!c                     U R                   $ Nr   r4   s    r%   r   SankakuPoolExtractor.posts   s    {{r(   r   N)ro   r   r   r   r   r   r   r   r   r   r   r   r   r   r"   r(   r%   r   r      s.    =KHM!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	)
SankakuPostExtractor   z+Extractor for single posts from sankaku.apprA   z{id}z/posts?(?:/show)?/(\w+)z#https://sankaku.app/post/show/12345c                 R    U R                   R                  U R                  S   5      $ r!   )r-   r   r   r4   s    r%   r   SankakuPostExtractor.posts   s    xx~~dkk!n--r(   r"   N)ro   r   r   r   r   r   r   r   r   r   r   r   r"   r(   r%   r   r      s$    5KK77G3G.r(   r   c                   6    \ rS rSrSrSr\S-   rSrS r	S r
Srg	)
SankakuBooksExtractor   z0Extractor for books by tag search on sankaku.appbooksz/books/?\?([^#]*)z"https://sankaku.app/books?tags=TAGc                     [         R                  X5        [        R                  " US   5      n[        R                  " UR                  SS5      R                  SS5      5      U l        g )Nr   r*   r   r   rI   )r   r   r   r   rr   r|   ra   r*   r   s      r%   r   SankakuBooksExtractor.__init__   sL    !!$.  q*LL62!6!>!>sC!HI	r(   c              #      #    U R                   SS.nU R                  R                  U5       H(  n[        US'   SUS   -   n[        R
                  X24v   M*     g 7f)N0)r*   	pool_type
_extractorzhttps://sankaku.app/books/r;   )r*   r-   pools_keysetr   r   Queue)r#   paramsr   rB   s       r%   rc   SankakuBooksExtractor.items   sS     ))#6HH))&1D!5D.d;C--** 2s   AAr   N)ro   r   r   r   r   r   r   r   r   r   rc   r   r"   r(   r%   r   r      s%    :K11G2GJ
+r(   r   c                   f    \ 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S jrS rSrg)r,      z!Interface for the sankaku.app APIzhttps://sankakuapi.comNc                     Xl         SU R                  UR                  S.U l        UR	                  5       u  U l        U l        U R
                  (       d  [        R                  U l	        g g )Nz$application/vnd.sankaku.api+json;v=2)AcceptzApi-VersionOrigin)
	extractorVERSIONr   rk   _get_auth_infousernamepasswordr   noopauthenticate)r#   r   s     r%   r   SankakuAPI.__init__   sR    "A<<$>>
 (1'?'?'A$t}}} $		D r(   c                 6    SS0nU R                  SU S3U5      $ )Nlangen/posts/z/notes_callr#   post_idr   s      r%   rz   SankakuAPI.notes   s%    $zzGG9F3V<<r(   c                    SU S3nSSSS.nS n U R                  X#5      nUS   nU(       d  U=(       d    / $ Uc  UnOUR                  U5        [        U5      S:  d  [        U5      US	   :  a  U$ US
==   S-  ss'   Mq  )Nr   z/tagsr   r   d   )r   rd   limitdataP   totalrd   )r   extendlen)r#   r   endpointr   r*   r   tags_news          r%   r*   SankakuAPI.tags   s    WIU+
 ::h/DF|Hzr!H%8}r!SY$w-%?6NaN r(   c                 4    SS0nU R                  SU-   U5      $ )Nr   r   z/pools/r   )r#   pool_idr   s      r%   r   SankakuAPI.pools   s!    $zz)g-v66r(   c                 &    U R                  SU5      $ )Nz/pools/keyset_paginationr#   r   s     r%   r   SankakuAPI.pools_keyset   s    88r(   c                 T    SSSS.nUR                  U5        U R                  SU5      $ )Nr   truer   )r   filledPoolsz
includes[]z/poolseriesv2)updater   )r#   r   params_s      r%   pools_seriesSankakuAPI.pools_series  s3    !"

 	v88r(   c                 \    SSS[        U5      S:X  a  SOSU-   S.nU R                  SU5      $ )Nr   1    zmd5:z	id_range:)r   rd   r   r*   z	/v2/posts)r   r   r   s      r%   r   SankakuAPI.posts  s:     #G 2fwN	
 zz+v..r(   c                 &    U R                  SU5      $ )Nz/v2/posts/keysetr   r   s     r%   r   SankakuAPI.posts_keyset  s     2F;;r(   c                 t    [        U R                  U R                  U R                  5      U R                  S'   g )NAuthorization)_authenticate_implr   r   r   rk   r4   s    r%   r   SankakuAPI.authenticate  s(    t~~t}}dmmL 	_%r(   c                 h   U R                   U-   n[        S5       GHq  nU R                  5         U R                  R	                  X2U R
                  S S9nUR                  S:X  an  UR
                  R                  S5      nU(       d&  SUR                  ;   a  [        R                  " S5      eU(       a  S OSnU R                  R                  XgS9  M  UR                  5       n UR                  S	S
5      n	U	(       d  UR                  S5      n
U
(       a8  U
R                  S5      (       a"  [        R!                  U R"                  5        GM1   SU
R%                  S5      S   R'                  SS5       S3n
[        R*                  " U
5      eUs  $    g ! [         a    S
n	 Nf = f! [(         a     N;f = f)Nr   )r   rk   fatali  zX-RateLimit-Resets   _tags-explicit-limitzSearch tag limit exceedediX  )untilsecondssuccessTcode)unauthorizedzinvalid-tokeninvalid_token'__r   -rI   )ROOTranger   r   rl   rk   status_coder|   contentr   AuthorizationErrorwaitjsonAttributeErrorendswithr  
invalidater   
rpartitionra   rm   AbortExtraction)r#   r   r   rB   rY   rT   r  r  r   r  r	  s              r%   r   SankakuAPI._call  s   ii("qA~~--DLL . FH ##s* ((,,-@A!8H<L<L!L#6635 5"'$S##%#A==?D((9d3 xx'DMMJL L&11$--@tt4Q7??SIJ!LD  //55K= " "  ! s$   #F(F$F! F!$
F10F1c              #     #    SUS'   [        U R                  R                  5      US'   U R                  R                  SS5      =n(       a	  S=pESSKJn   U R                  X5      nU(       a  US   nW(       a  [        R                  " X5      nU H  n	W(       d;  U	S	   =n
(       a/  [        R                  " [        R                  " U
S
S5      5      S-
  nSUs=:  a  W" 5       ::  a,  O  O)U R                  R                  R                  S5        S n  OUS-  nU	v   M     Wc  SnM  S=pEOUS    S h  vN   US   S   US'   US   (       d  g M   N7f)Nr   r   r   refreshFr
   )timer   r8   ze=&<   zRefreshing download URLsr   r   next)strr   per_pager.   r  r   r   advancer   	parse_intrp   r>   debug)r#   r   r   r  offsetexpiresr  r   r   rA   rB   s              r%   r   SankakuAPI._pagination>  sN    vdnn556wnn++Iu==7=  F!::h/DV LL7E!D""&z"2232&*nn $		#tS 9';=?'@G 7,df,**001KL"&aKFJ " ?G#$$  <''!&\&1F6N&>A 8 (s   D4E6E7E)r   r   rk   r   r   r   )ro   r   r   r   r   r  r   r   rz   r*   r   r   r   r   r   r   r   r   r   r"   r(   r%   r,   r,      sH    +#DG
*= 0799/<M D(r(   r,   i3)maxagekeyargc                    U R                   R                  SU5        U R                  nS UR                  S'   UR                  S-   nXS.nU R                  USUR                  USS9nUR                  5       nUR                  S:  d  UR                  S	5      (       d%  [        R                  " UR                  S
5      5      eSUS   -   $ )NzLogging in as %sr  z/auth/token)loginr   POSTF)methodrk   r  r  i  r  errorzBearer access_token)r>   infor-   rk   r  rl   r  r  r|   r   AuthenticationError)rp   r   r   r-   rB   r   rT   s          r%   r  r  i  s    HHMM$h/
((C#'CKK 
((]
"C4D||FCKKd%  IH==?Ds"$((9*=*=++DHHW,=>>tN+++r(   )r   r   r   commonr   r   r   r   r   r	   r\   r   r   r   r   r   r   r,   r  r"   r(   r%   <module>r5     s    * !  $ $  '
\~ \~"* "J+ ..+ .+, +&W Wt i", #,r(   