
    i2l                     @   S r SSKJrJr  SSK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
r " S S\5      rS r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r\	" SS9S 5       r " S S\5      r " S S\5      r " S S5      rg) z!Extractors for https://kemono.cr/   )	ExtractorMessage   )textutil	exception)cachememcache    Nz@(?:https?://)?(?:www\.|beta\.)?(kemono|coomer)\.(cr|s[tu]|party)z/([^/?#]+)/user/([^/?#]+)z'/[0-9a-f]{2}/[0-9a-f]{2}/([0-9a-f]{64})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SS9S 5       rS rS rS rS rS rS rS rS rS rS rSrg)KemonoExtractor   z Base class for kemono extractorskemonozhttps://kemono.cr)
{category}z	{service}z{user}z9{id}_{title[:180]}_{num:>02}_{filename[:180]}.{extension}z{service}_{user}_{id}_{num}z
.kemono.crc                 l    US   S:X  a  SU l         SU l        SU l        [        R                  " X5        g )Nr   coomerzhttps://coomer.stz
.coomer.st)categoryrootcookies_domainr   __init__selfmatchs     H/app/mltbenv/lib/python3.13/site-packages/gallery_dl/extractor/kemono.pyr   KemonoExtractor.__init__    s2    8x$DM+DI".D4'    c                 ~   [        U 5      U l        U R                  S5      U l        U R                  (       a  U R                  S:H  U l        U R                  S5      nU(       a  US   S;   OSU l        [        R                  " S5      R                  U l	        [        R                  " SSSS	S
9R                  U l        g )N	revisionsuniquezorder-revisionsr   )raFzhsrc="(?:https?://(?:kemono\.cr|coomer\.st))?(/inline/[^"]+|/[0-9a-f]{2}/[0-9a-f]{2}/[0-9a-f]{64}\.[^"]+)T),:)ensure_asciicheck_circular	sort_keys
separators)	KemonoAPIapiconfigr   revisions_uniquerevisions_reverser   refindall_find_inlinejsonJSONEncoderencode_json_dumps)r   orders     r   _initKemonoExtractor._init'   s    T?[1>>%)^^x%?D!-.;@qZ!7e GG>??Fw 	  ++uz3396 	r   c           
   #     ^#    [         R                  " [        5      R                  nU R	                  U R                  S5      5      nU R                  S5      (       a  SOS nU R                  S5      (       a  SOSnU R                  S5      S;   a  [        O[        nU R                  S5      (       a  SOSnU R                  S	5      (       a  SOS nU R                  S
