
    iKd                         S r SSKJrJr  SSKJrJrJr  SSKJr  SSK	r	SSK
r
SSKrSr " S	 S
\5      r " S S\5      r " S S\5      r " S S\5      rg)z>Extractors for https://e-hentai.org/ and https://exhentai.org/   )	ExtractorMessage   )textutil	exception)cache    Nz&(?:https?://)?(e[x-]|g\.e-)hentai\.orgc                   r    \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rSrSrS rS rS rS r\" SSS9S 5       rSrg)ExhentaiExtractor   z"Base class for exhentai extractorsexhentai)z
{category}z{gid} {title[:247]}z4{gid}_{num:>04}_{image_token}_{filename}.{extension}z{gid}_{num}z.exhentai.org)ipb_member_idipb_pass_hashzhttps://exhentai.org)g      @g      @zDEFAULT:!DHFc                 D    [         R                  " X5        US   U l        g )Nr   )r   __init__versionselfmatchs     J/app/mltbenv/lib/python3.13/site-packages/gallery_dl/extractor/exhentai.pyr   ExhentaiExtractor.__init__#   s    4'Qx    c                 J   U R                  SS5      nUS:X  a  U R                  S:X  a  SOSS-   nSU-   U l        U R                  S-   U l        SU-   U l        [
        R                  " U 5        U R                  S:w  a&  U R                  R                  S	S
U R                  S9  g g )Ndomainautoexze-z
hentai.orgzhttps://z/api.php.nw1r   )	configr   rootapi_urlcookies_domainr   
initializecookiesset)r   r   s     r   r&   ExhentaiExtractor.initialize'   s    Xv.V"lld2dLF'	yy:-!FlT"<<4LLT3t/B/BC  r   c                     [         R                  " X40 UD6nSUR                  ;  aA  UR                  (       d0  U R                  R                  S5        [        R                  " 5       eU$ )NzCache-Controlz
blank page)r   requestheaderscontentloginfor   AuthorizationError)r   urlkwargsresponses       r   r+   ExhentaiExtractor.request4   sQ    $$T9&9("2"228;K;KHHMM,'..00r   c                    U R                   (       a  [        R                  " S5      eU R                  U R                  5      (       a  gU R                  5       u  pU(       a   U R                  U R                  X5      5      $ U R                  S:X  aN  U R                  R                  S5        SU l        SU l        U R                  R                  SSU R                  S	9  S
U l        S
U l        g)zLogin and set necessary cookieszImage limit reached!Nr   z0No username or cookies given; using e-hentai.orgzhttps://e-hentai.orgz.e-hentai.orgr   r    r!   F)LIMITr   AbortExtractioncookies_checkcookies_names_get_auth_infocookies_update_login_implr   r.   r/   r#   r%   r'   r(   originallimits)r   usernamepasswords      r   loginExhentaiExtractor.login;   s    ::++,BCCd0011!002&&t'7'7'KLL<<4HHMMLM.DI"1DLLT3t/B/BCr   i v r   )maxagekeyargc                    U R                   R                  SU5        SnSS0nSSSUUSS	.nU R                  R                  5         U R	                  US
XES9nUR
                  nSU;  a1  SU;   a  [        R                  " S5      e[        R                  " 5       eU R                  S-   nU R	                  U5      nUR                  (       a  U R	                  U5        U R                  $ )NzLogging in as %sz7https://forums.e-hentai.org/index.php?act=Login&CODE=01Refererz0https://e-hentai.org/bounce_login.php?b=d&bt=1-1r    dz1-1zLogin!)
CookieDatebbtUserNamePassWordipb_login_submitPOSTmethodr,   datas   You are now logged in as:s%   The captcha was not entered correctlyz&CAPTCHA required. Use cookies instead./favorites.php)
r.   r/   r'   clearr+   r-   r   AuthenticationErrorr#   history)r   r?   r@   r1   r,   rQ   r3   r-   s           r   r<   ExhentaiExtractor._login_implO   s    ((3GI
    (
 	<<FG<O""'w677B33<> >//11 ii**<<$LL||r   )r$   r%   r>   r=   r#   r   N)__name__
__module____qualname____firstlineno____doc__categorydirectory_fmtfilename_fmtarchive_fmtr%   r9   r#   request_intervalciphersr6   r   r&   r+   rA   r	   r<   __static_attributes__ r   r   r   r      sh    ,H9MILK$N6M!D!GE D( (1%  & r   r   c                       \ 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 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 rS rS r S r!S&S jr"S  r#S! r$S" r%S# r&S$r'g)'ExhentaiGalleryExtractors   z/Extractor for image galleries from exhentai.orggalleryzQ(?:/(?:g|mpv)/(\d+)/([0-9a-f]{10})(?:/#page(\d+))?|/s/([0-9a-f]{10})/(\d+)-(\d+))z(https://e-hentai.org/g/12345/67890abcde/c                 T   [         R                  X5        [        R                  " US   =(       d    US   5      U l        US   U l        US   U l        [        R                  " US   =(       d    US   S5      U l        S U l        S U l	        S U l
        SU l        S U l        S	U l        g )
