
    i,8                     $   S r SSKJrJrJr  SSKJrJ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g)z.Extractors for https://www.hentai-foundry.com/   )	ExtractorMessageDispatch   )textutilz)(https?://)?(?:www\.)?hentai-foundry\.comc                       \ 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 jrS rS rS rS rS rS rSS jrSrg)HentaifoundryExtractor   z'Base class for hentaifoundry extractorshentaifoundry)
{category}{user}z&{category}_{index}_{title}.{extension}z{index}www.hentai-foundry.comzhttps://www.hentai-foundry.com   c                     US   =(       d    SS-   U l         US   U l        [        R                  " X5        SU l        SU l        SU l        g )Nr   zhttps://r   r        )rootuserr   __init__page_url
start_post
start_pageselfmatchs     O/app/mltbenv/lib/python3.13/site-packages/gallery_dl/extractor/hentaifoundry.pyr   HentaifoundryExtractor.__init__   sF    1X+/GG	!H	4'    c                 R    U R                  S5      S:X  a  U R                  U l        g g )Ndescriptionshtml)config_process_description_html_process_descriptionr   s    r   _initHentaifoundryExtractor._init#   s&    ;;~&&0(,(F(FD% 1r   c              #   V  #    U R                  5         U R                  5       n[        R                  " U R	                  5       U R
                  5       HR  nU R                  U5      nUR                  U5        [        R                  SU4v   [        R                  US   U4v   MT     g 7fNr   src)_init_site_filtersmetadatar   advancepostsr   _parse_postupdater   	DirectoryUrl)r   datapost_urlimages       r   itemsHentaifoundryExtractor.items'   s     !}}TZZ\4??CH$$X.ELL##R..++uU|U22	 Ds   B'B)c                     [        XR                  5      u  p#U =R                  U-  sl        U =R                  U-  sl        U$ N)divmodper_pager   r   )r   numpagesr/   s       r   skipHentaifoundryExtractor.skip1   s3    c==15 5 
r   c                     SU R                   0$ )Nr   r   r&   s    r   r-   HentaifoundryExtractor.metadata7       		""r   c                 8    U R                  U R                  5      $ r:   )_paginationr   r&   s    r   r/   HentaifoundryExtractor.posts:   s    ..r   c              #      #    U R                   n U R                  U SU 35      R                  n[        R                  " XRU5       S h  vN   SU;  d  SU;   a  g US-  nMS   N7f)Nz/page/zclass="pager"zclass="last hidden"r   )r   requestr   extract_iter)r   urlbeginendr=   pages         r   rF   "HentaifoundryExtractor._pagination=   sj     oo<<3%vcU 3499D((c:::d*.Ct.K1HC :s   AA%
A#A%c                    [         R                  " U R                  U5      nU R                  U5      R                   n[         R                  " X3R                  S5      5      n[         R                  " UR                  SS5      S   5      [         R                  " U" SS5      5      [         R                  " U" SS5      5      U" SS	5      U R                  U" S
S5      R                  SS5      5      [         R                  " U" SS5      SS5       Vs/ s H  n[         R                  " U5      PM     snU R                  U5      U R                  U" SS5      5      [         R                  " U" SS5      5      [         R                  " U" SS5      5      [         R                  " U" SS5      R                  5       5      [         R                  " U" SS5      5      S.nUS   nSU;   a  [         R                  " U R                  [         R                  " [         R                   " USS5      5      5      US'   [         R                  " [         R                   " USS5      5      US'   [         R                  " [         R                   " USS5      5      US '   O[         R                  " U R                  [         R                  " [         R                   " US!S5      5      5      US'   [         R                  " [         R                   " US"S5      5      US'   [         R                  " [         R                   " US#S5      5      US '   [         R"                  " US   U5      $ s  snf )$z+Collect url and metadata from an image postzid="picBox"/r   r   zclass="imageTitle"><z
/profile">z<div class="boxbody"z<div class="boxfooter"z<div class='picDescript'>z
</section>

class='ratings_box'</div>title=''z
datetime='z>Views</span>z>Vote Score</span>z>Media</span>z>Tags </span>)indextitleartist_bodydescriptionratings
categoriesdateviewsscoremediatagsr\   z<object zname="movie" value=""r+   zname='width' value='widthzname='height' value='heightzsrc="zwidth="zheight=")r   urljoinr   rI   extract_fromrY   	parse_intrsplitunescaper%   replacerJ   _extract_categoriesparse_datetime_isostrip
split_htmlextrnameext_from_url)r   pathrK   rN   rr   rr4   bodys           r   r0   "HentaifoundryExtractor._parse_postH   s   ll499d+||C %%  zz-'@A  >>$++c1*=a*@A==.CS)IJ==lC)@A&(@B44T+\6;&( 7;6G6G%xI12;S7B C 7BDMM!, 7B C33D9224c3JK>>$*DE>>$/CS*IJ==os)C)I)I)KL??4,+ ,!
( G},,tyy$--		,cA3 34 5DK NN499,c,3 4DM!^^DII-s-4 5DN ,,tyy$--		gsA$ 3% &DK NN499T9c+JKDM!^^DIIdJ,LMDN$$T%[$773Cs    Mc                 Z    [         R                  " [         R                  " USS5      5      $ )Nr   )r   rl   remove_html)r   r]   s     r   r%   +HentaifoundryExtractor._process_descriptionr   s     }}T--k2rBCCr   c                 z    UR                  S5      nUR                  SS U5      n[        R                  USU 5      $ )Nz</divr   )rfindstrrp   )r   r]   pos1pos2s       r   r$   0HentaifoundryExtractor._process_description_htmlu   s<      )  $5yyQt,--r   c           	         [         R                  " U5      nU R                  [         R                  " U" SS5      R	                  S5      S   5      [         R                  " U" SS5      5      U R                  U" SS5      R	                  S5      S   S	5      U" S
S5      S.nS HD  n[         R                  " U" SU S3S5      R                  SS5      5      X4R                  5       '   MF     [         R                  " U" SS5      5      R                  SS5      US'   U" SS5      nU R                  U-   US'   [         R                  " UR                  SS5      S   5      US'   U R                  U5      US'   [         R                  " U" SS5      SS5       Vs/ s H  n[         R                  " U5      PM     snUS '   [         R                  " US   U5      $ s  snf )!z$Collect url and metadata for a storyz<div class='titlebar'>z</a>>r   zalt="re   z	>Updated<</span>z	%B %d, %Yzclass='indent'>rR   )r   rZ   authorr`   status)ChaptersWordsCommentsViewsRatingz:</span>,r   zclass='storyDescript'>z<div class="storyRead">rS   rT   r]   zclass="pdfLink" href="r+   rQ   r   rY   r_   rU   rV   rW   rX   r^   )r   ri   r   rl   
rpartitionparse_datetimerj   rm   lowerr   rk   rn   rJ   rs   )r   r"   rr   r4   crt   ru   s          r   _parse_story#HentaifoundryExtractor._parse_storyz   s     &		d(&'22<*S/!'E Fd7C&89++DY-((2
3-;<GI.4
 FA"nnTA3h.&&-gc2&68DO F #mmD$&?-A BBI'DC 	] ,c2ii$&Ut{{3':1'=>W!55d;\595F5Ft!8H-.76> ? 6>4==+ 6> ?Y $$T%[$77?s    Gc           
          U" SS5      R                  S5       Vs/ s H/  n[        R                  " [        R                  " USS5      5      PM1     sn$ s  snf )Nzclass="categoryBreadcrumbs">r   z&raquo;r   rR   )splitr   rl   rr   )r   rr   r   s      r   rn   *HentaifoundryExtractor._extract_categories   sX    <iHy!"#"A dii345"# 	# #s   6Ac                     U R                   U l        U R                  " U40 UD6nUR                  n[        U5      S:  a*  SU;   a$  U R	                  S5        U R                  " U40 UD6nU$ )Ni  s   <div id="entryButtonContainer"F)_request_originalrI   contentlenr,   )r   rK   kwargsresponser   s        r   _request_check%HentaifoundryExtractor._request_check   si    -- <<.v.""w<$1W<##E*||C262Hr   c                    U(       aL  U R                   R                  SU R                  S9(       a#  U R                  U l        U R
                  U l        gU R                  S-   nU R                  USS9  U R                   R                  SU R                  S9nU(       d  U R                  R                  S5        gU R                  S	-   n0 S
S_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SSSS[        R                  " [        R                  " USS5      5      S .EnU R                  US!US"9  g)#z,Set site-internal filters to show all images	PHPSESSID)domainN/?enterAgree=1HEAD)methodYII_CSRF_TOKENz%Unable to update site content filtersz/site/filtersrating_nudity3rating_violencerating_profanityrating_racism
rating_sexrating_spoilersrating_yaoi1rating_yurirating_teenrating_gurorating_furryrating_beastrating_malerating_femalerating_futarating_otherrating_scatdate_new0z%22)rating_incestrating_rapefilter_orderfilter_typer   POST)r   r4   )cookiesgetcookies_domainrI   r   r   r   logwarningr   unquoterr   )r   check_cookiesrK   
csrf_tokenr4   s        r   r,   )HentaifoundryExtractor._init_site_filters   s   T\\--D$7$7 . 9%)\\D"..DLii**S(\\%%T%8%8 & :
HHDEii/)


 
 	

 
 
 
 
 
 
 
 
 
 
 
  !
