U
    Mf                    @   sl  d dl Z d dlZd dlZd dlZd dlZ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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%G dd de#Z&G dd de&Z'G dd de&Z(G dd de&Z)G dd de#Z*G dd de#Z+G dd deZ,G dd de#Z-dS )    N   )InfoExtractor   )HEADRequest)ExtractorErrorUnsupportedErrorUserNotLivedetermine_extfilter_dictformat_fieldint_or_nonejoin_nonemptymerge_dictsmimetype2extparse_qs	qualitiesremove_startsrt_subtitles_timecodestr_or_nonetraverse_objtry_calltry_geturl_or_noneurlencode_postdatac                   @   s   e Zd ZdZdZdZdddddd	ZdZdZdZ	e
jd
d Ze
jdd Ze
jdd Ze
jdd Zdd Zedd Zdd Zdd Zd2ddZdd  Zd3d!d"Zd#d$ Zd4d%d&Zd'd( Zd)d* Zd+d, Zd-d. Zd5d0d1ZdS )6TikTokBaseIEzhttps://www.tiktok.com/@%szhttps://www.tiktok.com/)Z360pZ540pZ720pZ1080pN
musical_lyz35.1.3Z
20235010300)iidapp_nameapp_versionmanifest_app_versionaidc                 C   s    | j rdgng }| jd|tdS )N app_infoie_key)_KNOWN_DEVICE_ID_configuration_argTikTokIE)selfdefault r+   ;/tmp/pip-unpacked-wheel-zk9bgjdq/yt_dlp/extractor/tiktok.py_KNOWN_APP_INFO8   s    zTikTokBaseIE._KNOWN_APP_INFOc                 C   s   | j dd gtdd S )N	device_idr$   r   r'   r(   r)   r+   r+   r,   r&   >   s    zTikTokBaseIE._KNOWN_DEVICE_IDc                 C   s   | j pttddS )Nl     *{Y2$ l   `[/MM$0 )r&   strrandomrandintr0   r+   r+   r,   
_DEVICE_IDB   s    zTikTokBaseIE._DEVICE_IDc                 C   s   | j ddgtdd S )NZapi_hostnamez#api16-normal-c-useast1a.tiktokv.comr$   r   r/   r0   r+   r+   r,   _API_HOSTNAMEF   s      zTikTokBaseIE._API_HOSTNAMEc                    s   j d kr:fddj D   fddjD _ j sDdS j d_jd }jd }|d	krzd
| }nd| d| }| d_dS )Nc                    s0   i | ](\}}|d kr| j ||gtdd qS )r   r$   r   r/   ).0keyr*   r0   r+   r,   
<dictcomp>M   s    z3TikTokBaseIE._get_next_app_info.<locals>.<dictcomp>c              
      s0   g | ](} t d d tj|dD qS )c                 s   s   | ]\}}|r||fV  qd S Nr+   )r6   kvr+   r+   r,   	<genexpr>S   s     z=TikTokBaseIE._get_next_app_info.<locals>.<listcomp>.<genexpr>/)dictzip_APP_INFO_DEFAULTSsplit)r6   r#   defaultsr)   r+   r,   
<listcomp>R   s   
z3TikTokBaseIE._get_next_app_info.<locals>.<listcomp>Fr   r   r    r   zcom.zhiliaoapp.musically/zcom.ss.android.ugc.r=   zR (Linux; U; Android 13; en_US; Pixel 7; Build/TD1A.220804.031; Cronet/58.0.2991.0)T)_APP_INFO_POOLr@   itemsr-   pop	_APP_INFO_APP_USER_AGENT)r)   r   versionpackager+   rB   r,   _get_next_app_infoK   s"    



zTikTokBaseIE._get_next_app_infoc                 C   s   d| pd d| S )Nzhttps://www.tiktok.com/@_z/video/r+   )user_idvideo_idr+   r+   r,   _create_urlg   s    zTikTokBaseIE._create_urlc                 C   s   | j d|d|di dS )Nz;<script[^>]+\bid="(?:SIGI_STATE|sigi-persisted-data)"[^>]*>z
sigi state	</script>Zend_patternr*   )_search_jsonr)   webpage
display_idr+   r+   r,   _get_sigi_statek   s        zTikTokBaseIE._get_sigi_statec              	   C   s&   t | jd|d|di ddthfp$i S )Nz;<script[^>]+\bid="__UNIVERSAL_DATA_FOR_REHYDRATION__"[^>]*>zuniversal datarQ   rR   Z__DEFAULT_SCOPE__)r   rS   r>   rT   r+   r+   r,   _get_universal_datap   s        z TikTokBaseIE._get_universal_dataTDownloading API JSONUnable to download API pagec	           
   
   C   s   |  | jddtjddd | | j}	|	drL|  | jd|	d j | j	d| j d| d	||||| j
d
d|pzi ||dS )NZodin_ttr"   0123456789abcdef   r:   sid_ttzhttps://z
/aweme/v1/r=   zapplication/json)
User-AgentAccept)rO   fatalnoteerrnoteheadersquerydata)_set_cookier5   joinr2   choices_get_cookies_WEBPAGE_HOSTgetvalue_download_jsonrI   )
r)   eprO   re   rf   rd   ra   rb   rc   Zwebpage_cookiesr+   r+   r,   _call_api_implv   s$     
    zTikTokBaseIE._call_api_implc              1   C   s   t |dddtt d tt d| jd | jd ddd	 | jd
 dD | jd
 | jd | jd | jd
 ddddddddddddtt t	
dd dddddddddd| jd
 dtt | jd| jdt	jd d!d"d#*S )$NZandroida  Z
googleplayr!   r   r"   c                 s   s   | ]}t |d V  qdS )Z02dNint)r6   r;   r+   r+   r,   r<      s     z0TikTokBaseIE._build_api_query.<locals>.<genexpr>r   .r    z	1080*2400i  zPixel 7ZGoogleenZ29Z13Zwifir   USnormaliQ i# zAmerica/New_Yorkz-14400zarmeabi-v7aZwifi5g1r   r[      r]   )*device_platformosZssmixZ_rticketZcdidchannelr!   r   Zversion_codeZversion_nameZmanifest_version_codeZupdate_version_codeZ
ab_version
resolutionZdpiZdevice_typeZdevice_brandlanguageZos_api
os_versionacZis_padZcurrent_regionZapp_typeZ
sys_regionZlast_install_timeZtimezone_nameZ	residenceapp_languageZtimezone_offsetZhost_abilocaleZac2ZuooZcarrier_regionZ	op_regionbuild_numberregiontsr   r.   Zopenudid)r
   rt   timer1   uuidZuuid4rH   rh   rA   r2   r3   rl   r4   ri   )r)   re   r+   r+   r,   _build_api_query   sZ    


