
    im'                     |    S r SSKJrJrJr  SSKJrJr  SSKJr   " S S5      r	 " S S	\	\5      r
 " S
 S\	\5      rg)z'Extractors for https://www.tsumino.com/   )GalleryExtractor	ExtractorMessage   )text	exception)cachec                   D    \ rS rSrSrSrSrSrS r\	" SSS	9S
 5       r
Srg)TsuminoBase   z!Base class for tsumino extractorstsuminozwww.tsumino.comzhttps://www.tsumino.comc                     U R                  5       u  pU(       a!  U R                  U R                  X5      5        g U R                  R	                  SS5        g )NzASP.NET_SessionIdx1drgggilez4cpkttneukrc5)_get_auth_infocookies_update_login_implcookies
setdefault)selfusernamepasswords      I/app/mltbenv/lib/python3.13/site-packages/gallery_dl/extractor/tsumino.pyloginTsuminoBase.login   sH    !002 0 0 DELL###%?A    i u r   )maxagekeyargc                     U R                   R                  SU5        U R                  S-   nSU0nXS.nU R                  USXES9nUR                  (       d  [
        R                  " 5       eU R                  $ )NzLogging in as %sz/Account/LoginReferer)UsernamePasswordPOSTmethodheadersdata)loginforootrequesthistoryr   AuthenticationErrorr   )r   r   r   urlr%   r&   responses          r   r   TsuminoBase._login_impl   sl    ((3ii**c"$;<<FG<O//11||r    N)__name__
__module____qualname____firstlineno____doc__categorycookies_domainr)   r   r	   r   __static_attributes__r0   r   r   r   r      s5    +H&N$DA (1%	 &	r   r   c                   2    \ rS rSrSrSrSrS rS rS r	Sr
g	)
TsuminoGalleryExtractor+   z,Extractor for image galleries on tsumino.comzV(?i)(?:https?://)?(?:www\.)?tsumino\.com/(?:entry|Book/Info|Read/(?:Index|View))/(\d+)z#https://www.tsumino.com/entry/12345c                 |    US   U l         U R                   SU R                    3n[        R                  " XU5        g )Nr   /entry/)
gallery_idr)   r   __init__)r   matchr-   s      r   r?    TsuminoGalleryExtractor.__init__1   s6    (74??"34!!$s3r   c                    [         R                  " U5      nU" SS5      n[         R                  " U5      R                  S5      u  pEnUR	                  5       nUR	                  5       n0 S[         R
                  " U R                  5      _SU=(       d    U_SU_SU_SU" S	S5      _S
[         R                  " U" SS5      5      _SU R                  U" SS5      R	                  5       S5      _S[         R                  " U" SS5      R                  S5      S   5      _S[         R                  " U" SS5      5      _S[         R                  " U" SS5      5      _S[         R                  " U" SS5      5      _S[         R                  " U" SS5      5      _S[         R                  " U" SS5      5      _S[         R                  " U" SS5      5      _S [         R                  " U" S!S5      5      _S"S#_S$S%_$ )&Nz"og:title" content=""/r>   titletitle_entitle_jp	thumbnailz"og:image" content="uploaderzid="Uploader">z</div>datezid="Uploaded">z%Y %B %dratingzid="Rating">     typezid="Category">
collectionzid="Collection">groupzid="Group">artistzid="Artist">parodyzid="Parody">
characterszid="Character">tagsz	id="Tag">languageEnglishlangen)r   extract_fromunescape	partitionstrip	parse_intr>   remove_htmlparse_datetimeparse_float
split_html)r   pageextrrE   rF   _rG   s          r   metadata TsuminoGalleryExtractor.metadata6   s     &+S1 $e 4 > >s CX>>#>>#
$..9
(.h
 (
 (	

 $5s;
 $**40@(+KL
 $--%x0668*F
 $**4,**3)C.,< =
 $**40@H+MN
 $**40BH+MN
 $//$}H*MN
 $//$~H*MN
 $//$~H*MN
  $//$/@H*MN!
" $//${H*MN#
$ )%
& $'
 	
r   c                 D   U R                    SU R                   S3nSU R                  0nU R                  X#SS9nSUR                  ;   a$  [
        R                  " SUR                   S35      eUR                  n[        R                  " US	S
5      u  pV[        R                  " USSU5      u  pv[        R                  " U5      R                  S5      u  pn
[        S[        R                  " U5      S-   5       Vs/ s H  nU[        U5      -   U
-   S 4PM     sn$ s  snf )Nz/Read/Index/z?page=1r   F)r%   fatalz/Auth/z(Failed to get gallery JSON data. Visit 'z1' in a browser and solve the CAPTCHA to continue.z
data-cdn="rC   z> of <z[PAGE]r   )r)   r>   page_urlr*   r-   r   AbortExtractionr   extractrZ   r[   ranger]   str)r   rb   r-   r%   r.   tplposcntbaserd   paramsis               r   imagesTsuminoGalleryExtractor.imagesS   s   <'8@dmm,<<E<Bx||#++:8<<. IB CD D }}<<lC8<<gsC8--,66x@ 1dnnS1!34
4 CF]V#T*4
 	
 
s   =D)r>   N)r1   r2   r3   r4   r5   patternexampler?   re   ru   r8   r0   r   r   r:   r:   +   s!    6AG3G4

:
r   r:   c                   H    \ 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)TsuminoSearchExtractorh   z+Extractor for search results on tsumino.comsearchz:(?i)(?:https?://)?(?:www\.)?tsumino\.com/(?:Books/?)?#(.+)z#https://www.tsumino.com/Books#QUERYc                 D    [         R                  " X5        US   U l        g )Nr   )r   r?   query)r   r@   s     r   r?   TsuminoSearchExtractor.__init__n   s    4'1X
r   c              #      #    U R                  5        H4  nU R                   SUS    3n[        US'   [        R                  X!4v   M6     g 7f)Nr=   id
_extractor)	galleriesr)   r:   r   Queue)r   galleryr-   s      r   itemsTsuminoSearchExtractor.itemsr   sG     ~~'GYYKwwt}o6C$;GL!---- (s   A
Ac           	   #   8  #    U R                   S-   nU R                   S-   SS.nSSSSSSSS	S
.nUR                  U R                  U R                  5      5         U R	                  USX#S9nUS    H
  nUS   v   M     US   US   :  a  gUS==   S-  ss'   M@  7f)z0Return all gallery results matching 'self.query'z/Search/Operate?type=BookrD   XMLHttpRequest)r   zX-Requested-Withr    Newest0false)
