o
    i!                     @   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u rd}|du rd}n	dt | d}|du rd}n|r$t |n|}d| d}g }t d| d	| | d
| D ]}|| q=|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_valueretlistm r   K/home/ubuntu/.local/lib/python3.10/site-packages/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 )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)   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	|}|r|t
|dd
}|r|t	d|}|r||d|kr|t|d}
tdd|
}
t|}tdd|} nq<|	d}|std|	d}|dkrtj|}n|dkrt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_dataencryptasciiRefererfromiframeurl_transparentreferer)	_typer/   r$   r'   r&   r(   r,   r)   r+   r!   )headers)	r$   r'   r&   r(   r,   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)selfr/   video_idtemp	series_idr,   r+   webpage_urlwebpage_htmlr4   series_titler'   r   mobjr5   mobj1data_urlplayer_encryptr?   r@   r   r   r   _real_extract`   st   




zDubokuIE._real_extractN)	__name__
__module____qualname__IE_NAMEIE_DESC
_VALID_URL_TESTSrF   r^   r   r   r   r   r   5   sJ    $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/   r0   playlist_countz'https://w.duboku.io/voddetail/1554.htmlzstartswith:1554u   以家人之名   )r/   r0   playlist_mincountc              	      s    |}|d u rtd| |d}tj|j}d| d} ||}t|ddd}|r8t	|dnd }|sB 
d	|}|sTt|d}|rRt	|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 qs|||
< q^d }d }
|r||}|}
ntt| d }|r|\}
}|st|rd| d  fdd|D |d |
 |S )NzInvalid URL: r$   zhttps://w.duboku.io/voddetail/r3   h1classr'   contentkeywordszplaylist\d+F)r   r   r   r   ar5   z[^'"]+?)r   r   )r5   r'   zCannot find zCannot extract playlistc                    s4   g | ]} j tjd |d t |ddqS )zhttps://w.duboku.ior5   r'   )ievideo_title)
url_resultrL   rM   urljoinr   ie_keyrJ   ).0xrS   r   r   
<listcomp>   s    z2DubokuPlaylistIE._real_extract.<locals>.<listcomp>#)_match_valid_urlr   rI   rL   rM   urlparsefragmentrD   r   r   _html_search_metar   r   rJ   nextiteritemsplaylist_result)rS   r/   rZ   rV   r|   rW   rX   r'   	playlistsdivplaylist_idplaylistro   firstr   rw   r   r^      s^   








zDubokuPlaylistIE._real_extractN)r_   r`   ra   rb   rc   rd   re   r^   r   r   r   r   rf      s$    rf   )NNNT)rO   r   urllib.parserL   commonr   utilsr   r   r   r   r	   r
   r   r   r   r   r   rf   r   r   r   r   <module>   s    (

v