zTikTokBaseIE._build_api_queryc	                 C   s2  | j s2|  s2d}	|r$t|	ddn| |	 d S t| jd }
tdD ]}| t	| j  | 
|phi }z | j||||||||dW   S  tk
r* } z~t|jtjr|jjdkrt	|jp|j}	|  s|rނ n| |	 W Y 0 d S | |	 d| d|
 d	 W Y qJ W 5 d }~X Y qJX qJd S )
Nz No working app info is availableTexpectedr   )re   rf   rd   ra   rb   rc   r   z. Retrying... (attempt z of ))rH   rL   r   report_warninglenrE   	itertoolscountwrite_debugr1   r   rp   
isinstancecausejsonJSONDecodeErrorposmsg)r)   ro   rO   re   rf   rd   ra   rb   rc   messageZ	max_triesr   Z
real_queryer+   r+   r,   	_call_api   s@    
      
zTikTokBaseIE._call_apic                 C   sP   t | jd|td| dddddidd	d
thf}|sFtd|d| |S )Nzmulti/aweme/detail[]r   )Z	aweme_idsZrequest_sourcezX-Argusr"   )rf   rd   Zaweme_detailsr   z#Unable to extract aweme detail inforO   )r   r   r   r>   r   _parse_aweme_video_app)r)   aweme_idaweme_detailr+   r+   r,   _extract_aweme_app   s    


zTikTokBaseIE._extract_aweme_appc                 C   sr  i d }}| j |||ddid}|dkr0||fS |\}}tj|jjdkr~d}	|r^| |	 | |	 d|    ||fS | 	|| }
r| 
d	 t|
d
dthfpd}t|
d
ddthf}n| || }r
| 
d t|ddthfpd}t|d|thf}n`| j||i d }r\| 
d t|dddthfpBd}t|ddddthf}n|rjtd||fS )Nr_   Mozilla/5.0)ra   rd   Fz/loginz4TikTok is requiring login for access to this contentz. z$Found universal data for rehydrationzwebapp.video-detailZ
statusCoder   ZitemInfoZ
itemStructzFound sigi state dataZ	VideoPageZ
ItemModuler*   zFound next.js datapropsZ	pagePropsz$Unable to extract webpage video data)Z_download_webpage_handleurllibparseurlparseurlpathZraise_login_requiredr   Z_login_hintrX   r   r   rt   r>   rW   Z_search_nextjs_datar   )r)   r   rO   ra   
video_datastatusresrU   Zurlhr   Zuniversal_dataZ	sigi_dataZ	next_datar+   r+   r,   _extract_web_data_and_status   s4    




z)TikTokBaseIE._extract_web_data_and_statusc           
   
   C   sV  i }t |dtd}|D ]l}t |dtdd}|s0q| j||dddd}|sJq||d	d
g dddd t|d D d q|st |dtdD ]B}|dsq||dpd
g t	|dd|d d q|sR|r| j
| |||dd\}}	t |dddd fD ]:}||dp,d
g t	|dd|d d q|S )N)Zinteraction_stickers.Zauto_video_caption_infoZauto_captions.expected_type)r   url_list.F)r   get_allzDownloading captionszUnable to download captions)rb   rc   ra   r   rv   Zsrtz

c              	   s   sV   | ]N\}}| d r|d  dt|d d  dt|d d  d|d   V  qdS )textr   

start_timerr   z --> Zend_timeN)rl   r   )r6   iliner+   r+   r,   r<     s    
z.TikTokBaseIE._get_subtitles.<locals>.<genexpr>Z
utterances)extrf   )videoZcla_infoZcaption_infos.r   langZcaption_formatZweb)r   r   ra   r   ZsubtitleInfosc                 S   s   |d S )NUrlr+   rM   r;   r+   r+   r,   <lambda>!      z-TikTokBaseIE._get_subtitles.<locals>.<lambda>ZLanguageCodeNameZFormatr   )r   r>   r   rn   
setdefaultrl   appendrh   	enumerater   r   rP   )
r)   r   r   	user_name	subtitlesZcaptions_infocaptionZcaption_urlZcaption_jsonrM   r+   r+   r,   _get_subtitles   s\          





  
zTikTokBaseIE._get_subtitlesc                 C   s\   | j d|dddd\}}}}|s(i d fS ||dkr6dn|t|dd	pFd t| j|d
|fS )Nz>v[^_]+_(?P<id>(?P<codec>[^_]+)_(?P<res>\d+p)_(?P<bitrate>\d+))zurl key)NNNN)idcodecr   bitrate)r*   groupZbytevc1h265rr   Zscale)	format_idvcodectbrquality)_search_regexr   r   	QUALITIES)r)   url_keyr   r   r   r   r+   r+   r,   _parse_url_key(  s        zTikTokBaseIE._parse_url_keyc                    s  |d }|d }i dd  i f fdd	}g }t |dt |dtfd	d
pdd|dr|||d ddt|ddrdndd |dr|d }t |d|||dd|drdnd dtfdd
|drdndd |dr8|||d dddd |dr`|||d dddd |dg D ]Z}|drl|||d |d d!t|d"d
 t|ddrdnd|d#d$ ql| jd%}|r|D ]$}		t
