U
    gr                    @   sh  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! 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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-q5ljy6pj/yt_dlp/extractor/tiktok.py_KNOWN_APP_INFO7   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randintr/   r*   r*   r+   
_DEVICE_IDA   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.   r/   r*   r*   r+   _API_HOSTNAMEE   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)   r/   r*   r+   
<dictcomp>L   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*   )r5   kvr*   r*   r+   	<genexpr>R   s     z=TikTokBaseIE._get_next_app_info.<locals>.<listcomp>.<genexpr>/)dictzip_APP_INFO_DEFAULTSsplit)r5   r"   defaultsr(   r*   r+   
<listcomp>Q   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*   rA   r+   _get_next_app_infoJ   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_urlf   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_statej   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 datarP   rQ   Z__DEFAULT_SCOPE__)r   rR   r=   rS   r*   r*   r+   _get_universal_datao   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   r9   sid_ttzhttps://z
/aweme/v1/r<   zapplication/json)
User-AgentAccept)rN   fatalnoteerrnoteheadersquerydata)_set_cookier4   joinr1   choices_get_cookies_WEBPAGE_HOSTgetvalue_download_jsonrH   )
r(   eprN   rd   re   rc   r`   ra   rb   Zwebpage_cookiesr*   r*   r+   _call_api_implu   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)r5   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   rZ      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
   rs   timer0   uuidZuuid4rG   rg   r@   r1   r2   rk   r3   rh   )r(   rd   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   )rd   re   rc   r`   ra   rb   r   z. Retrying... (attempt z of ))rG   rK   r   report_warninglenrD   	itertoolscountwrite_debugr0   r   ro   