" #
$ !$ # * # $TYYE5.* !+-
2 	Sd3r   )r%   r   r   rI   r   r   r   r   N)zthumbTitle"><a href="re   )T)__name__
__module____qualname____firstlineno____doc__categorydirectory_fmtfilename_fmtarchive_fmtr   r   r<   r   r'   r7   r?   r-   r/   rF   r0   r%   r$   r   rn   r   r,   __static_attributes__ r   r   r
   r
      sq    1H,M;LK-N+DHG3#/	(8TD.
8:#
+4r   r
   c                   ,    \ rS rSrSr\S-   rSrS rSr	g)HentaifoundryUserExtractor   z*Extractor for a hentaifoundry user profilez/user/([^/?#]+)/profilez0https://www.hentai-foundry.com/user/USER/profilec           	          U R                   nSU R                  -   nU R                  [        U SU 34[        U SU S34[
        U SU 34[        U U S344S5      $ )N/user/z	/pictures/scrapsz/stories/faves/pictures)pictures)r   r   _dispatch_extractorsHentaifoundryPicturesExtractorHentaifoundryScrapsExtractorHentaifoundryStoriesExtractorHentaifoundryFavoriteExtractor)r   r   r   s      r   r7    HentaifoundryUserExtractor.items   s    yy$))#((+vYtf-EF)vYtfG-LM*vXdV-DE+vdV?-KL	*

  	r   r   N)
