
    iE                     J   S r SSKJrJrJr  SSKJrJrJrJ	r	  SSK
J
r
Jr  SSKrSSKrS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 " 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 " S* S+\5      r  " S, S-\5      r! " S. S/\5      r" " S0 S1\5      r# " S2 S35      r$\
" S4SS59S6 5       r%g)7z%Extractors for https://www.pixiv.net/   )	ExtractorMessageDispatch   )textutildt	exception)cachememcache    Nz,(?:https?://)?(?:www\.|touch\.)?ph?ixiv\.netz/(?:en/)?users/(\d+)c                       \ 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S rS rS r\R,                  " SS94S jrS rS rS rSrg)PixivExtractor   zBase class for pixiv extractorspixivzhttps://www.pixiv.net)
{category}{user[id]} {user[account]}z{id}_p{num}.{extension}z{id}{suffix}.{extension}
.pixiv.netz(https://s.pximg.net/common/images/limit_c                    [        U 5      U l        U R                  SS5      U l        U R                  S:H  U l        U R                  SS5      U l        U R                  SS5      U l        U R                  S5      U l        U R                  S5      U l        U R                  S	5      U l	        U R                  S
5      U l
        U R                  (       d  U R                  (       a&  [        R                  " S5      R                  U l        g g )NugoiraToriginalz	max-postsr   sanitymetadatazmetadata-bookmarkcommentscaptionsz<a href="/jump\.php\?([^"]+))PixivAppAPIapiconfigload_ugoiraload_ugoira_original	max_postssanity_workaround	meta_usermeta_bookmarkmeta_commentsmeta_captionsr   resubmeta_captions_subselfs    G/app/mltbenv/lib/python3.13/site-packages/gallery_dl/extractor/pixiv.py_initPixivExtractor._init"   s    t$;;x6%)%5%5%C![!4!%Xt!<Z0![[)<=![[4![[4!!T%7%7%)WW/&114 " &8    c           	   #     #    U R                  SS5      nUS:X  a  S nOUS:X  a  S nOS nSSS	S
.nU R                  5       nU R                  5       nU R                  (       a   [        R
                  " XPR                  5      nU GH  nUS   S   (       d  M  U R                  U5      nU R                  (       a9  UR                  U R                  R                  [        US   S   5      5      5        U R                  (       aQ  US   (       aB  UR                  S5      (       d,   [        U R                  R                  US   5      5      US'   OSUS'   U R"                  (       aP  US   (       aF  U R                  R%                  US   5      nUS    V	s/ s H  n	U	S   (       d  M  U	S   PM     sn	US'   U R&                  (       a  UR                  S5      (       dj  UR                  S5      (       dT  UR                  S5      (       d>  U R)                  S[        US   5      -   5      =n
(       a  U R+                  U
S   5      US'   Ub  U" U5        SUS'   [,        R.                  " US   5      US'   [1        U5      US'   UR                  US   5      US'   S US!'   UR                  U5        [2        R4                  S U4v   [7        U5       H  u  US'   nUS"   nUR                  U5        [8        R:                  " X5        U R=                  U5      US#'   S$US%   =n;   a%  XR?                  S$5      S&-   URA                  S'5       OS US('   [2        RB                  X4v   M     GM     g ! [          a	    SUS'    GN'f = fs  sn	f 7f))Ntagsjapaneser   
translatedc                 Z    [        [        R                  S U S    5       5      5      U S'   g )Nc              3   D   #    U  H  nUS    =(       d    US   v   M     g7ftranslated_namenameN .0tags     r,   	<genexpr>?PixivExtractor.items.<locals>.transform_tags.<locals>.<genexpr>7   )      2-+ )*9c&k9+    r1   listdictfromkeysworks    r,   transform_tags,PixivExtractor.items.<locals>.transform_tags6   ,    #DMM 2-#F|2- %-  .Vr/   c                 D    U S    Vs/ s H  oS   PM	     snU S'   g s  snf Nr1   r8   r9   rF   r<   s     r,   rG   rH   ;   #    7;F|D|F|DVD   GeneralR-18R-18Gr   r   r   useridtotal_comments_ajaxr   r9   is_bookmarkedis_registeredr8   tags_bookmarkcaption_mypixiv/illust/illustCommentr   numcreate_datedatecount
x_restrictrating suffixurldate_url-filenamer   _hash)"r   r   worksr!   	itertoolsislice_extract_filesr#   updater   user_detailstrr%   getrB   illust_comments	Exceptionr$   illust_bookmark_detailr&   _request_ajax_sanitize_ajax_captionr	   	parse_isolenr   	Directory	enumerater   nameext_from_url_date_from_urlfindrfindUrl)r+   r1   rG   ratingsr   rl   rF   filesdetailr<   bodyfilerf   r8   s                 r,   itemsPixivExtractor.items1   s,    {{6:.:!N\!.
E  Fw7==?

>>$$UNN;ED<%''-E~~DHH00T&\$5G1HIJ!!()$((72C2C.+/ HH44T$Z@,BZ(
 (*D$!!d?&;88dD@Fv )B,/,@ *5V )B_%!!$((9*=*=,,TXXg5F5F--j3tDz?.JKK4K&*&A&A_-'/DO )t$DK<<](;<DLJDM$[[l);<DNDNKK!##R--%.u%5!UT5kD!%%c0#'#6#6s#;Z #&4
3C+C4#D !%YYs^A%5djjo FJL Vkk3,, &6K  % .+-Z(.)Bs>   D!N$*M)ANM?&	M?/F:N)M<8N;M<<Nc           	      N   US   nUS   nUS	 US	 US	 U(       a=  [        U5       VVs/ s H$  u  pEUS   S   SUS 3U R                  U5      S.PM&     snn$ US   nUR                  U R                  5      (       GaE  US	   nU R                  R                  S
Xv5        UR                  S5      S   nUS;   a  SUS'   U R                  R                  SU5        U R                  (       a  U R                  S[        U5      -   5      n	US   S:X  aT  U R                  (       d  gU R                  R                  SUS	   5         U R                  X5        U R                  X5      $ U R                  X5      $  gUS:X  a"  SUS'   U R                  R                  SU5        gSUS'   U R                  R#                  SXx5         gUS   S:w  a  X`R                  U5      S.4$ U R                  (       a   U R                  X5      $ gs  snnf ! [         aD  n
U R                  R!                  U
5        U R                  R                  SUS	   5         S n
A
gS n
A
ff = f! [         a?  n
U R                  R                  SUS	   U
R$                  R&                  U
5         S n
A
gS n
A
ff = f)Nmeta_single_page
meta_pages
image_urlsr   _p02)rf   re   	_fallbackoriginal_image_urlrT   %s: %s/r   )limit_zlimit_unviewable_360.pngzlimit_sanity_level_360.pngTrV   z %s: 'limit_sanity_level' warningr\   typer   r9   z#%s: Retrieving Ugoira AJAX metadatazH%s: Unable to extract Ugoira URL. Provide logged-in cookies to access itzlimit_mypixiv_360.pngr[   z%s: 'My pixiv' lockedz %s: Unknown 'limit' URL type: %s)rf   r   z1%s: Unable to retrieve Ugoira metatdata (%s - %s))r|   _fallback_image
startswith	limit_urllogdebug
rpartitionwarningr"   rw   rr   r   info_extract_ajax_extract_ugoiraru   	tracebackerror	__class____name__)r+   rF   r   r   r^   imgrf   work_id
limit_typer   excs              r,   ro   PixivExtractor._extract_filesr   s    23,'
#$ !** 5 !6HC	 ",/
; "3r(m!%!5!5c!:
 !6  34>>$..))4jGHHNN8W2,Q/J  
 !%W  !CWM))--j3w<.GHDF|x/#//#%&K&*4j2N ..t:#'#7#7#BB  $11$==! *L ) 66#'Z   !8'B$  $(Z A&4  &\X%.B.B3.GHJJ=++D66 y@  ) N HH..s3 HH,,!ABFt*N N4 9N.  =  GJ 6 6= = =s5   +H!H
 2I 

I:II
J$%5JJ$c                    UR                  S5      (       a)  U R                  S[        US   5      -   S-   5      nUS   nOU R                  R	                  US   5      nUS   =US'   =US'   nU R
                  US'   S	US
'   U R
                  (       a  U R                  U5      US'   UR                  S5      u  pVnU(       a  US-  nOjUR                  S5      u  pVnUR                  SSS5      U-   nS H  n U SU 3n	U R                  U	SS9    O!   U R                  R                  SUS   5        [        [        U5      5       V
s/ s H  n
U U
 SU 3SU
S 3U
S.PM     sn
$ UR                  S5      (       a  US   nOUS   S   nU R                  U5      US'   UR                  SSS5      n	SU	04$ ! [        R                   a     M  f = fs  sn
f ) NrV   r\   rT   z/ugoira_metasrcframes_ugoira_frame_data_ugoira_originalF_http_adjust_extensionrg   z	_ugoira0._ugoiraz/img-zip-ugoira/z/img-original/r   jpgpnggifz0.HEADmethodz%Unable to find Ugoira frame URLs (%s).r   r   )rf   re   _ugoira_frame_indexoriginalSrczip_urlsmedium_ugoira600x600_ugoira1920x1080rf   )rs   rw   rr   r   ugoira_metadatar    r~   r   replacerequestr
   	HttpErrorr   r   rangerz   )r+   rF   img_urlr   r   basesepextrj   rf   r^   zip_urls               r,   r   PixivExtractor._extract_ugoira   s#   88G''Sd_,~=?FUmGXX--d4j9F?Eh?OO!"OT(^f#'#<#< ).%&$$#227;D$//<NDs	!&11)<1||&(8!=?BC 1C!%b.S8	 1 HH$$?dM !V- .C	 #VC5#/ "3r(m+.
 .  xx   / ,X6#227;D//"24FJCCL?"- %.. s   7F5G5GGc                    U R                    SU 3n U R                  X R                  SS9nUR                  S5      (       d  US   $ U R                  R                  S[        R                  " U5      5        UR                  S5      =nS:X  a  S	nOS
U=(       d    S S
3nU R                  R                  SU5        g ! [         a     g f = f)Nz/ajaxF)headersfatalr   r   zServer response: %smessagezAn unknown error occurredzInvalid 'PHPSESSID' cookie'zGeneral Errorz%s)
rootrequest_jsonheaders_webrs   r   r   r   
json_dumpsr   ru   )r+   endpointrf   datamsgs        r,   rw   PixivExtractor._request_ajax   s    5
+	$$--U % <D88G$$F|#HHNN0$//$2GHxx	**/JJ2#013HHNN4% 		s   4B> A5B> >
C
Cc                 R   SUS'   U R                  U5      nU(       d  gS H  u  pEX%   X'   M     US   [        US   5      SUS   0 S	.US
'   SU;  a  UR                  S5      (       a  SOSUS'   / =US'   nUS   S    H$  nUS   n US   S   n	UR	                  XS.5        M&     U R                  US   5      US'   US   =US'   n
U
S:X  a  SU04$ UR                  S5      u  pn[        U
5       Vs/ s H  nU SU SU 3SUS 3S.PM     sn$ ! [         a    S n	 Nf = fs  snf )NTrV   r9   ))titleillustTitle)r   urls)r_   
createDate)widthr   )heightr   )sanity_levelsl)
total_view	viewCount)rU   commentCount)total_bookmarksbookmarkCount)restrictr   )rb   	xRestrict)illust_ai_typeaiType)illust_book_style	bookStyleuserAccountuserIdFuserName)accountrT   is_followedr8   profile_image_urlsrS   rW   bookmarkDatar1   r<   translationen)r8   r7   r]   rZ   	pageCount
page_countr   rf   _p0.r   r   r   )rf   re   )_extract_ajax_urlintrs   ru   appendrx   r   r   )r+   rF   r   rf   key_appkey_ajaxr1   r<   r8   r7   ra   r   rj   r   r^   s                  r,   r   PixivExtractor._extract_ajax   s   W$$T*"
G !NDM"
$  .tH~. 
+"$
V $&,0HH^,D,DD%D!  Vt<'Cu:D'"%m"4T": KKJK ( 55d?6KLY%)+%66\UA:CL?"~~f- U|

 $ "F"SE3%0s2h- $
 	
  '"&'