j|	d& jd%|j qg }
d'D ].}t||d(d)fD ]}|
||d* q0q|d+pZi }|d,pji }t|d-td.}t|d/d0td.}t|d1d2d3td.}|d4o|d5d6|d7k}|r|pd8| }}n|d5t|d3thf }}t|d3d9thfd:thfd;thfd<thfd=f}d>|it|d?thfd?thfd@t hfdAt|dBdCdDdEdFt d.|t|dGjd dHt|dIdJgjd dH|t|dKpd |rtdL|nd |||t|dIdJdG|
t|dMdNtjt dOdPhtfpt|dNt hfjdQ|kdR|kdS|kdTdUdVS )WNr   r   c                 S   s>   t | dd}|dksd| kr:d||dkr,dn|dd d dS i S )	Nm4a)Zdefault_extmp3z-music-zMusic trackaacnone)format_noter   acodecr   widthheight)r	   )r   r   r+   r+   r,   
audio_meta:  s    z7TikTokBaseIE._parse_aweme_video_app.<locals>.audio_metac                    s    dd\}ddk|r|i dtd | dtd |i   dt|d d   fdd	d
pg D S )Nr   r"   r   bytevc2r   r   r   c                    st   g | ]l}|t d ddd|kr&dndd r8dndt dd|krPd	nd
rZdnd
ddd|qS )	data_sizemp4r   zaweme/v1r   )r   filesizer   r   Zsource_preferencer   z(API)Nz(UNPLAYABLE) delim)
preferencer   )r   rl   r   )r6   r   )add_metaaddrr   
is_bytevc2parsed_metar+   r,   rD   M  s&    
 
 zMTikTokBaseIE._parse_aweme_video_app.<locals>.extract_addr.<locals>.<listcomp>r   )r   rl   r   r   update)r   r   r   )r   known_resolutionsr)   )r   r   r   r   r,   extract_addrE  s    z9TikTokBaseIE._parse_aweme_video_app.<locals>.extract_addrr   r   c                      s     S r9   r+   r+   )r   r   r+   r,   r   `  r   z5TikTokBaseIE._parse_aweme_video_app.<locals>.<lambda>      ?Z	play_addrzDirect videoZ
is_bytevc1Zis_h265r   h264)r   r   r   r   r   download_addrzDownload video%sZhas_watermarkz, watermarkedr"   c                      s   t   S r9   rs   r+   )dl_widthratior+   r,   r   r  r   r   r   )r   r   r   r   r   r   Zplay_addr_h264)r   r   r   Zplay_addr_bytevc1bit_rateZ	gear_namezPlayback videoc                 S   s   | d d S )Nr   rr   r+   xr+   r+   r,   r     r   ZFPS)r   r   r   r   Zfpsr^   r   )coverZai_dynamic_coverZanimated_coverZai_dynamic_cover_bakZorigin_coverZdynamic_coverr   .)r   r   Z
statisticsmusic)Zhybrid_label.r   r   )matched_songtitle)matched_pgc_soundr   )r   author)r   r   r   Zis_original_soundr   zoriginal sound - {}Zowner_handleoriginal soundZ	unique_iduidnicknamesec_uid)uploaderuploader_idr}   
channel_idr   descZcreate_time)r   description	timestampZ
play_countZ
digg_countZshare_countcomment_count
view_count
like_countrepost_countr  r  r   r  r  album
(?:, | & ))Nr   durationrr   r   ZPrivatezFriends onlyzFollowers only)
is_privateZneeds_subscriptionZis_unlisted)r   r   sizebr)channel_urluploader_urltrackr  artistsformatsr   
thumbnailsr  Zavailability_format_sort_fields)r   rl   r   extendr   r   _remove_duplicate_formatsrj   rk   rg   r   r   r   hostnamerm   r   r1   formatr   r   _UPLOADER_URL_FORMATrerA   extract_subtitles	functoolspartialanyZ_availability)r)   r   r   
video_infor   r  r   r   Zauth_cookiefr  Zcover_idZ	cover_urlZ
stats_infoZ
music_infolabelsZcontained_music_trackZcontained_music_authorZis_generic_og_tracknameZmusic_trackZmusic_authorauthor_infor+   )r   r   r   r   r   r)   r   r,   r   5  s"   
  



  
	
"       &
         z#TikTokBaseIE._parse_aweme_video_appc              
      s  dddd}t |dthfpi }t|dt|d t fdd	pPd
}g }t |ddd	 fD ]}| t |ddthfpd\}}|ddk}	||	rdnd |	rdndt |ddthfd |ot|d d   }
rH|
dkrd}
|dk r$t|
| }||
||d  d n$t|
| }|||d  |
d t |dddt	hfD ] }|
||d| |i q\qht |fdd	d tf}t |d!d"t	hfD ]&}|
|d#| | |d$ qt |d%t	hfD ] }|
|d&| |d' q| | t |d(d	 D ]2}|t|d)d*d+d,|d-pDd.d/ q|st |d0d1t	hfr|d0 d1 }t t|d2dd3d	 hthfpd4}|
d5| |||d4krdn|d6d7 |S )8Nr   r   r   )r   r   r   r   r   r   c                      s     S r9   r+   r+   Zplay_height
play_widthr+   r,   r     r   z3TikTokBaseIE._extract_web_formats.<locals>.<lambda>r   ZbitrateInfoc                 S   s   |d d S )NPlayAddrUrlListr+   r   r+   r+   r,   r     r   r)  ZUrlKeyr"   r   r   Z
UNPLAYABLEr   r   ZDataSize)r   r   r   r   i  @  r   )r   r   r*  .r   c                    s   |d  kS )Nr   r+   r   )r(  r+   r,   r     r   r   ZplayAddr)).srcNZplay)r   r   r   r   r   )ZdownloadAddr)downloadr   r-  )r   r   c                 S   s   d|d kS )NZunwatermarkedr   r+   r   r+   r+   r,   r     r   r   Zwatermarkedz, r   r   r   )r   r   r   ZplayUrlZ	mime_typec                 S   s   |  ddS )NrM   r=   )replacer   r+   r+   r,   r   "  r   r   audior   )r   r   r   r   r   )r   r>   r   rl   r   r   r1   r   rt   r   r   _proto_relative_urlr"  r  r   r   r   )r)   r   ZCOMMON_FORMAT_INFOr#  r   r  Zbitrate_infoformat_infor   r   Z	dimensionyr   Z	video_urlZplay_qualityZplay_urldownload_urlr$  Z	audio_urlr   r+   r'  r,   _extract_web_formats  s    





 	
   z!TikTokBaseIE._extract_web_formatsFc                 C   s>  t |ddthfdthfdthfdthfdfdd}||r>d n| ||rNd n| ||d d	|id
|t|d| jd dt|ddg| jd ddt |ddthfdthdd hfdthdd hfdthfdft |dthfdthfddthdd hfdthfdt |ddd d!d"d#ftd$d%t |d&d'd(th| j	hfifiS ))N)Z
authorInfor   Nr   )ZauthorSecIdsecUid)uniqueIdr   )ZauthorIdr   r   )r}   r  r  r  Fr   ZReferer)r   r  r   Zhttp_headersr  r   r  r  )r  r  r   r   r  c                 S   s   | pd S r9   r+   r   r+   r+   r,   r   @  r   z5TikTokBaseIE._parse_aweme_video_web.<locals>.<lambda>Z
authorNamec                 S   s   | rt d| S d S )Nr  )r  rA   r   r+   r+   r,   r   A  r   r  )r  r  r  r  r  r   c                 S   s   | pd S r9   r+   r   r+   r+   r,   r   H  r   
createTime)r   r  r  r  statsZ	playCountZ	diggCountZ
shareCountZcommentCountr  r   r  )Nr   )	thumbnailr   ZdynamicCoverZoriginCoverr   )
r   r1   r   r4  r  r   r  r   r   r0  )r)   r   webpage_urlrO   extract_flatr&  r+   r+   r,   _parse_aweme_video_web-  sf       	   z#TikTokBaseIE._parse_aweme_video_web)NNNTrY   rZ   )NNNTrY   rZ   )T)F)__name__
__module____qualname__r  rk   r   r@   rE   rH   rI   r   cached_propertyr-   r&   r4   r5   rL   staticmethodrP   rW   rX   rp   r   r   r   r   r   r   r   r4  r=  r+   r+   r+   r,   r   %   sT   





    
/    


#)  Yr   c                !   @   sP  e Zd ZdZde dgZddddddd	d
ddddddddeeeedddddddddddddd
ddddd d!d"dd#d$eeeed%d&d'd(d)gd*d+d,d-d.dd/d/d0d1d2d3d4d5d6d1gd7d8dd9eeeed:d;d<d=dd>d>d?d@dAdBdCdDdEdFddGeeeedHdIdJdKdLddMdNdOdPdQdRdSdTdUdVdWddXdPgeeeedYd;dZd[dd\d\d]d^d_d`dadadbdcddeeeededIdJdfdgdhdidNdjdkdldmdndodpgdqdrdsdteeeedudvd;dwdxdyddzdzd{d|d}d~dddgdUdddreeeeddddgdddddddddddddgdUdddeeeedddddddddddddddddgdddddeeeedudd,dddgZdd ZdS )r(   zMhttps?://www\.tiktok\.com/(?:embed|@(?P<user_id>[\w\.-]+)?/video)/(?P<id>\d+)z,<(?:script|iframe)[^>]+\bsrc=(["\'])(?P<url>r   z>https://www.tiktok.com/@leenabhushan/video/6748451240264420610Z 736bb7a466c6f0a6afeb597da1e6f5b7Z6748451240264420610r   z!#jassmanak #lehanga #leenabhushan   i   r+  ZleenabhushanZ6691488002098119685zdhttps://www.tiktok.com/@MS4wLjABAAAA_Eb4t1vodM1IuTy_cvp9CY22RAb59xqrO0Xtz9CYQJvgXaDvZxYnZYRzDWhhgJmyZfacestoriesbyleenabhz*re:^https?://[\w\/\.\-]+(~[\w\-]+\.image)?Z20191016iP]ZYsrbeatsZLehanga)r   r   r   r  r  r   r   r  r  r  creatorr:  upload_dater  r	  r
  r  r  artistr  r  z404 Not Foundr   md5	info_dictskipzOhttps://www.tiktok.com/@patroxofficial/video/6742501081818877190?langCountry=enZ f21112672ee4ce05ca390fb6522e1b6fZ6742501081818877190z$md5:5e2a23877420bb85ce6521dbee39ba94   ZpatroxZ18702747zhttps://www.tiktok.com/@patroxzOhttps://www.tiktok.com/@MS4wLjABAAAAiFnldaILebi5heDoVU6bn4jBWWycX6-9U3xuNPqZ8Wsz7MS4wLjABAAAAiFnldaILebi5heDoVU6bn4jBWWycX6-9U3xuNPqZ8WsZpatroXZ20190930i-]z	Evan ToddzJessica Keenan Wynnz	Alice LeezBarrett Wilbert Weedz
Jon EidsonzBig Fun)r   r   r   r  r  r   r   r  r  r  r  r  r}   r:  rE  r  r	  r
  r  r  r  r  r   rH  rI  z<https://www.tiktok.com/@barudakhb_/video/6984138651336838402Z6984138651336838402u.   Balas @yolaaftwsr hayu yu ? #SquadRandom_ 🔥Z