r   r   r   r   r   BASE_PATTERNpatternexampler7   r   r   r   r   r   r      s    477G@Gr   r   c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	r      z2Extractor for all pictures of a hentaifoundry userr   z+/pictures/user/([^/?#]+)(?:/page/(\d+))?/?$z1https://www.hentai-foundry.com/pictures/user/USERc                 n    [         R                  X5        U R                   SU R                   3U l        g )N/pictures/user/r
   r   r   r   r   r   s     r   r   'HentaifoundryPicturesExtractor.__init__   s*    ''499+_TYYK@r   r   N)r   r   r   r   r   subcategoryr   r   r   r   r   r   r   r   r   r      s     <KKKGAGAr   r   c                   4    \ rS rSrSrSrSr\S-   rSr	S r
Srg	)
r      z,Extractor for scraps of a hentaifoundry userscraps)r   r   Scrapsz/pictures/user/([^/?#]+)/scrapsz8https://www.hentai-foundry.com/pictures/user/USER/scrapsc                 p    [         R                  X5        U R                   SU R                   S3U l        g )Nr   r   r   r   s     r   r   %HentaifoundryScrapsExtractor.__init__   s,    ''499+_TYYKwGr   r   N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s%    6K6M??GHGHr   r   c                   8    \ rS rSrSrSrSrSr\S-   r	Sr
S rS	rg
)r      z5Extractor for favorite images of a hentaifoundry userfavorite)r   r   	Favoriteszf_{user}_{index}z/user/([^/?#]+)/faves/picturesz7https://www.hentai-foundry.com/user/USER/faves/picturesc                 p    [         R                  X5        U R                   SU R                   S3U l        g )Nr   r   r   r   s     r   r   'HentaifoundryFavoriteExtractor.__init__  s,    ''499+VDII;oFr   r   Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s*    ?K9M$K>>GGG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g)HentaifoundryTagExtractori  z/Extractor for tag searches on hentaifoundry.comtag)r   z{search_tags}zt_{search_tags}_{index}z/pictures/tagged/([^/?#]+)z2https://www.hentai-foundry.com/pictures/tagged/TAGc                 n    [         R                  X5        U R                   SU R                   3U l        g )Nz/pictures/tagged/r   r   s     r   r   "HentaifoundryTagExtractor.__init__  +    ''499+%6tyykBr   c                     SU R                   0$ )Nsearch_tagsrB   r&   s    r   r-   "HentaifoundryTagExtractor.metadata  s    tyy))r   r   Nr   r   r   r   r   r   r   r   r   r   r   r   r-   r   r   r   r   r   r     s/    9K3M+K::GBGC*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)HentaifoundryRecentExtractori  z4Extractor for 'Recent Pictures' on hentaifoundry.comrecent)r   zRecent Picturesz{date}z	r_{index}z%/pictures/recent/(\d\d\d\d-\d\d-\d\d)z9https://www.hentai-foundry.com/pictures/recent/1970-01-01c                 n    [         R                  X5        U R                   SU R                   3U l        g )Nz/pictures/recent/r   r   s     r   r   %HentaifoundryRecentExtractor.__init__#  r   r   c                     SU R                   0$ )Nr`   rB   r&   s    r   r-   %HentaifoundryRecentExtractor.metadata'  rD   r   r   Nr  r   r   r   r  r    s/    >K?MKEEGIGC#r   r  c                   8    \ rS rSrSrSrSrSr\S-   r	Sr
S rS	rg
)HentaifoundryPopularExtractori+  z1Extractor for popular images on hentaifoundry.compopular)r   zPopular Picturesz	p_{index}z/pictures/popular()z/https://www.hentai-foundry.com/pictures/popularc                 V    [         R                  X5        U R                  S-   U l        g )Nz/pictures/popular)r
   r   r   r   r   s     r   r   &HentaifoundryPopularExtractor.__init__3  s!    ''4		$77r   r   Nr   r   r   r   r
  r
  +  s)    ;K6MK33G?G8r   r
  c                   H    \ rS rSrSrSrSrSr\R                  r	S r
