
    V|h!                         S SK r S SKrS SKrSSKJr  SSKJrJrJ	r	J
r
JrJrJrJr  SS jrSS jr " S S	\5      r " S
 S\5      rg)    N   )InfoExtractor   )ExtractorError
clean_htmlextract_attributesget_elements_by_classint_or_none
js_to_jsonsmuggle_urlunescapeHTMLc                    Uc  SnUc  SnOS[         R                  " U5       S3nUc  SnO%U(       a  [         R                  " U5      OUnSU S3n/ n[         R                  " SU SU U S	3U 5       H  nUR                  U5        M     U$ )
zVReturn the content of the tag with the specified attribute in the passed HTML documentz[a-zA-Z0-9:._-]+ z\s+(?P<attribute>)z=['"]?(?P<value>z)['"]?z(?xs)
        <(?P<tag>zV)
         (?:\s+[a-zA-Z0-9:._-]+(?:=[a-zA-Z0-9:._-]*|="[^"]*"|='[^']*'|))*?
         z
         (?:\s+[a-zA-Z0-9:._-]+(?:=[a-zA-Z0-9:._-]*|="[^"]*"|='[^']*'|))*?
        \s*>
        (?P<content>.*?)
        </\1>
    )reescapefinditerappend)htmltag	attributevalueescape_valueretlistms          Q/home/james-whalen/.local/lib/python3.13/site-packages/yt_dlp/extractor/duboku.py_get_elements_by_tag_and_attribr      s     { 	(9)=(>a@	}$0		% e#E7'2G[[  

UG  
 	q N    c                 8    [        XX#U5      nU(       a  US   $ S $ )Nr   )r   )r   r   r   r   r   retvals         r   _get_element_by_tag_and_attribr!   0   s!    ,T	,WF6!9(D(r   c                   v    \ rS rSrSrSrSrSSSSS	S
S
SSSSS.
SS0S.SSSSSS
S
SSSSS.
SS0S./rSrS r	Sr
g)DubokuIE5   dubokuzwww.duboku.iozE(?:https?://[^/]+\.duboku\.io/vodplay/)(?P<id>[0-9]+-[0-9-]+)\.html.*z)https://w.duboku.io/vodplay/1575-1-1.htmlz1575-1-1mp4   白色月光u   contains:白色月光r   zSeason 11z	Episode 1)
idextseriestitleseason_numberepisode_numberseason
episode_id	season_idepisodeskip_downloadzm3u8 download)url	info_dictparamsz)https://w.duboku.io/vodplay/1588-1-1.htmlz1588-1-1u   亲爱的自己u   contains:第1集)
r)   r*   r+   r,   r-   r.   r2   r/   r0   r1   z.player_data\s*=\s*(\{\s*(.*)})\s*;?\s*</scriptc           
         U R                  U5      nUR                  S5      nUS   nUS   nUS   nSU S3nU R                  Xr5      nU R                  U R                  US5      n	U R                  X[        5      n	[        SU5      nS n
S nU H  n[        R                  " S	U5      nU(       d  M#  [        UR                  S5      5      R                  S
5      nU(       d  MU  [        R                  " SU5      nU(       d  Mu  UR                  S5      U:X  d  M  [        UR                  S5      5      n
[        R                  " SSU
5      n
[        U5      n[        R                  " SSU5      n  O   U	R                  S5      nU(       d  [        S5      eU	R                  S5      nUS:X  a   [         R"                  R%                  U5      nOHUS:X  aB  [         R"                  R%                  [&        R(                  " U5      R+                  S5      5      nSU0nU	R                  S5      S:X  a*  S[-        USU05      UUU
[/        U5      U[/        U5      US.	$ U R1                  UUSUS9nUUU
[/        U5      U[/        U5      UUUS.	$ )N-r   r   r   zhttps://w.duboku.io/vodplay/.htmlplayer_datar,   z<a\s+.*>(.*)</a>hrefz/(\d+)\.htmlz[\s\r\n\t]+ r4   zCannot find url in player_dataencryptasciiRefererfromiframeurl_transparentreferer)	_typer4   r)   r,   r+   r-   r1   r.   r0   r&   )headers)	r)   r,   r+   r-   r1   r.   r0   formatshttp_headers)	_match_idsplit_download_webpage_search_regex_PLAYER_DATA_PATTERN_parse_jsonr   r	   r   searchr   groupgetr   subr   urllibparseunquotebase64	b64decodedecoder   r
   _extract_m3u8_formats)selfr4   video_idtemp	series_idr1   r0   webpage_urlwebpage_htmlr:   series_titler,   r   mobjr;   mobj1data_urlplayer_encryptrE   rF   s                       r   _real_extractDubokuIE._real_extract`   sl   >>#&~~c"G	G	!W
4XJeD--kD ((%%|]D&&{jI %Wl;D990$7Dt)$**Q-8<<VD4IIot<EuQ9!<'1$**Q-'@')vvnc<'P *4 0 "~sE B  ??5) !ABB$3Q||++H5Hq ||++F,<,<X,F,M,Mg,VWH k*??6"h. +"8i-EF&!,Y!7&"-j"9(
 
 ,,XxPW,X "(3")*5$#

 
	
r    N)__name__
__module____qualname____firstlineno__IE_NAMEIE_DESC
_VALID_URL_TESTSrL   rd   __static_attributes__rf   r   r   r#   r#   5   s    GGYJ:$, "
 _
$ ;''" 
 _
#"FH MH
r   r#   c                   J    \ rS rSrSrSrSrSSSS.S	S
.SSSS.SS./rS rSr	g)DubokuPlaylistIE   zduboku:listzwww.duboku.io entire seriesz?(?:https?://[^/]+\.duboku\.io/voddetail/)(?P<id>[0-9]+)\.html.*z'https://w.duboku.io/voddetail/1575.htmlzstartswith:1575r'   )r)   r,      )r4   r5   playlist_countz'https://w.duboku.io/voddetail/1554.htmlzstartswith:1554u   以家人之名   )r4   r5   playlist_mincountc                    U R                  U5      nUc  [        SU 35      eUR                  S5      n[        R                  R                  U5      R                  nSU S3nU R                  XS5      n[        USSS5      nU(       a  [        UR                  S5      5      OS nU(       d  U R                  S	U5      nU(       d/  [        US5      nU(       a  [        UR                  S5      5      OS n0 n[        USS
SS9 H  n	U	R                  S5      n
/ n[        U	R                  S5      SSSSS9 HG  nUR                  [        UR                  S5      5      [        UR                  S5      5      S.5        MI     XU
'   M     S nS n
U(       a  UR                  U5      nUn
O.[        [        UR!                  5       5      S 5      nU(       a  Uu  pU(       d  [        U(       a	  SU 35      eS5      eU R#                  U Vs/ s HV  nU R%                  [        R                  R'                  SUS   5      [(        R+                  5       UR                  S5      S9PMX     snUS-   U
-   U5      $ s  snf )NzInvalid URL: r)   zhttps://w.duboku.io/voddetail/r9   h1classr,   contentkeywordszplaylist\d+F)r   r   r   r   ar;   z[^'"]+?)r   r   )r;   r,   zCannot find zCannot extract playlistzhttps://w.duboku.io)ievideo_title#)_match_valid_urlr   rO   rR   rS   urlparsefragmentrJ   r!   r   _html_search_metar   r   rP   nextiteritemsplaylist_result
url_resulturljoinr#   ie_key)rY   r4   r`   r\   r   r]   r^   r,   	playlistsdivplaylist_idplaylistr|   firstxs                  r   rd   DubokuPlaylistIE._real_extract   sf   $$S)< =!677JJt$	<<((-666ykG--kE /|T7GT8=U[[344**:|DE2<IE<ALY!78tE 	2NQVXC))G,KH4IIi(#vZV[]()9:)!'')*<=! ] &.k"X  }}X.H"Kioo/0$7E*/' -5,xj)V V;TV V ## 	%  OO$$%:AfIF??$!%%.  B 	% !*C+ =u	F 	F %s   AI1rf   N)
rg   rh   ri   rj   rk   rl   rm   rn   rd   ro   rf   r   r   rq   rq      sP    G+GSJ8##
  9#&
  F 6Fr   rq   )NNNT)rU   r   urllib.parserR   commonr   utilsr   r   r   r	   r
   r   r   r   r   r!   r#   rq   rf   r   r   <module>r      sI     	  !	 	 	<)
s
} s
lKF} KFr   