
    iD                     B   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
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S9S 5       r\	" SS9S 5       rg )!z$Extractors for https://mangadex.org/   )	ExtractorMessage   )textutil	exception)cachememcache    )defaultdictz,(?:https?://)?(?:www\.)?mangadex\.(?:org|cc)c                   d    \ rS rSrSrSrSrSrSrSr	\
R                  r0 rS rS	 rS
 r\rS rSrg)MangadexExtractor   z"Base class for mangadex extractorsmangadex)
{category}{manga}z;{volume:?v/ />02}c{chapter:>03}{chapter_minor}{title:?: //}z<{manga}_c{chapter:>03}{chapter_minor}_{page:>03}.{extension}z{chapter_id}_{page}zhttps://mangadex.orgc                 L    U R                   S   U l        [        U 5      U l        g )Nr   )groupsuuidMangadexAPIapiselfs    J/app/mltbenv/lib/python3.13/site-packages/gallery_dl/extractor/mangadex.py_initMangadexExtractor._init    s    KKN	t$    c              #      #    U R                  5        HT  nUS   nU R                  U5      n[        US'   X0R                  U'   [        R
                  U R                   SU 3U4v   MV     g 7f)Nid
_extractor	/chapter/)chapters
_transformMangadexChapterExtractor_cacher   Queueroot)r   chapterr   datas       r   _items_chapters!MangadexExtractor._items_chapters$   sb     }}G4=D??7+D!9D $KK--DII;iv!>DD 's   A*A,c              #      #    S[         0nU R                  5        H+  nU R                   SUS    3n[        R                  X14v   M-     g 7fNr    /title/r   )MangadexMangaExtractormangar'   r   r&   )r   r)   r0   urls       r   _items_mangaMangadexExtractor._items_manga,   sG     45ZZ\EYYKwuT{m4C--** "s   A	Ac                 F   [        [        5      nUS    H  nX#S      R                  U5        M     US   nUR                  S5      =n(       a  UR	                  S5      S   nUS   (       a  US   R	                  S5      u  pgnOS	u  pgn0 [        XS
   S   S   5      EUS   [        R                  " US   5      [        R                  " U5      Xx-   US   U R                  US   5      US    V	s/ s H  n	U	S   S   PM     sn	UUS   UR                  S5      S.
E$ s  sn	f )Nrelationshipstype
attributestranslatedLanguage-r   r(   .)r    r;   r0   r   titlevolume	publishAtscanlation_groupnamepagesexternalUrl)
r<   r=   r(   chapter_minor
chapter_iddategrouplangcount_external_url)	r   listappendget	partition_manga_infor   	parse_intparse_datetime_iso)
r   r(   r5   itemcattributesrG   chnumsepminorrF   s
             r   r#   MangadexExtractor._transform4   sI   #D)O,Dv,'..t4 - l+??#78848>>#&q)Dy! +I 6 @ @ EE )E
$g 6q 9$ ?@
#G,{8'<=u- [!$-//K0HI&34F&GI&GU |,V4&GI#G,(__];
 	
Is   1D)r   r   N)__name__
__module____qualname____firstlineno____doc__categorydirectory_fmtfilename_fmtarchive_fmtr'   r   USERAGENT_GALLERYDL	useragentr%   r   r*   r2   itemsr#   __static_attributes__ r   r   r   r      sS    ,HGM 	G 'K!D((IF%E+ E
r   r   c                   B    \ rS rSrSrSrSrSrSr\	S-   r
SrS	 rS
 rSrg)MangadexCoversExtractorR   z#Extractor for mangadex manga coverscovers)r   r   Coversz{volume:>02}_{lang}.{extension}zc_{cover_id}zD/(?:title|manga)/(?!follows|feed$)([0-9a-f-]+)(?:/[^/?#]+)?\?tab=artzGhttps://mangadex.org/title/01234567-89ab-cdef-0123-456789abcdef?tab=artc              #   \  #    U R                    SU R                   S3nU R                  R                  U R                  5       Hc  nU R	                  U5      nUS   n[
        R                  " XC5        US   US'   [        R                  SU4v   [        R                  X-   U4v   Me     g 7f)Nz/covers//coverfilenamecover_idr;   )
r'   r   r   covers_manga_transform_coverr   nameext_from_urlr   	DirectoryUrl)r   baserl   r)   r@   s        r   rb   MangadexCoversExtractor.items]   s     ))HTYYKq1XX**4995E((/D=D!!$-#J/D##R--++t{D00 6s   B*B,c           	      D   [        [        5      nUS    H  nX#S      R                  U5        M     US   n0 [        XS   S   S   5      EUS   UR	                  S5      [
        R                  " US	   5      U R                  US
   5      U R                  US   5      S.E$ )Nr5   r6   r7   r0   r   r   fileNamelocaler=   	createdAt	updatedAt)rl   rG   r=   rE   date_updated)r   rJ   rK   rN   rL   r   rO   rP   )r   rl   r5   rQ   rR   s        r   rp   (MangadexCoversExtractor._transform_coverg   s    #D)/*Dv,'..t4 +L)
$g 6q 9$ ?@
#J/#1{8'<=//K0HI 33K4LM
 	
r   rd   N)rW   rX   rY   rZ   r[   subcategoryr]   r^   r_   BASE_PATTERNpatternexamplerb   rp   rc   rd   r   r   rf   rf   R   s9    -K7M4L K ) )G?G1
r   rf   c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	r$   w   z.Extractor for manga-chapters from mangadex.orgr(   z/chapter/([0-9a-f-]+)zAhttps://mangadex.org/chapter/01234567-89ab-cdef-0123-456789abcdefc              #   6  #     U R                   R                  U R                  5      nUR                  S5      (       a2  US   (       d(  [        R                  " SUS    US    SUS    S35      e[        R                  SU4v   U R                  S	S
5      (       a  S	nSnOS=p4U R                  R                  U R                  5      nUS   nUS    SU SUS    S3nU R                  S5      (       a  [        R                  O[         nU" X$   S5       H6  u  US'   n["        R$                  " X15        [        R&                  Xc-   U4v   M8     g ! [         a:    U R                  R                  U R                  5      nU R                  U5      n GNlf = f7f)NrI   rH   zChapter r(   rC   z] is not available on MangaDex and can instead be read on the official publisher's website at r:   r;   z
data-saverF	dataSaverr)   baseUrlrk   hashzpage-reverser   page)r%   popr   KeyErrorr   r(   r#   rL   r   AbortExtractionr   rr   configathome_serverr   enumerate_reversed	enumerater   rq   rs   )r   r)   r(   pathkeyserverrt   enums           r   rb   MangadexChapterExtractor.items~   s    	,;;??499-D
 88O$$T']++4	?+D,A+B C3373H2ILM M
 T));;|U++DCD''		2##$AdV1WV_,=Q?*.+++ +t&&!* 	"&w|Q"7DL$!!$-++t{D00 #81  	,hh&&tyy1G??7+D	,s)   F%E D)FA FFFFrd   NrW   rX   rY   rZ   r[   r}   r~   r   r   rb   rc   rd   r   r   r$   r$   w   s!    8K55G7G1r   r$   c                   6    \ rS rSrSrSr\S-   rSrS r	S r
Srg	)
r/      z%Extractor for manga from mangadex.orgr0   z./(?:title|manga)/(?!follows|feed$)([0-9a-f-]+)z?https://mangadex.org/title/01234567-89ab-cdef-0123-456789abcdefc                     U R                  5       nU R                  SS5      (       aK  SS KnU R                   SU R                   S3nS[
        0nUR                  [        R                  X444U5      nU$ )Nrh   Fr   r.   z?tab=artr    )	r*   r   	itertoolsr'   r   rf   chainr   r&   )r   rb   r   r1   r)   s        r   rb   MangadexMangaExtractor.items   sj    $$&;;x''YYKwtyyk:C "9:DOOgmmS%?$A5IEr   c                 L    U R                   R                  U R                  5      $ N)r   
