a
    hH                    @   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srt_subtitles_timecodestr_or_nonetraverse_objtruncate_string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+   L/mnt/pikpak/tmp/myenv/lib/python3.9/site-packages/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   B2n?- )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 u 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              
      s4   g | ],}i  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 i |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<          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   uuiduuid4rH   rh   rA   r2   r3   rl   r4   ri   )r)   re   r+   r+   r,   _build_api_query   s\    


zTikTokBaseIE._build_api_queryc	                 C   s<  | 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y4 } zt|jtjr|jjdkrt	|jp|j}	|  s|r܂ n| |	 W Y d }~ d S | |	 d| d|
 d	 W Y d }~qJ W Y d }~qJd }~0 0 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   s4    


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   s  i d }}| j |||ddid}|du 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t|dthfst|dthfrd}	|r| |	 | j|	 d|   |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-detail
statusCoder   ZitemInfoZ
itemStructzFound sigi state dataZ	VideoPageZ
ItemModuler*   zFound next.js datapropsZ	pagePropsz$Unable to extract webpage video datavideoZisContentClassifiedzFThis post may not be comfortable for some audiences. Log in for accessr   )Z_download_webpage_handleurllibparseurlparseurlpathraise_login_requiredr   Z_login_hintrX   r   r   rt   r>   rW   Z_search_nextjs_datar   bool)r)   r   rO   ra   
video_datastatusresrU   Zurlhr   Zuniversal_dataZ	sigi_dataZ	next_datar+   r+   r,   _extract_web_data_and_status   s>    




$
z)TikTokBaseIE._extract_web_data_and_statusc              
      s  dddd}t t|  i }t|dtd}|D ]l}t|dtdd	}|sLq2| j||d
ddd}	|	sfq2||ddg 	dd
dd t|	d D d q2|st|dtdD ]B}|dsq||dpdg 	|d ||dd q|sn|r| j| |||dd\}}
t|dddd fD ]:}||dpHdg 	|d ||dd q2| D ]"\}}t| fd dd!||< qv|S )"Nr   srtZvtt)Zcreator_captionr   Zwebvtt)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   rw   z

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   )r   Zcla_infoZcaption_infos.r   langZFormatr   r   ra   r   ZsubtitleInfosc                 S   s   |d S )NUrlr+   rM   r;   r+   r+   r,   <lambda>0  ru   z-TikTokBaseIE._get_subtitles.<locals>.<lambda>ZLanguageCodeNamer   c                    s    | d S )Nr   r+   x
preferencer+   r,   r   8  ru   r7   )r   tuplevaluesr   r>   r   rn   
setdefaultrl   appendrh   	enumerater   rP   rF   sorted)r)   r   r   	user_nameZEXT_MAP	subtitlesZcaptions_infocaptionZcaption_urlZcaption_jsonrM   r   Z	subs_listr+   r   r,   _get_subtitles  sZ    






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)Z_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 q|d'p"i }	|d(p2i }
t|d)td*}t|
d+d,td*}t|
d-d.d/td*}|
d0o|
d1d2|
d3k}|r|pd4| }}n|
d1t|
d/thf }}t|d/d5thfd6thfd7thfd8thfd9f}d:|it|d;td<d=hfd;thfd>t hfd?t|	d@dAdBdCdDt d*|t|dEjd dFt|dGdHgjd dF|t|
dIprd |rtdJ|nd |||t|dGdHdEfdKdLdMD tdNdOt dPdQhtfpt|
dOt hfjdR|v dS|v dT|v dUdVdWS )XNr   r   c                 S   s>   t | dd}|dksd| v 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,   
audio_metaN  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              
      sz   g | ]r}|t d ddd|v r&dndd r<dndt dd|v rTd	nd
