U
    g.                     @   s   d dl Z 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mZmZmZmZ G dd deZG d	d
 d
eZG dd deZdS )    N   )InfoExtractor)PhantomJSwrapper   )ExtractorErrorUserNotLivedetermine_extint_or_none
js_to_jsonparse_resolutionstr_or_nonetraverse_objunescapeHTMLurl_or_noneurlencode_postdataurljoinc                   @   s.   e Zd Zdd Zdd Zdd Zddd	Zd
S )DouyuBaseIEc                 C   sD   dD ]2}| j ||ddd}|r| jdd| |  S qtdd S )N)zEhttps://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/md5.jsz2https://unpkg.com/cryptojslib@3.1.2/rollups/md5.jszDownloading signing dependencyF)notefataldouyucrypto-js-md5z0Unable to download JS dependency (crypto-js/md5))_download_webpagecachestorer   )selfvideo_idurlZjs_code r   </tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/extractor/douyutv.py_download_cryptojs_md5   s       
z"DouyuBaseIE._download_cryptojs_md5c                 C   s   | j jddddp| |S )Nr   r   z
2024.07.04)Zmin_ver)r   loadr   )r   r   r   r   r   _get_cryptojs_md5&   s      zDouyuBaseIE._get_cryptojs_md5c           	   
   C   st   t  j}tt }| | d| d| d| d| d
}t| }|j||dd }dd t	j
| D S )	N;z;console.log(ub98484234("z","z"))zExecuting JS signing scriptr   c                 S   s   i | ]\}}||d  qS )r   r   ).0ivr   r   r   
<dictcomp>1   s      z*DouyuBaseIE._calc_sign.<locals>.<dictcomp>)uuidZuuid4hexroundtimer!   r   executestripurllibparseparse_qsitems)	r   Z	sign_funcr   abcZ	js_scriptZphantomresultr   r   r   
_calc_sign*   s    
(
zDouyuBaseIE._calc_signTc                 C   s   | j d|d|dS )Nz6(?:<script.*)?<script[^>]*>(.*?ub98484234.*?)</script>zJS sign funcr   )_search_regex)r   webpager   r   r   r   _search_js_sign_func3   s       z DouyuBaseIE._search_js_sign_funcN)T)__name__
__module____qualname__r   r!   r6   r:   r   r   r   r   r      s   	r   c                   @   s   e Zd ZdZdZddddddedd	d
d	dd	i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	iddddddd dd!d
d"dd	idd#d	d$d%d	d$gZd&d' Zd(d) Zd*d+ Z	d,S )-	DouyuTVIEu   斗鱼直播zVhttps?://(?:www\.)?douyu(?:tv)?\.com/(topic/\w+\?rid=|(?:[^/]+/))*(?P<id>[A-Za-z0-9]+)zhttps://www.douyu.com/pigffZ24422Zpigffmp4u?   re:^【PIGFF】.* [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$u.   ≥15级牌子看鱼吧置顶帖进粉丝vx群Tis_live)	id
display_idexttitledescription	thumbnailuploaderr@   live_statusZskip_download)r   	info_dictparamszhttp://www.douyutv.com/85982Z85982Zflvu^   re:^小漠从零单排记！——CSOL2躲猫猫 [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$z$md5:746a2f7a253966a06755a912f0acc0d2zre:^https?://.*\.pngu   douyu小漠)rA   rB   rC   rD   rE   rF   rG   r@   zRoom not found)r   rI   rJ   skipzhttp://www.douyutv.com/17732Z17732uV   re:^清晨醒脑！根本停不下来！ [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$zre:.*m7show@163\.com.*u   7师傅z,https://www.douyu.com/topic/ydxc?rid=6560603Z6560603uV   re:^阿余：新年快乐恭喜发财！ [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$u   re:.*直播时间.*u   阿涛皎月Carry)rA   rB   rC   rD   rE   rF   rG   rH   zhttp://www.douyu.com/xiaocangr   Zonly_matchingzhttp://www.douyu.com/t/lplc                 C   s$   | j d| |ddd d|  S )Nz-https://www.douyu.com/swf_api/homeH5Enc?rids=zGetting signing scriptr#   dataroom)_download_json)r   room_idr   r   r   r   _get_sign_func   s     zDouyuTVIE._get_sign_funcc              	      s   g }t |dD ]}tt |dt |d}|rt |dthf t |d fddfdd	}t|}||t |d
krvdn||d
krdnd d k	r d nd dt |dthfdthfd q|S )N).rM   Zrtmp_urlZ	rtmp_liverate
multiratesc                    s   |d  kS )NrR   r   )_r&   rate_idr   r   <lambda>       z3DouyuTVIE._extract_stream_formats.<locals>.<lambda>F)get_allm3u8r?   m3u8_nativehttpsi)r   	format_idrC   protocolqualitynamebit)formatZtbr)r   r   r	   r   appendr   )r   stream_formatsformatsZstream_infoZ
stream_urlZ	rate_inforC   r   rU   r   _extract_stream_formats   s.     z!DouyuTVIE._extract_stream_formatsc              	   C   s  |  |}| ||}| d|d}| jd|ddddkrFtd|d	| jd
|ddddkrft|d	ddtt d}td| dtj	
| d  |d< t| jd| |d|ddd}t|ddkrt|d	| j|ddp| ||}ddi| |||}| jd| |dt|dg}	t|	d dD ]J}
|
t|	d d kr:|
|d< |	| jd| |d!|
 t|d q:|| |	d"d#t|d$thd%d& hfd'thfd(thfd)thfd*thfd+S ),Nz\$ROOM\.room_id\s*=\s*(\d+)zroom idz"videoLoop"\s*:\s*(\d+)Zloop )default1z The channel is auto-playing VODs)r   z\$ROOM\.show_status\s*=\s*(\d+)status2Zwp)ZaidZ