s   D4D$D! D!c                     US   S   =n(       a  U$   US   US      S   nUR                  S5      S   R                  S5      n[        U5      S	:  a2  U R                  R                  S
US   UR                  S5      S   5      $ USS2	 SUS'   SR                  U5      nS H  n U SU 3nU R                  USS9  Us  $    g ! [          a     Nf = f! [          a     g f = f! [        R                   a     MY  f = f)Nr   r   userIllustsrT   rf   _p0r   r      r   r         zimg-originalr   r   r   r   )
ru   r   splitrz   r   r   joinr   r
   r   )r+   r   r   
square1200partsr   r   rf   s           r,   r    PixivExtractor._extract_ajax_url5  s:   	<
33x3 4
	m,T$Z8?J %%e,Q/55c:u:>88##$t*j&;&;C&@&CE E !A#J!axx(Cd3%(S0
	 )#  		
  		" && s4   C C (C&
CC
C#"C#&C>=C>c                 `    U(       d  g[         R                  " U R                  S U5      5      $ )Nrd   c                 :    S[         R                  " U S   5      -   $ )Nz	<a href="r   )r   unquote)ms    r,   <lambda>7PixivExtractor._sanitize_ajax_caption.<locals>.<lambda>V  s    kDLL1$66r/   )r   unescaper)   )r+   rZ   s     r,   rx   %PixivExtractor._sanitize_ajax_captionR  s.    }}T336A B 	Br/   c              #      #    [        U[        5      (       a  S nUnO
US   nUS   nUR                  S5      S   nUR                  SSS5      S-   v   Uc  g S	 H  nXR;   d  M
  X%   v   M     g 7f)
Nr   r   r   r   z
-original/z-master/r   z_master1200.jpg)larger   square_medium)
isinstancerr   r   r   )r+   r   r   origr   fmts         r,   r   PixivExtractor._fallback_imageX  sz     c3DD|$D
#Ds#A&ll<Q7:KKK<7C{i 8s   AA.#A.	   )hoursc                      UR                  S5      u          p4pVpxp[        R                  " [        U5      [        U5      [        U5      [        U5      [        U5      [        U	5      5      U-
  $ ! [         a     g f = f)Nr   )r  r	   datetimer   ru   )
r+   rf   offsetrj   yr	  dHMSs
             r,   r~   PixivExtractor._date_from_urlj  sx    	143.Aq!QaA!;;AAAAAA@BHI I 		s   A-A0 0
A=<A=c                     UR                  S5      n0 S[        U5      S:  a&  US    SUS    SUS    SUS	    S
US    S
US    S3OS _SS_SU_SS _SS_SSU0_SS_SS_SS_SS_SS_SU_SU_SU_SS_S S_$ )!Nr   r_   r  r   rh   r      T   :
   z+09:00r   r   rT   r   r   r9   r   r   r   r   r   rU   rW   Fr1   r   r   rS   r   rb   )r  rz   )r+   kindrf   rS   ps        r,   
_make_workPixivExtractor._make_workr  s.   IIcN
.1!fqj %&aD61Q4&!A$q1a!vQqug#)"+>B
 
 	

 
 
 !5s ;
 
 
 
 
 
 
 
 
  !
" #
 	
