
    im)                         S r SSKJrJrJr  SSKJrJrJr  Sr	\	S-   r
 " S S5      r " S	 S
\\5      r " S S\\5      r " S S\\5      rS rg)z(Extractors for https://www.webtoons.com/   )GalleryExtractor	ExtractorMessage   )	exceptiontextutilz%(?:https?://)?(?:www\.)?webtoons\.comz/(([^/?#]+)c                   @    \ 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g)WebtoonsBase   webtoonszhttps://www.webtoons.com)z
{category}z{comic}z-{episode_no}-{num:>02}{type:?-//}.{extension}z{title_no}_{episode_no}_{num}z.webtoons.com)g      ?g      ?c           	      4    U R                  SSSSSSS.5        g )N
AD_CONSENTfalsetrue)atGDPRneedCCPA	needCOPPAneedGDPRpagGDPRageGatePass)cookies_update)selfs    J/app/mltbenv/lib/python3.13/site-packages/gallery_dl/extractor/webtoons.pysetup_agegate_cookies"WebtoonsBase.setup_agegate_cookies   s'    '"""!!
 	    c                     [         R                  " X40 UD6nUR                  (       a4  SUR                  ;   a$  [        R
                  " SUR                   S35      eU$ )Nz/ageGatez"HTTP redirect to age gate check ('z'))r   requesthistoryurlr   AbortExtraction)r   r!   kwargsresponses       r   r   WebtoonsBase.request(   sU    $$T9&9
hll :++4X\\N"EG Gr    N)__name__
__module____qualname____firstlineno__categoryrootdirectory_fmtfilename_fmtarchive_fmtcookies_domainrequest_intervalr   _initr   __static_attributes__r&   r   r   r   r      s7    H%D-MBL1K$N! "Er   r   c                   L    \ rS rSrSrSr\S-   rSr/ r	S r
S rS rS	 rS
 rSrg)WebtoonsEpisodeExtractor0   z(Extractor for an episode on webtoons.comepisodez0/([^/?#]+)/([^/?#]+)/[^/?#]+)/viewer\?([^#'\"]+)zQhttps://www.webtoons.com/en/GENRE/TITLE/NAME/viewer?title_no=123&episode_no=12345c                 H   U R                  5         U R                  u  ol        U l        U l        n[
        R                  " U5      nUR                  S5      U l        UR                  S5      U l	        U R                   SU SU 3U l        U R                  SS5      U l        g )Ntitle_no
episode_no/z/viewer?bgmT)r   groupslanggenrecomicr   parse_querygetr9   r:   r,   page_urlconfigr<   )r   basequeryparamss       r   r2   WebtoonsEpisodeExtractor._init9   s    ""$9=6iTZ!!%(

:. **\299+QtfHUG<;;ud+r   c                    [         R                  " U5      nU" SS5      nU" SS5      nU" SS5      (       a  U" SS5      nU" SS5      nOS	=pVU" S
S5      (       a
  U" SS5      nOS	nU" SS5      (       a  U" SS5      nU" SS5      n	OS	=pU R                  U R                  U R                  U R
                  [         R                  " U5      U[         R                  " U5      [         R                  " U5      U[         R                  " U	5      [         R                  " U5      U R                  [        R                  " U R                  5      S.$ )Nz#<meta property="og:title" content=""z)<meta property="og:description" content="z<div class="subj_info"
><z <h1 class="subj_episode" title=" z"<span class="tx _btnOpenEpisodeLisz>#z<span class="author"/u/z<span>z</span>)r?   r@   r9   r:   titler7   
comic_nameepisode_nameusernameauthor_namedescriptionr>   language)
r   extract_fromr?   r@   r9   r:   unescaper>   r	   code_to_language)
r   pageextrrP   descrrQ   rR   r7   rS   rT   s
             r   metadata!WebtoonsEpisodeExtractor.metadataC   s)     &:C@@#F($//c3J BCHL(**J4c::4oGG&--E3'Hx3K%''H !JJ JJ MM OO MM%0# MM*5 MM,7$ MM+6 MM%0 II 11$))<
 	
r   c                    U R                  S5      nUb  US:X  a  SSSS.nOcU(       d  S nOY[        U[        5      (       a  X"S.nO?[        U[        5      (       a  S[        U5      -   nX"S.nO[        U[        5      (       d  S nU R
                  (       a  Sn0 =U l        nOS n/ n[        R                  " USS	5       H  nUR                  S
5      u  pxn	Ub  US-  nUWXwR                  SS5      S  '   UbG  UR                  UR                  S5      S   R                  5       5      n
U
SL a  UnOU
(       a  U SU
 3nUR                  [        U5      S 45        M     U$ )NqualityoriginalF)jpgjpegwebp)rb   rc   q    zclass="_images" data-url="rJ   ?r   r;      .r   z?type=)rD   
isinstancestrintdictr<   pathsr   extract_iter
rpartitionfindrB   lowerappend_url)r   rZ   r`   numrn   resultsr!   path_rF   types              r   imagesWebtoonsEpisodeExtractor.imagesi   s\   ++i(?g3#UEBGG%%%7G%%CL(G%7GGT**G88C!##DJC$$2C9C !^^C0NDUq25d99S!,-./"{{4??3#7#:#@#@#BC5=C!F&/CNNDIt,-9 r   c                 ~   / nU R                  SS5      (       aM  [        R                  " USS5      n[        [        R                  " USS5      5      nUR	                  USS.5        U R
                  (       aE  [        R                  " US	S
5      =n(       a&  U R                  U[        R                  " U5      5        U$ )N
thumbnailsFz	class="onz</a>z
data-url="rJ   	thumbnailr!   ry   zepisodeBgmList:z,
)	rD   r   r[   rt   rs   r<   
_asset_bgmr	   
json_loads)r   rZ   assetsactiver!   r<   s         r   r   WebtoonsEpisodeExtractor.assets   s    ;;|U++YYt[&9Ftyys;<CMM#{;<88ii&7??s?(<=r   c                 \   SS K nSSS.nSSU R                  U R                  S-   SSS	S
.nU R                  n[        U R                  [
        5      (       a  U R                  R                  5       =pxOSnSnU GH0  n	SU	S    S3n
U R                  XUSS9nUS   S   n[        R                  " UR                  U5      R                  5       5      nUS   nU	R                  SS5      nU	R                  SS5      nUR                  0 U	EUEUR                  U5      =(       d    SUR                  U5      =(       d    SXR                  S5      S-   UR                  S5       XR                  S5      S-   UR                  S5       USSUS   -   US   R                  5       US.	E5        GM3     g )Nrf   HIGHzAAC,MP3)r`   acceptCodecszapplication/jsonr;   emptycorsz
cross-site)AcceptzContent-TypeOriginRefererzSec-Fetch-DestzSec-Fetch-ModezSec-Fetch-Sitemp4Fz=https://apis.naver.com/audiocweb/audiocplayogwweb/play/audio/audioIdz
/hls/token)rG   headersintervalresult	playToken	audioInfoplayImageUrlrN   stopImageUrlr   ri   r<   zytdl:r!   ry   )	num_playnum_stopfilename_playfilename_stop	extensionry   r!   _ytdl_manifest_ytdl_manifest_remux)binasciir,   rn   rj   r<   rk   rr   request_jsonr	   r   
a2b_base64decoderB   rs   rfind)r   r   bgm_listr   rG   r   rn   remuxextr<   r!   datatokenaudioplaystops                   r   r   #WebtoonsEpisodeExtractor._asset_bgm   s    #%
 10"ii"ii#o%$*
 

dhh$$((..**ECCEC ^,J8C$$Ge % EDN;/E??8#6#6u#=#D#D#FGD%E77>2.D77>2.DMM  "IIdO0q!IIdO0q!%jjoa&7

3!H!%jjoa&7

3!H %,."'-"5"5"7(-  r   )r<   r@   r:   r?   r>   rC   rn   r9   N)r'   r(   r)   r*   __doc__subcategoryLANG_PATTERNpatternexampleimages_urlsr2   r]   rz   r   r   r3   r&   r   r   r5   r5   0   s@    2K & &G0GK,$
L$L/r   r5   c                   H    \ 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g)WebtoonsComicExtractor   z-Extractor for an entire comic on webtoons.comr@   Tz{type}.{extension}z{title_no}_{type}z#/([^/?#]+)/([^/?#]+))/list\?([^#]+)z9https://www.webtoons.com/en/GENRE/TITLE/list?title_no=123c              #   `  #    U R                   nU R                  u  o!S'   US'   US'   n[        R                  " U5      n[        R                  " UR                  S5      5      =US'   n[        R                  " UR                  S5      S5      =US'   nSU SU S	U 3nU R                  U R                  U-   5      nUR                  (       a/  UR                  R                  S5      n	SR                  U	S
S 5      nUR                  n
U R                  S5      (       aE  U R                  U
5      =n(       a-  [        R                  SU4v   [        R                   US   U4v   S["        0n U R%                  U
5       Hg  n[        R                  " UR'                  S5      S   5      n[        R                  " UR                  S5      5      US'   [        R(                  X4v   Mi     US-   =US'   nSU SU S	U 3nXz;  a  g U R                  U R                  U-   5      R                  n
M  7f)Nr>   r?   r@   r9   rZ   r   r;   z/list?title_no=z&page=   bannersrN   r!   
_extractorrg   r   r:   )kwdictr=   r   rA   	parse_intrB   r   r,   r    r!   splitjoinrD   _asset_bannerr   	DirectoryUrlr5   get_episode_urlsrp   Queue)r   kwrE   rF   rG   r9   page_norw   r$   partsrZ   assetr   r!   s                 r   itemsWebtoonsComicExtractor.items   s    [[<@KK9j"W+r'{E!!%($(NN6::j3I$JJ:#~~fjj.@!DD6
W4&zyA<<		D 01LL&&s+E88E!BK(D}};;y!!0B0B40H'Hu'H##R..++uU|U2267,,T2))#..*=a*@A%)^^FJJ|4L%M\"mmS.. 3
 $+Q;.BvJtfOH:VG9ED<<		D 0166D s   H,H.c                     [         R                  " USS5      n[        R                  R	                  U5       Vs/ s H  nUS   PM
     sn$ s  snf )z-Extract and return all episode urls in 'page'zid="_listUl"z</ul>rf   )r   r[   r5   r   finditer)r   rZ   matchs      r   r   'WebtoonsComicExtractor.get_episode_urls   sP    yy~w7 299BB4H
H !HH
 	
 
s   Ac                      UR                  S5      n[        [        R                  " USSU5      S   5      n[        R
                  " X3SS.5      $ ! [         a     g f = f)Nz<span class="thmbzsrc="rJ   rf   bannerr   )index	Exceptionrt   r   extractnameext_from_url)r   rZ   posr!   s       r   r   $WebtoonsComicExtractor._asset_banner   s`    	**01C 4<<gsC8;<$$Sx*HII	  		s   A 
AAr&   N)r'   r(   r)   r*   r   r   categorytransferr.   r/   r   r   r   r   r   r   r3   r&   r   r   r   r      s:    7K'L%KCCGIG7>
Jr   r   c                   6    \ rS rSrSrSr\S-   rSrS r	S r
Srg	)
WebtoonsArtistExtractori	  z"Extractor for webtoons.com artistsartistz"/p/community/([^/?#]+)/u/([^/?#]+)z2https://www.webtoons.com/p/community/LANG/u/ARTISTc              #      #    U R                  5        H5  n[        US'   U R                  US   S   -   n[        R                  X!4v   M7     g 7f)Nr   extraepisodeListPath)comicsr   r,   r   r   )r   r@   	comic_urls      r   r   WebtoonsArtistExtractor.items  sF     [[]E"8E,		E'N3D$EEI--11 #s   AAc                 Z   U R                   u  p[        R                  " U5      R                  5       nU R                   SU SU 3nU R                  U5      R                  n[        R                  " USS5      nU R                   SU S3nUSS.nS	U0nU R                  XGUS
9n	U	S   S   $ )Nz/p/community/rO   z\"creatorId\":\"\z/p/community/api/v1/creator/z/titles50)rV   nextSizerV   )rG   r   r   titles)	r=   r	   rY   upperr,   r   r   r[   r   )
r   r>   r   rV   r!   rZ   
creator_idrG   r   r   s
             r   r   WebtoonsArtistExtractor.comics  s    {{((.446=c&:||C %%YYt%:DA
7
|7K 

 
   W EH~h''r   r&   N)r'   r(   r)   r*   r   r   BASE_PATTERNr   r   r   r   r3   r&   r   r   r   r   	  s$    ,KBBGBG2(r   r   c                 &    U R                  SS5      $ )Nz://webtoon-phinf.z://swebtoon-phinf.)replace)r!   s    r   rt   rt   *  s    ;;*,@AAr   N)r   commonr   r   r   rN   r   r   r	   r   r   r   r5   r   r   rt   r&   r   r   <module>r      sg    / 8 8 $ $7n, :\|-= \~7J\9 7Jt(lI (BBr   