Nr                  r   r
   F)r   r   r   	parse_int
gallery_idgallery_tokenimage_token	image_num	key_startkey_showkey_nextcountrQ   mpvr   s     r   r   !ExhentaiGalleryExtractor.__init__{   s    ""4/..q)=U1X>"1X 8a(<E!Ha@
	r   c                 b   U R                  S5      nUS:X  a  U R                  U l        OUS:X  a  U R                  U l        U R                  SS5      nU(       a!  UR                  [
        L a  X l        SU l        OSU l        U R                  SS5      U l        U R                  S	S
5      U l	        g )Nsourcehitomimetadatar>   Fr
   zfallback-retriesr   r=   T)
r"   _items_hitomiitems_items_metadata	__class__intr>   _limits_remainingfallback_retriesr=   )r   rz   r>   s      r   _initExhentaiGalleryExtractor._init   s    X&X++DJz!--DJXu-f&&#- K%&D"DK $,> BJ5r   c                    U R                   (       d  g U R                  (       aK  U R                  R                  SU R                  U R
                  U R                  U R                   S   5        g U R                   R                  S5      =n(       a@  U R                  R                  SU R                  XR
                  U R                   S   5        g g )NzYUse '%s/mpv/%s/%s/#page%s' as input URL to continue downloading from the current positionnumrq   zRUse '%s/s/%s/%s-%s' as input URL to continue downloading from the current position)rQ   rw   r.   r/   r#   ro   rp   get)r   tokens     r   finalize!ExhentaiGalleryExtractor.finalize   s    yy88HHMM N))T__d6H6H))E*, iimmM22U2HHMM N))UOOTYYu=MO 3r   c                     U R                   S-   nU R                  U R                  SS.nUSSS.nU R                  USX4S9  g )	Nz/gallerypopups.phpaddfav)gidtactzApply Changesr    )favcatapplyupdaterN   )rP   paramsrQ   )r#   ro   rp   r+   )r   slotr1   r   rQ   s        r   favorite!ExhentaiGalleryExtractor.favorite   sQ    ii..??%%
 &

 	SBr   c              #     #    U R                  5         U R                  (       a  U R                  5       nU R                  (       dp  [        R
                  " USS5      U l        U R                  (       d2  U R                  R                  SU5        [        R                  " S5      eU R                  5       nOU R                  5       n[        R
                  " USS5      nU(       d2  U R                  R                  SU5        [        R                  " S5      eUR                  S5      S   U l        U R                  5       nU R                  U5      =U l        n[        R                  " US	   5      U l        ["        R$                  S
U4v   U R                  (       a  U R'                  5       nO5[(        R*                  " U R-                  W5      4U R/                  5       5      nU Hv  u  pgUR1                  U5        U R2                  (       a  U R5                  U5        SU;   a  U R6                  US'   OS US'   U R8                  US'   ["        R:                  Xd4v   Mx     U R=                  S5      nUb  U R?                  U5        S U l        g 7f)Nzhentai.org/s/"Page content:
%sz%Failed to extract initial image tokenzhentai.org/g/zFailed to extract gallery token/r   	filecount /fullimg_http_validate_http_signaturefav) rA   rp   _gallery_pagerw   r   extrrq   r.   debugr   r7   _image_pagesplitget_metadatarQ   rn   rv   r   	Directoryimages_from_mpv	itertoolschainimage_from_pageimages_from_apir   r>   _limits_check_validate_response_validate_signatureUrlr"   r   )	r   gpageipagepartrQ   imagesr1   imager   s	            r   r~   ExhentaiGalleryExtractor.items   s    

&&(E88#'99UOS#I ''HHNN#6>#33?A A((*$$&E99UOS9D2E://57 7!%C!3D&&(E,,U33	D^^D$56
T))88))+F__%%e,.0D0D0FHF !JCKK{{""4(S )-)@)@%&)-%&&*&>&>D"#++s(( ! kk% ?MM#	s   J	Jc              #      #    U R                  SS5      (       a(  U R                  5       nU R                  US   5      US'   O0 nSSKJn  SU R
                   S3nX!S	'   [        R                  X14v   g 7f)