r^dnd
ddd|qS )	data_sizemp4r   zaweme/v1r   )r   filesizer   r   Zsource_preferencer   z(API)Nz(UNPLAYABLE) )delim)r   r   )r   rl   r   )r6   r   )add_metaaddrr   
is_bytevc2parsed_metar+   r,   rD   a  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_addrY  s    z9TikTokBaseIE._parse_aweme_video_app.<locals>.extract_addrr   r   c                      s     S r9   r+   r+   )r   r   r+   r,   r   t  ru   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     ru   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+   r   r+   r+   r,   r     ru   ZFPS)r   r   r   r   Zfpsr^   r   
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   descH   leftZcreate_time)r  description	timestampZ
play_countZ
digg_countZshare_countcomment_count
view_count
like_countrepost_countr  r  r   r  r  album
(?:, | & )c                    s:   g | ]2}t  |d dfD ]}|||dv r,dnddqqS )r   .)coverorigin_coverr   r   r   r   r   )r   r6   Zcover_idZ	cover_url)
video_infor+   r,   rD     s   z7TikTokBaseIE._parse_aweme_video_app.<locals>.<listcomp>)r  Zai_dynamic_coverZanimated_coverZai_dynamic_cover_bakr  Zdynamic_cover)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   r1   formatr   r   r   _UPLOADER_URL_FORMATrerA   extract_subtitlesanyZ_availability)r)   r   r   r   r(  r   r   Zauth_cookiefZ
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,   r   I  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 ]&}|
i ||d| |i q\qht |fdd	d tf}t |d!d"t	hfD ]*}|
i |d#| | |d$ qt |d%t	hfD ](}|
i |d&| |d'd(d) q| | |st |d*d+t	hfr|d* d+ }t t|d,dd-d	 hthfphd.}|
d/| |||d.krdn|d0d1 d2d3 |D S )4Nr   r   r   )r   r   r   r   r   r   c                      s     S r9   r+   r+   Zplay_height
play_widthr+   r,   r     ru   z3TikTokBaseIE._extract_web_formats.<locals>.<lambda>r   ZbitrateInfoc                 S   s   |d d S )NPlayAddrUrlListr+   r   r+   r+   r,   r     ru   r8  ZUrlKeyr"   r   r   Z
UNPLAYABLEr   r   ZDataSize)r   r   r   r   i  @  r   )r   r   r9  .r   c                    s   |d  kS )Nr   r+   r   )r7  r+   r,   r     ru   r   ZplayAddr)).srcNZplay)r   r   r   r   r   )ZdownloadAddr)downloadr   r<  Zwatermarkedr   )r   r   r   r   r  ZplayUrlZ	mime_typec                 S   s   |  ddS )NrM   r=   )replacer   r+   r+   r,   r   3  ru   r   audior   )r   r   r   r   r   c                 S   s&   g | ]}t j|d  jdkr|qS )r   zwww.tiktok.com)r   r   r   r-  )r6   r3  r+   r+   r,   rD   =  ru   z5TikTokBaseIE._extract_web_formats.<locals>.<listcomp>)r   r>   r   rl   r   r   r1   r   rt   r   r   _proto_relative_urlr2  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_urlZ	audio_urlr   r+   r6  r,   _extract_web_formats  s    






	
	z!TikTokBaseIE._extract_web_formatsFc              
      s8  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tfdthdd hfdthfdft  dt	ddhfdthfddthtfdthfdt  ddd d!d"d#ftd$d% fd&d'd(D 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  Z
authorNamec                 S   s   | rt d| S d S )Nr  )r0  rA   r   r+   r+   r,   r   S  ru   z5TikTokBaseIE._parse_aweme_video_web.<locals>.<lambda>r   )r&  r  r'  r   r  r  r  r   
createTime)r  r  r   r  statsZ	playCountZ	diggCountZ
shareCountZcommentCountr  r   r)  c                    sB   g | ]:}t  d |thfD ]"}|||dkr4dnddqqS ))Nr   dynamicCoverr   r   r  )r   r   r?  r  r   r)   r+   r,   rD   c  s   z7TikTokBaseIE._parse_aweme_video_web.<locals>.<listcomp>)	thumbnailr  rI  ZoriginCover)
r   r1   r   rC  r1  r   r/  filterr   r   )r)   r   webpage_urlrO   extract_flatr5  r+   rJ  r,   _parse_aweme_video_web?  s^    	
z#TikTokBaseIE._parse_aweme_video_web)NNNTrY   rZ   )NNNTrY   rZ   )T)F)__name__
__module____qualname__r/  rk   r   r@   rE   rH   rI   	functoolscached_propertyr-   r&   r4   r5   rL   staticmethodrP   rW   rX   rp   r   r   r   r   r   r   r   rC  rO  r+   r+   r+   r,   r   %   sP   





  
/  


)7 !Vr   c                !   @   sJ  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g d&d'd(d)d*d+dd,d,d-d.d/d0d1d2d3d.gd4d5dd6eeeed7d8d9d:dd;d;d<d=d>d?d@dAdBdCddDeeeedEdFdGdHdIddJdKdLdMdNdOdPdQdRdSdTddUdMgeeeedVd8dWdXddYdYdZd[d\d]d^d^d_d`daeeeedbdFdGdcdddedfdKdgdhdidjdkdldmgdndodpdqeeeedrdsd8dtdudvddwdwdxdydzd{d|d}d~gdRdddoeeeeddddgdddddddddddddgdRdddeeeedddddddddddddddddgdddddeeeedrd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%  creatorrK  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6742501081818877190uN   Tag 1 Friend reverse this Video and look what happens 🤩😱 @skyandtami ...z$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~   rK  rX  r  r  r  r  r  r'  r&  r   r[  r\  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   rK  rX  r  r  r  r  r   r\  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   rK  rX  r  r  r  r  zThis video is unavailabler   r\  r]  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   rK  rX  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%  rY  r  r&  r  r   rX  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   rX  r  r  r  r  r  rK  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&  rX  r  r   r  r  r  r  rK  r)  zUnable to find video in feed)r   r[  r\  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&  rX  r  r   r  r  r  r  rK  z6Unavailable via feed API, only audio available via webz>https://www.tiktok.com/@hara_yoimiya/video/7253412088251534594Z 2ff8fe0174db2dbf49c597a7bef4e47dZ7253412088251534594r   u   я ред флаг простите #переписка #щитпост #тревожныйтиппривязанности #р...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   rX  r  r  r  r  r  rK  z<https://www.tiktok.com/@hankgreen1/video/7047596209028074758Tr   Zonly_matchingc              
   C   s   |  |dd\}}| jrdz| |W S  tyb } z"d|_| | d W Y d }~n