barudakhb_z$md5:29f238c49bc0c176cb3cef1a9cea9fa6Z6974687867511718913z"https://www.tiktok.com/@barudakhb_zdhttps://www.tiktok.com/@MS4wLjABAAAAbhBwQC-R1iKoix6jDFsF-vBdfx2ABoDjaZrM9fX6arU3w71q3cOWgWuTXn1soZ7dzLMS4wLjABAAAAbhBwQC-R1iKoix6jDFsF-vBdfx2ABoDjaZrM9fX6arU3w71q3cOWgWuTXn1soZ7dz
Boka Dancei`   Z20210712)r   r   r   r  r  r}   r  r  r  r  r  r  r  r  r:  rE  r	  r
  r  r  r   rI  z~https://www.tiktok.com/@MS4wLjABAAAATh8Vewkn0LYM7Fo03iec3qKdeCUOcBIouRk1mkiag6h3o_pQu_dUXvZ2EZlGST7_/video/7042692929109986561Z7042692929109986561zSlap and Run!Zuser440922249zSlap And RunZ7036055384943690754zdhttps://www.tiktok.com/@MS4wLjABAAAATh8Vewkn0LYM7Fo03iec3qKdeCUOcBIouRk1mkiag6h3o_pQu_dUXvZ2EZlGST7_ZLMS4wLjABAAAATh8Vewkn0LYM7Fo03iec3qKdeCUOcBIouRk1mkiag6h3o_pQu_dUXvZ2EZlGST7_zPromoted Musicia   Z20211217)r   r   r   r  r  r}   r  r  r  r  r  r  r:  rE  r	  r
  r  r  zThis video is unavailabler   rI  rJ  z?https://www.tiktok.com/@pokemonlife22/video/7059698374567611694Z7059698374567611694z!TikTok video #7059698374567611694r"   Zpokemonlife22ZPokemon6820838815978423302z%https://www.tiktok.com/@pokemonlife22zdhttps://www.tiktok.com/@MS4wLjABAAAA0tF1nBwQVVMyrGu3CqttkNgM68Do1OXUFuCY0CRQk8fEtSVDj89HqoqvbSTmUP2WLMS4wLjABAAAA0tF1nBwQVVMyrGu3CqttkNgM68Do1OXUFuCY0CRQk8fEtSVDj89HqoqvbSTmUP2Wr   iKa   Z20220201)r   r   r   r  r  r}   r  r  r  r  r  r  r  r:  rE  r  r	  r
  r  r  z:https://www.tiktok.com/@denidil6/video/7065799023130643713Z7065799023130643713u   #denidil#денидилZdenidil6Z7046664115636405250zdhttps://www.tiktok.com/@MS4wLjABAAAAsvMSzFdQ4ikl3uR2TEJwMBbB2yZh2Zxwhx-WCo3rbDpAharE3GQCrFuJArI3C8QJzHolocron Musicz[Wolf Sounds (1 Hour) Enjoy the Company of the Animal That Is the Majestic King of the Nightib   Z20220217)r   r   r   r  r  r  r  rF  r  r  r  r  rE  r	  r
  r  r  z@https://www.tiktok.com/@_le_cannibale_/video/7139980461132074283Z7139980461132074283r   z!TikTok video #7139980461132074283ZAntauraZ_le_cannibale_Z6604511138619654149z&https://www.tiktok.com/@_le_cannibale_zdhttps://www.tiktok.com/@MS4wLjABAAAAoShJqaw_5gvy48y3azFeFcT4jeyKWbB0VVYasOCt2tTLwjNFIaDcHAM4D-QGXFOPzLMS4wLjABAAAAoShJqaw_5gvy48y3azFeFcT4jeyKWbB0VVYasOCt2tTLwjNFIaDcHAM4D-QGXFOPznathan !zgrahamscott canon
   Z20220905iiNczre:^https://.+\.(?:webp|jpe?g))r   r   r   r  r}   r  r  r  r  r  r  r  r  rE  r  r	  r
  r  r  r:  z;https://www.tiktok.com/@moxypatch/video/7206382937372134662Z 4cdefa501ac8ac20bf04986e10916feaZ7206382937372134662z$md5:1d95c0b96560ca0e8a231af4172b2c0aZ	MoxyPatchZ	moxypatchZ7039142049363379205z!https://www.tiktok.com/@moxypatchzdhttps://www.tiktok.com/@MS4wLjABAAAAFhqKnngMHJSsifL0w1vFOP5kn3Ndo1ODp0XuIBkNMBCkALTvwILdpu12g3pTtL4VZLMS4wLjABAAAAFhqKnngMHJSsifL0w1vFOP5kn3Ndo1ODp0XuIBkNMBCkALTvwILdpu12g3pTtL4Vzyour worst nightmareZ20230303i7dzre:^https://.+zcount:3)r   r   r   r  r}   r  r  r  r  r  r  r  rE  r  r  r	  r
  r  r  r:  r  zUnable to find video in feed)r   rH  rI  expected_warningsz;https://www.tiktok.com/@tatemcrae/video/7107337212743830830Z 982512017a8a917124d5a08c8ae79621Z7107337212743830830uO   new music video 4 don’t come backkkk🧸🖤 i hope u enjoy !! @musicontiktokZ	tatemcraeZ86328792343818240zdhttps://www.tiktok.com/@MS4wLjABAAAA-0bQT0CqebTRr6I4IkYvMDMKSRSJHLNPBo5HrSklJwyA2psXLSZG5FP-LMNpHnJdzLMS4wLjABAAAA-0bQT0CqebTRr6I4IkYvMDMKSRSJHLNPBo5HrSklJwyA2psXLSZG5FP-LMNpHnJdz
tate mcraeZ20220609iUb   zre:^https://.+\.webp)r   r   r   r  r  r  r  r  r}   r  r  rE  r  r  r	  r
  r  r  r:  z6Unavailable via feed API, only audio available via webz>https://www.tiktok.com/@hara_yoimiya/video/7253412088251534594Z 2ff8fe0174db2dbf49c597a7bef4e47dZ7253412088251534594r   u   я ред флаг простите #переписка #щитпост #тревожныйтиппривязанности #рекомендации Zhara_yoimiyaZ6582536342634676230z$https://www.tiktok.com/@hara_yoimiyazdhttps://www.tiktok.com/@MS4wLjABAAAAIAlDxriiPWLE-p8p1R_0Bx8qWKfi-7zwmGhzU8Mv25W8sNxjfIKrol31qTczzuLBzLMS4wLjABAAAAIAlDxriiPWLE-p8p1R_0Bx8qWKfi-7zwmGhzU8Mv25W8sNxjfIKrol31qTczzuLBu   лампочка(!)u	   Øneheartzwatching the stars<   Z20230708iKd)r   r   r   r  r  r  r  r  r  r}   r  r  r  r  rE  r  r	  r
  r  r  r:  z<https://www.tiktok.com/@hankgreen1/video/7047596209028074758Tr   Zonly_matchingc              
   C   s   |  |dd\}}| jrbz| |W S  tk
r` } zd|_| | d W 5 d }~X Y nX | ||}| ||\}}|r|dkr| 	|||S |dkrtdddtd	| |d
d S )Nr   rN   Tz; trying with webpager   i'  zThis video is privater   z!Video not available, status code r   )
_match_valid_urlr   r-   r   r   r   r   rP   r   r=  )r)   r   rO   rN   r   r   r   r+   r+   r,   _real_extractd  s    "zTikTokIE._real_extractN)r>  r?  r@  
_VALID_URLZ_EMBED_REGEXrt   _TESTSr[  r+   r+   r+   r,   r(   Y  s      	r(   c                   @   s~   e Zd ZdZdZddddddd	d
ddddddddddddddidgZdZdZdd Zdd Z	dd Z
dd ZdS ) TikTokUserIEztiktok:userzK(?:tiktokuser:|https?://(?:www\.)?tiktok\.com/@)(?P<id>[\w.-]+)/?(?:$|[#?])z&https://tiktok.com/@corgibobaa?lang=en-   ZLMS4wLjABAAAAepiJKgwWhulvCpSuUVsp7sgVVsFJbbNaLeQ6OQ0oAJERGDUIXhb2yxxHZedsItgTZ
corgibobaar   r   )r   playlist_mincountrI  z+https://www.tiktok.com/@6820838815978423302   rR  rQ  zhttps://www.tiktok.com/@memeiQ  ZLMS4wLjABAAAAiKfaDWeCsT3IHwY77zqWGtVRIy9v4ws1HbVi7auP1Vx7dJysU_hc5yRiGywojRD6ZmemezWtiktokuser:MS4wLjABAAAAM3R2BtjzVT-uAtstkl2iugMzC6AtnpkojJbjiOdDDrdsTiTR75-8lyWJCY5VvDrZ   r   zLMS4wLjABAAAAM3R2BtjzVT-uAtstkl2iugMzC6AtnpkojJbjiOdDDrdsTiTR75-8lyWJCY5VvDrZzPMozilla/5.0 (Windows NT 10.0; Win64; x64; rv:115.0) Gecko/20100101 Firefox/115.0z-https://www.tiktok.com/api/creator/item_list/c              $   C   s^   ddddddddddd	|| j d
dddddddddddd|ddddtjtjdd ddS )N1988rv   Z
tiktok_webzen-USZMozillatrueZWin32z5.0 (Windows)Z15Zweb_pcuser2falseZwindowsr"   rw   Z1080Z1920ry   UTCZverify_   r]   )r!   r   r   Zbrowser_languageZbrowser_nameZbrowser_onlineZbrowser_platformZbrowser_versionr}   Zcookie_enabledr   cursorr.   r{   Zfocus_stateZ	from_pageZhistory_lenZis_fullscreenZis_page_visibler   r|   Zpriority_regionZrefererr   Zscreen_heightZscreen_widthr5  typeZtz_nameZverifyFpZwebcast_language)r4   rh   r2   ri   string	hexdigits)r)   r   rk  r+   r+   r,   _build_web_query  s@    zTikTokUserIE._build_web_queryc              
   c   s  |p|}t  }tt d }tdD ]}| j| j|d| | ||d| jid}t	|ddd fD ]L}|d	 }	|	|kr~qh|