Nr|   Fposteddater   )HitomiGalleryExtractorzhttps://hitomi.la/galleries/z.html
_extractor)r"   metadata_from_apiparse_timestampr{   r   ro   r   Queue)r   rQ   r   r1   s       r   r}   &ExhentaiGalleryExtractor._items_hitomi   sn     ;;z5))))+D//X?DLD2,T__,=UC3\mmS&&s   A1A3c              #   R   #    [         R                  SU R                  5       4v   g 7f)Nr   )r   r   r   r   s    r   r   (ExhentaiGalleryExtractor._items_metadata   s!     T%;%;%===s   %'c                    U R                  U5      nU R                  SS5      (       a6  UR                  U R                  5       5        U R	                  US   5      US'   U R                  SS5      (       am  [
        R                  " [        5      nUS    H*  nUR                  S5      u  pVnX5   R                  U5        M,     UR                  5        H  u  pXXSU-   '   M     U$ )zExtract gallery metadatar|   Fr   r   tags:tags_)metadata_from_pager"   r   r   r   collectionsdefaultdictlist	partitionappendr~   )	r   pagerQ   r   tagtype_valuevaluess	            r   r   %ExhentaiGalleryExtractor.get_metadata   s    &&t,;;z5))KK..01//X?DL;;vu%%**40DF|!$s!3