S rSrg	)
HentaifoundryImageExtractori8  z3Extractor for a single image from hentaifoundry.comr6   z](https?://)?(?:www\.|pictures\.)?hentai-foundry\.com/(?:pictures/user|[^/?#])/([^/?#]+)/(\d+)z=https://www.hentai-foundry.com/pictures/user/USER/12345/TITLEc                 B    [         R                  X5        US   U l        g N   r
   r   rY   r   s     r   r   $HentaifoundryImageExtractor.__init__A      ''41X
r   c              #      #    U R                    SU R                   SU R                   S3nU R                  U5      nU R                  US'   [        R
                  SU4v   [        R                  US   U4v   g 7f)Nr   rQ   r   r   r   r+   )r   r   rY   r0   r   r2   r3   )r   r5   r6   s      r   r7   !HentaifoundryImageExtractor.itemsE  sq     yyk

|>3  *		fU**kk5<..s   A8A:rY   N)r   r   r   r   r   r   r   r   r   r?   r   r7   r   r   r   r   r  r  8  s)    =K<GMG>>D/r   r  c                   :    \ rS rSrSrSrSr\S-   rSr	S r
S rS	rg
)r   iN  z-Extractor for stories of a hentaifoundry userstories	s_{index}z*/stories/user/([^/?#]+)(?:/page/(\d+))?/?$z0https://www.hentai-foundry.com/stories/user/USERc              #     #    U R                  5         [        R                  " U R                  5       U R                  5       HA  nU R                  U5      n[        R                  SU4v   [        R                  US   U4v   MC     g 7fr*   )	r,   r   r.   r  r   r   r   r2   r3   )r   
story_htmlstorys      r   r7   #HentaifoundryStoriesExtractor.itemsU  si     !,,t||~tGJ%%j1E##R..++uU|U22 Hs   BBc                 ^    U R                    SU R                   3nU R                  USS5      $ )N/stories/user/z<div class="storyRow">z</tr></table>)r   r   rF   )r   rK   s     r   r  %HentaifoundryStoriesExtractor.stories\  s0    >$))5%=OOr   r   N)r   r   r   r   r   r   r   r   r   r   r7   r  r   r   r   r   r   r   N  s*    7KKJJG@G3Pr   r   c                   R    \ rS rSrSrSrSr\S-   rSr	\
R                  rS rS rS	rg
)HentaifoundryStoryExtractoria  z#Extractor for a hentaifoundry storyr  r  z/stories/user/([^/?#]+)/(\d+)z<https://www.hentai-foundry.com/stories/user/USER/12345/TITLEc                 B    [         R                  X5        US   U l        g r  r  r   s     r   r   $HentaifoundryStoryExtractor.__init__j  r  r   c              #     #    U R                    SU R                   SU R                   S3nU R                  U R	                  U5      R
                  5      n[        R                  SU4v   [        R                  US   U4v   g 7f)Nr!  rQ   z/x?enterAgree=1r   r+   )	r   r   rY   r   rI   r   r   r2   r3   )r   	story_urlr  s      r   r7   !HentaifoundryStoryExtractor.itemsn  ss     		{.O5	!!$,,y"9">">?U**kk5<..s   BBr  N)r   r   r   r   r   r   r   r   r   r   r   r?   r   r7   r   r   r   r   r$  r$  a  s2    -KK==GLG>>D/r   r$  N)r   commonr   r   r   r   r   r   r   r
   r   r   r   r   r   r  r
  r  r   r$  r   r   r   <module>r+     s    5 0 0 ;C4Y C4L+A  A%; A	H#9 	H
G%; 
G* 6 * ##9 # 
8$: 
8/"8 /,P$: P&/"8 /r   