|	 | ||	}
| j|
tf| j||
|	d
dV  qh|}t	|ddddd hf}|r||kr|d }|dk st	|ds( qq(d S )N     @@r   Downloading page r_   )re   rd   itemListc                 S   s   |d S Nr   r+   r   r+   r+   r,   r     r   z'TikTokUserIE._entries.<locals>.<lambda>r   Tr<  r   r8  c                 S   s   t | d S )Nrp  rs   r   r+   r+   r,   r     r   i $l   4<H[ZhasMorePrevious)setrt   r   r   r   rn   _API_BASE_URLro  _USER_AGENTr   addrP   
url_resultr(   r=  )r)   r   r   rV   Zseen_idsrk  pageresponser   rO   r;  Z
old_cursorr+   r+   r,   _entries  s@      
 
  zTikTokUserIE._entriesc              	   C   sz   | j ||dddid| dd| ddp,d}t| ||d	d
ddthfpxt| ||ddddthfddddthtfS )NFr_   r   zDownloading z webpagezUnable to download )ra   rd   rb   rc   r"   zwebapp.user-detailZuserInforf  r5  LiveRoomliveRoomUserInfo
UserModuleusers.)_download_webpager   rX   r1   rW   r"  )r)   Zuser_urlr   r   rU   r+   r+   r,   _get_sec_uid  s$       
 