!!%( $ !%

'-Wt^$ !-r   c           	      $   [         R                  " U5      nU" SS5      =n(       a  X0l        0 SU R                  _SU R                  _SU" SS5      _S[         R
                  " U" S	S
5      5      _S[         R
                  " U" SS
5      5      _SU" SS5      _SU" SS5      _SU" SS5      _SU R                  U" SS5      5      _SU" SS5      _SSU" SS5      :g  _SU" SS5      _S [         R                  " U" S!S5      R                  S"5      5      _S#U" S$S5      _S%U" S&S5      _S'U" S(S5      _S)U" S*S5      _nUS   nU(       a8  US+   S:X  a/  [         R
                  " [         R                  " USS5      5      US'   US%   S+   nUS,:X  a  S-US%'   OUS.:X  a  S/US%'   [        R                  " US   5      US0'   [         R                  " US1S5       Vs/ s H)  n[         R                  " UR                  S2S5      5      PM+     snUS3'   U$ s  snf )4Nzvar api_url = "r   r   r   thumbzbackground:transparent url()titlez<h1 id="gn">z</h1>	title_jpnz<h1 id="gj">r   z<div id="gdc"><div class="cs cteh_category><uploaderz<div id="gdn">z</div>r   z>Posted:</td><td class="gdt2">z</td>parentz'>Parent:</td><td class="gdt2"><a href="expungedYesz>Visible:</td><td class="gdt2">languagez >Language:</td><td class="gdt2"> filesizez!>File Size:</td><td class="gdt2">Bbir   z>Length:</td><td class="gdt2">	favoriteszid="favcount">ratingz
>Average: torrentcountz>Torrent Download (r
   N0Or    langzhentai.org/tag/+r   )r   extract_fromr$   ro   rp   unescapeparse_datetime_isoparse_bytesrstripr   r   language_to_codeextract_iterunquotereplace)r   r   r   r$   rQ   r   fr   s           r   r   +ExhentaiGalleryExtractor.metadata_from_page  s     &,c2272"L
T__
T//
 T"?E
 T]]4+HI	

 T]]4+HI
 T"CSI
 T#s^
 T"2H=
 T44T0'6; <
 T93@
 Ud13'8 8
 T"DcJ
  T--d3S/::@&-I!
$ T"BCH%
& T"2C8'
( T,4)
* T"7=+
0 
#s*#}}TYYxc-JKDa 8 #D#X #D,,T*-=>V ((/@#F
F LLS#./F
V
 