client_sysr+   zroom/?ZzNzMV1y4EMxOHS6I5WKmauthz#http://www.douyutv.com/api/v1/room/zDownloading room infoF)r   queryr   rM   Zshow_statusr7   rR   r   z*https://www.douyu.com/lapi/live/getH5Play/zDownloading livestream format)r   rM   )rM   rS   .rR   )rM   rR   zDownloading livestream format T)rA   re   r@   r   c                 S   s   | dd  S )Nr   r   )r%   r   r   r   rW      rX   z)DouyuTVIE._real_extract.<locals>.<lambda>Z	room_nameZshow_detailsZnicknameZroom_src)rB   rD   rE   rG   rF   )	_match_idr   r8   r   intr+   hashlibmd5r.   r/   	urlencodeencode	hexdigestr   rO   r:   rQ   r6   r   rc   rf   strr   r   )r   r   r   r9   rP   rJ   rN   js_sign_func	form_datard   rV   r   r   r   _real_extract   st    


   
   zDouyuTVIE._real_extractN)
r;   r<   r=   ZIE_DESC
_VALID_URLrv   _TESTSrQ   rf   ry   r   r   r   r   r>   9   s       Gr>   c                   @   sl   e Zd ZdZdddddeddd	d
eddgdddddgZddddZddddZddddZ	dd Z
dS )DouyuShowIEz;https?://v(?:mobile)?\.douyu\.com/show/(?P<id>[0-9a-zA-Z]+)z)https://v.douyu.com/show/mPyq7oVNe5Yv1gLYZmPyq7oVNe5Yv1gLYr?   uW   四川人小时候的味道“蒜苗回锅肉”，传统菜不能丢，要常做来吃iy  u   美食作家王刚VZOVAO4NVx1m7QicZ20220830u   美食u   美食综合)rA   rC   rD   durationrF   rG   uploader_id	timestampZupload_date
view_counttags)r   rI   z/https://vmobile.douyu.com/show/rjNBdvnVXNzvE2ywTrL   u   原画u   超清u   高清)superhighnormalZ	1920x1080Z1280x720Z852x480c                 C   s  | dd}| |}| ||}| jd|d|td}| |}d|i| |||d d }| jd	|t|d
d}g }t	|ddt
jhdfD ]\}	}t	|dthf}
|
rt|
}|| j|	|	|
| j|	|dkrdn||dkrdnddt| j|	 q| d| j|	|	 d|    q||dt	|dddthfddthfddthfddthfddthfddthfdd thfd!dd"thfd#fS )$Nzvmobile.zv.z<script>\s*window\.\$DATA\s*=z
video info)Ztransform_sourceZvidZROOMZpoint_idz+https://v.douyu.com/api/stream/getStreamUrlzDownloading video formats)rM   r   rM   Zthumb_video.r   rZ   r?   r[   r\   )rb   r]   r   r_   rC   r^   "z!" format may require logging in. )rA   re   ZDATAcontentrD   authorZup_idZvideo_durationZ	video_picZcreate_timeZview_numZvideoTagZtagName)rD   rG   r~   r}   rF   r   r   r   )replacero   r   Z_search_jsonr
   r:   r6   rO   r   r   dictr1   r   r   rc   _FORMATSget
_QUALITIESr   _RESOLUTIONSZ	to_screenZ_login_hintrv   r   r	   )r   r   r   r9   Z
video_inforw   rx   Zurl_infore   r`   Z	video_urlrC   r   r   r   ry     sl    
   
   









zDouyuShowIE._real_extractN)r;   r<   r=   rz   rv   rp   r{   r   r   r   ry   r   r   r   r   r|      s@   r|   )rq   r+   r.   r(   commonr   Zopenloadr   utilsr   r   r   r	   r
   r   r   r   r   r   r   r   r   r>   r|   r   r   r   r   <module>   s   8! !