5      nU R                  SS5      (       a  0 OS n	[        R                  n
U R                  S5      =n(       a\  [        U[        5      (       a  [        UR                  S5      5      nO.[        U[        [        45      (       a  [        U5      nO1 SknOSnSS0nU R                  5       nU(       a  [         R"                  " X5      nU R$                  (       a  U R'                  U5      nU GH8  mST;   a  TS   mU R(                   STS    STS    STS    3US'   UTS'   U R+                  TR-                  S5      =(       d    TR-                  S5      =(       d    S5      TS'   TS   nTS   nU	bA  U SU 3nUU	;  a"   U R.                  R1                  X5      =nU	U'   OU	U   nUTS!'   US"   TS#'   U(       a_  U R.                  R=                  XTS   5      =TS'   n[        U[        5      (       d&  U R6                  R?                  S$UTS   U5        STS'   Ub,  USL a"  U R.                  RA                  TS   TS   5      nUTS	'   Ub,  USL a"  U R.                  RC                  TS   TS   5      nUTS'   / n[        5       nU" 5       =nTS'   [         RD                  RG                  U4S% jU 5       5       GH  nUS&   nS'U;   a  URI                  S'S5      =US&'   nU" U5      =n(       aM  US(   =US)'   nUS*   U;  a(  UU;   a"  U R6                  R?                  S+US*   U5        Mp  URK                  U5        OS=US)'   nUS,   S:X  a  U R(                   S-U 3nO4URM                  U R(                  5      (       a  U R(                   S-US.S   3nUUS/'   UR-                  S"5      =n(       aV  [         RN                  " UU5        [         RP                  " U5      nUS0   (       d  UUS0'   O5US1:X  a  US0   S1:w  a	  [R        US2'   O[         RT                  " UU5        US0   nUU
;   d  US3:X  as  US0   U
;   aj  S4US*'   U(       a.   U R.                  RW                  U5      nURY                  U5        OURa                  5       nU[        L a  UUU'   OURc                  U5        URc                  U5        GM     [e        U5      TS6'   [f        Rh                  ST4v   [k        US(5       H;  u  TS7'   nSU;   a  US	 TRY                  U5        [f        Rl                  US/   T4v   M=     GM;     g ! [2        R4                   a9    U R6                  R9                  S XTS   5        [        R:                  =nU	U'    GNf = f! [Z         a`  nU R6                  R9                  S5TS   UR-                  S"5      UR\                  R^                  U5        URa                  5       n S nAGN_S nAff = f7f)8NfilesannouncementsTarchivesFarchives-format>   dictobjectcommentsdms	max-postsmetadata
duplicatesr"   >   fileinline
attachment zAccept-Encodingidentitypost/service/user/user/post/idReferer_http_headers	publishedadded date_z%s/%s/%s: 'Creator not found'user_profilenameusernamez	%s/%s: %sc              3   2   >#    U  H  o" T5      v   M     g 7fNrF   ).0grH   s     r   	<genexpr>(KemonoExtractor.items.<locals>.<genexpr>   s      61%/AdGGZs   path\r   hashtypezSkipping %s %s (duplicate)r   /data   url	extensiontxt_http_validatebinarchive8%s: Failed to retrieve archive metadata of '%s' (%s: %s)countnum)7r   r-   HASH_PATTERNr   _build_file_generatorsr*   r<   listr   EXTS_ARCHIVE
isinstancestrsetsplittupleposts	itertoolsislicer   
_revisionsr   _parse_datetimegetr)   creator_profiler   	HttpErrorlogwarningNONEcreator_post_commentsdebugcreator_dmscreator_announcementschainfrom_iterablereplaceadd
startswithnameext_from_nameext_from_url	_validatenameext_from_urlrC   update	Exception	__class____name__copyappendlenr   	Directory	enumerateUrl)r   	find_hash
generatorsr9   r:   archives_typer>   r?   	max_postscreator_infoexts_archiverB   headersrw   rJ   
creator_idkeycreatorcmtsr8   hashespost_archivesrC   re   r   ra   rW   extrj   excrH   s                                 @r   itemsKemonoExtractor.items6   s    GGL)//	00W1EF
 $O < <$;;z224 $,= > C !#' 	;;z224kk%((ddKK,	![[T::r((\22:2*c** !1!1#!67
Ju66 _
=
J %j1

$$U6E>>OOE*ED~F|%)YYKqi0A%)&\N&d#FGI$+D!//%@'):@bBDL9oGfJ' 	:,/l*@6:hh6N6N#71 1,s"3 +3/G'.^$#*6?Z *.((*H*Hd+5 5Z 4!$--HHNN;
DJM')D$$;((..Yf7C!U( D($(HH$B$BYf%7M(5_%EUF/<>MD,!55 61%/61 16l3;),T3)??DL3%cN*5**/(2DL4F|:5$&.'C'+F|S: JJt$*,,DL4q6S=!YYKuSE2C^^DII..!YYKuSXJ7C!U88F++4+**46++C0C,,/[)${*;u*D1:-.))#t4{+C,&uk):l)J#,DL2&*hhmmD&9G#NN40 #'))+$,.5d+%,,W5T"o1r  JDM##R--%.ua%8!UT4<T
D!kk4;44	 &9W " %.. @(()H)0d4jJ6:ii?,s"3@R  ) 2 HH,,!015dTXXf=M # 6 6= '+iikG2sX   I*[. XJ [/,Y&B;[A	Y#["Y##[&
[0A[[[[c                     U R                  5       u  pU(       a-  U R                  U R                  XR                  4U5      5        g g rZ   )_get_auth_infocookies_update_login_implr   )r   rX   passwords      r   loginKemonoExtractor.login   sD    !002 0 0../!; < r   i r   )maxagekeyargc                    US   nU R                   R                  SU5        U R                  S-   nXS.nU R                  USUSS9nUR                  S:  a.   S	UR                  5       S
    S	3n[        R                  " U5      eUR                   Vs0 s H  owR                  UR                  _M     sn$ ! [         a    Sn NUf = fs  snf )Nr   zLogging in as %sz/api/v1/authentication/login)rX   r   POSTF)methodr0   fatali  "errorz#"Username or password is incorrect")r   infor   requeststatus_coder0   r   r   AuthenticationErrorcookiesrW   value)r   rX   r   re   dataresponsemsgcs           r   r   KemonoExtractor._login_impl   s    A;((3ii88$;<<FU<K3&<(--/'2315 //44)1)9)9:)9A)9::	  <;< ;s   B6  C6CCc                 8    US   nU(       a  SU;  a  gSUS'   U4$ )NrC   r_   rF   rb   rF   )r   rH   rC   s      r   _fileKemonoExtractor._file   s(    F|vT)Vwr   c                 .    US    H  nSUS'   M
     US   $ )NattachmentsrE   rb   rF   )r   rH   rE   s      r   _attachmentsKemonoExtractor._attachments   s&    }-J!-Jv .M""r   c              #   z   #    U R                  UR                  S5      =(       d    S5       H
  nX"SS.v   M     g 7f)NcontentrS   rD   )r_   rW   rb   )r/   r|   )r   rH   r_   s      r   _inlineKemonoExtractor._inline   s4     %%dhhy&9&?R@Dx@@ As   9;c                    Uc#  U R                   U R                  U R                  4$ U R                  U R                   U R                  S.n[        U[        5      (       a  UR                  S5      nU Vs/ s H  o2U   PM	     sn$ s  snf )N)rC   r   rD   r"   )r   r   r   rr   rs   ru   )r   	filetypesgenmapfts       r   ro   &KemonoExtractor._build_file_generators   sx    %%tzz4<<@@::,,<<

 i%%!,I%./Yrr
Y///s   5Bc                 L    [        U5      S:  a  US S nU R                  U5      $ )N   )r   parse_datetime_iso)r   date_strings     r   r{   KemonoExtractor._parse_datetime   s,    {b %cr*K&&{33r   c                 V   ^  [         R                  R                  U 4S jU 5       5      $ )Nc              3   F   >#    U  H  nTR                  U5      v   M     g 7frZ   )_revisions_post)r[   rH   r   s     r   r]   -KemonoExtractor._revisions.<locals>.<genexpr>  s"      -:384D  &&5s   !)rx   r   r   )r   rw   s   ` r   rz   KemonoExtractor._revisions   s'    ,, -:38-: : 	:r   c                     UR                  S5      =n(       a*  SU;   a$  US    Vs/ s H  nSUS   ;   d  M  US   PM     sn$ U R                  R                  US   US   US   5      $ s  snf )Npropsr   revision_idr   rJ   rL   rN   )r|   r)   creator_post_revisions)r   rH   r   revs       r   _revisions_getKemonoExtractor._revisions_get  s    XXg&&E&K5,@ !--C CF* A- 
 xx..OT&\4:7 	7s
   A)	A)c                    U R                  U5      nSU;   a  US   nSUS'   U(       d!  U R                  U5      US'   SUS'   SUS'   U4$ UR                  SU5        U H  nU R                  U5      US'   M     U R                  (       a/  / nS nU H#  nXSS   :w  d  M  US   nUR	                  U5        M%     Un[        U5      =pgU H  nXsS'   XcS'   US-  nM     U R                  (       a  UR                  5         U$ )NrH   r   r   revision_hashr   revision_indexrevision_count)r   _revision_hashinsertr+   r   r   r,   reverse)r   rH   revsr   uniqlastcntidxs           r   r   KemonoExtractor._revisions_post  s   ""4(T><D]$($7$7$=D!%&D!"%&D!"7NAtC#'#6#6s#;C     DD///DKK$  DIC$' !$' !1HC 
 !!LLNr   c                     U R                  U5      n[        U5      =p4U H$  nU R                  U5      US'   XES'   X5S'   US-  nM&     U R                  (       a  UR	                  5         U$ )Nr   r   r   r   )r   r   r   r,   r   )r   rH   r   r   r   r   s         r   _revisions_allKemonoExtractor._revisions_all3  sq    ""4(IC#'#6#6s#;C $' !$' !1HC	  !!LLNr   c                    [        US   [        5      (       aI  [        R                  " US   5      US'   US    Vs/ s H  n[        R                  " U5      PM     snUS'   UR	                  5       nUR                  SS 5        UR                  SS 5        UR                  SS 5        UR                  SS 5        US   R	                  5       US'   US   R                  SS 5        US    Vs/ s H  o"R	                  5       PM     snUS'   US    H  nUR                  SS 5        M     [        R                  " U R                  U5      5      $ s  snf s  snf )NrC   r   r   rR   nextprevrW   )rr   rs   r   
json_loadsr   popsha1r3   )r   revisionr!   r   s       r   r   KemonoExtractor._revision_hashB  s/   hv&,,#x/?@HV,4],C'E,Cq",C'EH]# mmot$&k&&(FF%03M0BC0B1ffh0BCM]#AEE&$ $yy))#.//'E Ds    E,E)	r/   r3   r)   r   r   r   r,   r+   r   N)r   
__module____qualname____firstlineno____doc__r   r   directory_fmtfilename_fmtarchive_fmtr   r   r5   r   r   r	   r   r   r   r   ro   r{   rz   r   r   r   r   __static_attributes__rF   r   r   r   r      s    *HD9MNL/K!N(:O5b< *Q'; (;"#
A
04
:7#J0r   r   c                 R    U R                   S   S:g  =(       d    U R                  S:g  $ )Nzcontent-length9s	   not found)r   r   )r   s    r   r   r   U  s.    -.#5 -,.r   c                   6    \ rS rSrSrSr\S-   rSrS r	S r
Srg	)
KemonoUserExtractoriZ  z5Extractor for all posts from a kemono.cr user listingrL   z/?(?:\?([^#]+))?(?:$|\?|#)z$https://kemono.cr/SERVICE/user/12345c                 B    US   U l         [        R                  X5        g N   subcategoryr   r   r   s     r   r   KemonoUserExtractor.__init__`       8  -r   c           	      B   U R                   u    pp4[        R                  " U5      nU R                  S5      S;   a  U R                  R
                  nOU R                  R                  nU" X#UR                  S5      UR                  S5      UR                  S5      5      $ )Nendpoint)zposts+zlegacy+oqtag)groupsr   parse_queryr*   r)   creator_posts_expandcreator_postsr|   )r   rU   rJ   r   queryparamsr  s          r   rw   KemonoUserExtractor.postsd  s    +/;;(1z!!%(;;z"&;;xx44Hxx--H

3C&**U:KM 	Mr   )r  Nr   r   r   r   r   r  USER_PATTERNpatternexampler   rw   r  rF   r   r   r  r  Z  s%    ?K::G4G.
Mr   r  c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	KemonoPostsExtractoriq  z%Extractor for kemono.cr post listingsrw   z/posts()()(?:/?\?([^#]+))?zhttps://kemono.cr/postsc                     [         R                  " U R                  S   5      nU R                  R	                  UR                  S5      UR                  S5      UR                  S5      5      $ )N   r  r  r  )r   r  r  r)   rw   r|   )r   r  s     r   rw   KemonoPostsExtractor.postsw  sQ    !!$++a.1xx~~JJsOVZZ_fjj.?A 	Ar   rF   N)r   r   r   r   r   r  BASE_PATTERNr  r  rw   r  rF   r   r   r!  r!  q  s     /K::G'GAr   r!  c                   6    \ rS rSrSrSr\S-   rSrS r	S r
Srg	)
KemonoPostExtractori}  z%Extractor for a single kemono.cr postrH   z(/post/([^/?#]+)(/revisions?(?:/(\d*))?)?z/https://kemono.cr/SERVICE/user/12345/post/12345c                 B    US   U l         [        R                  X5        g r
  r  r   s     r   r   KemonoPostExtractor.__init__  r  r   c                    U R                   u    pp4pVU R                  R                  X#U5      nU(       d  U4$ SU l        U R	                  U5      nU(       d  U$ U H  n	[        U	S   5      U:X  d  M  U	4s  $    [        R                  " S5      e)NFr   r   )r  r)   creator_postr   r   rs   r   NotFoundError)
r   rU   rJ   r   post_idr   r   rH   r   r   s
             r   rw   KemonoPostExtractor.posts  s    DHKKA1zHxx$$W'B7N""4(KC3}%&+5v  %%j11r   )r   r  Nr  rF   r   r   r'  r'  }  s$    /KHHG?G.2r   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)KemonoDiscordExtractori  z'Extractor for kemono.cr discord serversdiscord)r   r1  z{server_id} {server}z{channel_id} {channel}z%{id}_{num:>02}_{filename}.{extension}zdiscord_{server_id}_{id}_{num}z+/discord/server/(\d+)[/#](?:channel/)?(\d+)z,https://kemono.cr/discord/server/12345/12345c           
   #     #    U R                   u    pn [        X5      u  pEXS   nUS   US   US   US   US   US   US   US   S.n[
        R                  " S	5      R                  n[
        R                  " [        5      R                  n	U R                  S
5      (       a  SOSn
U R                  S5      S;   a  [        O[        n[        R                  nU R                  S5      =n(       a(  US   S;   a  U R                  R!                  X6S   5      nOU R                  R!                  U5      nU R                  S5      =n(       a  ["        R$                  " X5      nU GHT  n/ nUS    H5  nU	" US   5      nU(       a  US   OSUS'   SUS'   UR'                  U5        M7     U" US   =(       d    S5       H  nUR'                  SU-   USSS.5        M     UR)                  U5        U R+                  US   5      US'   [-        U5      US '   S!=US
'   n[.        R0                  SU4v   [3        US5       GHy  u  US"'   nUS   =US'   nUS   US'   US   nUR5                  S5      =n(       a=  [
        R6                  " UU5        [
        R8                  " U5      nUS#   (       d  UUS#'   O[
        R:                  " UU5        US#   nUU;   a}  U(       d  U" 5       =US
'   nS$US'   U
(       a.   U R                  R=                  U5      nUR)                  U5        OURG                  5       nU[        L a  UUU'   OUR'                  U5        US   S&:X  a  U RH                   S'U 3nO4URK                  U RH                  5      (       a  U RH                   S'US(S   3n[.        RL                  UU4v   GM|     GMW     g ! [         a    [        R                  " S5      ef = f! [         a`  nU R>                  RA                  S%US   UR5                  S5      URB                  RD                  U5        URG                  5       n S nAGNS nAff = f7f))NchannelrW   rN   is_nsfwrb   topicparent_channel_id)server	server_idr3  
channel_idchannel_nsfwchannel_typechannel_topic	parent_idz_https?://(?:cdn\.discordapp.com|media\.discordapp\.net)(/[A-Za-z0-9-._~:/?#\[\]@!$&'()*+,;%=]+)r:   TFr;   >   r<   r=   zorder-postsr   )r    d
post_countr@   r   r_   r   rS   ra   rE   r   zhttps://cdn.discordapp.comrD   )r_   rW   rb   ra   rQ   rT   rl   rF   rm   rf   rj   rk   rI   rc   rd   )'r  discord_server_infor   r   r,  r   r-   r.   rn   r   r*   r<   rp   r   rq   r)   discord_channelrx   ry   r   r   r{   r   r   r   r   r|   r   r   r   rC   r   r   r   r   r   r   r   r   )r   rU   r8  r9  r7  channelsr3  rA   find_inliner   r:   r   r   r4   rw   r   rH   r8   rE   r   r_   r   rC   ra   re   rW   r   rj   r   s                                r   r   KemonoDiscordExtractor.items  s1    &*kk#1	524CF*G
 $F^#D\$V_$T]$Y/$V_$W-$%89	
 gg899@ 	 GGL)//	;;z224 $,= > C !#' 	(([[//E/U1X5KHH,,Z9NOEHH,,Z8EK0090$$U6EDE"=1
!*V"4516U1XB
6"%1
6"Z(	 2
 $DO$9r:&BT&I&*HbJ K ; KK!//[0ABDLJDM/11D}##R--%.ua%8!UT&*6l2Vt#F|V6l88F++4+**46++C0C,,/[)))#t4{+C,&(;H?JZ(=#,DL2&*hhmmD&9G#NN40 #'))+$,.5d+%,,W5q6S=!YYKuSE2C^^DII..!YYKuSXJ7Ckk3,,O &9% ?  	5)))44	5N  ) 2 HH,,!015dTXXf=M # 6 6= '+iikG2sH   QN< K
Q0,O B Q<!OQ 
Q
*AQ?QQ

QrF   N)r   r   r   r   r   r  r  r  r  r%  r  r  r   r  rF   r   r   r0  r0    s2    1KGM:L2KKKG<G^-r   r0  c                   ,    \ rS rSrSr\S-   rSrS rSr	g)KemonoDiscordServerExtractori  zdiscord-serverz/discord/server/(\d+)z&https://kemono.cr/discord/server/12345c           	   #      #    U R                   S   n[        X5      u  p#UR                  5        H=  nU R                   SU SUS    SUS    3n[        R
                  UUU[        S.4v   M?     g 7f)Nr   /discord/server/rI   rN   #rW   )r7  r3  
_extractor)r  r@  valuesr   r   Queuer0  )r   r8  r7  rB  r3  re   s         r   r   "KemonoDiscordServerExtractor.items
  s~     KKN	.t?(Gii[ 01dm_Agfo%68C--$%4'   )s   A/A1rF   N)
r   r   r   r   r  r%  r  r  r   r  rF   r   r   rF  rF    s    "K55G6G
r   rF  )r   c                     U R                   R                  U5      nUUR                  S5       Vs0 s H	  nUS   U_M     sn4$ s  snf )NrB  rN   )r)   discord_serverr   )extrr8  r7  r3  s       r   r@  r@    sU    XX$$Y/Fzz*--G 	w-   s   Ac                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	KemonoFavoriteExtractori   z!Extractor for kemono.cr favoritesfavoritez+/(?:account/)?favorites()()(?:/?\?([^#]+))?z+https://kemono.cr/account/favorites/artistsc           	   #     ^
#    U R                  5         [        R                  " U R                  S   5      nUR	                  S5      =(       d    U R                  S5      =(       d    SnUR	                  S5      m
UR	                  S5      =(       d    SnUS:X  a  U R                  R                  S5      nT
(       d  Sm
UR                  U
4S	 jUS:H  S
9  U H`  nUS   nUS:X  a  [        US'   U R                   SUS    3nO [        US'   U R                   SU SUS    3n[        R                  Xu4v   Mb     g US:X  a  U R                  R                  S5      nT
(       d  Sm
UR                  U
4S jUS:H  S
9  U H@  n	[        U	S'   U R                   SU	S    SU	S    SU	S    3n[        R                  Xy4v   MB     g g 7f)Nr#  rb   	favoritesartistsortr4   descupdatedc                 <   > U T   =(       d    [         R                  $ rZ   r   r   xrW  s    r   <lambda>/KemonoFavoriteExtractor.items.<locals>.<lambda>4      QtW%9		%9r   r   r   rJ   r1  rJ  rH  rN   rI   rK   rH   	faved_seqc                 <   > U T   =(       d    [         R                  $ rZ   r[  r\  s    r   r^  r_  F  r`  r   rL   rM   )r   r   r  r  r|   r*   r)   account_favoritesrW  rF  r   r  r   rL  r'  )r   r  rb   r4   usersrL   rJ   re   rw   rH   rW  s             @r   r   KemonoFavoriteExtractor.items&  s    

!!$++a.1zz&!IT[[%=Izz&!

7#-v8HH..x8E JJ9 %  2 y/i')ED&!YYK'7T
|DC)<D&!YYKq	T
|DCmmS..  V^HH..v6E"JJ9 %  2 %8\"))Ad9o%6fv,vd4j\;mmS..	  s   GGrF   Nr   r   r   r   r   r  r%  r  r  r   r  rF   r   r   rR  rR     s    +KKKG;G'/r   rR  c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	KemonoArtistsExtractoriP  zExtractor for kemono artistsartistsz/artists(?:\?([^#]+))?zhttps://kemono.cr/artistsc              #   0  ^#    [         R                  " U R                  S   5      nU R                  R	                  5       nUR                  S5      (       a0  US   R                  5       nU Vs/ s H  nUS   U:X  d  M  UPM     nnUR                  S5      (       a=  US   R                  5       nU Vs/ s H  nXTS   R                  5       ;   d  M  UPM     nnUR                  S5      =(       d    SmUR                  S5      =(       d    SnUR                  U4S	 jUS
:g  S9  U H`  nUS   nUS:X  a  [        US'   U R                   SUS    3nO [        US'   U R                   SU SUS    3n[        R                  Xt4v   Mb     g s  snf s  snf 7f)Nr   rJ   r  rW   sort_by	favoritedr4   rX  c                 <   > U T   =(       d    [         R                  $ rZ   r[  )rL   rW  s    r   r^  .KemonoArtistsExtractor.items.<locals>.<lambda>f  s    DJ$;$))$;r   ascra  r1  rJ  rH  rN   rI   rK   )r   r  r  r)   creatorsr|   lowerrW  rF  r   r  r   rL  )	r   r  re  rJ   rL   r  r4   re   rW  s	           @r   r   KemonoArtistsExtractor.itemsV  s    !!$++a.1!!#::i  Y'--/G&+ 4edY72 eE 4 ::c??s!!#A&+ 3ed&\//11 eE 3 zz)$3

7#-v

;!UN 	 	- D9oG)#%A\"#3DJ<@%8\"1WIVDJ<@--** 4
3s+   A+F.F?F/F4FFB>FrF   Nrg  rF   r   r   ri  ri  P  s    &K66G)G+r   ri  c                       \ rS rSrSrS rSS jrS rS r SS jr	 SS	 j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S rSS jrSS jrS rSrg)r(   it  zIInterface for the Kemono API v1.3.0

https://kemono.cr/documentation/api
c                 J    Xl         UR                  S-   U l        SS0U l        g )Nz/apiAcceptztext/css)	extractorr   r   )r   rw  s     r   r   KemonoAPI.__init__z  s#    "NNV+	 *-r   Nc                 6    SnX!US.nU R                  XESS5      $ )Nz	/v1/posts)r  r  r  2   rw   _pagination)r   offsetr  tagsr  r  s         r   rw   KemonoAPI.posts  s&    $7"g>>r   c                 .    SU-   nU R                  U5      $ )Nz	/v1/file/_call)r   	file_hashr  s      r   rC   KemonoAPI.file  s    *zz(##r   c                 (    SnU R                  U5      $ )Nz/v1/creatorsr  )r   r  s     r   rq  KemonoAPI.creators  s    !zz(##r   c                 B    SU SU S3nX5US.nU R                  XgS5      $ )N/v1/rK   z/posts)r  r  r  rz  r{  )r   rJ   r   r}  r  r~  r  r  s           r   r  KemonoAPI.creator_posts  s3    '&F;7"55r   c              #   t   #    U R                  XX4U5       H  nU R                  XUS   5      S   v   M     g 7f)NrN   rH   )r  r+  )r   rJ   r   r}  r  r~  rH   s          r   r  KemonoAPI.creator_posts_expand  sE     &&VD:D##T$Z1179 9:s   68c                 6    SU SU S3nU R                  U5      $ )Nr  rK   z/announcementsr  r   rJ   r   r  s       r   r   KemonoAPI.creator_announcements  s%    '&NCzz(##r   c                 6    SU SU S3nU R                  U5      $ )Nr  rK   z/dmsr  r  s       r   r   KemonoAPI.creator_dms  s%    '&D9zz(##r   c                 6    SU SU S3nU R                  U5      $ )Nr  rK   z	/fancardsr  r  s       r   creator_fancardsKemonoAPI.creator_fancards  s%    '&I>zz(##r   c                 :    SU SU SU 3nU R                  U5      $ )Nr  rK   rM   r  r   rJ   r   r-  r  s        r   r+  KemonoAPI.creator_post  s)    '&F7)Dzz(##r   c                 :    SU SU SU S3nU R                  USS9$ )Nr  rK   rM   z	/commentsFr   r  r  s        r   r   KemonoAPI.creator_post_comments  s/    '&F7)9Mzz(%z00r   c                 :    SU SU SU S3nU R                  USS9$ )Nr  rK   rM   z
/revisionsFr  r  r  s        r   r    KemonoAPI.creator_post_revisions  s/    '&F7):Nzz(%z00r   c                 6    SU SU S3nU R                  U5      $ )Nr  rK   z/profiler  r  s       r   r}   KemonoAPI.creator_profile  s%    '&H=zz(##r   c                 6    SU SU S3nU R                  U5      $ )Nr  rK   z/linksr  r  s       r   creator_linksKemonoAPI.creator_links  s%    '&F;zz(##r   c                 6    SU SU S3nU R                  U5      $ )Nr  rK   z/tagsr  r  s       r   creator_tagsKemonoAPI.creator_tags  s%    '&E:zz(##r   c                 `    SU-   nUc  U R                  U0 S5      $ U R                  U0 SU5      $ )Nz/v1/discord/channel/   )r|  _pagination_reverse)r   r9  r?  r  s       r   rA  KemonoAPI.discord_channel  s>    )J6##Hb#66++Hb#zJJr   c                 .    SU-   nU R                  U5      $ )Nz/v1/discord/channel/lookup/r  r   r8  r  s      r   discord_channel_lookup KemonoAPI.discord_channel_lookup  s    09<zz(##r   c                 .    SU-   nU R                  U5      $ )Nz/v1/discord/server/r  r  s      r   rO  KemonoAPI.discord_server  s    (94zz(##r   c                 0    SnSU0nU R                  X#5      $ )Nz/v1/account/favoritesrb   r  )r   rb   r  r  s       r   rd  KemonoAPI.account_favorites  s    *$zz(++r   c                     Uc  U R                   nO0 U R                   EUEnU R                  R                  U R                  U-   X#SUS9$ )Nzutf-8)r  r   encodingr   )r   rw  request_jsonr   )r   r  r  r   r   s        r   r  KemonoAPI._call  sR    ?llG111G~~**II E + + 	+r   c              #     #    [         R                  " UR                  S5      5      nXUU-  -
  US'    U R                  X5      nUb  UR                  U5      nU(       d  g U S h  vN   [	        U5      U:  a  g US==   U-  ss'   MV   N#7fNr  )r   	parse_intr|   r  r   )r   r  r  batchr   r}  r   s          r   r|  KemonoAPI._pagination  s     

30~-s::h/Dxx}OO4y5 3K5 K  s   A#B%B	&$Bc              #      #    XC-  U-  US'    U R                  X5      nU(       d  g UR                  5         U S h  vN   US   (       d  g US==   U-  ss'   MM   N7fr  )r  r   )r   r  r  r  rl   r   s         r   r  KemonoAPI._pagination_reverse  s^     nu,s::h/DLLNOO#;3K5 K  s   :AAA)rw  r   r   )r   NNrZ   )NNT)rz  N)r   r   r   r   r   r   rw   rC   rq  r  r  r   r   r  r+  r   r   r}   r  r  rA  r  rO  rd  r  r|  r  r  rF   r   r   r(   r(   t  s    
.
?
$$
 266 9=9$$$$11$$$K$$,
+!"!r   r(   )r   commonr   r   rS   r   r   r   r	   r
   rx   r0   r%  r  rn   r   r   r  r!  r'  r0  rF  r@  rR  ri  r(   rF   r   r   <module>r     s    ( & $ $ #  5::9{0i {0|	.
M/ M.	A? 	A2/ 2:h-_ h-V? $ 
 -/o -/`!+_ !+HE! E!r   