r/   c                     g)z9Return an iterable containing all relevant 'work' objectsNr9   r*   s    r,   rl   PixivExtractor.works  s    r/   c                     0 $ )z"Collect metadata for extractor jobr9   r*   s    r,   r   PixivExtractor.metadata  s    	r/   )
r   r   r    r!   r$   r&   r)   r%   r#   r"   N)r   
__module____qualname____firstlineno____doc__categoryr   directory_fmtfilename_fmtarchive_fmtcookies_domainr   r-   r   ro   r   rw   r   r   rx   r   r	   	timedeltar~   r(  rl   r   __static_attributes__r9   r/   r,   r   r      s~    )H"D@M,L,K!N:I
5?-BDL1#f"7
r:B $ *,A)> 
,Hr/   r   c                   ,    \ rS rSrSr\S-   rSrS rSr	g)PixivUserExtractor  z"Extractor for a pixiv user profilezM/(?:(?:en/)?u(?:sers)?/|member\.php\?id=|(?:mypage\.php)?#id=)(\d+)(?:$|[?#])z$https://www.pixiv.net/en/users/12345c           
         U R                  S5      =n(       aU  SU;   d  US:X  aI  [        R                  " U 5        [        U 5      R	                  U R
                  S   5      nSUS   S   -   nOSnU R                   S	U R
                  S    S
3nU R                  [        US-   4[        US-   4[        US-   4[        US-   4[        US-   4[        US-   4[        U44SS5      $ )Nincludesketchallr   zhttps://sketch.pixiv.net/@rS   r   rd   z/users/r   avatar
backgroundartworkszbookmarks/artworkszbookmarks/novelsnovels)rB  ))bookmarkznovel-bookmarkN)rS   z
novel-userN)r   r   
initializer   rq   groupsr   _dispatch_extractorsPixivAvatarExtractorPixivBackgroundExtractorPixivArtworksExtractorPixivFavoriteExtractorPixivNovelBookmarkExtractorPixivNovelUserExtractorPixivSketchExtractor)r+   incrS   r>  r   s        r,   r   PixivUserExtractor.items  s    ;;y))C)C3%<  &t$00Q@D1DL4KKFF))GDKKN#315((!$/:%$*=>#$*;<#$1E*EF($1C*CD$$/:!&1*
  
 	r/   r9   N)
r   r.  r/  r0  r1  BASE_PATTERNpatternexampler   r8  r9   r/   r,   r:  r:    s     , # #G 5G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g)rJ  i  z&Extractor for artworks of a pixiv userrB  z~/(?:(?:en/)?users/(\d+)/(?:artworks|illustrations|manga)(?:/([^/?#]+))?/?(?:$|[?#])|member_illust\.php\?id=(\d+)(?:&([^#]+))?)z-https://www.pixiv.net/en/users/12345/artworksTc                    [         R                  U 5        U R                  u  pp4U(       a  [        R                  " U5      nO,U(       a%  [        R
                  " U5      R                  S5      nU=(       d    UU l        U=(       d    UU l        U R                  (       ac  U R                  (       aQ  S[        l
        U R                  R                  SU R                  S9(       d  U R                  R                  S5        g g g g )Nr<   F	PHPSESSID)domainzONo 'PHPSESSID' cookie set. Can detect only non R-18 'limit_sanity_level' works.)r   r-   rF  r   r  parse_queryrs   user_idr<   r"   _warn_phpsessidrJ  cookiesr6  r   r   )r+   u1t1u2t2s        r,   r-   PixivArtworksExtractor._init  s    T"b!B!!"%))%0BxR8!!d&:&:5:"2<<##K8K8K#L   "H I M ';!r/   c                 |    U R                  S5      (       a%  U R                  R                  U R                  5        0 $ )Nr   )r   r   rq   rY  r*   s    r,   r   PixivArtworksExtractor.metadata  s,    ;;z""HH  .	r/   c                   ^ U R                   R                  U R                  5      nU R                  (       a  U R	                  SU R                   S35      =n(       a`   [        [        [        US   5      5      nUR                  [        [        US   5      5        UR                  5         U R                  X5      nU R                  (       a&  U R                  R!                  5       mU4S jU 5       nU$ ! [         aK  nU R                  R                  U5        U R                  R                  SU R                  5         S nANS nAff = f)Nz/user/z/profile/allillustsmangaz1u%s: Failed to collect artwork IDs using AJAX APIc              3      >#    U  H3  nTUS     Vs/ s H  o"S   R                  5       PM     sn;   d  M/  Uv   M5     gs  snf 7f)r1   r8   N)lower)r;   rF   tr<   s      r,   r=   /PixivArtworksExtractor.works.<locals>.<genexpr>  s@      !&d6lClV9??,lCC Cs   A>AA)r   user_illustsrY  r"   rw   rB   mapr   extendsort_extend_sanityru   r   r   r   r<   rg  )r+   rl   r   ajax_idsr   r<   s        @r,   rl   PixivArtworksExtractor.works  s   %%dll3!!t/A/Al305 (5t (5	=Ci 9:Cg 78 ++E<88((.."C!&E
   A""3'   "237<<A AAs   AC7 7
EAEEc              #     #    SS0n[        U5      S-
  nU Ho  nUS:  ab  US   nX$   nXv:X  a  US-  nONXv:  a@  US-  nU R                  R                  SU5        U R                  XpR                  U5      v   OOUS:  a  Mb  Uv   Mq     US:  aL  X$   nU R                  R                  SU5        U R                  XpR                  U5      v   US-  nUS:  a  MK  g g 7f)NrT   r   r   zInserting work %s)rz   r   r   r(  r   )r+   rl   ro  rS   indexrF   r   ajax_ids           r,   rn  %PixivArtworksExtractor._extend_sanity  s     ayH!D1*t*"/%QJE&QJEHHNN#6@//'>>4HH  1*  J# & qjoGHHNN.8//'>>4@@QJE	 qjs   A>CACC)r<   rY  N)r   r.  r/  r0  r1  subcategoryrQ  rR  rS  rZ  r-   r   rl   rn  r8  r9   r/   r,   rJ  rJ    s:    0K > >G >GOI"