s   0Hc                     SU R                   U R                  44SS.nU R                  U R                  SUS9nSU;   a  [        R
                  " US   5      eUS   S   $ )	Ngdatar   )rP   gidlist	namespacerN   rP   jsonerror	gmetadatar
   )ro   rp   request_jsonr$   r   r7   r   rQ   s     r   r   *ExhentaiGalleryExtractor.metadata_from_api3  sm     ??D,>,>?A
   f4 Hd?++DM::K ##r   c                 L   UR                  S5      S-   n[        R                  " X5      nU" SS5      U l        U" SS5      nU" SS5      R	                  S5      nU" S	S5      n U R
                  (       aZ  U(       aS  U R                  S
-   [        R                  " U5      -   nU R                  U" SS5      5      nU R                  XW5      US'   O2UnU R                  U5      nU R                  XPR                  5      US'    U R                  US'   U" SS5      =US'   U l        XHS'   XXS'   U" SS5      U l        U R)                  U5        U[        R*                  " Xx5      4$ ! [         a7    U R                  R                  SU5        [         R"                  " SW S35      ef = f)z#Get image url and data from webpagez+<div id="i3"><a onclick="return load_image(   'z<img id="img" src="r    nl(r   "'hentai.org/fullimgr   ownload originalr   	_fallbackr    Unable to parse image info for 'r   zvar startkey="z";rq   	_url_1280_nlzvar showkey=")indexr   r   ru   stripr=   r#   r   _parse_original_info_fallback_original_parse_image_info_fallback_1280rr   
IndexErrorr.   r   r   r7   rs   rt   
_check_509nameext_from_url)	r   r   posr   iurlnlorigr1   rQ   s	            r   r   (ExhentaiGalleryExtractor.image_from_page@  s   jjFG"L  +S#)3/&#$$U+(#.	;}}ii*,t}}T/BB006H#1NO$($;$;B$D[!--c2$($7$7NN$K[! nnU/34Dd/KK]dn [U_d3D))#444  	;HHNN.5++23%q9; ;	;s   $A*E" 1E" "AF#c           	   #     #    U R                   nU R                  nSU R                  SUU R                  S.n[	        U R
                  S-   U R                  S-   5       GH  US'   U R                  USUS9nUS   nUS	   nUn[        R                  " US
S
5      u  p([        R                  " USSU5      u  p[        R                  " USSU5      u  pU
=(       d    SR                  S5      n
 UR                  S5      nU R                  (       aw  US:  aq  [        R                  " USSU5      u  p[        R                  " U5      nU R                  [        R                  " USSU5      S   5      nU R!                  X5      US'   O,U	nU R#                  U5      nU R%                  XS   U5      US'    US   US'   X}S'   XS'   XS'   U R1                  U	5        U[        R2                  " X5      4v   X#S'   GM     g! [&         a7    U R(                  R+                  SU5        [,        R.                  " SW S
35      ef = f7f)z%Get image url and data from api callsshowpager
   )rP   r   r   imgkeyshowkeyr   r   rN   r   i3i6r  zid="img" src="r   r  r   r   r  r  r	  r   r
  r   r  r   rq   r  r  r  N)r$   ru   ro   rt   rangerr   rv   r   r   extractr  findr=   rextractr   r  r  r  r  r  r.   r   r   r7   r  r  )r   r$   nextkeyr+   r   r   r!  r  r  imgurlr  origurlr1   rQ   s                 r   r   (ExhentaiGalleryExtractor.images_from_apia  s.    ,,--!}}
  %T^^a%7aHGFO$$WV'$JDdBdBF<<C5LG<<,<c3GLF<<FC=LB(!!%(B?gg23==SAX#'==S#s#CLG--0C44T\\.S6::;6= >D(,(?(?(HD% C11#6D(,(;(;FOV)5D% "&/DK"( &KOOF#t,,S777 'HM  I2  ?2D9//6se1=? ??s-   C)H>,BG:H>+G:0A
H>:AH;;H>c           	   #     #    U R                    SU R                   SU R                   S3nU R                  U5      R                  n[
        R                  " [        R                  " USS5      5      nU R                  nU R                  S-
  nSU R                  SS[        R                  " US	S
5      S.nU(       a  [
        R                  " X55      nU GH0  nUS-  nXVS'   US   =US'   nU R                  USUS9n	 U	S   n
U R                  (       aZ  U	R                  S5      (       aD  SU	S   ;   a;  U R                    SU	S    3n U R                  U	5      nU R'                  U	5      US'   O(U
nU R%                  U5      nU R)                  X5      US'    X[S'   U	S   US'   XS'   XS'   U R3                  U
5        UR                  S5      =n(       a  [        R4                  " X5        O[        R6                  " X5        X4v   GM3     g ! [         a/    U R                   R#                  S5        U R%                  U
5      n Nf = f! [*         a7    U R                   R-                  SU	5        [.        R0                  " SU S35      ef = f7f)!zGet image url and data from MPVz/mpv/r   zvar imagelist = ;r   imagedispatchr
   r   zvar mpvkey = "r   )rP   r   r   r  mpvkeyr   kr  rN   r   ior   lfz(Failed to extract original file metadatar
  r   r  r  r   sr  r  rq   nameN)r#   ro   rp   r+   r   r   
json_loadsr   r$   rr   advancer   r=   r   _parse_mpv_info
ValueErrorr.   warningr  _fallback_mpv_original_fallback_mpv_1280r  r   r   r7   r  nameext_from_namer  )r   r1   r   r   r$   pnumr+   r   r  r/   r'  rQ   r3  s                r   r   (ExhentaiGalleryExtractor.images_from_mpv  so    5 143E3E2FaH||C %%41CS!IJ,,~~!%ooii&6<
 \\&/FEAID"FO).s3GH$$WV'$JD?c==TXXc]]sd3i7G!YYKqd5C>#33D9
 )-(C(CD(ID% C11#6D(,(?(?(ND% Ks)DK &"(OOF#yy((t(&&t2%%c0)OK  & >((FH#55f=>  ?2D9//6se1=? ??sQ   C;J>A	IHI-J.'IA6J6IIIIAJJc                 T   UR                   (       d0  UR                  R                  SS5      R                  S5      (       d  gUR                  nU R
                  R                  SU5        SU;   a  U R                  S5      nUS:X  a  [        R                  " S	5      eUS
:X  a  U R                  S5        UR                  $ U R
                  R                  S5        SU l        U R                  S   $ SU;   a  [        R                  " S5      eU R!                  5         UR                  $ )Nzcontent-typer   z	text/htmlTz'%s'z requires GPgpstopzNot enough GPwaitPress ENTER to continue.z&Falling back to non-original downloadsFr  z temporarily banned zTemporarily Banned)rU   r,   r   
startswithr   r.   r8  r"   r   r7   inputr1   r/   r=   rQ   r0   _limits_exceeded)r   r3   r   r?  s       r   r   +ExhentaiGalleryExtractor._validate_response  s    8#3#3#7#7$$$.J{$;$<}}&T!T"BV|//@@v

56||#HHMMBC!DM99[))!T)../CDD||r   c                     U(       aM  US   =n(       a/  US:X  a(  SR                  USS R                  5       5      (       a  ggU H  nU(       d  M    g   g)	z1Return False if all file signature bytes are zeror
   <   s   <!doctype htmlN   zHTML responseTF)rC  lower)r   	signaturebytes      r   r   ,ExhentaiGalleryExtractor._validate_signature  s]     |#t#2:"3">">!#2,,.#0 #0*!4 " r   c                     SnU R                    Vs0 s HH  nUR                  U R                  :X  d  M  UR                  S:w  d  M1  UR                  UR                  _MJ     snUS'   U R
                  " U40 UD6R                  n[        R                  " USS5      R                  SS5      nU R                  R                  SXPR                  5        U R                  [        R                  " U5      -
  U l        U$ s  snf )	Nzhttps://e-hentai.org/home.phpigneousr'   z<strong>z	</strong>,r   zImage Limits: %s/%s)r'   r   r%   r3  r   r+   r   r   r   r.   r   r>   rn   r   )r   r2   r1   cookier   currents         r   _request_home&ExhentaiGalleryExtractor._request_home  s    - ,,
&}} 3 33 & KK9$ &FKK%&
y ||C*6*// ))D*k:BB3K,g{{C!%t~~g/F!F
s   C;C;C;c                     UR                  S5      (       a,  U R                  R                  U5        U R                  5         g g )N)zhentai.org/img/509.gifzehgt.org/g/509.gif)endswithr.   r   rE  )r   r1   s     r   r  #ExhentaiGalleryExtractor._check_509  s;     << / 0 0HHNN3!!#0r   c                 r   SnU R                  S5      nU(       a  US:X  a!  S[        l        [        R                  " U5      eU R
                  R                  U5        US:X  a"  U R                  S5        U R                  5         g US:X  a  U R                  5         g U R
                  R                  SU5        g )	NzImage limit exceeded!zlimits-actionr@  TrA  rB  resetz"Invalid 'limits-action' value '%s')r"   r   r6   r   r7   r.   r8  rD  _limits_update_limits_resetr   )r   msgactions      r   rE  )ExhentaiGalleryExtractor._limits_exceeded  s    %_-6)&*#++C00VJJ12!w HHNN?Hr   c                     U R                   (       a  US   S-  S:X  a  U R                  5         U =R                   US   -  sl         U R                   S::  a  U R                  5         g g )Nr      r
   cost)r   rZ  rE  r  s     r   r   &ExhentaiGalleryExtractor._limits_check!  s[    %%er)9Q)>!$v,.!!Q&!!# 'r   c                 `    U R                   R                  S5        U R                  SSS0SS9  g )NzResetting image limitsrN   zContent-Typez!application/x-www-form-urlencodeds   reset_imagelimit=Reset+QuotarO   )r.   r/   rS  r   s    r   r[  &ExhentaiGalleryExtractor._limits_reset(  s5    ./#%HI0 	 	2r   c                    U R                    SU R                   SU R                   S3nU R                  USS9nUR                  nUR
                  S:X  a  SU;   a  [        R                  " 5       eUR                  S5      (       a  [        R                  " S5      eUR                  S	5      S
:  a*  U R                  c  [        R                  " S5      eSU l        U$ )Nz/g/r   Ffatali  zGallery Not Available)zKey missingzGallery not foundrg   zhentai.org/mpv/r   z('/s/' URLs in MPV mode are not supportedT)r#   ro   rp   r+   r   status_coder   r0   rC  NotFoundErrorrv   r7   rw   )r   r1   r3   r   s       r   r   &ExhentaiGalleryExtractor._gallery_page1  s    3t/q1C1C0DAF<<5<1}}3&+Bd+J..00???@@)))44::'(1,!!)//>@ @DHr   c                     U R                    SU R                   SU R                   SU R                   3nU R	                  USS9R
                  nUR                  S5      (       a  [        R                  " S5      eU$ )N/s/r   -Frf  zInvalid pagezKeep tryingz
image page)	r#   rq   ro   rr   r+   r   rC  r   ri  )r   r1   r   s      r   r   $ExhentaiGalleryExtractor._image_pageA  st    ))C 0 014??#1T^^$46||Cu|-22??:;;)),77r   c              #   p   #    U SU 3n[         R                  " U R                  5       H  nUv   M	     g 7f)N?nl=)r   repeatr   )r   r  fullimgr1   r   s        r   r  +ExhentaiGalleryExtractor._fallback_originalJ  s3     	bT"T223AI 4s   46c              #      #    U R                    SUS    SUS    3n[        R                  " U R                  5       H  nUv   M	     g 7f)Nr   r1  rq  r2  )r#   r   rr  r   )r   r/   r1   r   s       r   r9  /ExhentaiGalleryExtractor._fallback_mpv_originalO  sE     1T$ZLT#YK8T223AI 4s   AA	Nc           
   #   d  #    U(       d  U R                   n[        R                  " U R                  5       Hu  nU R                   SU SU R
                   SU SU 3	nU R                  USS9R                  nUR                  S5      (       a    g U R                  U5      u  pWUv   US   nMw     g 7f)	Nrl  r   rm  rq  Frf  rn  r  )
rs   r   rr  r   r#   ro   r+   r   rC  r   )r   r  r   r   r   r1   r   rQ   s           r   r  'ExhentaiGalleryExtractor._fallback_1280T  s     NNET223AYYKs5'4??*;1SEbTJC<<5<166D>??,,T2ICIeB 4s   B.B0c              #      #    [         R                  " U R                  5       H-  nUS   US'   U R                  U R                  SUS9nUS   v   M/     g 7f)Nr2  r  rN   r   r/  )r   rr  r   r   r$   )r   r/   r+   r   s       r   r:  +ExhentaiGalleryExtractor._fallback_mpv_1280c  sO     T223A IGDM$$T\\&w$ODs)O 4s   AAc                    UR                  S5      SS   H  n UR                  S5      u  p4pVn  O   S=n=pVS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.$ ! [         a     Mr  f = f)Nr   rl   rm  r
   r   ra  sizewidthheight)r   r7  r   rn   )r   r1   r   r   r}  r~  r  s          r   r  *ExhentaiGalleryExtractor._parse_image_infoi  s    IIcN12&D,0JJsO) ' %&%D%5 nnT*nnU+nnV,	
 	
  s   A::
BBc                 "   UR                  5       R                  S5      n[        R                  " US   US   S   -   5      nS[        R
                  " US-  5      -   U[        R                  " US   5      [        R                  " US   5      S.$ )	Nr   rj   rl   r
   r   順 r   r|  )lstripr   r   r   mathceilrn   )r   r/   partsr}  s       r   r  -ExhentaiGalleryExtractor._parse_original_infoz  s}    ##C(a58A; 67 $))D7N33nnU1X.nnU1X.
 	
