
    yfT!                         d dl Z d dlZd dlZddlmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZmZmZ ddZddZ G d	 d
e      Z G d de      Zy)    N   )InfoExtractor   )compat_urlparse)
clean_htmlextract_attributesExtractorErrorget_elements_by_classint_or_none
js_to_jsonsmuggle_urlunescapeHTMLc                     |d}|d}ndt        j                  |      z  }|d}n|rt        j                  |      n|}d|z  }g }t        j                  d|d||d|       D ]  }|j                  |        |S )zVReturn the content of the tag with the specified attribute in the passed HTML documentz[a-zA-Z0-9:._-]+ z\s+(?P<attribute>%s)z=['"]?(?P<value>%s)['"]?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          9/usr/lib/python3/dist-packages/yt_dlp/extractor/duboku.py_get_elements_by_tag_and_attribr      s     { 	+bii	.BB	}$0		% e,u4G[[ 	5" $() 	 	q	 N    c                 2    t        | ||||      }|r|d   S d S )Nr   )r   )r   r   r   r   r   retvals         r   _get_element_by_tag_and_attribr!   1   s%    ,T3	5,WF6!9(D(r   c                   n    e Zd ZdZdZdZdddddd	d	d
dddd
ddiddddddd	d	dd
ddd
ddidgZdZd Zy)DubokuIE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-   r1   r.   r/   r0   z.player_data\s*=\s*(\{\s*(.*)})\s*;?\s*</scriptc           
         | j                  |      }|j                  d      }|d   }|d   }|d   }d|z  }| j                  ||      }| j                  | j                  |d      }	| j                  |	|t              }	t        d|      }d }
d }|D ]  }t        j                  d|      }|st        |j                  d            j                  d	      }|sHt        j                  d
|      }|sa|j                  d      |k(  svt        |j                  d            }
t        j                  dd|
      }
t        |      }t        j                  dd|      } n |	j                  d      }|st        d      |	j                  d      }|dk(  r t         j"                  j%                  |      }nF|dk(  rAt         j"                  j%                  t'        j(                  |      j+                  d            }d|i}|	j                  d      dk(  r*dt-        |d|i      |||
t/        |      |t/        |      |d	S | j1                  ||d|      }|||
t/        |      |t/        |      |||d	S )N-r   r   r   z#https://w.duboku.io/vodplay/%s.htmlplayer_datar+   z<a\s+.*>(.*)</a>hrefz/(\d+)\.htmlz[\s\r\n\t]+ r3   zCannot find url in player_dataencryptasciiRefererfromiframeurl_transparentreferer)	_typer3   r(   r+   r*   r,   r0   r-   r/   r%   )headers)	r(   r+   r*   r,   r0   r-   r/   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)selfr3   video_idtemp	series_idr0   r/   webpage_urlwebpage_htmlr8   series_titler+   r   mobjr9   mobj1data_urlplayer_encryptrC   rD   s                       r   _real_extractzDubokuIE._real_extracta   sk   >>#&~~c"G	G	!W
;hF--k8D ((%%|]D&&{HjI %Wl; 	D990$7D)$**Q-8<<VDIIot<E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__IE_NAMEIE_DESC
_VALID_URL_TESTSrJ   rb    r   r   r#   r#   6   s    GGYJ:$, "
 _
$ ;''" 
 _
#"FH MH
r   r#   c                   B    e Zd ZdZdZdZdddddd	d
dddddgZd Zy)DubokuPlaylistIEz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+      )r3   r4   playlist_countz'https://w.duboku.io/voddetail/1554.htmlzstartswith:1554u   以家人之名   )r3   r4   playlist_mincountc                 z   | j                  |      }|t        d|z        |j                  d      }t        j                  |      j
                  }d|z  }| j                  ||      }t        |ddd      }|rt        |j                  d            nd }|s| j                  d|      }|s*t        |d      }|rt        |j                  d            nd }i }t        |dd	d
      D ]  }	|	j                  d      }
g }t        |	j                  d      dddd
      D ]F  }|j                  t        |j                  d            t        |j                  d            d       H |||
<    d }d }
|r|j                  |      }|}
n*t        t        |j                               d       }|r|\  }
}|st        |r	d|z        d      | j!                  |D cg c]N  }| j#                  t        j$                  d|d         t&        j)                         |j                  d            P c}|dz   |
z   |      S c c}w )NzInvalid URL: %sr(   z%https://w.duboku.io/voddetail/%s.htmlh1classr+   contentkeywordszplaylist\d+F)r   r   r   r   ar9   z[^'"]+?)r   r   )r9   r+   zCannot find %szCannot extract playlistzhttps://w.duboku.io)ievideo_title#)_match_valid_urlr	   rM   r   urlparsefragmentrH   r!   r   _html_search_metar   r   rN   nextiteritemsplaylist_result
url_resulturljoinr#   ie_key)rW   r3   r^   rZ   r|   r[   r\   r+   	playlistsdivplaylist_idplaylistrv   firstxs                  r   rb   zDubokuPlaylistIE._real_extract   s_   $$S)< !2S!899JJt$	"++C099=	I--k9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:)!'')*<=!  &.Ik"
	.  }}X.H"Kioo/0$7E*/'h /7 8+X X=VX X ## 	%  OO''(=qyI??$!%%.  B% !*C+ =u	F 	F %s   AH8N)rc   rd   re   rf   rg   rh   ri   rb   rj   r   r   rl   rl      sP    G+GSJ8##
  9#&
  F 6Fr   rl   )NNNT)rS   r   urllib.parserP   commonr   compatr   utilsr   r   r	   r
   r   r   r   r   r   r!   r#   rl   rj   r   r   <module>r      sL     	  ! $	 	 	<)
s
} s
lKF} KFr   