zTikTokUserIE._get_sec_uidc                 C   s0  |  |d  }}td| }r2d |d }}n.| | j| |dp^| | j| d |d}|s| jd| |ddd	pd
}t| jd|d|i dddd| t	hf}t|dddt
hfD ]F}| ||}| j||dd\}	}
| j|	||ddd}|r qq|stddd| | ||||S )NzMS4wLjABAAAA[\w-]{64}r   rf  z/liveZlivezhttps://www.tiktok.com/embed/@zDownloading user embed pageF)rb   ra   r"   z;<script[^>]+\bid=[\'"]__FRONTITY_CONNECT_STATE__[\'"][^>]*>rf   r   sourcez/embed/@Z	videoList.r   r   Trt  r  zUnable to extract secondary user ID. If you are able to get the channel_id from a video posted by this user, try using "tiktokuser:channel_id" as the input URL (replacing `channel_id` with its actual value)r   )	_match_idr  	fullmatchr   r  r  r  r   rS   r>   r1   rP   r   r=  rl   r   playlist_resultr|  )r)   r   r   r   ZmobjrU   rf   r   r;  r   rM   r+   r+   r,   r[    sV            zTikTokUserIE._real_extractN)r>  r?  r@  IE_NAMEr\  r]  rw  rv  ro  r|  r  r[  r+   r+   r+   r,   r^  x  sB    #
r^  c                   @   s   e Zd Zdd Zdd ZdS )TikTokBaseListIEc           	      c   s   | j |ddddddd| ji}tdD ]}|  D ]r}z | j| j||d	| d
d}W q2 tk
r } z.t|j	t
jr|j	jdkr||_W Y q2 W 5 d }~X Y q2X q2|dg D ]*}| |t dd|d  dV  q|ds q|d |d< q&d S )Nrk  r   r      rl  rb  r.   r   zDownloading video list page zUnable to download video list)re   rb   rc   Z
aweme_listZTikTokzhttps://tiktok.com/@_/video/r   )Zextractor_keyZ	extractorr;  Zhas_more)_QUERY_NAMEr4   r   r   ZRetryManagerr   _API_ENDPOINTr   r   r   r   r   r   errorrl   r   r(   r%   )	r)   list_idrV   re   rz  retryZ	post_listr   r   r+   r+   r,   r|    sF           

zTikTokBaseListIE._entriesc                 C   s   |  |}| | |||S r9   )r  r  r|  )r)   r   r  r+   r+   r,   r[  (  s    
zTikTokBaseListIE._real_extractN)r>  r?  r@  r|  r[  r+   r+   r+   r,   r    s    r  c                   @   sH   e Zd ZdZdZdZdZdZdddd	id
gdddddid
gdgZdS )TikTokSoundIEztiktok:soundzBhttps?://(?:www\.)?tiktok\.com/music/[\w\.-]+-(?P<id>[\d]+)[/?#&]?FZmusic_idzmusic/awemezEhttps://www.tiktok.com/music/Build-a-Btch-6956990112127585029?lang=end   r   Z6956990112127585029Retryingr   ra  rI  rV  zBhttps://www.tiktok.com/music/jiefei-soap-remix-7036843036118469381i  Z7036843036118469381N	r>  r?  r@  r  r\  _WORKINGr  r  r]  r+   r+   r+   r,   r  -  s(    	 r  c                   @   s>   e Zd ZdZdZdZdZdZdddd	id
gddddgZdS )TikTokEffectIEztiktok:effectzDhttps?://(?:www\.)?tiktok\.com/sticker/[\w\.-]+-(?P<id>[\d]+)[/?#&]?FZ
sticker_idzsticker/awemez7https://www.tiktok.com/sticker/MATERIAL-GWOOORL-1258156r  r   Z1258156r  r  z0https://www.tiktok.com/sticker/Elf-Friend-479565TrY  Nr  r+   r+   r+   r,   r  E  s     	r  c                   @   sH   e Zd ZdZdZdZdZdZdddd	d
dgddddgZdd Z	dS )TikTokTagIEz
tiktok:tagz3https?://(?:www\.)?tiktok\.com/tag/(?P<id>[^/?#&]+)FZch_idzchallenge/awemez https://tiktok.com/tag/hello2018'   Z46294678Z	hello2018r`  r  r  u=   https://tiktok.com/tag/fypシ?is_copy_url=0&is_from_webapp=v1TrY  c                 C   sB   |  |}| j||ddid}| d|d}| | ||||S )Nr_   zIfacebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)rd   z"snssdk\d*://challenge/detail/(\d+)ztag ID)r  r  Z_html_search_regexr  r|  )r)   r   rV   rU   Ztag_idr+   r+   r,   r[  l  s    
 zTikTokTagIE._real_extractN)