r   c                     US   R                  5       u    p#p$pVn[        R                  " XVS   -   5      nS[        R                  " US-  5      -   U[        R
                  " U5      [        R
                  " U5      S.$ )Nr0  r
   r   r  r|  )r   r   r   r  r  rn   )r   r/   r   whr2  ur}  s           r   r6  (ExhentaiGalleryExtractor._parse_mpv_info  so    !%c!21qQaD) $))D7N33nnQ'nnQ'
 	
r   )r   r$   rv   rQ   r   ro   rp   rr   rq   r~   ru   rt   rs   r>   rw   r=   )r   N)(rW   rX   rY   rZ   r[   subcategoryBASE_PATTERNpatternexampler   r   r   r   r~   r}   r   r   r   r   r   r   r   r   r   rS  r  rE  r   r[  rZ  r   r   r  r9  r  r:  r  r  r6  rb   rc   r   r   re   re   s   s    9K22G 9G6"OC.`
'>.`$5B2(h7r4"$I"$2 #N 


"



r   re   c                   <    \ rS rSrSrSr\S-   rSrS r	S r
S rS	rg
)ExhentaiSearchExtractori  z%Extractor for exhentai search resultssearchz/(?:\?([^#]*)|tag/([^/?#]+))z$https://e-hentai.org/?f_search=QUERYc                    [         R                  X5        U R                  u  p#nU(       aC  SU;   a-  UR                  S5      u  pRnU SUR	                  SS5       S3nOUS-  nUSS.U l        g [        R                  " U5      U l        S	U R
                  ;  a=  [        R                  " U R
                  R                  S
5      5      U R
                  S
'   g g )Nr   r   z:"r   z$"$r
   )f_searchr   nextr   )
r   r   groups
rpartitionr   r   r   parse_queryrn   r   )r   r   r   queryr   nss         r   r    ExhentaiSearchExtractor.__init__  s    ""4/#cz ^^C0
sCC 56c:s
'*A6DK**51DKT[[(&*nnT[[__V5L&MF# )r   c                 &    U R                   U l        g r  r#   
search_urlr   s    r   r   ExhentaiSearchExtractor._init  s    ))r   c              #     #    U R                  5         S[        0nU R                  nU R                  n S nU R	                  X#S9R
                  n[        R                  R                  U5       HM  nUS   nXt:X  a  M  Un[
        R                  " US   5      US'   US   US'   [        R                  US-   U4v   MO     [
        R                  " US	S
S 5      nUb  U(       d  g UnS nOSU;   d  SU;   a  g US==   S-  ss'   M  7f)Nr   )r   r
   r   ro   rj   rp   r   z	nexturl="r   zclass="ptdd">&gt;<z>No hits found</p>r   r   )rA   re   r  r   r+   r   r  finditerrn   r   r   r   )	r   rQ   r  r   lastr   r   r1   next_urls	            r   r~   ExhentaiSearchExtractor.items  s    

67__
D<<
<:??D199BB4HAh;%)^^E!H%=\"(-a_%mmS3Y44 I yy{C>H#%
%-1E1Mv!#/ s   DD)r   r  N)rW   rX   rY   rZ   r[   r  r  r  r  r   r   r~   rb   rc   r   r   r  r    s*    /K<<G4GN $$r   r  c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	ExhentaiFavoriteExtractori  z*Extractor for favorited exhentai galleriesr   z/favorites\.php(?:\?([^#]*)())?z"https://e-hentai.org/favorites.phpc                 ,    U R                   S-   U l        g )NrR   r  r   s    r   r   ExhentaiFavoriteExtractor._init  s    ))&66r   )r  N)rW   rX   rY   rZ   r[   r  r  r  r  r   rb   rc   r   r   r  r    s    4K??G2G7r   r  )r[   commonr   r   r   r   r   r   r	   r   r   r  r  r   re   r  r  rc   r   r   <module>r     s_    E & $ $    8[	 [|]
0 ]
@6$/ 6$r7 7 7r   