
    i6                        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g)z+Extractors for https://www.furaffinity.net/   )	ExtractorMessageDispatch   )textutilz;(?:https?://)?(?:www\.|sfw\.)?(?:f[ux]|f?xfu)raffinity\.netc                       \ 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SS jrSS jrS rSrg)FuraffinityExtractor   z%Base class for furaffinity extractorsfuraffinity)
{category}{user!l}z{id}{title:? //}.{extension}z{id}z.furaffinity.net)abzhttps://www.furaffinity.netg      ?Tc                 R    [         R                  " X5        US   U l        SU l        g )Nr       )r   __init__useroffsetselfmatchs     M/app/mltbenv/lib/python3.13/site-packages/gallery_dl/extractor/furaffinity.pyr   FuraffinityExtractor.__init__   s"    4'!H	    c                    U R                  SS5      U l        U R                  S5      S:X  a  [        R                  U l        U R                  S5      nU(       a  US:w  a  US:X  a  SOSU l        OS U l        U R                  (       aG  U R                  U R                  5      (       d  U R                  R                  S	5        S[        l        g g )
NexternalFdescriptionshtmllayoutautooldTz"no 'a' and 'b' session cookies set)configr   strstrip_process_description_new_layout_warningcookies_checkcookies_nameslogwarningr
   )r   r    s     r   _initFuraffinityExtractor._init"   s    J6;;~&&0(+		D%X&f&(.%uTD#D==%%d&8&899  !EF,1 ) r   c              #     #    U R                  5       n[        R                  " U R                  5       U R                  5       H  nU R                  U5      =n(       d  M  U(       a  UR                  U5        [        R                  SU4v   [        R                  US   U4v   U R                  (       d  Mu  [        R                  " US   SS5       H  n[        R                  SU-   U4v   M     M     g 7f)N url_descriptionz
href="http"http)metadatar   advancepostsr   _parse_postupdater   	DirectoryUrlr   r   extract_iterQueue)r   r5   post_idpostr1   s        r   itemsFuraffinityExtractor.items3   s     ==?||DJJL$++>G''00t0KK)''T11kk4;44===#00 0, E%mmVc\4?? E ?s   AC6AC67?C6c                     g N r   s    r   r5   FuraffinityExtractor.metadataA   s    r   c                 0    U =R                   U-  sl         U$ rC   )r   )r   nums     r   skipFuraffinityExtractor.skipD   s    s
r   c                 	   U R                    SU S3n[        R                  " U R                  U5      R                  5      nU R                  c  SU" SS5      ;  U l        U" SS5      nU(       d[  [        R
                  " U" SS	5      =(       d	    U" SS
5      5      R                  S5      S   nU R                  R                  SX5      $ [        R                  n[        R
                  n[        R                  " UU" U5      SU-   S.5      nU R                  (       Ga  [        R                  " U" SS	5      5      US'   U" SS5      S:H  US'   [        R                  " U" SS5      5      US'   U" SS5      R                  5       US'   U" SS5      US'   U" SS5      US'   U" U" U" SS 5      5      5      US!'   U" U" U" S"S 5      5      5      US#'   U" U" U" S$S 5      5      5      US%'   U" U" S&S 5      5      US''   U" U" S(S 5      5      US)'   U" U" SS5      5      US*'   U" U" S+S,5      5      US-'   U" U" S.S,5      5      US/'   U" U" S0S15      5      US2'   U" U" S3S45      5      US5'   / =US6'   n	U" S7S	5      R                  S85       H%  n
U" U
5      =n
(       d  M  U	R                  U
5        M'     GOZS9U" S:S85      ;   US'   [        R                  " U" S;S<5      5      US'   U" SS5      R                  5       US'   U" SS5      US'   U" S=S5      R                  5       US)'   U" S>S5      R                  5       US*'   U" S?S5      R                  5       US-'   U" S@S5      R                  5       US/'   U" U" SAS5      5      US#'   U" U" SBS5      5      US%'   U" U" SCS5      5      US!'   U" U" SDS15      5      US2'   U" U" S3S5      5      US5'   [        R                  " U" SES,5      5      S S SF2   US'   U" SGSH5      US''   U" SISJ5      US'   SKUS6'   U R                   =(       d    US   USL'   U R#                  USM   R                  SN5      S   5      USO'   U R%                  US   5      USP'   SQU SRUR'                  SSF5      SS    ST3USU'   U$ )VNz/view//zhttp-equiv=z<meta >z	href="//dr3   zSystem Messagez
</section>z</table>z . Continue r   z!Unable to download post %s ("%s")z	https://d)idr1   z<h3>Keywords</h3>tagsz submissions"><Scrapsscrapsz<h2><p>z	</p></h2>titleztitle="
artist_urlartistz4class="submission-description user-submitted-links">z*                                    </div>r2   zclass="views">z</span>viewszclass="favorites">	favoriteszclass="comments">commentszclass="rating">ratingz>Category</strong>fa_categorythemez>Species</strong>z</div>speciesz>Gender</strong>genderz<span>xwidthr0   pheightfoldersz<h3>Listed in Folders</h3>z</a>/scraps/zclass="minigallery-titlez<h2>z</h2>z<b>Category:</b>z<b>Theme:</b>z<b>Species:</b>z<b>Gender:</b>z<b>Favorites:</b>z<b>Comments:</b>z<b>Views:</b>z<b>Resolution:</b>zid="keywords">r   z
<img alt=" zK<td valign="top" align="left" width="70%" class="alt1" style="padding:8px">z$                               </td>rD   r   filename.datedescriptionzhttps://t.furaffinity.net/z@600-r   z.jpg	thumbnail)rootr   extract_fromrequestr'   remove_html	partitionr+   r,   	parse_intnameext_from_url
split_htmlunescaper%   splitappendr   parse_timestampr&   rsplit)r   r>   r1   extrpathmsgpirhdatarb   folders              r   r8    FuraffinityExtractor._parse_postH   s   6'!,  c!2!7!78# -T(C5H HDK%""%|4 3%z2 i'+C 88##5wE E ^^$$Tg;%,
 
 ??4#\,3 4DL"#3S9XEDN MM$y+*FGDM!%i!5!;!;!=D!#s^DN#'F<$>D  r$'7"CDEDM "2d+?&K#L MD!"T*=y%I"JKD%6	 BCDN"$T*>	%J"KDtC~.DM &98!DEDO%7 BCDNtHc23DMR.DN(**DOg0,@@EfNZ'6'NN6*N d#=vFF N MM$vw*?@DM!%i!5!;!;!=D!#s^DN"&'93"?"E"E"GD #6<<>DM"#4c:@@BDO!"2C8>>@DN "4(;S#A BD!$'93"?@DtOS9:DMt$8#>?DMR.DN??4 (,, --0qS2DL!,4DN#''(N$PD  !DOyy6D$6V++D,<,F,Fs,KA,NOV"77^8LM]9'% $C 3A 67t=[r   c                 Z    [         R                  " [         R                  " USS5      5      $ )Nr0   )r   rr   rm   )r   rh   s     r   r&   )FuraffinityExtractor._process_description   s     }}T--k2rBCCr   Nc           	   #     #    SnUc  SOSU S3n U R                    SU SU R                   U SU S3	nU R                  U5      R                  nS n[        R                  " USS5       H  nUv   M	     U(       d  g US-  nMs  7f)Nr   r0   z/folder/z/arL   id="sid-r3   )rj   r   rl   r   r<   )r   rx   r}   rH   r1   pager>   s          r   _pagination FuraffinityExtractor._pagination   s     ~XfXR+@YYKqa		{6(!C5BC<<$))DG,,T:sC D 1HC s   BBc              #     #    SU R                    S3nUb  X!-  nU(       a  U R                  U R                  U-   5      R                  n[        R                  " U5      n U" SS5      nU(       d  O([        R
                  " U" SS5      5      U l        Uv   M9  UR                  S5      nUS:  a  [        R                  " USSU5      nM  [        R                  " US	S5      nU(       a  M  g g 7f)
N/favorites/rL   r   r3   zdata-fav-id="ztype="submit">Next</button>r   z<form action="zright" href=")
r   rl   rj   r   rk   ro   _favorite_idfindrextrrw   )r   startrx   r   rw   r>   poss          r   _pagination_favorites*FuraffinityExtractor._pagination_favorites   s     TYYKq)MD<<		D 0166D$$T*Dz3/$(NN43M$N!  ))9:Caxzz$(8#sC99T?C8D ds   C(C.,C.c              #     #    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_nUR                  U5        SU;   a  [        R                  " US   5      US'    U R	                  USUS9R                  nS n[        R
                  " USS5       H  nUv   M	     U(       d  g SU;   a  US==   S-  ss'   OSUS'   Mc  7f)Nz/search/r   r   zorder-by	relevancyzorder-directiondescrangeall
range_fromr0   range_tozrating-general1zrating-maturezrating-adultztype-artz
type-musicz
type-flashz
type-storyz
type-photoztype-poetrymodeextendedPOST)methodr|   r   r3   	next_pageNext)rj   r9   r   ro   rl   r<   )r   queryr1   r|   r   r>   s         r   _pagination_search'FuraffinityExtractor._pagination_search   so    ii*$
q
{
 v
 u	

 r
 r
 s
 s
 s
 s
 s
 s
 s
 s
 s
  z!
& 	EU?>>%-8DL<<F<>CCDG,,T:sC D d"V!$*[! s   CC)r   r'   r&   r   r   r   rC   )__name__
__module____qualname____firstlineno____doc__categorydirectory_fmtfilename_fmtarchive_fmtcookies_domainr*   rj   request_intervalr(   r   r-   r@   r5   rI   r8   r&   r   r   r   __static_attributes__rD   r   r   r
   r
      si    /H.M1LK'NM(DH
2"@N`D 9*&+r   r
   c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	FuraffinityGalleryExtractor   z*Extractor for a furaffinity user's gallerygalleryz$/gallery/([^/?#]+)(?:$|/(?!folder/))z)https://www.furaffinity.net/gallery/USER/c                 $    U R                  S5      $ )Nr   r   rE   s    r   r7   !FuraffinityGalleryExtractor.posts   s    	**r   rD   Nr   r   r   r   r   subcategoryBASE_PATTERNpatternexampler7   r   rD   r   r   r   r      s    4KDDG9G+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
)FuraffinityFolderExtractor   z"Extractor for a FurAffinity folderr}   )r   r   Foldersz{folder_id}{folder_name:? //}z./gallery/([^/?#]+)/folder/(\d+)(?:/([^/?#]+))?z<https://www.furaffinity.net/gallery/USER/folder/12345/FOLDERc                 R    U R                   S   U R                   S   =(       d    SS.$ )Nr   r   r0   )	folder_idfolder_name)groupsrE   s    r   r5   #FuraffinityFolderExtractor.metadata   s'    ;;q>;;q>/R
 	
r   c                 @    U R                  SU R                  S   5      $ )Nr   r   )r   r   rE   s    r   r7    FuraffinityFolderExtractor.posts  s    	4;;q>::r   rD   N)r   r   r   r   r   r   r   r   r   r   r5   r7   r   rD   r   r   r   r      s,    ,KAMNNGLG
;r   r   c                   4    \ rS rSrSrSrSr\S-   rSr	S r
Srg	)
FuraffinityScrapsExtractori  z)Extractor for a furaffinity user's scrapsrR   )r   r   rQ   z/scraps/([^/?#]+)z(https://www.furaffinity.net/scraps/USER/c                 $    U R                  S5      $ )NrR   r   rE   s    r   r7    FuraffinityScrapsExtractor.posts  s    ))r   rD   N)r   r   r   r   r   r   r   r   r   r   r7   r   rD   r   r   r   r     s$    3K8M11G8G*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
)FuraffinityFavoriteExtractori  z,Extractor for a furaffinity user's favoritesfavorite)r   r   	Favoritesz)/favorites/([^/?#]+)(/\d+/(?:next|prev))?z+https://www.furaffinity.net/favorites/USER/c                 >    U R                  U R                  S   5      $ )Nr   )r   r   rE   s    r   r7   "FuraffinityFavoriteExtractor.posts  s    ))$++a.99r   c                 \    [         R                  X5      =n(       a  U R                  US'   U$ )Nfavorite_id)r
   r8   r   )r   r>   r?   s      r   r8   (FuraffinityFavoriteExtractor._parse_post  s-    '33DBB4B"&"3"3Dr   rD   N)r   r   r   r   r   r   r   r   r   r   r7   r8   r   rD   r   r   r   r     s)    6K;MIIG;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)FuraffinitySearchExtractori   z(Extractor for furaffinity search resultssearch)r   Searchz{search}z#/search(?:/([^/?#]+))?/?[?&]([^#]+)z+https://www.furaffinity.net/search/?q=QUERYc                 
   [         R                  X5        [        R                  " US   5      U l        U R
                  (       a?  SU R                  ;  a.  [        R                  " U R
                  5      U R                  S'   g g g )Nr   q)r
   r   r   parse_queryr   r   unquoter   s     r   r   #FuraffinitySearchExtractor.__init__'  sY    %%d2%%eAh/
99DJJ."ll4995DJJsO /9r   c                 <    SU R                   R                  S5      0$ )Nr   r   )r   getrE   s    r   r5   #FuraffinitySearchExtractor.metadata-  s    $**..-..r   c                 8    U R                  U R                  5      $ rC   )r   r   rE   s    r   r7    FuraffinitySearchExtractor.posts0  s    &&tzz22r   )r   N)r   r   r   r   r   r   r   r   r   r   r   r5   r7   r   rD   r   r   r   r      s.    2K8MCCG;G6/3r   r   c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	FuraffinityPostExtractori4  z-Extractor for individual posts on furaffinityr?   z/(?:view|full)/(\d+)z'https://www.furaffinity.net/view/12345/c                 .    U R                   nS U l         U4$ rC   r   )r   r>   s     r   r7   FuraffinityPostExtractor.posts:  s    ))	zr   r   Nr   rD   r   r   r   r   4  s    7K44G7Gr   r   c                   ,    \ rS rSrSr\S-   rSrS rSr	g)FuraffinityUserExtractori@  z'Extractor for furaffinity user profilesz/user/([^/?#]+)z&https://www.furaffinity.net/user/USER/c                     U R                   nU R                  S-   nU R                  [        U SU 34[        U SU 34[
        U SU 344S5      $ )NrL   z	/gallery/rc   r   )r   )rj   r   _dispatch_extractorsr   r   r   )r   baser   s      r   r@   FuraffinityUserExtractor.itemsE  sn    yyyy3(((dV9TF+CD'dV8D6+BC)dV;tf+EF*
 	 	r   rD   N)
r   r   r   r   r   r   r   r   r@   r   rD   r   r   r   r   @  s    1//G6Gr   r   c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	FuraffinityFollowingExtractoriO  z0Extractor for a furaffinity user's watched users	followingz/watchlist/by/([^/?#]+)z.https://www.furaffinity.net/watchlist/by/USER/c              #     #    U R                    SU R                   S3nS[        0n U R                  U5      R                  n[        R
                  " USS5       H%  n[        R                  U R                   U-   U4v   M'     [        R                  " USS5      nUR                  U5      (       a  g U R                   U-   nM  7f)Nz/watchlist/by/rL   
_extractorz	<a href="r3   zaction=")
rj   r   r   rl   r   r<   r   r=   r   endswith)r   r1   r|   r   rx   s        r   r@   #FuraffinityFollowingExtractor.itemsU  s     >$))A667<<$))D))$SAmmTYY%5t;; B ::dJ4D||D!!))d"C s   CCrD   N)r   r   r   r   r   r   r   r   r   r@   r   rD   r   r   r   r   O  s    :K66G>G#r   r   c                   6    \ rS rSrSrSr\S-   rSrS r	S r
Srg	)
FuraffinitySubmissionsExtractorie  z)Extractor for new furaffinity submissionssubmissionsz(/msg/submissions(?:/[^/?#]+)?)z+https://www.furaffinity.net/msg/submissionsc                 j    S U l         U R                  U R                  S   -   nU R                  U5      $ )Nr   )r   rj   r   _pagination_submissions)r   r1   s     r   r7   %FuraffinitySubmissionsExtractor.postsk  s0    	ii$++a.(++C00r   c              #   b  #     U R                  U5      R                  n[        R                  " USS5       H  nUv   M	     UR                  S5      =nS:  a  UR                  S5      =nS:  a  g [        R                  " USSU5      nU R
                  [        R                  " U5      -   nM  7f)Nr   r3   z>Next 48</a>r   z>&gt;&gt;&gt; Next 48 &gt;&gt;zhref=")rl   r   r<   r   r   rj   rr   )r   r1   r   r>   r   rx   s         r   r   7FuraffinitySubmissionsExtractor._pagination_submissionsp  s     <<$))D,,T:sC D yy00A5 II&FGGS1L::dHc37D))dmmD11C s   B-B/r   N)r   r   r   r   r   r   r   r   r   r7   r   r   rD   r   r   r   r   e  s$    3K??G;G1
2r   r   N)r   commonr   r   r   r0   r   r   r   r
   r   r   r   r   r   r   r   r   r   rD   r   r   <module>r      s    2 0 0 MU+9 U+p+"6 +;!5 ;$*!5 *#7  3!5 3(	3 	x)= #$8 #,2&: 2r   