r>  r?  r@  r  r\  r  r  r  r]  r[  r+   r+   r+   r,   r  Y  s"   	r  c                   @   sX   e Zd ZdZdZddddddd	d
ddddgZdZdZdd Zdd Z	dd Z
dS )TikTokCollectionIEztiktok:collectionzehttps?://www\.tiktok\.com/@(?P<user_id>[\w.-]+)/collection/(?P<title>[^/?#]+)-(?P<id>\d+)/?(?:[?#]|$)zMhttps://www.tiktok.com/@imanoreotwe/collection/count-test-7371330159376370462Z7371330159376370462zimanoreotwe-count-testr`  	   )r   rI  Zplaylist_countzOhttps://www.tiktok.com/@imanoreotwe/collection/%F0%9F%98%82-7111887189571160875Z7111887189571160875zimanoreotwe-%F0%9F%98%82r  )r   rI  ra  z0https://www.tiktok.com/api/collection/item_list/rO  c                 C   s   d|| j |ddS )Nrd  Z113)r!   ZcollectionIdr   rk  Z
sourceType)_PAGE_COUNT)r)   collection_idrk  r+   r+   r,   ro    s    z#TikTokCollectionIE._build_web_queryc           	   
   c   s   d}t dD ]}| j| j|d| | ||d}t|ddd fD ]P}|d }t|d	d
thtfphd}| ||}| j	|t
f| j|||ddV  qFt|ds q|| j7 }qd S )Nr   r   rq  )re   rr  c                 S   s   |d S rs  r+   r   r+   r+   r,   r     r   z-TikTokCollectionIE._entries.<locals>.<lambda>r   r   )r6  r5  r   rM   Trt  ZhasMore)r   r   rn   rv  ro  r   r1   r"  rP   ry  r(   r=  r  )	r)   r  rk  rz  r{  r   rO   r   r;  r+   r+   r,   r|    s*      
 
zTikTokCollectionIE._entriesc                 C   s8   |  |ddd\}}}| | ||d||fS )Nr   r   rN   -)rZ  r   r  r|  rh   )r)   r   r  r   r   r+   r+   r,   r[    s      z TikTokCollectionIE._real_extractN)r>  r?  r@  r  r\  r]  rv  r  ro  r|  r[  r+   r+   r+   r,   r  u  s(   
	r  c                   @   s  e Zd ZdZddddddddd	d
ddddddgeeeedddddddddddddddddddgeeeedddd d!d"dd#d#ddd	d
dd$d%d&ddgeeeedddd'd(d)dd*dd+d,deeeed-d.d/d0d1d2dd3d3ddd	d
dd4d5d6ddgeeeedddgZd7Zd8Zd9d: Zd;S )<DouyinIEz3https?://(?:www\.)?douyin\.com/video/(?P<id>[0-9]+)z0https://www.douyin.com/video/6961737553342991651Z 9ecce7bc5b302601018ecb2871c63a75Z6961737553342991651r   u-   #杨超越  小小水手带你去远航❤️Z
6897520xkaZ110403406559zShttps://www.douyin.com/user/MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98Z7MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98u	   杨超越   io`Z20210513u   @杨超越创作的原声zre:https?://.+\.jpe?g)r   r   r   r  r  r  r  r  r}   r  r  rE  r  r  r	  r
  r  r  r:  rL  z0https://www.douyin.com/video/6982497745948921092Z 15c5e660b7048af3707304e3cc02bbb5Z6982497745948921092u8   这个夏日和小羊@杨超越 一起遇见白色幻想Z0731chaoyueZ408654318141572zShttps://www.douyin.com/user/MS4wLjABAAAAZJpnglcjW2f_CMVcnqA_6oVBXKWMpH0F8LIHuUu8-lAz7MS4wLjABAAAAZJpnglcjW2f_CMVcnqA_6oVBXKWMpH0F8LIHuUu8-lAu   杨超越工作室*   i`Z20210708u"   @杨超越工作室创作的原声z0https://www.douyin.com/video/6953975910773099811Z 0e6443758b8355db9a3c34864a4276beZ6953975910773099811u'   #一起看海  出现在你的夏日里   iD|`Z20210422z0https://www.douyin.com/video/6950251282489675042Z b4db86aec367ef810ddd38b1737d2fedZ6950251282489675042u'   哈哈哈，成功了哈哈哈哈哈哈Z20210412i@t`)r   r   r   r  rE  r  r  r	  r
  r  r  zNo longer availablerG  z0https://www.douyin.com/video/6963263655114722595Z 1440bcf59d8700f8e014da073a4dfea8Z6963263655114722595u8   #哪个爱豆的105度最甜 换个角度看看我哈哈   ik{`Z20210517zhttps://www.douyin.com/user/%szhttps://www.douyin.com/c              	   C   sZ   |  |}t| jd|ddd|idddthf}|sPtd| | jd	 d
| |S )Nz1https://www.douyin.com/aweme/v1/web/aweme/detail/zDownloading web detail JSONz"Failed to download web detail JSONr   F)re   ra   r   z4Fresh cookies (not necessarily logged in) are neededZ
s_v_web_idr   )	r  r   rn   r>   r   rj   rk   rl   r   )r)   r   rO   Zdetailr+   r+   r,   r[  &  s"    
   zDouyinIE._real_extractN)	r>  r?  r@  r\  rt   r]  r  rk   r[  r+   r+   r+   r,   r    s   rr  c                   @   s   e Zd ZdZdZddddddeeed	d
dddedddddddddddddeeeddddedddddddd d!d"gZd#d$ Zd%S )&
TikTokVMIEzFhttps?://(?:(?:vm|vt)\.tiktok\.com|(?:www\.)tiktok\.com/t)/(?P<id>\w+)z	vm.tiktokz"https://www.tiktok.com/t/ZTRC5xgJpZ7170520270497680683r   z$md5:c64f6152330c2efe98093ccc8597871cZ6687535061741700102Z20221127zdhttps://www.tiktok.com/@MS4wLjABAAAAObqu3WCTXxmw2xwZ3iLEHnEecEIw7ks6rxWqOqOhaPja9BI7gqUQnjw8_5FSoDXXz"Wave of Mutilation: Best of Pixieszre:https://.+\.webp.*rb  i:΂cZPixieszWhere Is My Mind?ZsigmachaddeusZ	SigmaChad)r   r   r   r  rE  r	  r
  r  r  r  r:  r  r  r  rF  r  r  r  rD  rN  z https://vm.tiktok.com/ZTR45GpSF/Z7106798200794926362z$md5:edc3e7ea587847f8537468f2fe51d074Z6997695878846268418Z20220608zdhttps://www.tiktok.com/@MS4wLjABAAAAdZ_NcPPgMneaGrW0hN8O_J_bwLshwNNERRF5DxOw2HKIzk0kdlLrR8RkVl1ksrMO   iPkbZ	Akihitokor   Z
akihitoko1)r   r   r   r  rE  r	  r
  r  r:  r  r  r  r  rF  r  r  r  rD  zhttps://vt.tiktok.com/ZSe4FqkKdTrY  c                 C   s<   | j t|| |ddidj}| |r2t|| |S )Nr_   zfacebookexternalhit/1.1r  )Z_request_webpager   r  r   Zsuitabler   ry  )r)   r   new_urlr+   r+   r,   r[  l  s      
