U
    g!                     @   s   d dl Z d dlZd dl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dZdd	d
ZG dd deZG dd deZdS )    N   )InfoExtractor   )ExtractorError
clean_htmlextract_attributesget_elements_by_classint_or_none
js_to_jsonsmuggle_urlunescapeHTMLTc                 C   s   |dkrd}|dkrd}ndt | d}|dkr:d}n|rHt |n|}d| d}g }t d| d	| | d
| D ]}|| qz|S )zVReturn the content of the tag with the specified attribute in the passed HTML documentNz[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_valueZretlistm r   ;/tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/extractor/duboku.py_get_elements_by_tag_and_attrib   s*    	r   c                 C   s    t | ||||}|r|d S d S )Nr   )r   )r   r   r   r   r   retvalr   r   r   _get_element_by_tag_and_attrib0   s    r   c                   @   sp   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d ZdS )DubokuIEZ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episodeZ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'   r+   r(   r)   r*   z.player_data\s*=\s*(\{\s*(.*)})\s*;?\s*</scriptc              
   C   s  |  |}|d}|d }|d }|d }d| d}| ||}| | j|d}	| |	|t}	td|}d }
d }|D ]}t	d	|}|rxt
|dd
}|rxt	d|}|rx|d|krxt|d}
tdd|
}
t|}tdd|} qqx|	d}|std|	d}|dkr4tj|}n"|dkrVtjt|d}d|i}|	ddkrdt|d|i|||
t||t||d	S | j||d|d}|||
t||t||||d	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]+ r,   zCannot find url in player_dataZencryptasciiZRefererfromiframeZurl_transparentZreferer)	_typer,   r"   r%   r$   r&   r*   r'   r)   r   )headers)	r"   r%   r$   r&   r*   r'   r)   formatsZhttp_headers)Z	_match_idsplit_download_webpageZ_search_regex_PLAYER_DATA_PATTERNZ_parse_jsonr
   r   r   searchr   groupgetr   subr   urllibparseunquotebase64	b64decodedecoder   r	   Z_extract_m3u8_formats)selfr,   Zvideo_idtemp	series_idr*   r)   webpage_urlwebpage_htmlr1   Zseries_titler%   r   mobjr2   Zmobj1Zdata_urlZplayer_encryptr8   r9   r   r   r   _real_extract`   sv    

  




zDubokuIE._real_extractN)	__name__
__module____qualname__IE_NAMEIE_DESC
_VALID_URL_TESTSr<   rM   r   r   r   r   r   5   sL     $r   c                   @   sD   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d ZdS )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%      )r,   r-   Zplaylist_countz'https://w.duboku.io/voddetail/1554.htmlzstartswith:1554u   以家人之名   )r,   r-   Zplaylist_mincountc              	      s    |}|d kr td| |d}tj|j}d| d} ||}t|ddd}|rpt	|dnd }|s 
d	|}|st|d}|rt	|dnd }i }t|dd
ddD ]\}	|	d}
g }t|	ddddddD ](}|t	|dt	|dd q|||
< qd }d }
|r8||}|}
n tt| d }|rX|\}
}|svt|rpd| nd  fdd|D |d |
 |S )NzInvalid URL: r"   zhttps://w.duboku.io/voddetail/r0   h1classr%   contentkeywordszplaylist\d+F)r   r   r   r   ar2   z[^'"]+?)r   r   )r2   r%   zCannot find zCannot extract playlistc                    s4   g | ],} j tjd |d t |ddqS )zhttps://w.duboku.ior2   r%   )ZieZvideo_title)Z
url_resultrA   rB   urljoinr   Zie_keyr?   ).0xrG   r   r   
<listcomp>   s    z2DubokuPlaylistIE._real_extract.<locals>.<listcomp>#)Z_match_valid_urlr   r>   rA   rB   urlparsefragmentr;   r   r   Z_html_search_metar   r   r?   nextiteritemsZplaylist_result)rG   r,   rL   rI   rd   rJ   rK   r%   Z	playlistsdivZplaylist_idZplaylistr\   firstr   r`   r   rM      sj    


   

    




 zDubokuPlaylistIE._real_extractN)rN   rO   rP   rQ   rR   rS   rT   rM   r   r   r   r   rU      s"   rU   )NNNT)NNNT)rD   r   urllib.parserA   commonr   utilsr   r   r   r   r	   r
   r   r   r   r   r   rU   r   r   r   r   <module>   s   (

v