2r/   rJ  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)rH  i  zExtractor for pixiv avatarsr@  z%avatar{date:?_//%Y-%m-%d}.{extension}zavatar_{user[id]}_{date}z/avatarz+https://www.pixiv.net/en/users/12345/avatarc                 f    [         R                  U 5        S=U l        =U l        =U l        U l        g )NF)r   r-   r"   r$   r%   r&   r*   s    r,   r-   PixivAvatarExtractor._init  s;    T" "'	' 	'	'r/   c                     U R                   R                  U R                  S   5      S   nUS   S   R                  SS5      nU R	                  SX!5      4$ )Nr   rS   r   r   z_170.r   r@  )r   rq   rF  r   r(  )r+   rS   rf   s      r,   rl   PixivAvatarExtractor.works  sT    xx##DKKN3F;'(2::7CH#466r/   )r$   r&   r%   r"   N)r   r.  r/  r0  r1  ru  r4  r5  USER_PATTERNrR  rS  r-   rl   r8  r9   r/   r,   rH  rH    s-    %K:L,KZ'G;G'7r/   rH  c                   P    \ rS rSrSrSrSrSr\S-   r	Sr
\R                  rS rS	rg
)rI  i  z&Extractor for pixiv background bannersrA  z)background{date:?_//%Y-%m-%d}.{extension}zbackground_{user[id]}_{date}z/backgroundz/https://www.pixiv.net/en/users/12345/backgroundc                 p   U R                   R                  U R                  S   5      nUS   S   nU(       d  gSU;   a'  UR                  S5      nUSS2	 SR	                  U5      nUR                  S	S
5      nU R                  SX!S   5      nUR                  S5      (       a  US S nUS-   US-   4US'   U4$ )Nr   profilebackground_image_urlr9   z/c/r   r   r   z_master1200.r   rA  rS   .jpg.pngz.gifr   )r   rq   rF  r  r  r   r(  endswith)r+   r   rf   r  rF   s        r,   rl   PixivBackgroundExtractor.works%  s    %%dkk!n5Y 67C<IIcNEac
((5/Ckk.#.|S.A<<cr(C!$vsV| <Dwr/   r9   N)r   r.  r/  r0  r1  ru  r4  r5  r{  rR  rS  rH  r-   rl   r8  r9   r/   r,   rI  rI    s3    0K>L0K]*G?G &&Er/   rI  c                   *    \ rS rSrSrSrSrSrS rSr	g)	PixivMeExtractori6  zExtractor for pixiv.me URLsmez!(?:https?://)?pixiv\.me/([^/?#]+)zhttps://pixiv.me/USERc              #      #    SU R                   S   -   nU R                  USS9n[        R                  US[        04v   g 7f)Nzhttps://pixiv.me/r   rS   )notfound
_extractor)rF  request_locationr   Queuer:  )r+   rf   locations      r,   r   PixivMeExtractor.items<  sC     !DKKN2((v(>mmX6H'IIIs   ?Ar9   N)
r   r.  r/  r0  r1  ru  rR  rS  r   r8  r9   r/   r,   r  r  6  s    %K2G%GJr/   r  c                   0    \ rS rSrSrSrSrSrS rS r	Sr
g	)
PixivWorkExtractoriB  z.Extractor for a single pixiv work/illustrationrF   a  (?:https?://)?(?:(?:www\.|touch\.)?ph?ixiv\.net/(?:(?:en/)?artworks/|member_illust\.php\?(?:[^&]+&)*illust_id=)(\d+)|(?:i(?:\d+\.pixiv|\.pximg)\.net/(?:(?:.*/)?img-[^/]+/img/\d{4}(?:/\d\d){5}|img\d+/img/[^/]+)|img\d*\.pixiv\.net/img/[^/]+|(?:www\.)?pixiv\.net/i)/(\d+))z$https://www.pixiv.net/artworks/12345c                 Z    [         R                  X5        US   =(       d    US   U l        g )Nr   r   )r   __init__	illust_idr+   matchs     r,   r  PixivWorkExtractor.__init__M  s$    ,q-U1Xr/   c                     U R                   R                  U R                  5      4nU R                  SS5      (       a;  U R                   R	                  U R                  5      n[
        R                  " X5      nU$ )NrelatedF)r   illust_detailr  r   illust_relatedrm   chain)r+   rl   r  s      r,   rl   PixivWorkExtractor.worksQ  sY    ''79;;y%((hh--dnn=GOOE3Er/   )r  N)r   r.  r/  r0  r1  ru  rR  rS  r  rl   r8  r9   r/   r,   r  r  B  s#    8KOG 5G.r/   r  c                   6    \ rS rSrSrSr\S-   rSrS r	S r
Srg	)
PixivUnlistedExtractoriY  z,Extractor for a unlisted pixiv illustrationsunlistedz /(?:en/)?artworks/unlisted/(\w+)z?https://www.pixiv.net/en/artworks/unlisted/a1b2c3d4e5f6g7h8i9j0c                     U R                  SUS   -   5      nUS   US'   [        R                  " US   5      US'   U R                  X5      $ )Nz/illust/unlisted/rT   id_unlistedillustId)rw   r   	parse_intr   )r+   rF   r   s      r,   ro   %PixivUnlistedExtractor._extract_files_  sR    !!"5T
"BC"4j]^^D$45T
!!$--r/   c                 ,    U R                   S   SS0S.4$ )Nr   rT   r   )rT   rS   )rF  r*   s    r,   rl   PixivUnlistedExtractor.workse  s    {{1~ay9;;r/   r9   N)r   r.  r/  r0  r1  ru  rQ  rR  rS  ro   rl   r8  r9   r/   r,   r  r  Y  s$    6K@@GOG.<r/   r  c                   J    \ 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)rK  ii  z5Extractor for all favorites/bookmarks of a pixiv userfavorite)r   	bookmarksz,{user_bookmark[id]} {user_bookmark[account]}z+f_{user_bookmark[id]}_{id}{num}.{extension}zb/(?:(?:en/)?users/(\d+)/(bookmarks/artworks|following)(?:/([^/?#]+))?|bookmark\.php)(?:\?([^#]*))?z7https://www.pixiv.net/en/users/12345/bookmarks/artworksc                 V   UR                  5       u  p#U l        n[        R                  " U5      nU(       d  UR	                  S5      nU(       d  SU l        US:X  d  UR	                  S5      S:X  a  SU l        U R                  U l        [        R                  X5        X@l
        X l        g )NrT   rD  	followingr   rS   )rF  r<   r   rX  rs   ru  _items_followingr   r   r  queryrY  )r+   r  uidr&  r  s        r,   r  PixivFavoriteExtractor.__init__t  s    %*\\^"48U  '))D/C#- ;%))F"3v"=*D..DJ,
r/   c                 b   S nSU R                   ;   a$  [        R                  " U R                   S   5      nO1U R                  (       a   [        R                  " U R                  5      nSnU R                   R	                  S5      S:X  a  SnU R
                  R                  U R                  X5      $ )Nr<   publicresthideprivate)r  r   r  r<   rs   r   user_bookmarks_illustrY  )r+   r<   r   s      r,   rl   PixivFavoriteExtractor.works  s}    DJJ,,tzz%01CXX,,txx(C::>>&!V+ Hxx--dllCJJr/   c                     U R                   (       a)  U R                  R                  U R                   5      S   nO0U R                  R                  5         U R                  R                  nUS   U l         SU0$ )NrS   rT   user_bookmark)rY  r   rq   loginrS   )r+   rS   s     r,   r   PixivFavoriteExtractor.metadata  sW    <<88''5f=DHHNN88==DDz&&r/   c              #     #    SnU R                   R                  S5      S:X  a  SnU R                  R                  U R                  U5       H6  nUS   n[
        US'   S[        US   5      -   n[        R                  XC4v   M8     g 7f)	Nr  r  r  r  rS   r  zhttps://www.pixiv.net/users/rT   )	r  rs   r   user_followingrY  r:  rr   r   r  )r+   r   previewrS   rf   s        r,   r  'PixivFavoriteExtractor._items_following  sx     ::>>&!V+ Hxx..t||XFG6?D!3D03tDz?BC--**	 Gs   BB)r   r  ru  r<   rY  N)r   r.  r/  r0  r1  ru  r3  r5  rQ  rR  rS  r  rl   r   r  r8  r9   r/   r,   rK  rK  i  sC    ?KEM?K 0 0G HG"K'	+r/   rK  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)PixivRankingExtractori  z!Extractor for pixiv ranking pagesrankingz7r_{ranking[mode]}_{ranking[date]}_{id}{num}.{extension})r   rankingsz{ranking[mode]}z{ranking[date]}z/ranking\.php(?:\?([^#]*))?z!https://www.pixiv.net/ranking.phpc                 ^    [         R                  X5        US   U l        S =U l        U l        g Nr   )r   r  r  moder`   r  s     r,   r  PixivRankingExtractor.__init__  s)    ,1X
 $$	DIr/   c              #     #    U R                   nU R                  R                  U R                  U R                  5      nU R
                  (       a  [        U R
                  4S jU5      n[        US5       H  u  US'   nUv   M     g 7f)Nc                     U S   U:H  $ )Nr   r9   )rF   rh  s     r,   r
  -PixivRankingExtractor.works.<locals>.<lambda>  s    T&\Q5Fr/   r   rank)r  r   illust_rankingr  r`   r   filterr|   )r+   r  rl   rF   s       r,   rl   PixivRankingExtractor.works  se     ,,''		499=99$))FNE%.ua%8!GFOTJ &9s   BBc                    [         R                  " U R                  5      nUR                  SS5      R	                  5       nSSSSSSS	S
SSSSSSS.n X2   =U l        nUR                  S5      =n(       aV  [        U5      S:X  a)  UR                  5       (       a  USS  SUSS  SUSS  3nOU R                  R                  SU5        S nU(       d9  [        R                  " 5       [        R                  " SS9-
  R!                  S5      nX@l        UR                  S5      =U l        nUU R"                  SU=(       d    SS .=U l        nS!U0$ ! [         a    [        R                  " SU S35      ef = f)"Nr  dailydayday_r18day_ai
day_r18_aiweekweek_r18monthday_maleday_male_r18
day_femaleday_female_r18week_originalweek_rookie	week_r18g)r  	daily_r18daily_aidaily_r18_aiweekly
weekly_r18monthlymalemale_r18female
female_r18r   rookier18gzInvalid mode 'r   r`   r#  r      rh   r   zinvalid date '%s'r   days%Y-%m-%dcontentr?  )r  r`   r  r   r  )r   rX  r  rs   rg  r  KeyErrorr
   AbortExtractionrz   	isdecimalr   r   r	   nowr7  strftimer`   r   r  )r+   r  r  mode_mapr`   r   r  s          r,   r   PixivRankingExtractor.metadata  s     ,yy)//1" ($&"*'#
 	F'~-DI 99V$$4$4yA~$.."2"2q)Ad1Qi[$q)=  !4d;FFHr||33==jID	 99Y//	D IIME	"
 	
w 7##+  	F++nTF!,DEE	Fs   E %E4)r`   r  r  r  r   Nr   r.  r/  r0  r1  ru  r5  r3  rQ  rR  rS  r  rl   r   r8  r9   r/   r,   r  r    s5    +KKK;M;;G1G%
+$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)PixivSearchExtractori  z"Extractor for pixiv search resultssearchz&s_{search[word]}_{id}{num}.{extension})r   r  z{search[word]}zD/(?:(?:en/)?tags/([^/?#]+)(?:/[^/?#]+)?/?|search\.php)(?:\?([^#]+))?z!https://www.pixiv.net/en/tags/TAGc                     [         R                  X5        UR                  5       u  U l        U l        S =U l        U l        g N)r   r  rF  wordr  rm  targetr  s     r,   r  PixivSearchExtractor.__init__  s2    , %	4:"&&	DKr/   c                     U R                   R                  U R                  U R                  U R                  U R
                  U R                  S9$ )N)