zTikTokVMIE._real_extractN)r>  r?  r@  r\  r  rt   r]  r[  r+   r+   r+   r,   r  6  sd   2r  c                   @   sz   e Zd ZdZdZddddddd	d
ded	ddiddddeddddded	ddddddddgZd!ddZdd  Z	dS )"TikTokLiveIEz(?x)https?://(?:
        (?:www\.)?tiktok\.com/@(?P<uploader>[\w.-]+)/live|
        m\.tiktok\.com/share/live/(?P<id>\d+)
    )ztiktok:livez,https://www.tiktok.com/@weathernewslive/liveZ7210809319192726273r   u(   re:ウェザーニュースLiVE[\d\s:-]*u   ウェザーニュースLiVEZweathernewsliveZ6621496731283095554z'https://www.tiktok.com/@weathernewsliveis_live)	r   r   r   rD  r  r  r  Zlive_statusconcurrent_view_countZskip_downloadZm3u8)r   rI  paramsz)https://www.tiktok.com/@pilarmagenta/liveZ7209423610325322522ZPilarmagentaZpilarmagentaZ6624846890674683909z$https://www.tiktok.com/@pilarmagentaZ
LivestreamrP  z@https://m.tiktok.com/share/live/7209423610325322522/?language=enTrY  z&https://www.tiktok.com/@iris04201/liveNc              	   C   s^   t | j||ddd||id|thfi d}t|ddkr@|S |sPtdd	d
t|dd S )NFr!   rd  )ra   re   r   r   r   zThis livestream has endedTr   r   )r   rn   r>   r   rl   r   r   )r)   r   paramroom_idr  r7   r{  r+   r+   r,   r     s$         zTikTokLiveIE._call_apic                    s0   |dd\}}j||p"|ddi| d}|r||pB|}t|dddd	thfd
dptjd|dd dpt|}|pt|ddd
td}|st|dg }j	dd||dd t
d}fddt ddddhdthfi d D ]\}}	t|	ddhd thfd!d"d hfd#d$d hfd%f}
t|	dd&thf}|rb||d&d'| ||d(|
 t|	dd)thf}|r||d*d+d,| ||d-|
 q fd.d/}d0D ]l}	t d|	 d1thf}|r|||	d)krd*nd&|	d)krd+nd2|	 d3||	 d4|d5d6 qt dd7thfi d D ]B\}}t|sNq8||d&d'|  |d8|||d9 q8t|d:d st j	d;d<||d=d t d>r| d> d*d+d?d@|dAd6 |pt dBdC}||t|d jpd dD|dEdFt dGdHdthfdIdJthfdKd
dS )LNr  r   r_   r   )rd   ra   r  r  .ZroomIdFr7  zsnssdk\d*://live\?room_id=(\d+)zroom IDr   )r}  r~  rf  r6  )r  r  .r6  )r   r   r   z,https://webcast.tiktok.com/webcast/room/infor  rf   )r7   )
ZSD1ZldZSD2sdZHD1ZhdZFULL_HD1ZuhdORIGIONoriginc                    s     | d S r9   )Z_parse_jsonr   r0   r+   r,   r     r   z,TikTokLiveIE._real_extract.<locals>.<lambda>
stream_urlZlive_core_sdk_dataZ	pull_dataZstream_datamain
sdk_paramsVCodecZvbitratec                 S   s
   t | dS )Nrr   )r   r   r+   r+   r,   r     r   r~   c                 S   s   t d|   S )Nz(?i)\d+x\d+|\d+p)r  matchr   lowerr   r+   r+   r,   r     r   )r   r   r~   Zflvzflv-)r   r   r   r   hlsr   Zm3u8_nativezhls-)r   r   protocolr   r   c                     s   t  d| hdthfS )Nr  r  )r  )r   r1   )keys)	live_infoparse_innerr+   r,   
get_vcodec  s        z.TikTokLiveIE._real_extract.<locals>.get_vcodec)r  ZrtmpZ	_pull_urlhttpsz-pullZ_pull_url_paramsr  )r   r   r  r   r   r   Zflv_pull_urlZflv_pull_url_params)r   r   r   r   r   c                 S   s   |d dkS )Nr   r   r+   r   r+   r+   r,   r     r   z'https://www.tiktok.com/api/live/detail/ZroomIDZLiveRoomInfoZliveUrlzhls-fallbackr   r  )	ownerInfor6  )ownerrV   T)r   r   )r   r  r  r  r  r  r   r  r  )r  r   )Z
user_count)ZliveRoomStatsZ	userCount)r   r  rD  r  )rZ  r   r  rW   r   r   r   r1   r   r   r   r>   rF   r   r   r  r   rl   r   r  r   )r)   r   r  r  rU   rf   r  Zget_qualityr   streamr  Zflv_urlZhls_urlr  r  Zf_idZf_urlr+   )r  r  r)   r,   r[    s          
         
		"
	    	
zTikTokLiveIE._real_extract)N)
r>  r?  r@  r\  r  rt   r1   r]  r   r[  r+   r+   r+   r,   r  t  sJ   $
r  ).r   r   r   r2   r  rm  r   urllib.parser   r   commonr   Z
networkingr   utilsr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r(   r^  r  r  r  r  r  r  r  r  r+   r+   r+   r,   <module>   s<   X    8  ! &: >