manga_feedr   r   s    r   r"   MangadexMangaExtractor.chapters   s    xx""499--r   rd   N)rW   rX   rY   rZ   r[   r}   r~   r   r   rb   r"   rc   rd   r   r   r/   r/      s&    /KNNG7G.r   r/   c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	MangadexFeedExtractor   z-Extractor for chapters from your Updates Feedfeedz/titles?/feed$()zhttps://mangadex.org/title/feedc                 6    U R                   R                  5       $ r   )r   user_follows_manga_feedr   s    r   r"   MangadexFeedExtractor.chapters   s    xx//11r   rd   N)rW   rX   rY   rZ   r[   r}   r~   r   r   r"   rc   rd   r   r   r   r      s    7K00G/G2r   r   c                   H    \ rS rSrSrSr\S-   rSr\	R                  rS rSrg)	MangadexFollowingExtractor   z.Extractor for followed manga from your Library	followingz/titles?/follows(?:\?([^#]+))?$z"https://mangadex.org/title/followsc                 6    U R                   R                  5       $ r   )r   user_follows_mangar   s    r   r0    MangadexFollowingExtractor.manga   s    xx**,,r   rd   N)rW   rX   rY   rZ   r[   r}   r~   r   r   r   r2   rb   r0   rc   rd   r   r   r   r      s*    8K??G2G**E-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
)MangadexListExtractor   zExtractor for mangadex MDListsrJ   z//list/([0-9a-f-]+)(?:/[^/?#]*)?(?:\?tab=(\w+))?zChttps://mangadex.org/list/01234567-89ab-cdef-0123-456789abcdef/NAMEc                 r    US   S:X  a  SU l         OU R                  U l        [        R	                  X5        g )Nr   r   z	list-feed)r}   r2   rb   r   __init__)r   matchs     r   r   MangadexListExtractor.__init__   s1    8v*D**DJ""4/r   c                 L    U R                   R                  U R                  5      $ r   )r   	list_feedr   r   s    r   r"   MangadexListExtractor.chapters   s    xx!!$)),,r   c                     U R                   R                  U R                  5      S    Vs/ s H  nUS   S:X  d  M  UPM     sn$ s  snf )Nr5   r6   r0   )r   rJ   r   )r   rQ   s     r   r0   MangadexListExtractor.manga   sK     dii0A
AF|w& A
 	
 
s
   AA)rb   r}   N)rW   rX   rY   rZ   r[   r}   r~   r   r   r   r"   r0   rc   rd   r   r   r   r      s.    (KABG<G0-