date_startdate_end)r   search_illustr  rm  r  r   r  r*   s    r,   rl   PixivSearchExtractor.works  s@    xx%%IItyy$++ & @ 	@r/   c                    [         R                  " U R                  5      nU R                  (       a&  [         R                  " U R                  5      U l        O US   U l        UR                  SS5      nSSSSS	S
.n X2   =U l	        nUR                  SS5      nSSSS.n XT   =U l
        nUR                  S5      U l        UR                  S5      U l        SU R                  U R                  U R                  U R                  U R                  S.0$ ! [
         a    [        R                  " S5      ef = f! [
         a    [        R                  " SU S35      ef = f! [
         a    [        R                  " SU S35      ef = f)Nr  zMissing search termorderdate_ddate_asc	date_descpopular_descpopular_male_descpopular_female_desc)r`   r  	popular_dpopular_male_dpopular_female_dzInvalid search order 'r   s_mode
s_tag_fullpartial_match_for_tagsexact_match_for_tagstitle_and_caption)s_tagr  s_tczInvalid search mode 'scdecdr  )r  rm  r  r   r  )r   rX  r  r  r  r  r
   r  rs   rm  r  r   r  )r+   r  rm  sort_mapr  
target_maps         r,   r   PixivSearchExtractor.metadata  s     ,99TYY/DIG!&M	 yy(+!'1 5
	N'~-DI 8\2-0'


	O#-#55DK&  ))E*		%(IIIIkk//
  	=  G//0EFFG  	N++.DTF!,LMM	N  	O++.CF81,MNN	Os$   
D >D9 "E! !D69%E!%F)r  r   r  rm  r  r  Nr  r9   r/   r,   r  r    s8    ,K:K>M . .G1G'
@
,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)PixivFollowExtractori0  z:Extractor for new illustrations from your followed artistsfollowz)F_{user_follow[id]}_{id}{num}.{extension})r   r  z/bookmark_new_illust\.phpz-https://www.pixiv.net/bookmark_new_illust.phpc                 6    U R                   R                  5       $ r  )r   illust_followr*   s    r,   rl   PixivFollowExtractor.works8  s    xx%%''r/   c                 f    U R                   R                  5         SU R                   R                  0$ )Nuser_follow)r   r  rS   r*   s    r,   r   PixivFollowExtractor.metadata;  s#    txx}}--r/   r9   N)r   r.  r/  r0  r1  ru  r5  r3  rQ  rR  rS  rl   r   r8  r9   r/   r,   r  r  0  s.    DK=K/M99G=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Srg)PixivPixivisionExtractori@  z5Extractor for illustrations from a pixivision article
pixivision)r   r&  z"{pixivision_id} {pixivision_title}z)V{pixivision_id}_{id}{suffix}.{extension}z7(?:https?://)?(?:www\.)?pixivision\.net/(?:en/)?a/(\d+)z%https://www.pixivision.net/en/a/12345c                 B    [         R                  X5        US   U l        g r  )r   r  pixivision_idr  s     r,   r  !PixivPixivisionExtractor.__init__I  s    ,"1Xr/   c                    ^  U 4S j[         R                  " [        R                  " T R                  SS5      5       5       $ )Nc              3   ~   >#    U  H2  nTR                   R                  UR                  S 5      S   5      v   M4     g7f)?r   N)r   r  	partition)r;   r  r+   s     r,   r=   1PixivPixivisionExtractor.works.<locals>.<genexpr>N  s@      
P	 HH""9#6#6s#;A#>??Ps   :=z+<a href="https://www.pixiv.net/en/artworks/")r   unique_sequencer   extract_iterpager*   s   `r,   rl   PixivPixivisionExtractor.worksM  s;    
!11$2C2C		H#3O P
 	
r/   c                     SU R                   -   nSS0nU R                  XS9R                  U l        [        R                  " U R                  SS5      nU R                   [        R
                  " U5      S.$ )Nz https://www.pixivision.net/en/a/
User-AgentzMozilla/5.0r   z<title><)r(  pixivision_title)r(  r   r   r2  extrr  )r+   rf   r   r   s       r,   r   !PixivPixivisionExtractor.metadataT  si    043E3EE/LLL6;;			$))Y4 $ 2 2 $e 4
 	