isinstancecausejsonJSONDecodeErrorposmsg)r(   rn   rN   rd   re   rc   r`   ra   rb   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!   )re   rc   Zaweme_detailsr   z#Unable to extract aweme detail inforN   )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)r`   rc   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_hintrW   r   r   rs   r=   rV   Z_search_nextjs_datar   )r(   r   rN   r`   
video_datastatusresrT   Zurlhr   Zuniversal_dataZ	sigi_dataZ	next_datar*   r*   r+   _extract_web_data_and_status   s4    




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)ra   rb   r`   r~   ru   z

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

start_timerq   z --> Zend_timeN)rk   r   )r5   iliner*   r*   r+   r;     s    
z.TikTokBaseIE._get_subtitles.<locals>.<genexpr>Z
utterances)extre   )videoZcla_infoZcaption_infos.r   langZFormatr   r   r`   r   ZsubtitleInfosc                 S   s   |d S )NUrlr*   rL   r:   r*   r*   r+   <lambda>)      z-TikTokBaseIE._get_subtitles.<locals>.<lambda>ZLanguageCodeNamer   c                    s    | d S )Nr   r*   x
preferencer*   r+   r   1  r   r6   )r   tuplevaluesr   r=   r   rm   
setdefaultrk   appendrg   	enumerater   rO   rE   sorted)r(   r   r   	user_nameZEXT_MAP	subtitlesZcaptions_infocaptionZcaption_urlZcaption_jsonrL   r   Z	subs_listr*   r   r+   _get_subtitles   sj          





  
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h265rq   Zscale)	format_idvcodectbrquality)_search_regexr   r   	QUALITIES)r(   url_keyr   r   r   r   r*   r*   r+   _parse_url_key5  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+   
audio_metaG  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)r   r   )r   rk   r   )r5   r   )add_metaaddrr   
is_bytevc2parsed_metar*   r+   rC   Z  s&    
 
 zMTikTokBaseIE._parse_aweme_video_app.<locals>.extract_addr.<locals>.<listcomp>r   )r   rk   r   r   update)r   r   r   )r   known_resolutionsr(   )r   r   r   r   r+   extract_addrR  s    z9TikTokBaseIE._parse_aweme_video_app.<locals>.extract_addrr   r   c                      s     S r8   r*   r*   )r   r   r*   r+   r   m  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 r8   rr   r*   )dl_widthratior*   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   rq   r*   r   r*   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   durationrq   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   rk   r   extendr   r   _remove_duplicate_formatsri   rj   rf   r   r   r   hostnamerl   r   r0   formatr   r   _UPLOADER_URL_FORMATrer@   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   B  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'd(d) q| | |st |d*d+t	hfr|d* d+ }t t|d,dd-d	 hthfpZd.}|
d/| |||d.krzdn|d0d1 d2d3 |D S )4Nr   r   r   )r   r   r   r   r   r   c                      s     S r8   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   r2  Zwatermarkedr   )r   r   r   r   r   ZplayUrlZ	mime_typec                 S   s   |  ddS )NrL   r<   )replacer   r*   r*   r+   r   +  r   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   )r5   r)  r*   r*   r+   rC   5  s      z5TikTokBaseIE._extract_web_formats.<locals>.<listcomp>)r   r=   r   rk   r   r   r0   r   rs   r   r   _proto_relative_urlr'  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*   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 r8   r*   r   r*   r*   r+   r   J  r   z5TikTokBaseIE._parse_aweme_video_web.<locals>.<lambda>Z
authorNamec                 S   s   | rt d| S d S )Nr  )r#  r@   r   r*   r*   r+   r   K  r   r  )r  r  r  r  r	  r   c                 S   s   | pd S r8   r*   r   r*   r*   r+   r   R  r   
createTime)r   r
  r  r  statsZ	playCountZ	diggCountZ
shareCountZcommentCountr  r   r  )Nr   )	thumbnailr   ZdynamicCoverZoriginCoverr   )
r   r0   r   r9  r$  r   r"  r   r   r5  )r(   r   webpage_urlrN   extract_flatr+  r*   r*   r+   _parse_aweme_video_web7  sf       	   z#TikTokBaseIE._parse_aweme_video_web)NNNTrX   rY   )NNNTrX   rY   )T)F)__name__
__module____qualname__r"  rj   r   r?   rD   rG   rH   r%  cached_propertyr,   r%   r3   r4   rK   staticmethodrO   rV   rW   ro   r   r   r   r   r   r   r   r9  rB  r*   r*   r*   r+   r   $   sT   





    
/    


#7  Vr   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   r0  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?  rJ  r  r  r  r  r  r  r  r   rM  rN  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?  rJ  r  r  r  r  r   rN  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?  rJ  r  r  r  r  zThis video is unavailabler   rN  rO  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?  rJ  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  rK  r  r  r  r  rJ  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  rJ  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  rJ  r  r  r  r  r  r  r?  r  zUnable to find video in feed)r   rM  rN  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  rJ  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  rJ  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   rM   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   rO   r   rB  )r(   r   rN   rM   r   r   r   r*   r*   r+   _real_extractn  s    "zTikTokIE._real_extractN)rC  rD  rE  
_VALID_URLZ_EMBED_REGEXrs   _TESTSr`  r*   r*   r*   r+   r'   c  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_mincountrN  z+https://www.tiktok.com/@6820838815978423302   rW  rV  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1988ru   Z
tiktok_webzen-USZMozillatrueZWin32z5.0 (Windows)Z15Zweb_pcuser2falseZwindowsr!   rv   Z1080Z1920rx   UTCZverify_   r\   )r    r   r   Zbrowser_languageZbrowser_nameZbrowser_onlineZbrowser_platformZbrowser_versionr|   Zcookie_enabledr   cursorr-   rz   Zfocus_stateZ	from_pageZhistory_lenZis_fullscreenZis_page_visibler~   r{   Zpriority_regionZrefererr   Zscreen_heightZscreen_widthr:  typeZtz_nameZverifyFpZwebcast_language)r3   rg   r1   rh   string	hexdigits)r(   r  rp  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^   )rd   rc   itemListc                 S   s   |d S Nr   r*   r   r*   r*   r+   r     r   z'TikTokUserIE._entries.<locals>.<lambda>r   TrA  r   r=  c                 S   s   t | d S )Nru  rr   r   r*   r*   r+   r     r   i $l   4<H[ZhasMorePrevious)setrs   r   r   r   rm   _API_BASE_URLrt  _USER_AGENTr   addrO   
url_resultr'   rB  )r(   r  r   rU   Zseen_idsrp  pageresponser   rN   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 )r`   rc   ra   rb   r!   zwebapp.user-detailZuserInfork  r:  LiveRoomliveRoomUserInfo
UserModuleusers.)_download_webpager   rW   r0   rV   r'  )r(   Zuser_urlr   r   rT   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   rk  z/liveZlivezhttps://www.tiktok.com/embed/@zDownloading user embed pageF)ra   r`   r!   z;<script[^>]+\bid=[\'"]__FRONTITY_CONNECT_STATE__[\'"][^>]*>re   r   sourcez/embed/@Z	videoList.r   r   Try  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   rR   r=   r0   rO   r   rB  rk   r   playlist_resultr  )r(   r   r   r  ZmobjrT   re   r   r@  r   rL   r*   r*   r+   r`    sV            zTikTokUserIE._real_extractN)rC  rD  rE  IE_NAMEra  rb  r|  r{  rt  r  r  r`  r*   r*   r*   r+   rc    sB    #
rc  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 )Nrp  r   r      rq  rg  r-   r   zDownloading video list page zUnable to download video list)rd   ra   rb   Z
aweme_listZTikTokzhttps://tiktok.com/@_/video/r   )Zextractor_keyZ	extractorr@  Zhas_more)_QUERY_NAMEr3   r   r   ZRetryManagerr   _API_ENDPOINTr   r   r   r   r   r   errorrk   r   r'   r$   )	r(   list_idrU   rd   r  retryZ	post_listr   r   r*   r*   r+   r    sF           