d }~0 0 | ||}| ||\}}|r|dkr| 	|||S |dv r| 
d n|dkrtd	dd
td| |dd S )Nr   rN   Tz; trying with webpager   )i'  '  zQYou do not have permission to view this post. Log into an account that has accessi'  z3Your IP address is blocked from accessing this postr   z!Video not available, status code r   )_match_valid_urlr   r-   r   r   r   r   rP   r   rO  r   )r)   r   rO   rN   r   r   r   r+   r+   r,   _real_extractz  s$    &zTikTokIE._real_extractN)rP  rQ  rR  
_VALID_URLZ_EMBED_REGEXrt   _TESTSro  r+   r+   r+   r,   r(   o  s      	r(   c                	   @   s   e Zd ZdZdZddddddgd	d
idddddddgd	d
idddddddgd	d
idddddidgd	d
idgZdZdd Zd#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  &TikTok API keeps sending the same pageZextractor_retriesrh  )r   playlist_mincountr\  ri  paramsz+https://www.tiktok.com/@6820838815978423302   re  rd  zhttps://www.tiktok.com/@memeiQ  ZLMS4wLjABAAAAiKfaDWeCsT3IHwY77zqWGtVRIy9v4ws1HbVi7auP1Vx7dJysU_hc5yRiGywojRD6ZmemezWtiktokuser:MS4wLjABAAAAM3R2BtjzVT-uAtstkl2iugMzC6AtnpkojJbjiOdDDrdsTiTR75-8lyWJCY5VvDrZ   r   zLMS4wLjABAAAAM3R2BtjzVT-uAtstkl2iugMzC6AtnpkojJbjiOdDDrdsTiTR75-8lyWJCY5VvDrZz-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1988rw   Z
tiktok_webzen-USZMozillatrueZWin32z5.0 (Windows)Z15Zweb_pcuser2falseZwindowsr"   rx   Z1080Z1920rz   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_widthrD  typeZtz_nameZverifyFpZwebcast_language)r4   rh   r2   ri   string	hexdigits)r)   r
  r  r+   r+   r,   _build_web_query  s@    zTikTokUserIE._build_web_queryFc                 c   s  |p|}t  }tt d }tdD ]V}|  D ]}| j| j|d| | ||d}	t	t