r/   )r2  r(  N)r   r.  r/  r0  r1  ru  r3  r5  rR  rS  r  rl   r   r8  r9   r/   r,   r%  r%  @  s/    ?K;M=KHG5G&
	
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)PixivSeriesExtractori`  z/Extractor for illustrations from a Pixiv seriesseries)r   r   z{series[id]} {series[title]}z({num_series:>03}_{id}_p{num}.{extension}z/user/(\d+)/series/(\d+)z-https://www.pixiv.net/user/12345/series/12345c                 h    [         R                  X5        UR                  5       u  U l        U l        g r  )r   r  rF  rY  	series_idr  s     r,   r  PixivSeriesExtractor.__init__i  s$    ,',||~$dnr/   c              #      #    S nU R                   R                  U R                  5       HD  nUc-  U R                   R                  nUR	                  S5      =US'   nOWS-  nX2S'   XS'   Uv   MF     g 7f)Nseries_work_counttotalr   
num_seriesr=  )r   illust_seriesr?  r   pop)r+   r=  rF   rD  s       r,   rl   PixivSeriesExtractor.worksm  sn     HH**4>>:D~/5zz:M/NNw*a
!+#NJ ;s   A1A3)r?  rY  N)r   r.  r/  r0  r1  ru  r3  r4  rQ  rR  rS  r  rl   r8  r9   r/   r,   r<  r<  `  s0    9K5M=L88G=G6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S rSrg)rN  i|  z,Extractor for user pages on sketch.pixiv.netr   r>  )r   r>  z{user[unique_name]}z{post_id} {id}.{extension}zS{user[id]}_{id}zhttps://sketch.pixiv.netr   z+(?:https?://)?sketch\.pixiv\.net/@([^/?#]+)zhttps://sketch.pixiv.net/@USERc              #     #    U R                   S   U l        SU R                   SU R                   30nU R                  5        H  nUS   nUS   US'   [        R
                  " US   5      US'   [        R                  " US	5        [        R                  S
U4v   XS'   U HR  nUS   S   nUS   US'   US   US'   US   US'   US   n[        R                  " Xb5        [        R                  Xb4v   MT     M     g 7f)Nr   Referer/@mediarT   post_id
created_atr`   )rT   rL  _linksrd   _http_headersphotor   r   r   rf   )rF  usernamer   postsr	   ry   r   delete_itemsr   r{   r   r}   r   )r+   r   postrL  rQ  r   rf   s          r,   r   PixivSketchExtractor.items  s    A2dmm_=>JJLDME"4jDO<<\(:;DLd$=>##R--$+! >*5"4[T
 ( 1W!)(!3Xuo%%c0kk3,,  !s   C;C=c              #   >  #    U R                    SU R                   S3nSU R                   S-   U R                    SU R                   3S.n U R                  XS9nUS   S	    S h  vN   US
   R                  S5      nU(       d  g U R                   US   -   nMO   N47f)Nz/api/walls/@z/posts/public.jsonzapplication/vnd.sketch-v4+jsonr   rK  )AcceptrJ  zX-Requested-Withr6  r   r   rO  nexthref)r   rR  r   rs   )r+   rf   r   r   next_urls        r,   rS  PixivSketchExtractor.posts  s     <6HI6yy3#'99+R ?
 $$S$:DF|G,,,H~))&1H))hv..C ,s   A$B&B'5BrR  N)r   r.  r/  r0  r1  r2  ru  r3  r4  r5  r   r6  rR  rS  r   rS  r8  r9   r/   r,   rN  rN  |  s<    6HKCM/L$K%D!N<G.G-./r/   rN  c                   &    \ rS rSrSrSrSrS rSrg)PixivNovelExtractori  z%Base class for pixiv novel extractorszpixiv-novel)g      ?g      ?c           	   #   2
  #    U R                   S   U l        U R                  SS5      nUS:X  a  S nOUS:X  a  S nOS nSS	S
S.nU R                  S5      nU R                  S5      nU R                  5       nU R                  (       a   [
        R                  " X`R                  5      nU GH  nU R                  (       a9  UR                  U R                  R                  [        US   S   5      5      5        U R                  (       a:  US   (       a+  [        U R                  R                  US   5      5      US'   OSUS'   U R                  (       aP  US   (       aF  U R                  R!                  US   5      nUS    V	s/ s H  n	U	S   (       d  M  U	S   PM     sn	US'   U(       a  U" U5        SUS'   ["        R$                  " US   5      US'   UR'                  US   5      US'   SUS'   [(        R*                  SU4v    U R                  R-                  US   5      S   n
S US!'   [(        R4                  S"U
-   U4v   U(       a  US#   S$   R7                  S%5      S&   nS'UR9                  S(5      S   R;                  S)S5      -   nU R=                  U5      US*'   US==   S+-  ss'   S,US   S- 3US'   US.-   4US/'   US0-   n[>        R@                  " X5        [(        R4                  X4v   US/	 U(       d  GMT  S1n0 n[>        RB                  " U
S2S35       HO  nURE                  S45      (       a  S5nM  URE                  S65      (       d  M5  S UUS7S  R7                  S85      S   '   MQ     U(       a   U RG                  S9[        US   5      -   5      nUS:   RI                  5       nU H  nURO                  S<5      S   nUR                  U5        U R=                  U5      US*'   US==   S+-  ss'   S,US   S- 3US'   [>        R@                  " X5        [(        R4                  X4v   M     U(       d  GM  [P        US='   S US*'   U HA  nUS==   S+-  ss'   S,US   S- 3US'   U RR                   S>U 3n[(        RT                  X4v   MC     GM     g s  sn	f ! [.         a$    U R0                  R3                  SUS   5         GM  f = f! [.         aB  nU R0                  R3                  S;US   URJ                  RL                  U5        Sn S nAGNgS nAff = f7f)?Nr   r1   r2   r   r3   c                 Z    [        [        R                  S U S    5       5      5      U S'   g )Nc              3   D   #    U  H  nUS    =(       d    US   v   M     g7fr6   r9   r:   s     r,   r=   DPixivNovelExtractor.items.<locals>.transform_tags.<locals>.<genexpr>  r?   r@   r1   rA   rE   s    r,   rG   1PixivNovelExtractor.items.<locals>.transform_tags  rI   r/   c                 D    U S    Vs/ s H  oS   PM	     snU S'   g s  snf rK   r9   rL   s     r,   rG   rd    rM   rN   rO   rP   rQ   rR   embedscoversrS   rT   rU   r   r9   rW   rX   r8   rY   r^   r_   r`   rb   rc   rd   re   r   zUnable to download novel %stxt	extensionztext:r   r  z/img/r   z-https://i.pximg.net/novel-cover-original/img/r   _master1200rg   r   r   r   r  r   r  F[]zuploadedimage:Tzpixivimage:   rh   z/novel/textEmbeddedImagesz0%s: Failed to get embedded novel images (%s: %s)r   r  z
/artworks/)+rF  novel_idr   rC  r!   rm   rn   r#   rp   r   rq   rr   r%   rB   novel_commentsr$   novel_bookmark_detailr	   ry   rs   r   r{   novel_webviewru   r   r   r   r-  r   r   r~   r   r}   r1  r   rw   valuesr   r   rF  r  r   r  )r+   r1   rG   r   rf  rg  rC  novelr   r<   r  pathrf   url_jpgdesktoprd  markerr   imagesr   imager  s                         r,   r   PixivNovelExtractor.items  s    A{{6:.:!N\!.
E  Fw7X&X&>>%%fnn=FE~~TXX11#eFmD6I2JKL!!)*(,//d<)>E*% )+E*%!!eO&<77dDAG *C#-0-A +6#f+ *Co&u%E%LLL})=>E&M%kk%*=>E(O E(O##R..((00t=fE
 "'E+++w0%77\*73==gFqIFs+A.66}bIJ$($7$7$<j!e!$&uU|B&7"8h&)Fl_k",%%g5kk711+&v"//cBF(()9::"&**=99AErs 5 5c :1 =>	 C $#11)c%+>N2NO!%&:!;!B!B!D "(#ii/
;U+,0,?,?,Dj)e),.uU|B.?*@h--c9%kk355 "( 7*<E,'(,E*%%,	e),.uU|B.?*@h!%:i[A%mmS77	 &-Y *C    !>dLD % $((N!$K)?)?F "$	$s}   FTR	RA'T!R'CT>AT%T53S(B
T7A T)S TST
T7T	TTT)ro  N)	r   r.  r/  r0  r1  r2  request_intervalr   r8  r9   r/   r,   r_  r_    s    /H!f8r/   r_  c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	PixivNovelNovelExtractori"  zExtractor for pixiv novelsrt  z /n(?:ovel/show\.php\?id=|/)(\d+)z-https://www.pixiv.net/novel/show.php?id=12345c                     U R                   R                  U R                  5      nU R                  S5      (       a@  US   (       a6  [        R
                  U l        U R                   R                  US   S   5      $ U4$ )Nzfull-seriesr=  rT   )r   novel_detailro  r   PixivNovelSeriesExtractorru  novel_series)r+   rt  s     r,   rC  PixivNovelNovelExtractor.novels(  sb    %%dmm4;;}%%%/8DDD88((x)>??xr/   )ru  Nr   r.  r/  r0  r1  ru  rQ  rR  rS  rC  r8  r9   r/   r,   r~  r~  "  s    $K@@G=Gr/   r~  c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	rM  i0  z!Extractor for pixiv users' novelsrS   z/novelsz+https://www.pixiv.net/en/users/12345/novelsc                 L    U R                   R                  U R                  5      $ r  )r   user_novelsro  r*   s    r,   rC  PixivNovelUserExtractor.novels6  s    xx##DMM22r/   r9   Nr   r.  r/  r0  r1  ru  r{  rR  rS  rC  r8  r9   r/   r,   rM  rM  0  s    +KZ'G;G3r/   rM  c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	r  i:  z Extractor for pixiv novel seriesr=  z/novel/series/(\d+)z(https://www.pixiv.net/novel/series/12345c                 L    U R                   R                  U R                  5      $ r  )r   r  ro  r*   s    r,   rC   PixivNovelSeriesExtractor.novels@  s    xx$$T]]33r/   r9   Nr  r9   r/   r,   r  r  :  s    *K33G8G4r/   r  c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	rL  iD  z%Extractor for bookmarked pixiv novelsrD  z0/bookmarks/novels(?:/([^/?#]+))?(?:/?\?([^#]+))?z5https://www.pixiv.net/en/users/12345/bookmarks/novelsc                     U R                   u  pnU(       a  [        R                  " U5      OS n[        R                  " U5      R	                  S5      S:X  a  SnOSnU R
                  R                  XU5      $ )Nr  r  r  r  )rF  r   r  rX  rs   r   user_bookmarks_novel)r+   rY  r<   r  r   s        r,   rC  "PixivNovelBookmarkExtractor.novelsK  sa    "kke#&dll3DE"&&v.&8 HHxx,,W8DDr/   r9   Nr  r9   r/   r,   rL  rL  D  s$    /K 2 2GEG	Er/   rL  c                   *   \ rS rSrSrSrSrSrS rS r	\
" SS	S
9S 5       rS rS rS rS)S jrS*S jrS rS+S jrS rS rS rS rS rS rS r  S,S jrS-S jrS-S jrS.S jr\" S	S9S/S  j5       rS.S! jr S" r!S# r"S$ r#S0S% jr$ S1S& jr%S' r&S(r'g)2r   iZ  zMinimal interface for the Pixiv App API for mobile devices

For a more complete implementation or documentation, see
- https://github.com/upbit/pixivpy
- https://gist.github.com/ZipFile/3ba99b47162c23f8aea5d5942bb557b1
MOBrBDS8blbauoSck0ZfDbtuzpyT(lsACyCD94FhDUtGTXi3QzcFE2uU1hqtDaKeqrdwj@28c1fdd170a5204386cb1313c7077b34f83e4aaf4aa829ce78c231e05b0bae2cc                    Xl         UR                  U l        UR                  5       S   U l        S U l        UR
                  R                  R                  5       Ul        UR
                  R                  R                  SSSSSS.5        UR                  SU R                  5      U l        UR                  S	U R                  5      U l        UR                  S
5      nUb  US:X  a  [        U R                  5      nX l        g )Nr   iosz16.7.2z7.19.1z+PixivIOSApp/7.19.1 (iOS 16.7.2; iPhone12,8)zhttps://app-api.pixiv.net/)zApp-OSzApp-OS-VersionzApp-Versionr5  rJ  z	client-idzclient-secretzrefresh-tokenr   )	extractorr   _get_auth_inforR  rS   sessionr   copyr   rp   r   	CLIENT_ID	client_idCLIENT_SECRETclient_secret_refresh_token_cacherefresh_token)r+   r  tokens      r,   r  PixivAppAPI.__init__f  s    "==!00215	 ) 1 1 9 9 > > @	!!((#&&K:*
 	 #)))&--T//1   1=EW,(7E"r/   c                     U R                  U R                  5      u  U l        nXR                  R                  R
                  S'   g)zLogin and gain an access tokenAuthorizationN)_login_implrR  rS   r  r  r   )r+   auths     r,   r  PixivAppAPI.login  s4    **4==9	4:>&&7r/   i  r   maxagekeyargc                    U R                   (       d  [        R                  " S5      eU R                  R	                  S5        SnU R
                  U R                  SU R                   SS.n[        R                  " 5       R                  S5      nU[        R                  " X@R                  -   R                  5       5      R                  5       S.nU R                  R!                  US	XSS
S9nUR"                  S:  a;  U R                  R%                  UR&                  5        [        R                  " S5      eUR)                  5       S   nUS   SUS   -   4$ )NzB'refresh-token' required.
Run `gallery-dl oauth:pixiv` to get one.zRefreshing access tokenz)https://oauth.secure.pixiv.net/auth/tokenr  1)r  r  
grant_typer  get_secure_urlz%Y-%m-%dT%H:%M:%S+00:00)zX-Client-TimezX-Client-HashPOSTF)r   r   r   r   r;  zInvalid refresh tokenresponserS   zBearer access_token)r  r
   AuthenticationErrorr   r   r  r  r	   r  r  hashlibmd5HASH_SECRETencode	hexdigestr  r   status_coder   r   json)r+   rR  rf   r   timer   r  s          r,   r  PixivAppAPI._login_impl  s.   !!//;< < 	/09"nn"00-"00!
 vvx  !:;!$[[(((00244=IK
 >>))% * I3&HHNN8==)//0GHH}}z*F|Yn)====r/   c                 4    SU0nU R                  SU5      S   $ )Nr  z/v1/illust/detailillust_callr+   r  paramss      r,   r  PixivAppAPI.illust_detail  s#    y)zz-v6x@@r/   c                 4    SU0nU R                  SU5      S   $ )Nr  z/v2/illust/bookmark/detailbookmark_detailr  r  s      r,   rv   "PixivAppAPI.illust_bookmark_detail  s,    y)zz(&22CE 	Er/   c                 0    SU0nU R                  SUS5      $ )Nr  z/v3/illust/commentsr   _paginationr  s      r,   rt   PixivAppAPI.illust_comments  s"    y) 5vzJJr/   c                 .    SU0nU R                  SU5      $ )Nr   z/v2/illust/followr  )r+   r   r  s      r,   r  PixivAppAPI.illust_follow  s     h' 3V<<r/   Nc                 .    XS.nU R                  SU5      $ )N)r  r`   z/v1/illust/rankingr  )r+   r  r`   r  s       r,   r  PixivAppAPI.illust_ranking  s    - 4f==r/   c                 .    SU0nU R                  SU5      $ )Nr  z/v2/illust/relatedr  r  s      r,   r  PixivAppAPI.illust_related  s     y) 4f==r/   c                 ,    XS.nU R                  SUSS9$ )N)illust_series_idr  z/v1/illust/seriesillust_series_detail)key_datar  )r+   r?  r  r  s       r,   rE  PixivAppAPI.illust_series  s,    &/B 3V)?   A 	Ar/   c                 4    SU0nU R                  SU5      S   $ )Nro  z/v2/novel/bookmark/detailr  r  r+   ro  r  s      r,   rq  !PixivAppAPI.novel_bookmark_detail  s,    h'zz'11BD 	Dr/   c                 0    SU0nU R                  SUS5      $ )Nro  z/v1/novel/commentsr   r  r  s      r,   rp  PixivAppAPI.novel_comments  s"    h' 4fjIIr/   c                 4    SU0nU R                  SU5      S   $ )Nro  z/v2/novel/detailrt  r  r  s      r,   r  PixivAppAPI.novel_detail  s#    h'zz,f5g>>r/   c                 0    SU0nU R                  SUS5      $ )Nr?  z/v1/novel/seriesrC  r  )r+   r?  r  s      r,   r  PixivAppAPI.novel_series  s"    y) 2FHEEr/   c                 .    SU0nU R                  SU5      $ )Nro  z/v1/novel/textr  r  s      r,   
novel_textPixivAppAPI.novel_text  s    h'zz*F33r/   c                 D    USS.nU R                  SX R                  5      $ )N20221031_ai)rT   viewer_versionz/webview/v2/novel)r  _novel_webview_parser  s      r,   rr  PixivAppAPI.novel_webview  s*     MBzz)B)BD 	Dr/   c                 n    [         R                  " [        R                  " UR                  SS5      5      $ )Nznovel: z,
)r   
json_loadsr   r9  )r+   r  s     r,   r   PixivAppAPI._novel_webview_parse  s)    tyyMM9e - . 	.r/   c                 2    XX$XVS.nU R                  SU5      $ )N)r  search_targetrm  duration
start_dateend_datez/v1/search/illust)_pagination_search)r+   r  rm  r  r  r   r  r  s           r,   r  PixivAppAPI.search_illust  s)     *B &&':FCCr/   c                 0    XUS.nU R                  SU5      $ )z#Return illusts bookmarked by a userrY  r<   r   z/v1/user/bookmarks/illustr  r+   rY  r<   r   r  s        r,   r  !PixivAppAPI.user_bookmarks_illust  s     $hG ;VDDr/   c                 2    XUS.nU R                  SUS5      $ )z"Return novels bookmarked by a userr  z/v1/user/bookmarks/novelrC  r  r  s        r,   r   PixivAppAPI.user_bookmarks_novel  s"    $hG :FHMMr/   c                 0    XS.nU R                  SUS5      $ )z&Return bookmark tags defined by a userrY  r   z/v1/user/bookmark-tags/illustbookmark_tagsr  r+   rY  r   r  s       r,   user_bookmark_tags_illust%PixivAppAPI.user_bookmark_tags_illust  s&    $;+V_F 	Fr/   )r  c                 *    SU0nU R                  SX2S9$ )NrY  z/v1/user/detailr   r  )r+   rY  r   r  s       r,   rq   PixivAppAPI.user_detail  s     W%zz+VzAAr/   c                 0    XS.nU R                  SUS5      $ )Nr  z/v1/user/followinguser_previewsr  r  s       r,   r  PixivAppAPI.user_following  s     $; 4foNNr/   c                 ,    SU0nU R                  SUSS9$ )NrY  z/v1/user/illustsrS   )key_userr  r+   rY  r  s      r,   rj  PixivAppAPI.user_illusts  s%    W% 2FVLLr/   c                 0    SU0nU R                  SUS5      $ )NrY  z/v1/user/novelsrC  r  r  s      r,   r  PixivAppAPI.user_novels  s"    W% 168DDr/   c                 4    SU0nU R                  SU5      S   $ )Nr  z/v1/ugoira/metadatar   r  r  s      r,   r   PixivAppAPI.ugoira_metadata	  s$    y)zz/89JKKr/   c                    SU-   n U R                  5         U R                  R                  XRSS9nU(       a	  U" U5      nOUR                  5       nSU;  d  U(       d  U$ U R                  R                  U5        UR                  S:X  a  [        R                  " 5       eUS   nSUR                  S5      =(       d    SR                  5       ;   a  U R                  R                  S	S
9  M  UR                  S5      =n	(       a  SU	 S3OUR                  S5      =n	(       a  SU	 S3OUn	[        R                  " SU	-   5      e)Nzhttps://app-api.pixiv.netF)r  r   r   i  z
rate limitr   rd   i,  )secondsuser_messager   zAPI request failed: )r  r  r   r  r   r   r  r
   NotFoundErrorrs   rg  waitr  )