PageNumberTextSortListLengthMinimumRatingExcludeListCompletelyExcludeHatedr"   r#   r&   entry
pageNumber	pageCountNr   )r)   update_parser~   request_json)r   r-   r%   r&   r(   r   s         r   r    TsuminoSearchExtractor.galleriesx   s     ii55yy3 0

  &-	
 	DKK

+,$$FG % @D  <g&& ( L!T+%66!# s   BBc                     U(       d  0 $  US   S:X  a  U R                  U5      $ U R                  U5      $ ! [         a"  n[        R                  " SU SU S35      eS nAff = f)NrM   ?zInvalid search query 'z' ())_parse_simple_parse_jsurl	Exceptionr   rk   )r   r~   excs      r   r   TsuminoSearchExtractor._parse   sq    I	;Qx3))%00$$U++ 	;++(s3%q9; ;	;s   6 6 
A" AA"c           	          UR                  S5      u  p#nSSSSSSSS	S
.nXRSS R                  5          [        R                  " U5      R	                  SS5      SS.$ )z.Parse search query with format '?<key>=value>'=1234567100)TagCategory
CollectionGroupArtistParody	CharacterUploaderr   N+rL   r   )zTags[0][Type]zTags[0][Text]zTags[0][Exclude])r[   
capitalizer   unquotereplace)r   r~   keyrd   value	tag_typess         r   r   $TsuminoSearchExtractor._parse_simple   sp    ,	
	 '12w'9'9';<!\\%088cB '
 	
r   c                 z   ^^^^^^^ Sm[        T5      mUU4S jmUUU4S jmUUUUUUU4S jmU4S jmT" 5       $ )zParse search query in JSURL format

Nested lists and dicts are handled in a special way to deal
with the way Tsumino expects its parameters -> expand(...)

Example: ~(name~'John*20Doe~age~42~children~(~'Mary~'Bill))
Ref: https://github.com/Sage/jsurl
rM   c                 J   > TT   U :w  a  [        SU  STT    35      eTS-  mg )Nzbad JSURL syntax: expected 'z', got r   )
ValueError)expectedr&   rt   s    r   eat0TsuminoSearchExtractor._parse_jsurl.<locals>.eat   s=     Aw(" 28*GDG9MO OFAr   c            	      ~  > Tn SnTT:  a  TT   nUS;  a  TS-  mOUS:X  aj  U T:  a  UTU T -  nTTS-      S:X  a'  U[        [        TTS-   TS-    S5      5      -  nTS-  mO&U[        [        TTS-   TS-    S5      5      -  nTS-  mTn O"US	:X  a  U T:  a  UTU T -  nUS
-  nTS-  mTn OOTT:  a  M  UTU T -   $ )Nr   z~)*!r   *r      r      !$)chrint)begresultchr&   rt   imaxs      r   decode3TsuminoSearchExtractor._parse_jsurl.<locals>.decode   s    CFd(!WV#FA3YQw$s1+-AE{c)#c$qs1Q3-&<"==Q#c$qs1Q3-&<"==QC3YQw$s1+-cMFFAC 3 d(6 DQK''r   c                    > T" S5        Sn T
T   nUS:X  a  TS-  mT
T   S:X  aU  / n T
TS-      S:X  a  TS-  mOU R                  T" 5       5        T
T   S:X  a!  U R                  T" 5       5        T
T   S:X  a  M!  O@0 n T
T   S:w  a5   T" 5       nT" 5       nT" X#5       H	  u  pEXPU'   M     T
T   S:w  a  OTS-  mM4  T" S5        U $ US:X  a  TS-  mT" 5       n U $ TnTS-  mTT:  a  T
T   S;  a  TS-  mTT:  a  T
T   S;  a  M  T
UT nUS;   a#  [        U5      n[        U5      n	X:X  a  U	n U $ Un U $ US	;  a  [        S
U-   5      eUn U $ )N~r   (r   r   'z~)z0123456789-)truer   nullzbad value keyword: )appendfloatr   r   )r   r   r   r   ekeyevaluer   subfvalivalr&   r   r   expandrt   r   	parse_ones             r   r   6TsuminoSearchExtractor._parse_jsurl.<locals>.parse_one   s    HFaBSyQ7c>FAaCyC'Qik2"1gn"MM)+6 #1gn  FAw#~""((C$-KE06s0B/5t 1C#Aw#~ %FA # C. M+ sQ& M! Q$h47$#6FA $h47$#6 3qk& :Dt9D%)\TF M 8<F M	 ";;()>)DEE FMr   c              3   2  >#    [        U[        5      (       a-  [        U5       H  u  p#U  SU S3nT" XC5       S h  vN   M     g [        U[        5      (       a2  UR	                  5        H  u  pCU  SU S3nT" XC5       S h  vN   M     g X4v   g  NV N7f)N[])
isinstancelist	enumeratedictr   )r   r   indexcvalueckeyr   s        r   r   3TsuminoSearchExtractor._parse_jsurl.<locals>.expand$  s     %&&%.u%5ME!U!E7!,D%d333 &6 E4(($)KKMLD!U!D6+D%d333 %2 j  4 4s"   9BBABBBB)len)r   r&   r   r   r   rt   r   r   s    `@@@@@@r   r   #TsuminoSearchExtractor._parse_jsurl   s8     4y	!	(F6	 6	p
	! {r   )r~   N)r1   r2   r3   r4   r5   subcategoryrw   rx   r?   r   r   r   r   r   r8   r0   r   r   rz   rz   h   s3    5KKG3G.$<	;
({r   rz   N)r5   commonr   r   r   r   r   r   r	   r   r:   rz   r0   r   r   <module>r      s@    . 8 8   6:
k+; :
zH[) Hr   