|	dddthf}
|
r6|
t	|kr6d}| jrt| d	d
d| `t| dd
d|_q6t
|	ddd fD ]P}|d }||v rq|| | ||}| j|tfi | j|||d
dV  q|}t
|	ddddd hf}|rJ||krR|d }|dk sht
|	dsn d S |r(|s(| d q(d S )N     @@r   Downloading page re   itemList.r   ru  z&. Try again with a different device_idTr   z+. Taking measures to avoid an infinite loopc                 S   s   |d S Nr   r+   r   r+   r+   r,   r     ru   z'TikTokUserIE._entries.<locals>.<lambda>rN  r   rG  c                 S   s   t | d S )Nr  rs   r   r+   r+   r,   r     ru   i $l   4<H[ZhasMorePreviousztThis user's account is likely either private or all of their videos are private. Log into an account that has access)setrt   r   r   r   RetryManagerrn   _API_BASE_URLr  r   r   r1   r&   r   r4   erroraddrP   
url_resultr(   rO  r   )r)   r
  r   
fail_earlyrV   Zseen_idsr  pageretryresponseZcurrent_batchr   r   rO   rM  Z
old_cursorr+   r+   r,   _entries  sV    





zTikTokUserIE._entriesc           	      C   s   | j d| |dddd}|s,| d d S t| jd|d|i dd	dd
| thf}t|dddthfD ]H}| ||}| j||dd\}}| j|||dd	d}|rj|  S qjd S )Nzhttps://www.tiktok.com/embed/@zDownloading user embed pageF)rc   ra   z?This user's account is either private or has embedding disabledz;<script[^>]+\bid=[\'"]__FRONTITY_CONNECT_STATE__[\'"][^>]*>rf   r   sourcez/embed/@Z	videoList.r   r   Tr  r  )
_download_webpager   r   rS   r>   r1   rP   r   rO  rl   )	r)   r   rU   rf   r   rM  r   rM   r
  r+   r+   r,   _extract_sec_uid_from_embed  s0    


z(TikTokUserIE._extract_sec_uid_from_embedc                 C   s   |  |d  }}td|r,d | }}d}n| j| j| |dddddidpNd	}t| ||d
thfpji }|ddkr| 	d t|dddt
hf}|rt|d }n| |}d}|stddd| | |||||S )NzMS4wLjABAAAA[\w-]{64}TzDownloading user webpagezUnable to download user webpageFr_   r   r   r"   webapp.user-detailr   rm  zCThis user's account is private. Log into an account that has accessuserInfor|  rD  )r  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_idr0  	fullmatchr  r/  r   rX   r>   rl   r   r1   r  r   playlist_resultr  )r)   r   r   r
  r  rU   detailr+   r+   r,   ro  )  s>    


zTikTokUserIE._real_extractN)F)rP  rQ  rR  IE_NAMErp  rq  r  r  r  r  ro  r+   r+   r+   r,   rr    sN   


$#
4rr  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 ]x}z | j| j||d	| d
d}W q2 ty } z:t|j	t
jr|j	jdkr||_W Y d }~q2 W Y d }~q2d }~0 0 q2|dg D ].}i | |t dd|d  dV  q|ds q|d |d< q&d S )Nr  r   r      r  rx  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	extractorrM  Zhas_more)_QUERY_NAMEr4   r   r   r  r   _API_ENDPOINTr   r   r   r   r   r   r  rl   r   r(   r%   )	r)   list_idrV   re   r  r  Z	post_listr   r   r+   r+   r,   r  I  s<    

zTikTokBaseListIE._entriesc                 C   s   |  |}| | |||S r9   )r  r  r  )r)   r   r  r+   r+   r,   ro  i  s    
zTikTokBaseListIE._real_extractN)rP  rQ  rR  r  ro  r+   r+   r+   r,   r  H  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   rv  r\  ri  zBhttps://www.tiktok.com/music/jiefei-soap-remix-7036843036118469381i  Z7036843036118469381N	rP  rQ  rR  r  rp  _WORKINGr  r  rq  r+   r+   r+   r,   r  n  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-479565Trl  Nr  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	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	hello2018rt  r  r  u=   https://tiktok.com/tag/fypシ?is_copy_url=0&is_from_webapp=v1Trl  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,   ro    s    
zTikTokTagIE._real_extractN)
rP  rQ  rR  r  rp  r  r  r  rq  ro  r+   r+   r+   r,   r    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-testrt  	   )r   r\  Zplaylist_countzOhttps://www.tiktok.com/@imanoreotwe/collection/%F0%9F%98%82-7111887189571160875Z7111887189571160875zimanoreotwe-%F0%9F%98%82r  )r   r\  rv  z0https://www.tiktok.com/api/collection/item_list/rb  c                 C   s   d|| j |ddS )Nrz  Z113)r!   ZcollectionIdr   r  Z
sourceType)_PAGE_COUNT)r)   collection_idr  r+   r+   r,   r    s    z#TikTokCollectionIE._build_web_queryc           	      c   s   d}t dD ]}| j| j|d| | ||d}t|ddd fD ]T}|d }t|d	d
thtfphd}| ||}| j	|t
fi | j|||ddV  qFt|ds q|| j7 }qd S )Nr   r   r  r  r  c                 S   s   |d S r  r+   r   r+   r+   r,   r     ru   z-TikTokCollectionIE._entries.<locals>.<lambda>r   r  )rE  rD  r   rM   Tr  ZhasMore)r   r   rn   r  r  r   r1   r2  rP   r  r(   rO  r  )	r)   r  r  r  r  r   rO   r  rM  r+   r+   r,   r    s$    


zTikTokCollectionIE._entriesc                 C   s8   |  |ddd\}}}| | ||d||fS )Nr   r  rN   -)rn  r   r  r  rh   )r)   r   r  r  r   r+   r+   r,   ro    s    z TikTokCollectionIE._real_extractN)rP  rQ  rR  r  rp  rq  r  r  r  r  ro  r+   r+   r+   r,   r    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  rX  r&  r'  r  r  r  r  rK  r_  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  rX  r  r  r  r  r  r  zNo longer availablerZ  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   r  r+   r+   r,   ro  g  s    
zDouyinIE._real_extractN)	rP  rQ  rR  rp  rt   rq  r/  rk   ro  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.*rx  i:΂cZPixieszWhere Is My Mind?ZsigmachaddeusZ	SigmaChad)r   r   r  r  rX  r  r  r  r%  r  rK  r   r  r  rY  r&  r  r  rW  ra  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  rX  r  r  r  rK  r%  r   r  r  rY  r&  r  r  rW  zhttps://vt.tiktok.com/ZSe4FqkKdTrl  c                 C   s<   | j t|| |ddidj}| |r2t|| |S )Nr_   zfacebookexternalhit/1.1r  )Z_request_webpager   r  r   Zsuitabler   r  )r)   r   new_urlr+   r+   r,   ro    s    
zTikTokVMIE._real_extractN)rP  rQ  rR  rp  r  rt   rq  ro  r+   r+   r+   r,   r  w  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  rW  r  r  r%  Zlive_statusconcurrent_view_countZskip_downloadZm3u8)r   r\  rw  z)https://www.tiktok.com/@pilarmagenta/liveZ7209423610325322522ZPilarmagentaZpilarmagentaZ6624846890674683909z$https://www.tiktok.com/@pilarmagentaZ
Livestreamrc  z@https://m.tiktok.com/share/live/7209423610325322522/?language=enTrl  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!   rz  )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                    sV   |dd\}}|sNt|d j|}t||ddddthf}|rV|sj||pb|| d}||px|}|pt|ddtht	f}|pt|dd	tht	f}|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tddhfddd hfdf}
t|	dd thf}|r||d d!| ||d"|
 t|	dd#thf}|r
||d$d%d&| ||d'|
 q
 fd(d)}d*D ]l}	t d|	 d+thf}|r|||	d#krd$nd |	d#krd%nd,|	 d-||	 d.|d/d0 qt dd1thfi d D ]B\}}t|stq^||d d!|  |d2|||d3 q^t|d4d st jd5d6||d7d t d8r| d8 d$d%d9d:|d;d0 |pt d<d=}||t|d jp$d d>|d?d@t dAdBdthfdCdDthfdEdFdGS )HNr  r   r  r  r|  ZroomIdr   ))ZLiveRoomZliveRoomUserInfor|  )Z
UserModuleZusers.rE  r   z,https://webcast.tiktok.com/webcast/room/infor  rf   r   )
ZSD1ZldZSD2sdZHD1ZhdZFULL_HD1ZuhdORIGIONoriginc                    s     | d S r9   )Z_parse_jsonr   r0   r+   r,   r   
  ru   z,TikTokLiveIE._real_extract.<locals>.<lambda>
stream_urlZlive_core_sdk_dataZ	pull_dataZstream_datar   main
sdk_paramsVCodecZvbitraterr   r   r   c                 S   s   t d|   S )Nz(?i)\d+x\d+|\d+p)r0  matchr   lowerr   r+   r+   r,   r     ru   )r   r   r   Zflvzflv-)r   r   r   r   hlsr   Zm3u8_nativezhls-)r   r   protocolr   r   c                     s"   t  dg| hdthR S )Nr  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   G  ru   z'https://www.tiktok.com/api/live/detail/ZroomIDZLiveRoomInfoZliveUrlzhls-fallbackr   r  )	ownerInforE  )ownerrV   T)r   r   )r   r  r%  r  r(  r*  r  r  r  )r  r	  )Z
user_count)ZliveRoomStatsZ	userCount)r  r  rW  r  FrF  )rn  r   r  r   r/  r   rX   r1   rW   r2  r   r   r   r>   rF   r   r   r   r  r   rl   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,   ro    s    







		"
	
	
zTikTokLiveIE._real_extract)N)
rP  rQ  rR  rp  r  rt   r1   rq  r   ro  r+   r+   r+   r,   r    sJ   $
r  ).rS  r   r   r2   r0  r  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(   rr  r  r  r  r  r  r  r  r  r+   r+   r+   r,   <module>   s<   X    N  % 7&: >