r+   r   r  parser   rf   r  r   r   r   s
             r,   r  PixivAppAPI._call  s!   )H4JJL~~--c-NHX}}d"%HHNN4 ##s*--//ME		) 4 :AACC##C#0).>)B"B#"BQse1:).9)="=#"=Qse1:  ++,BS,HIIr/   c              #     #    U R                  X5      nUb  UR                  U5      U l        Ubi  Xe   R                  S5      (       dQ  U R                  U R                  R
                  SS9nUR                  S5      (       a  [        R                  " S5      eg  Xc    S h  vN   US   (       d  g US   R                  S5      S   n[        R                  " U5      nU R                  X5      nMW   NO7f)	NrT   Fr  r   rS   r[  r,  r   )r  rs   r   rq   r  rY  r
   r  r   r   rX  )	r+   r   r  	key_itemsr  r  r   rS   r  s	            r,   r  PixivAppAPI._pagination+  s     zz(+*DI(:(:4(@(@##DNN$:$:%#HDxx  --f55&&
#$//4Q7E%%e,F::h/D &s   BC3!C1"AC3c              #     #    US   nUS:X  a  Sn[         R                  " SS9nS nO"US:X  a  Sn[         R                  " S	S9nS
 nOS nS n U R                  X5      nUc  US    S h  vN   O>US   n	W" XyS	   S   5      (       a&  U	 H   n
Uc  U
v   M  U" XzS   5      (       d  M  S nM"     UR                  S5      =n(       d  g UR	                  S5      S   n[
        R                  " U5      nU(       a  [
        R                  " UR                  S5      5      S:  ae  US   S	   S   n[         R                  " U5      W-   R                  S5      nU R                  R                  SXM5        XU'   UR                  SS 5        GM;   GN7f)Nrm  r  r  r   r  c                 
    X:  $ r  r9   lhsrhss     r,   r
  0PixivAppAPI._pagination_search.<locals>.<lambda>E      
r/   r  r  c                 
    X:*  $ r  r9   r  s     r,   r
  r  I  r  r/   rd  r_   r[  r,  r   r  i  r  z/Reached 'offset' >= 5000; Updating '%s' to '%s')r	   r7  r  rs   r   r   rX  r  ry   r  r   r   rF  )r+   r   r  rm  date_keydate_offdate_cmp	date_lastr   rl   rF   r[  r  date_vals                 r,   r  PixivAppAPI._pagination_search@  s    f~;!H||+H2HZ#H||,H2HH	::h/D 	?**YIRy'?@@ %$,"&J%im1DEE(,I	 !& !% 44H4'',Q/E%%e,FDNN6::h+?@DH OB/>	LL3h>HH  67?K#+x 

8T*5  +s   A'F)F*9F'C"F)r  r  r   r  r   r  rS   rR  )r?  )r  N)r   )NNNNN)Nr  )r  )T)NNT)rd  NN)(r   r.  r/  r0  r1  r  r  r  r  r  r   r  r  rv   rt   r  r  r  rE  rq  rp  r  r  r  rr  r  r  r  r  r  r   rq   r  rj  r  r   r  r  r  r8  r9   r/   r,   r   r   Z  s     /I>M6K#2?
 $q!> ">@AE
K=>>A
D
J?F4D
. DH04DE
N
F QB BOMELJ> BF0*(+r/   r   l    w r  c                     g r  r9   r]  s    r,   r  r  k  s    r/   )&r1  commonr   r   r   rd   r   r   r	   r
   r   r   rm   r  rQ  r{  r   r:  rJ  rH  rI  r  r  r  rK  r  r  r  r%  r<  rN  r_  r~  rM  r  rL  r   r  r9   r/   r,   <module>r%     sa   , 0 0 ( ( #  >55xY xv> >T^ Tn7> 7*~ 6	J~ 	J .<^ < <+^ <+~C$N C$L?> ?D.> . 
~ 
@> 82/9 2/pk8. k8\2 31 34 3 4E"5 E,N+ N+b k!$ %r/   