r   r   c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	MangadexAuthorExtractor   zExtractor for mangadex authorsauthorz/author/([0-9a-f-]+)zEhttps://mangadex.org/author/01234567-89ab-cdef-0123-456789abcdef/NAMEc              #      #    U R                   R                  U R                  5       H4  n[        US'   U R                   SUS    3n[
        R                  X!4v   M6     g 7fr-   )r   manga_authorr   r/   r'   r   r&   )r   r0   r1   s      r   rb   MangadexAuthorExtractor.items   sS     XX**4995E"8E,YYKwuT{m4C--++ 6s   AA!rd   Nr   rd   r   r   r   r      s!    (K44G<G,r   r   c                       \ rS rSrSrS rS rSS jrS rS r	S r
S	 r\" S
S9S 5       rS rS rS rS rS r\" SS
S9S 5       r\" SS
S9S 5       rSS jrSS jrSS jrSS jrSS jrSrg)r      zBInterface for the MangaDex API v5

https://api.mangadex.org/docs/
c                    Xl         S U l        0 U l        UR                  5       u  U l        U l        U R                  (       aY  UR                  S5      =U l        nUR                  S5      U l        U(       a  U R                  U l
        O'U R                  U l
        O[        R                  U l        UR                  S5      nUc  SU l        g [        R                   " U5      R#                  S5      U l        g )Nz	client-idzclient-secretz
api-serverzhttps://api.mangadex.orgrk   )	extractorheadersheaders_auth_get_auth_infousernamepasswordr   	client_idclient_secret_authenticate_impl_client_authenticate_impl_authenticate_impl_legacyr   noopauthenticater   ensure_http_schemerstripr'   )r   extrcidr   s       r   r   MangadexAPI.__init__   s    '+':':'<$t}==#';;{#;;DNS!%_!=D*.*H*H'*.*H*H' $		D\*39>/	11&9@@E 		r   c                 *    U R                  SU-   5      $ )Nz/at-home/server/_callr   r   s     r   r   MangadexAPI.athome_server
  s    zz,t344r   c                 L    U(       a  SS0OS nU R                  SU-   U5      S   $ )N
includes[])r0   z/author/r)   r   )r   r   r0   paramss       r   r   MangadexAPI.author  s+    /4,
+$zz*t+V4V<<r   c                 :    SS0nU R                  SU-   U5      S   $ )Nr   r?   r!   r)   r   r   r   r   s      r   r(   MangadexAPI.chapter  s(     56zz+,f5f==r   c                 .    SU0nU R                  SU5      $ )Nzmanga[]z/cover)_pagination_coversr   s      r   ro   MangadexAPI.covers_manga  s    T"&&x88r   c                 4    U R                  SU-   S S5      S   $ )N/list/Tr)   r   r   s     r   rJ   MangadexAPI.list  s    zz(T/46v>>r   c                 0    U R                  SU S3S S5      $ )Nr   /feedT_pagination_chaptersr   s     r   r   MangadexAPI.list_feed  s     ((6$u)=tTJJr   r   keyargc                 :    SS0nU R                  SU-   U5      S   $ )Nr   )artistr   /manga/r)   r   r   s      r   r0   MangadexAPI.manga  s(     45zz)d*F3F;;r   c                 .    SU0nU R                  SU5      $ )NauthorOrArtistz/manga_pagination_manga)r   uuid_authorr   s      r   r   MangadexAPI.manga_author$  s    "K0%%h77r   c                     U R                   R                  S5      (       a  SOSnUUS.nU R                  SU S3U5      $ )Nchapter-reversedescasc)order[volume]zorder[chapter]r   r   )r   r   r   )r   r   orderr   s       r   r   MangadexAPI.manga_feed(  sI    ..//0ABB##
 ((74&)>GGr   c                 0    SS 0nU R                  SUS5      $ )NcontentRatingz/user/follows/mangaTr   r   r   s     r   r   MangadexAPI.user_follows_manga0  s&    !4(%%!641 	1r   c                 0    SS0nU R                  SUS5      $ )Nzorder[publishAt]r   z/user/follows/manga/feedTr   r  s     r   r   #MangadexAPI.user_follows_manga_feed5  s&    $f-((&6 	6r   c                 j    U R                  U R                  U R                  5      U R                  S'   g )NAuthorization)r   r   r   r   r   s    r   r   MangadexAPI.authenticate:  s*    ##DMM4==A 	/*r   i  maxager   c                    [        US45      =n(       aA  U R                  R                  R                  S5        SUU R                  U R
                  S.nOVU R                  R                  R                  SU5        SU R                  U R                  U R                  U R
                  S.nU R                  R                  R                  SU R                  S S	 5        S
nU R                  R                  USUS S9n US   nX4R                  S5      :w  a  [         R                  US4US   5        SU-   $ ! [         a&    [        R                  " UR                  S5      5      ef = f)NpersonalRefreshing access tokenrefresh_token)
grant_typer  r   r   Logging in as %sr   )r  r   r   r   r   u   Using client-id '%s…'   zGhttps://auth.mangadex.org/realms/mangadex/protocol/openid-connect/tokenPOST)methodr)   fatalaccess_tokenerror_descriptionBearer )_refresh_token_cacher   loginfor   r   r   r   debugrequest_json	Exceptionr   AuthenticationErrorrL   update)r   r   r   r  r)   r1   r  s          r   r   %MangadexAPI._authenticate_impl_client>  s\   0(J1GHH=HNN##$=>!0!.!%!%!3!3	D NN##$6A!+!%!%!%!%!3!3D 	  !:DNN3B<OP0~~**T + 7	O/L HH_55 '':&_(=? <''  	O//9L0MNN	Os   >D7 70E'c                 B   [        U5      =n(       a9  U R                  R                  R                  S5        U R                  S-   nSU0nO9U R                  R                  R                  SU5        U R                  S-   nXS.nU R                  R                  R                  S5        U R                  R                  USUS S	9nUR                  S
5      S:w  a  [        R                  " 5       eX6S   S   :w  a  [         R                  XS   S   5        SUS   S   -   $ )Nr  z/auth/refreshtokenr  z/auth/login)r   r   zUsing legacy login methodr  )r  jsonr  resultokrefreshr  session)r  r   r  r  r'   r  r  rL   r   r  r  )r   r   r   r  r1   r#  r)   s          r   r   %MangadexAPI._authenticate_impl_legacyc  s	   0::=:NN##$=>))o-C]+DNN##$6A))m+C (?D  !<=~~**T + 788H%//11M)44 ''w-	2JK4=333r   Nc                 H   U R                   U-   nU(       a  U R                  OU R                  n U(       a  U R                  5         U R                  R                  XBUS S9nUR                  S:  a  UR                  5       $ UR                  S:X  a6  UR                  R                  S5      nU R                  R                  US9  M  SR                  S UR                  5       S    5       5      n[        R                  " UR                   S	UR                   S
U S35      e)N)r   r   r  i  i  zX-RateLimit-Retry-After)untilz, c              3   >   #    U  H  nUS     SUS    S3v   M     g7f)r<   z: "detail"Nrd   ).0errors     r   	<genexpr>$MangadexAPI._call.<locals>.<genexpr>  s/      D)B  %W~.c%/1B!D)Bs   errors z ())r'   r   r   r   r   requeststatus_coder#  rL   waitjoinr   r   reason)	r   endpointr   authr1   r   responser*  msgs	            r   r   MangadexAPI._callx  s   ii("'+$##!!#~~--G4 . AH ##c)}}&##s* ((,,-FG##%#0)) D)1)BD DC++''((//):"SECE Er   c                     Uc  0 nU R                   R                  S5      n[        U[        5      (       a  SU;   a  UR	                  S5      nXBS'   SUS'   U R                  XU5      $ )NrG   ,ztranslatedLanguage[]r   r   r   r   
isinstancestrsplit_paginationr   r:  r   r;  rG   s        r   r    MangadexAPI._pagination_chapters  sf    >F~~$$V,dC  SD[::c?D)-%&4|$77r   c                 0    Uc  0 nU R                  XU5      $ r   )rE  )r   r:  r   r;  s       r   r   MangadexAPI._pagination_manga  s    >F$77r   c                    Uc  0 nU R                   R                  S5      n[        U[        5      (       a  SU;   a  UR	                  S5      nXBS'   S US'   U R                   R                  S5      (       a  SOSUS'   U R                  XU5      $ )	NrG   r@  z	locales[]r  r   r   r   r   rA  rF  s        r   r   MangadexAPI._pagination_covers  s    >F~~$$V,dC  SD[::c?D"{"&nn++,=>>FE 	 $77r   c              #     #    U R                   R                  nSU;  a8  U" S5      nUc  SnO&[        U[        5      (       a  UR	                  S5      nXRS'   SUS'   U" S5      =n(       a#  U H  nXr;   d  M
  X'	 M     UR                  U5         U R                  XU5      nUS	    S h  vN   US   US
   -   US'   US   US   :  a  g M<   N!7f)Nr  ratings)safe
suggestiveeroticapornographicr@  zcontentRating[]r   offsetzapi-parametersr)   limittotal)r   r   rB  rC  rD  r  r   )	r   r:  r   r;  r   rM  
api_paramsr   r)   s	            r   rE  MangadexAPI._pagination  s     &&&(Y'GKGS))!--,(/$%x 011:1!= " MM*%::h5DF|###H~W=F8h4=0 #s   A1C72C)C*"C)
r   r   r   r   r   r   r   r   r'   r   )F)NF)rW   rX   rY   rZ   r[   r   r   r   r(   ro   rJ   r   r
   r0   r   r   r   r   r   r	   r   r   r   r   r   r   rE  rc   rd   r   r   r   r      s    
G(5=>9?K Q< <8H1
6
B #a "( !"(H #a 4 !4(E,
888r   r   i v r	  c                     g r   rd   )r   s    r   r  r    s    r   r   c                    U R                   R                  U5      n[        [        5      nUS    H  nX4S      R	                  U5        M     US   nUS   R                  S5      =(       d&    [        [        US   R                  5       5      S5      US   UR                  S5      =(       d    S	 Vs/ s H  nUR                  5       S
   PM     snU R                  UR                  S5      5      US   R                  S5      =(       d&    [        [        US   R                  5       5      S5      UR                  S5      UR                  S5      UR                  S5      UR                  S5      UR                  S5      UR                  S5      US    Vs/ s H  owS   S   S   PM     snUS    Vs/ s H
  oS   S   PM     snUS    V	s/ s H
  oS   S   PM     sn	S.$ s  snf s  snf s  snf s  sn	f )Nr5   r6   r7   r<   enr;   r   	altTitlesrd   r   ry   descriptionpublicationDemographicoriginalLanguagestatusyearr  linkstagsr@   r   r   )r0   manga_idmanga_titles
manga_dater[  demographicoriginr^  r_  ratingr`  ra  r   r   )r   r0   r   rJ   rK   rL   nextitervaluespopitemrP   )
r   r   r0   relrQ   mattrttagr   r   s
             r   rN   rN     s   HHNN4 E
d
Co&L  & ',E >%%d+ ;U7^2245r:$K"'))K"8">B">@">Q Q">@//		+0FG}-11$7 Gd5#7#>#>#@A2Fyy!9:))./))H%))F#))O,))G$>CFmLms|$V,T2mL>A(mLmF,'/mL>A(mLmF,'/mL# @ MLLs   2G$G)4G.G3N)r[   commonr   r   r;   r   r   r   r	   r
   collectionsr   r~   r   rf   r$   r/   r   r   r   r   r   r  rN   rd   r   r   <module>rr     s    + & $ $ # #><
	 <
~"
/ "
J$10 $1N.. .(2- 2	-!2 	-
- 
4,/ ,V Vr hq! " 
 r   