zTikTokBaseListIE._entriesc                 C   s   |  |}| | |||S r8   )r  r  r  )r(   r   r  r*   r*   r+   r`  2  s    
zTikTokBaseListIE._real_extractN)rC  rD  rE  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   rf  rN  r[  zBhttps://www.tiktok.com/music/jiefei-soap-remix-7036843036118469381i  Z7036843036118469381N	rC  rD  rE  r  ra  _WORKINGr  r  rb  r*   r*   r*   r+   r  7  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-479565Tr^  Nr  r*   r*   r*   r+   r  O  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	hello2018re  r  r  u=   https://tiktok.com/tag/fypシ?is_copy_url=0&is_from_webapp=v1Tr^  c                 C   sB   |  |}| j||ddid}| d|d}| | ||||S )Nr^   zIfacebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)rc   z"snssdk\d*://challenge/detail/(\d+)ztag ID)r  r  Z_html_search_regexr  r  )r(   r   rU   rT   Ztag_idr*   r*   r+   r`  v  s    
 zTikTokTagIE._real_extractN)
rC  rD  rE  r  ra  r  r  r  rb  r`  r*   r*   r*   r+   r  c  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-testre  	   )r   rN  Zplaylist_countzOhttps://www.tiktok.com/@imanoreotwe/collection/%F0%9F%98%82-7111887189571160875Z7111887189571160875zimanoreotwe-%F0%9F%98%82r  )r   rN  rf  z0https://www.tiktok.com/api/collection/item_list/rT  c                 C   s   d|| j |ddS )Nri  Z113)r    ZcollectionIdr   rp  Z
sourceType)_PAGE_COUNT)r(   collection_idrp  r*   r*   r+   rt    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   rv  )rd   rw  c                 S   s   |d S rx  r*   r   r*   r*   r+   r     r   z-TikTokCollectionIE._entries.<locals>.<lambda>r   r  )r;  r:  r   rL   Try  ZhasMore)r   r   rm   r{  rt  r   r0   r'  rO   r~  r'   rB  r  )	r(   r  rp  r  r  r   rN   r  r@  r*   r*   r+   r    s*      
 
zTikTokCollectionIE._entriesc                 C   s8   |  |ddd\}}}| | ||d||fS )Nr   r   rM   -)r_  r   r  r  rg   )r(   r   r  r   r   r*   r*   r+   r`    s      z TikTokCollectionIE._real_extractN)rC  rD  rE  r  ra  rb  r{  r  rt  r  r`  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  rJ  r  r  r  r  r  r  r?  rQ  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  rJ  r  r  r  r  r  r  zNo longer availablerL  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)rd   r`   r   z4Fresh cookies (not necessarily logged in) are neededZ
s_v_web_idr   )	r  r   rm   r=   r   ri   rj   rk   r   )r(   r   rN   Zdetailr*   r*   r+   r`  0  s"    
   zDouyinIE._real_extractN)	rC  rD  rE  ra  rs   rb  r"  rj   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.*rg  i:΂cZPixieszWhere Is My Mind?ZsigmachaddeusZ	SigmaChad)r   r   r   r  rJ  r  r  r  r  r  r?  r  r  r  rK  r  r
  r  rI  rS  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  rJ  r  r  r  r?  r  r  r  r  rK  r  r
  r  rI  zhttps://vt.tiktok.com/ZSe4FqkKdTr^  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+   r`  v  s      
zTikTokVMIE._real_extractN)rC  rD  rE  ra  r  rs   rb  r`  r*   r*   r*   r+   r  @  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   rI  r  r  r  Zlive_statusconcurrent_view_countZskip_downloadZm3u8)r   rN  paramsz)https://www.tiktok.com/@pilarmagenta/liveZ7209423610325322522ZPilarmagentaZpilarmagentaZ6624846890674683909z$https://www.tiktok.com/@pilarmagentaZ
LivestreamrU  z@https://m.tiktok.com/share/live/7209423610325322522/?language=enTr^  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    ri  )r`   rd   r   r   r   zThis livestream has endedTr   r   )r   rm   r=   r   rk   r   r   )r(   r   paramroom_idr  r6   r  r*   r*   r+   r     s$         zTikTokLiveIE._call_apic                    s&   |dd\}}j||p"|ddi| d}|r||pB|}t|ddthtfpjjd|d	|d
}|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}|rX||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rd'nd#|	d&krd(nd/|	 d0||	 d1|d2d3 qt dd4thfi d
 D ]B\}}t|sDq.||d#d$|  |d5|||d6 q.t|d7d st j	d8d9||d:d t d;r| d; d'd(d<d=|d>d3 |pt d?d@}||t|d jpd dA|dBdCt dDdEdthfdFdGthfdHddIS )JNr  r   r^   r   )rc   r`   ))r  r  rk  )r  r  .ZroomIdzsnssdk\d*://live\?room_id=(\d+)zroom IDr   )r  r  rk  r;  )r  r  .r;  F)r   r   r   z,https://webcast.tiktok.com/webcast/room/infor  re   r   )
ZSD1ZldZSD2sdZHD1ZhdZFULL_HD1ZuhdORIGIONoriginc                    s     | d S r8   )Z_parse_jsonr   r/   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 )Nrq   )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   r0   )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  )	ownerInfor;  )ownerrU   T)r   r   )r   r  r  r  r  r  r   r  r  )r  r  )Z
user_count)ZliveRoomStatsZ	userCount)r   r  rI  r  r<  )r_  r   r  rV   r   r0   r'  r   r   r   r   r=   rE   r   r   r  r   rk   r   r"  r   r   )r(   r   r  r  rT   re   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)
rC  rD  rE  ra  r  rs   r0   rb  r   r`  r*   r*   r*   r+   r  ~  sJ   $
r  )-r%  r   r   r1   r#  rr  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'   rc  r  r  r  r  r  r  r  r  r*   r*   r*   r+   <module>   s<   T    C  ! &: >