o
    ig)                    @   s  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	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$ ddl%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)Z0G dd de)Z1G dd deZ2G dd de)Z3dS )    N   )InfoExtractor   )HEADRequest)ExtractorErrorUnsupportedErrorUserNotLivedetermine_extextract_attributesfilter_dictformat_fieldint_or_nonejoin_nonemptymerge_dictsmimetype2extparse_qs	qualitiessrt_subtitles_timecodestr_or_nonetruncate_stringtry_calltry_geturl_or_noneurlencode_postdata)find_elementrequiretraverse_objc                   @   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		d4ddZdd  Z		d4d!d"Zd#d$ Zd%d& Zd5d'd(Zd)d* Zd+d, Zd-d. Zd/d0 Zd6d2d3ZdS )7TikTokBaseIEzhttps://www.tiktok.com/@%szhttps://www.tiktok.com/)360p540p720p1080pN
musical_lyz35.1.3
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 r3   K/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/extractor/tiktok.py_KNOWN_APP_INFO;   s   zTikTokBaseIE._KNOWN_APP_INFOc                 C   s   | j dd gtdd S )N	device_idr,   r   r/   r0   r1   r3   r3   r4   r.   A      zTikTokBaseIE._KNOWN_DEVICE_IDc                 C   s   | j p
ttddS )Nl     *{Y2$ l   B2n?- )r.   strrandomrandintr8   r3   r3   r4   
_DEVICE_IDE   r9   zTikTokBaseIE._DEVICE_IDc                 C   s   | j ddgtdd S )Napi_hostnamez#api16-normal-c-useast1a.tiktokv.comr,   r   r7   r8   r3   r3   r4   _API_HOSTNAMEI   s
   zTikTokBaseIE._API_HOSTNAMEc                    s   j d u rfddj D   fddjD _ j s"dS j d_jd }jd }|d	kr=d
| }nd| d| }| d_dS )Nc                    s0   i | ]\}}|d kr| j ||gtdd qS )r%   r,   r   r7   ).0keyr2   r8   r3   r4   
<dictcomp>P   s
    z3TikTokBaseIE._get_next_app_info.<locals>.<dictcomp>c              
      s8   g | ]}i  t d d tj|dddD qS )c                 s   s     | ]\}}|r||fV  qd S Nr3   )r@   kvr3   r3   r4   	<genexpr>V   s    
z=TikTokBaseIE._get_next_app_info.<locals>.<listcomp>.<genexpr>/F)strict)dictzip_APP_INFO_DEFAULTSsplit)r@   r+   defaultsr1   r3   r4   
<listcomp>U   s    z3TikTokBaseIE._get_next_app_info.<locals>.<listcomp>Fr   r&   r(   r"   zcom.zhiliaoapp.musically/zcom.ss.android.ugc.rG   zR (Linux; U; Android 13; en_US; Pixel 7; Build/TD1A.220804.031; Cronet/58.0.2991.0)T)_APP_INFO_POOLrK   itemsr5   pop	_APP_INFO_APP_USER_AGENT)r1   r&   versionpackager3   rM   r4   _get_next_app_infoN   s"   



zTikTokBaseIE._get_next_app_infoc                 C   s   d| pd d| S )Nzhttps://www.tiktok.com/@_z/video/r3   )user_idvideo_idr3   r3   r4   _create_urlj   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>end_patternr2   )_search_jsonr1   webpage
display_idr3   r3   r4   _get_sigi_staten   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 datar\   r]   __DEFAULT_SCOPE__)r   r_   rI   r`   r3   r3   r4   _get_universal_datas   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r&|  | jd|	d j | j	d| j d| d	||||| j
d
d|p=i ||dS )Nodin_ttr*   0123456789abcdef   rD   sid_ttzhttps://z
/aweme/v1/rG   zapplication/json)
User-AgentAccept)rZ   fatalnoteerrnoteheadersquerydata)_set_cookier?   joinr;   choices_get_cookies_WEBPAGE_HOSTgetvalue_download_jsonrT   )
r1   eprZ   rs   rt   rr   ro   rp   rq   webpage_cookiesr3   r3   r4   _call_api_imply   s    
zTikTokBaseIE._call_api_implc                 C   s  t i |i dddddddtt d dtt d	d
d| jd d| jd dddd | jd dD d| jd d| jd d| jd d| jd ddddddddi d d!d"d#d$d%d&d'd(d)d*d+d,d-d.d+d/tt t	
d0d1 d2d3d4d+d5d!d6d7d8d9d:d!d;d<d=d>d+d+| jd d+tt | jd?| jdt	jd@dAdBdCS )DNdevice_platformandroidosssmixa_rticket  cdidchannel
googleplayr)   r&   version_coder*   c                 s   s    | ]	}t |d V  qdS )02dNint)r@   rE   r3   r3   r4   rF      s    z0TikTokBaseIE._build_api_query.<locals>.<genexpr>r'   .version_namemanifest_version_coder(   update_version_code
ab_version
resolutionz	1080*2400dpii  device_typezPixel 7device_brandGooglelanguageenos_api29
os_version13acwifiis_padr$   current_regionUSapp_typenormal
sys_regionlast_install_timeiQ i# timezone_namezAmerica/New_York	residenceapp_languagetimezone_offsetz-14400host_abizarmeabi-v7alocaleac2wifi5guoo1r%   ri      rk   )carrier_region	op_regionbuild_numberregiontsr%   r6   openudid)r   r   timer:   uuiduuid4rS   rv   rL   r;   r<   rz   r=   rw   )r1   rs   r3   r3   r4   _build_api_query   s   

	 




 !"#$


zTikTokBaseIE._build_api_queryc	                 C   s$  | j s|  sd}	|rt|	dd| |	 d S t| jd }
tdD ]k}| t	| j  | 
|p3i }z| j||||||||dW   S  ty } z>t|jtjr|jjdkrt	|jp`|j}	|  sv|ri | |	 W Y d }~ d S | |	 d| d|
 d	 W Y d }~q$ d }~ww d S )
Nz No working app info is availableTexpectedr   )rs   rt   rr   ro   rp   rq   r   z. Retrying... (attempt z of ))rS   rW   r   report_warninglenrP   	itertoolscountwrite_debugr:   r   r   
isinstancecausejsonJSONDecodeErrorposmsg)r1   r}   rZ   rs   rt   rr   ro   rp   rq   message	max_triesr   
real_queryer3   r3   r4   	_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}|s#td|d| |S )Nzmulti/aweme/detail[]r$   )	aweme_idsrequest_sourcezX-Argusr*   )rt   rr   aweme_detailsr   z#Unable to extract aweme detail inforZ   )r   r   r   rI   r   _parse_aweme_video_app)r1   aweme_idaweme_detailr3   r3   r4   _extract_aweme_app   s   



zTikTokBaseIE._extract_aweme_appc              	   C   sh  t |tdddhthdtdd htjhtjhf}|s'd|v r#tdtd	| 	d
 t |ddt
htjhtdhf}t |ddt
htjhtjhtdhf}tdD ]"}t
| }| }|| | |krut| |d<  nqStdttj|dd  }t |tdddhthdtdhf}	tt | dpd d }
| jd|	||
d d S )NcsT)idhtmlclassc                 S   s
   |  dS )Nz===r3   xr3   r3   r4   <lambda>   s   
 z>TikTokBaseIE._solve_challenge_and_set_cookie.<locals>.<lambda>zPlease wait...z Unable to extract challenge dataz(Unexpected response from webpage requestz7Solving JS challenge using native Python implementationrE   czchallenge expected digestr   zchallenge base hashiAB dzUnable to solve JS challenge),:)
separatorswcizchallenge cookie namesleep_interval_requestsr   r   z.tiktok.com)expire_time)r   r   r
   filterbase64	b64decoder   loadsr   	to_screenr:   r   hashlibsha256rangeencodecopyupdatedigest	b64encodedecodedumpsr   r   	get_paramru   )r1   ra   challenge_dataexpected_digest	base_hashinumber	test_hashcookie_valuecookie_namer   r3   r3   r4   _solve_challenge_and_set_cookie   sJ   


z,TikTokBaseIE._solve_challenge_and_set_cookiec              
      sf  i d}}d fdd	}| }|du r||fS  |}|s^z| W n! tyJ }	 z r4 j|	jd ||fW  Y d }	~	S d }	~	ww |dd}|du rX||fS  |}|ssd	}
 rht|
j|
d ||fS t|d
dthfp}d}t|d
ddthf}t|dthfst|dthfrd}
 r	|
 j|
 d
  d ||fS )NDownloading webpagec                    sr   j |  dd}|du rdS |\}}tj|jjdkr7d} r'| j| d  d dS |S )NTro   impersonateFz/loginz4TikTok is requiring login for access to this content. r   )	_download_webpage_handleurllibparseurlparseurlpathraise_login_requiredr   _login_hint)rp   resra   urlhr   ro   r1   r
  rZ   r3   r4   get_webpage  s   
z>TikTokBaseIE._extract_web_data_and_status.<locals>.get_webpageFr   z)Downloading webpage with challenge cookie)rp   z0Unable to extract universal data for rehydrationzwebapp.video-detail
statusCoder   itemInfo
itemStructvideoisContentClassifiedzFThis post may not be comfortable for some audiences. Log in for accessr  )r  )re   r   r   r   orig_msgr   r   rI   boolr  r  )r1   r
  rZ   ro   
video_datastatusr  ra   universal_datar   r   r3   r  r4   _extract_web_data_and_status	  sD   

 
z)TikTokBaseIE._extract_web_data_and_statusc              
      s  dddd}t t|  i }t|dtd}|D ]6}t|dtdd	}|s&q| j||d
ddd}	|	s3q||ddg 	dd
dd t|	d D d q|s{t|dtdD ]!}|dsaqY||dpidg 	|d ||dd qY|s|r| j| |||dd\}}
t|dddd fD ]}||dpdg 	|d ||dd q| D ]\}}t| fd dd!||< q|S )"Nr   srtvtt)creator_captionr  webvtt)interaction_stickers.auto_video_caption_infoauto_captions.expected_type)r
  url_list.F)r%  get_allzDownloading captionszUnable to download captions)rp   rq   ro   r   r   z

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

start_timer   z --> end_timeN)rz   r   )r@   r   liner3   r3   r4   rF   Y  s    8
z.TikTokBaseIE._get_subtitles.<locals>.<genexpr>
utterances)extrt   )r  cla_infocaption_infos.r
  langFormatr
  r.  ro   r  subtitleInfosc                 S      |d S )NUrlr3   rX   rE   r3   r3   r4   r   k      z-TikTokBaseIE._get_subtitles.<locals>.<lambda>LanguageCodeNamer7  c                    s    | d S )Nr.  r3   r   
preferencer3   r4   r   s      rA   )r   tuplevaluesr   rI   r   r|   
setdefaultrz   appendrv   	enumerater  r[   rQ   sorted)r1   r   r   	user_nameEXT_MAP	subtitlescaptions_infocaptioncaption_urlcaption_jsonrX   r1  	subs_listr3   r;  r4   _get_subtitles@  sZ   







zTikTokBaseIE._get_subtitlesc                 C   s\   | j d|dddd\}}}}|si d fS ||dkrdn|t|dd	p#d t| j|d
|fS )Nz>v[^_]+_(?P<id>(?P<codec>[^_]+)_(?P<res>\d+p)_(?P<bitrate>\d+))zurl key)NNNN)r   codecr  bitrate)r2   groupbytevc1h265r   scale)	format_idvcodectbrquality)_search_regexr   r   	QUALITIES)r1   url_keyrU  rN  r  rO  r3   r3   r4   _parse_url_keyw  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
p2ddrP||d ddtddrHdndd drd }t |d|||dddrmdnd dtfdd
drdndd dr||d dddd dr||d dddd dg D ]*}|dr|||d |d d!t|d"d
 t|ddrdnd|d#d$ q| jd%}|r|D ]}	t
j|d& jd%|j q|d'p	i }	|d(pi }
t|d)td*}t|
d+d,td*}t|
d-d.d/td*}|
d0o<|
d1d2|
d3k}|rI|pDd4|}}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@dAdBdCdDdEt d*|t|dFjd dGt|dHdIgjd dG|t|
dJpd |rtdK|nd |||t|dHdIdFfdLdMdND tdOdPt dQdRhtfpt|
dPt hfjdS|v dT|v dU|v dVdWdXS )YNr   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)default_extmp3z-music-zMusic trackaacnone)format_noter.  acodecrV  widthheight)r	   r3  r3   r3   r4   
audio_meta  s   z7TikTokBaseIE._parse_aweme_video_app.<locals>.audio_metac                    s    dd\}ddk|rE|i dtd | dtd |i   dt|d d   fdd	d
pTg D S )Nr[  r*   rV  bytevc2re  rd  r  c              
      sz   g | ]9}|t d ddd|v rdndd rdndt dd|v r*d	nd
r/dnd
ddd|qS )	data_sizemp4r`  zaweme/v1r  )r
  filesizer.  rc  source_preferencerb  z(API)Nz(UNPLAYABLE) )delim)r<  rb  )r   rz   r   )r@   r
  )add_metaaddrrf  
is_bytevc2parsed_metar3   r4   rO     s(    
zMTikTokBaseIE._parse_aweme_video_app.<locals>.extract_addr.<locals>.<listcomp>r&  )r\  rz   rA  r   r   )rq  rp  r  )rf  known_resolutionsr1   )rp  rq  rr  rs  r4   extract_addr  s   z9TikTokBaseIE._parse_aweme_video_app.<locals>.extract_addrrd  re  c                           S rC   r3   r3   )re  rd  r3   r4   r     r9  z5TikTokBaseIE._parse_aweme_video_app.<locals>.<lambda>      ?	play_addrzDirect video
is_bytevc1is_h265rR  h264)rU  rb  rV  rd  re  download_addrzDownload video%shas_watermarkz, watermarkedr*   c                      s   t   S rC   r   r3   )dl_widthratior3   r4   r     r=  rj  r  )rU  rb  rV  rd  re  r<  play_addr_h264)rU  rb  rV  play_addr_bytevc1bit_rate	gear_namezPlayback videoc                 S   s   | d d S )Nr  r   r3   r   r3   r3   r4   r     r=  FPS)rU  rb  rW  rV  fpsrl   r
  
statisticsmusic)hybrid_label.r(  r$  )matched_songtitle)matched_pgc_soundr  )r  author)r  r  r  is_original_soundr  zoriginal sound - {}owner_handleoriginal sound	unique_iduidnicknamesec_uid)uploaderuploader_idr   
channel_idr   descH   leftcreate_time)r  description	timestamp
play_count
digg_countshare_countcomment_countcollect_count
view_count
like_countrepost_countr  
save_countr  r2   r  r  album
(?:, | & )c                    s:   g | ]}t  |d dfD ]}|||dv rdnddqqS )r&  .)coverorigin_coverr  rj  r   r
  r<  )r   r@   cover_id	cover_url)
video_infor3   r4   rO     s    	z7TikTokBaseIE._parse_aweme_video_app.<locals>.<listcomp>)r  ai_dynamic_coveranimated_coverai_dynamic_cover_bakr  dynamic_cover)Nr|  durationr   rS  PrivatezFriends onlyzFollowers only)
is_privateneeds_subscriptionis_unlisted)rX  rN  sizebr)channel_urluploader_urltrackr  artistsformatsrG  
thumbnailsr  availability_format_sort_fields)r   rz   r   extendr   r   _remove_duplicate_formatsrx   ry   ru   r  r  r	  hostnamer{   r:   formatr   r   r   _UPLOADER_URL_FORMATrerL   extract_subtitlesany_availability)r1   r   r   ru  r  r|  rO  auth_cookief
stats_info
music_infolabelscontained_music_trackcontained_music_authoris_generic_og_tracknamemusic_trackmusic_authorauthor_infor3   )rf  r~  re  rt  r  r1   r  rd  r4   r     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	p(d
}g }t |ddd	 fD ]}| t |ddthfpBd\}}|ddk}	||	rSdnd |	rXdndt |ddthfd |ont|d d  }
r|
dkrwd}
|dk rt|
| }||
||d  d nt|
| }|||d  |
d t |dddt	hfD ]}|
i ||d| |i qq4t |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| | |sCt |d*d+t	hfrC|d* d+ }t t|d,dd-d	 hthfp-d.}|
d/| |||d.kr=dn|d0d1 d2d3 |D S )4Nri  r{  r`  )r.  rV  rc  r  rd  re  c                      rv  rC   r3   r3   play_height
play_widthr3   r4   r   .  r9  z3TikTokBaseIE._extract_web_formats.<locals>.<lambda>rw  bitrateInfoc                 S   s   |d d S )NPlayAddrUrlListr3   r8  r3   r3   r4   r   1  r=  r  UrlKeyr*   rV  rg  
UNPLAYABLErm  r  DataSize)rb  r<  rk  i  @  r   r   )rd  re  r  .r
  c                    s   |d  kS )Nrd  r3   r8  )r  r3   r4   r   T  r=  rX  playAddr)).srcNplay)rU  r
  rd  re  rX  )downloadAddr)downloadr
  r  watermarkedrj  )rU  r
  rb  r<  r  playUrl	mime_typec                 S   s   |  ddS )NrX   rG   )replacer   r3   r3   r4   r   o  r=  r]  audiora  )rU  r
  r.  rc  rV  c                 S   s&   g | ]}t j|d  jdkr|qS )r
  zwww.tiktok.com)r  r  r	  r  )r@   r  r3   r3   r4   rO   y  s   & z5TikTokBaseIE._extract_web_formats.<locals>.<listcomp>)r   rI   r   rz   r   r\  r:   r   r   r   rB  _proto_relative_urlr  r  r   r   )r1   r   COMMON_FORMAT_INFOr  r  r  bitrate_infoformat_infor  rr  	dimensionyr   	video_urlplay_qualityplay_urldownload_url	audio_urlr.  r3   r  r4   _extract_web_formats%  s   






	
	z!TikTokBaseIE._extract_web_formatsFc              
      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 |r'd 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#d$ftd%d& fd'd(d)D iS )*N)
authorInfor  Nr  )authorSecIdsecUid)uniqueIdr  )authorIdr  r   )r   r  r  r  Fr'  Referer)r   r  rG  http_headersr  r  r  r  )r  r  r  r  r  
authorNamec                 S   s   | rt d| S d S )Nr  )r  rL   r   r3   r3   r4   r         z5TikTokBaseIE._parse_aweme_video_web.<locals>.<lambda>r  )r  r  r  r  r  r  r  r  
createTime)r  r  r  r  stats	playCount	diggCount
shareCountcommentCountcollectCountr  r$  r  c                    sB   g | ]}t  d |thfD ]}|||dkrdnddqqS ))Nr  dynamicCoverrj  r  r  )r   r   r  r  r   r1   r3   r4   rO     s    z7TikTokBaseIE._parse_aweme_video_web.<locals>.<listcomp>)	thumbnailr  r
  originCover)
r   r:   r   r  r  r   r  r   r   r   )r1   r   webpage_urlrZ   extract_flatr  r3   r  r4   _parse_aweme_video_web{  s`   	
z#TikTokBaseIE._parse_aweme_video_web)NNNTrf   rg   )TF) __name__
__module____qualname__r  ry   rZ  rK   rP   rS   rT   	functoolscached_propertyr5   r.   r=   r?   rW   staticmethodr[   rc   re   r   r   r   r   r   r  rM  r\  r   r  r  r3   r3   r3   r4   r   (   sT    






/


*77 "Vr   c                   @   s.  e Zd ZdZde dgZddi dddd	d
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d"ed#eeed$d%d%d&d'd(d)d*i dd+dd	d
d,dd-dd.dddddd/dd0dd1d2d3d4d5d6d7dddd8dd9d!eeeeeg d:d;d<d=d>i dd?dd	d
d@dd@ddAd6dBddCddDd2dEd4dFdGdHdIdBgddJddKddddLd!eeeeedMdNdOi ddPdd	d
dQddQddRd6dSddTddUd4dVdGdWddXddYddddZd!ed"ed#eeed[d\d]d^i dd_dd	d
d`ddaddbd6dcddddded2dfd4dgdGdhddiddjddddkdIdcgd!eeeeedMdNdli ddmdd	d
dnddnddoddpddqdrdsdtdudGduddvddwddxd!ed"ed#edyedzeid\d]d{i dd|dd}d
d~ddad6dddddddd2dd4ddIdgdGdddddddd!ed"eeeedddNddi dddd	d
dddd6dddddddd2dd4ddIdgdGdhddddddd!ed"eeeeddddgdddi dddd	d
dddddddddd4dd6ddIdgdGdhddddddd!ed"ed#eeedddd(ddi ddddd
dddddddddd2dd4dd6ddIdgdtddGdddddddd!eeeeeddd=dddgZddÄ ZdS )r0   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/6748451240264420610 736bb7a466c6f0a6afeb597da1e6f5b7r   6748451240264420610r.  ri  r  z!#jassmanak #lehanga #leenabhushanr  r     re  i   rd  r  r  leenabhushanr  6691488002098119685r  zdhttps://www.tiktok.com/@MS4wLjABAAAA_Eb4t1vodM1IuTy_cvp9CY22RAb59xqrO0Xtz9CYQJvgXaDvZxYnZYRzDWhhgJmycreatorfacestoriesbyleenabhr  z*re:^https?://[\w\/\.\-]+(~[\w\-]+\.image)?upload_date20191016r  iP]r  r  r  YsrbeatsLehanga)r  r  artistr  r  z404 Not Foundr
  md5	info_dictskipzOhttps://www.tiktok.com/@patroxofficial/video/6742501081818877190?langCountry=en f21112672ee4ce05ca390fb6522e1b6f6742501081818877190uN   Tag 1 Friend reverse this Video and look what happens 🤩😱 @skyandtami ...z$md5:5e2a23877420bb85ce6521dbee39ba94   patrox18702747zhttps://www.tiktok.com/@patroxr  zOhttps://www.tiktok.com/@MS4wLjABAAAAiFnldaILebi5heDoVU6bn4jBWWycX6-9U3xuNPqZ8Wsr  z7MS4wLjABAAAAiFnldaILebi5heDoVU6bn4jBWWycX6-9U3xuNPqZ8Wsr   patroX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&  z<https://www.tiktok.com/@barudakhb_/video/69841386513368384026984138651336838402u.   Balas @yolaaftwsr hayu yu ? #SquadRandom_ 🔥
barudakhb_z$md5:29f238c49bc0c176cb3cef1a9cea9fa66974687867511718913z"https://www.tiktok.com/@barudakhb_zdhttps://www.tiktok.com/@MS4wLjABAAAAbhBwQC-R1iKoix6jDFsF-vBdfx2ABoDjaZrM9fX6arU3w71q3cOWgWuTXn1soZ7dzLMS4wLjABAAAAbhBwQC-R1iKoix6jDFsF-vBdfx2ABoDjaZrM9fX6arU3w71q3cOWgWuTXn1soZ7dr  z
Boka Dancer  i`   20210712)r  r  r  r  r
  r&  z~https://www.tiktok.com/@MS4wLjABAAAATh8Vewkn0LYM7Fo03iec3qKdeCUOcBIouRk1mkiag6h3o_pQu_dUXvZ2EZlGST7_/video/70426929291099865617042692929109986561zSlap and Run!user440922249zSlap And Run7036055384943690754zdhttps://www.tiktok.com/@MS4wLjABAAAATh8Vewkn0LYM7Fo03iec3qKdeCUOcBIouRk1mkiag6h3o_pQu_dUXvZ2EZlGST7_LMS4wLjABAAAATh8Vewkn0LYM7Fo03iec3qKdeCUOcBIouRk1mkiag6h3o_pQu_dUXvZ2EZlGST7_zPromoted Musicia   20211217)r  r  zThis video is unavailabler
  r&  r'  z?https://www.tiktok.com/@pokemonlife22/video/70596983745676116947059698374567611694z!TikTok video #7059698374567611694r*   pokemonlife22Pokemon6820838815978423302z%https://www.tiktok.com/@pokemonlife22zdhttps://www.tiktok.com/@MS4wLjABAAAA0tF1nBwQVVMyrGu3CqttkNgM68Do1OXUFuCY0CRQk8fEtSVDj89HqoqvbSTmUP2WLMS4wLjABAAAA0tF1nBwQVVMyrGu3CqttkNgM68Do1OXUFuCY0CRQk8fEtSVDj89HqoqvbSTmUP2Wr  iKa   20220201z:https://www.tiktok.com/@denidil6/video/70657990231306437137065799023130643713u   #denidil#денидилdenidil67046664115636405250zdhttps://www.tiktok.com/@MS4wLjABAAAAsvMSzFdQ4ikl3uR2TEJwMBbB2yZh2Zxwhx-WCo3rbDpAharE3GQCrFuJArI3C8QJr#  zHolocron Musicr  z[Wolf Sounds (1 Hour) Enjoy the Company of the Animal That Is the Majestic King of the Nightib   20220217r  r  z@https://www.tiktok.com/@_le_cannibale_/video/71399804611320742837139980461132074283r_  z!TikTok video #7139980461132074283Antaura_le_cannibale_6604511138619654149z&https://www.tiktok.com/@_le_cannibale_zdhttps://www.tiktok.com/@MS4wLjABAAAAoShJqaw_5gvy48y3azFeFcT4jeyKWbB0VVYasOCt2tTLwjNFIaDcHAM4D-QGXFOPzLMS4wLjABAAAAoShJqaw_5gvy48y3azFeFcT4jeyKWbB0VVYasOCt2tTLwjNFIaDcHAM4D-QGXFOPznathan !zgrahamscott canon
   20220905iiNczre:^https://.+\.(?:webp|jpe?g))r  r  r  r  z;https://www.tiktok.com/@moxypatch/video/7206382937372134662 4cdefa501ac8ac20bf04986e10916fea7206382937372134662z$md5:1d95c0b96560ca0e8a231af4172b2c0a	MoxyPatch	moxypatch7039142049363379205z!https://www.tiktok.com/@moxypatchzdhttps://www.tiktok.com/@MS4wLjABAAAAFhqKnngMHJSsifL0w1vFOP5kn3Ndo1ODp0XuIBkNMBCkALTvwILdpu12g3pTtL4VLMS4wLjABAAAAFhqKnngMHJSsifL0w1vFOP5kn3Ndo1ODp0XuIBkNMBCkALTvwILdpu12g3pTtL4Vzyour worst nightmare20230303i7dzre:^https://.+zcount:3)r  r  r  r  r  zUnable to find video in feed)r
  r%  r&  expected_warningsz;https://www.tiktok.com/@tatemcrae/video/7107337212743830830 982512017a8a917124d5a08c8ae796217107337212743830830uO   new music video 4 don’t come backkkk🧸🖤 i hope u enjoy !! @musicontiktok	tatemcrae86328792343818240zdhttps://www.tiktok.com/@MS4wLjABAAAA-0bQT0CqebTRr6I4IkYvMDMKSRSJHLNPBo5HrSklJwyA2psXLSZG5FP-LMNpHnJdzLMS4wLjABAAAA-0bQT0CqebTRr6I4IkYvMDMKSRSJHLNPBo5HrSklJwyA2psXLSZG5FP-LMNpHnJdz
tate mcrae20220609iUb   zre:^https://.+\.webpr  r  r  z6Unavailable via feed API, only audio available via webz>https://www.tiktok.com/@hara_yoimiya/video/7253412088251534594 2ff8fe0174db2dbf49c597a7bef4e47d7253412088251534594r]  u   я ред флаг простите #переписка #щитпост #тревожныйтиппривязанности #р...u   я ред флаг простите #переписка #щитпост #тревожныйтиппривязанности #рекомендации hara_yoimiya6582536342634676230z$https://www.tiktok.com/@hara_yoimiyazdhttps://www.tiktok.com/@MS4wLjABAAAAIAlDxriiPWLE-p8p1R_0Bx8qWKfi-7zwmGhzU8Mv25W8sNxjfIKrol31qTczzuLBzLMS4wLjABAAAAIAlDxriiPWLE-p8p1R_0Bx8qWKfi-7zwmGhzU8Mv25W8sNxjfIKrol31qTczzuLBu   лампочка(!)u	   Øneheartzwatching the stars<   20230708iKd)r  r  r  r  r  z<https://www.tiktok.com/@hankgreen1/video/7047596209028074758Tr
  only_matchingc              
   C   s   |  |dd\}}| jr2z| |W S  ty1 } zd|_| | d W Y d }~nd }~ww | ||}| ||\}}|rM|dkrM| 	|||S |dv rW| 
d n
|dkratd	dd
td| |d)Nr   rY   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_urlrP  r5   r   r   r   r   r[   r  r  r  )r1   r
  rZ   rY   r   r  r  r3   r3   r4   _real_extract  s(   zTikTokIE._real_extractN)r  r  r  
_VALID_URL_EMBED_REGEXr   _TESTSrh  r3   r3   r3   r4   r0     sr   	
	
	
	
	
	
	
	
	
	
    r0   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-   LMS4wLjABAAAAepiJKgwWhulvCpSuUVsp7sgVVsFJbbNaLeQ6OQ0oAJERGDUIXhb2yxxHZedsItgT
corgibobaar   r  &TikTok API keeps sending the same pageextractor_retriesrM  )r
  playlist_mincountr&  rV  paramsz+https://www.tiktok.com/@6820838815978423302   rA  r@  zhttps://www.tiktok.com/@memeiQ  LMS4wLjABAAAAiKfaDWeCsT3IHwY77zqWGtVRIy9v4ws1HbVi7auP1Vx7dJysU_hc5yRiGywojRD6memezWtiktokuser:MS4wLjABAAAAM3R2BtjzVT-uAtstkl2iugMzC6AtnpkojJbjiOdDDrdsTiTR75-8lyWJCY5VvDrZ   r   zLMS4wLjABAAAAM3R2BtjzVT-uAtstkl2iugMzC6AtnpkojJbjiOdDDrdsTiTR75-8lyWJCY5VvDrZz-https://www.tiktok.com/api/creator/item_list/c                 C   s   i ddddddddd	d
ddd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#|d$d%d&d tjtjd'd( dd)S )*Nr)   1988r   r   r&   
tiktok_webbrowser_languagezen-USbrowser_nameMozillabrowser_onlinetruebrowser_platformWin32browser_versionz5.0 (Windows)r   cookie_enabledr   15cursorr6   r   web_pcfocus_state	from_pageuserhistory_len2falsewindowsr*   r   10801920r   UTCverify_   rk   )is_fullscreenis_page_visibler   r   priority_regionrefererr   screen_heightscreen_widthr  typetz_nameverifyFpwebcast_language)r=   rv   r;   rw   string	hexdigits)r1   r  r  r3   r3   r4   _build_web_query  sd   	
zTikTokUserIE._build_web_queryFc                 c   s~   |p|}t  }tt d }tdD ]}|  D ]A}| j| j|d| | ||d}	t	t
|	dddthf}
|
r\|
t	|kr\d}| jrPt| d	d
d| `t| dd
d|_qt
|	ddd fD ](}|d }||v rqqf|| | ||}| j|tfi | j|||d
dV  qf|}t
|	ddddd hf}|r||kr|d }|dk st
|	ds d S |r|s| d qd S )N     @@r   Downloading page rs   itemList.r   rq  z&. Try again with a different device_idTr   z+. Taking measures to avoid an infinite loopc                 S   r6  Nr   r3   r8  r3   r3   r4   r   =  r9  z'TikTokUserIE._entries.<locals>.<lambda>r  r  r  c                 S   s   t | d S )Nr  r   r   r3   r3   r4   r   I  r=  i $l   4<H[hasMorePreviousztThis user's account is likely either private or all of their videos are private. Log into an account that has access)setr   r   r   r   RetryManagerr|   _API_BASE_URLr  rD  r   r:   r.   r   r=   erroraddr[   
url_resultr0   r  r  )r1   r  rE  
fail_earlyrb   seen_idsr  pageretryresponsecurrent_batchr   r  rZ   r  
old_cursorr3   r3   r4   _entries%  s^   




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 ]$}| ||}| j||dd\}}| j|||dd	d}|rY|  S q5d S )Nzhttps://www.tiktok.com/embed/@zDownloading user embed pageF)rq   ro   z?This user's account is either private or has embedding disabledz;<script[^>]+\bid=[\'"]__FRONTITY_CONNECT_STATE__[\'"][^>]*>rt   r  sourcez/embed/@	videoList.r   r4  Tr  r  )
_download_webpager   r   r_   rI   r:   r[   r  r  rz   )	r1   rE  ra   rt   r   r  r  rX   r  r3   r3   r4   _extract_sec_uid_from_embedY  s2   

z(TikTokUserIE._extract_sec_uid_from_embedc                 C   s  |  |d }}td|rd |}}d}n\| j| j| |dddddp%d}t| ||dthfp3i }t|d	d
dtht	f}|sN|
ddkrN| d n
|dkrXtdddt|d	ddthf}|rkt|d }n| |}d}|sztddd| | |||||S )NzMS4wLjABAAAA[\w-]{64}TzDownloading user webpagezUnable to download user webpageFr  r*   webapp.user-detailuserInfo)r  statsV2
videoCountr  rf  zCThis user's account is private. Log into an account that has accessr   z,This account does not have any videos postedr   r  r  )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))	_match_idr  	fullmatchr  r  r   re   rI   r   r  rz   r  r   r:   r  playlist_resultr  )r1   r
  rE  r  r  ra   detailvideo_countr3   r3   r4   rh  p  sD   


zTikTokUserIE._real_extractNr  )r  r  r  IE_NAMEri  rk  r  r  r  r  rh  r3   r3   r3   r4   rl    sP    


$
#4rl  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 ]h}|  D ]5}z| j| j||d	| d
d}W q tyO } zt|j	t
jrJ|j	jdkrJ||_W Y d }~q d }~ww |dg D ]}i | |t dd|d  dV  qV|dsv d S |d |d< qd S )Nr  r   r      r  ru  r6   r   zDownloading video list page zUnable to download video list)rs   rp   rq   
aweme_listTikTokzhttps://tiktok.com/@_/video/r   )extractor_key	extractorr  has_more)_QUERY_NAMEr=   r   r   r  r   _API_ENDPOINTr   r   r   r   r   r   r  rz   r   r0   r-   )	r1   list_idrb   rs   r  r  	post_listr   r  r3   r3   r4   r    sD   

zTikTokBaseListIE._entriesc                 C   s   |  |}| | |||S rC   )r  r  r  )r1   r
  r  r3   r3   r4   rh    s   
zTikTokBaseListIE._real_extractN)r  r  r  r  rh  r3   r3   r3   r4   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]+)[/?#&]?Fmusic_idzmusic/awemezEhttps://www.tiktok.com/music/Build-a-Btch-6956990112127585029?lang=end   r   6956990112127585029Retryingr
  rs  r&  rV  zBhttps://www.tiktok.com/music/jiefei-soap-remix-7036843036118469381i  7036843036118469381N	r  r  r  r  ri  _WORKINGr  r  rk  r3   r3   r3   r4   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]+)[/?#&]?F
sticker_idzsticker/awemez7https://www.tiktok.com/sticker/MATERIAL-GWOOORL-1258156r  r   1258156r  r  z0https://www.tiktok.com/sticker/Elf-Friend-479565Trd  Nr  r3   r3   r3   r4   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>[^/?#&]+)Fch_idzchallenge/awemez https://tiktok.com/tag/hello2018'   46294678	hello2018rp  r  r  u=   https://tiktok.com/tag/fypシ?is_copy_url=0&is_from_webapp=v1Trd  c                 C   sB   |  |}| j||ddid}| d|d}| | ||||S )Nrm   zIfacebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)rr   z"snssdk\d*://challenge/detail/(\d+)ztag ID)r  r  _html_search_regexr  r  )r1   r
  rb   ra   tag_idr3   r3   r4   rh    s   
zTikTokTagIE._real_extractN)
r  r  r  r  ri  r  r  r  rk  rh  r3   r3   r3   r4   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-73713301593763704627371330159376370462zimanoreotwe-count-testrp  	   )r
  r&  playlist_countzOhttps://www.tiktok.com/@imanoreotwe/collection/%F0%9F%98%82-71118871895711608757111887189571160875zimanoreotwe-%F0%9F%98%82r  )r
  r&  rs  z0https://www.tiktok.com/api/collection/item_list/r:  c                 C   s   d|| j |ddS )Nry  113)r)   collectionIdr   r  
sourceType)_PAGE_COUNT)r1   collection_idr  r3   r3   r4   r    s   z#TikTokCollectionIE._build_web_queryc           	      c   s    d}t dD ]T}| j| j|d| | ||d}t|ddd fD ]*}|d }t|d	d
thtfp5d}| ||}| j	|t
fi | j|||ddV  q$t|dsW d S || j7 }qd S )Nr   r   r  r  r  c                 S   r6  r  r3   r8  r3   r3   r4   r   '  r9  z-TikTokCollectionIE._entries.<locals>.<lambda>r   r  )r  r  r   rX   Tr  hasMore)r   r   r|   r  r  r   r:   r  r[   r  r0   r  r  )	r1   r  r  r  r  r  rZ   r  r  r3   r3   r4   r     s(   


zTikTokCollectionIE._entriesc                 C   s8   |  |ddd\}}}| | ||d||fS )Nr   r  rY   -)rg  rP  r  r  rv   )r1   r
  r  r  rE  r3   r3   r4   rh  3  s   z TikTokCollectionIE._real_extractN)r  r  r  r  ri  rk  r  r  r  r  rh  r3   r3   r3   r4   r     s*    
	r  c                   @   sB  e Zd ZdZddi dddddd	d
d	ddddddddddddddddddddgdeded eeed!d"d#d$d%i dd&dddd'd
d'dd(dd)dd*dd+dd,dd-dd.dd/dd0dd,gdeded eeed!d"d#d1d2i dd3dddd4d
d4dddddddddddd5dd6dd7ddddgdeded eeed!d"d#d8d9d:dd;dd<d=deeeeed>d?d@dAdBi ddCddddDd
dDddddddddddddEddFddGddddgdeded eeed!d"d#gZdHZdIZdJdK ZdLS )MDouyinIEz3https?://(?:www\.)?douyin\.com/video/(?P<id>[0-9]+)z0https://www.douyin.com/video/6961737553342991651 9ecce7bc5b302601018ecb2871c63a75r   6961737553342991651r.  ri  r  u-   #杨超越  小小水手带你去远航❤️r  r  
6897520xkar  110403406559r  zShttps://www.douyin.com/user/MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98r  7MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98r   u	   杨超越r     r  io`r  20210513r  u   @杨超越创作的原声r  r  r  r  zre:https?://.+\.jpe?gr]  r/  z0https://www.douyin.com/video/6982497745948921092 15c5e660b7048af3707304e3cc02bbb56982497745948921092u8   这个夏日和小羊@杨超越 一起遇见白色幻想0731chaoyue408654318141572zShttps://www.douyin.com/user/MS4wLjABAAAAZJpnglcjW2f_CMVcnqA_6oVBXKWMpH0F8LIHuUu8-lAz7MS4wLjABAAAAZJpnglcjW2f_CMVcnqA_6oVBXKWMpH0F8LIHuUu8-lAu   杨超越工作室*   i`20210708u"   @杨超越工作室创作的原声z0https://www.douyin.com/video/6953975910773099811 0e6443758b8355db9a3c34864a4276be6953975910773099811u'   #一起看海  出现在你的夏日里   iD|`20210422z0https://www.douyin.com/video/6950251282489675042 b4db86aec367ef810ddd38b1737d2fed6950251282489675042u'   哈哈哈，成功了哈哈哈哈哈哈20210412i@t`)r   r.  r  r  r  r  r  r  r  r  r  r  zNo longer availabler$  z0https://www.douyin.com/video/6963263655114722595 1440bcf59d8700f8e014da073a4dfea86963263655114722595u8   #哪个爱豆的105度最甜 换个角度看看我哈哈   ik{`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}|s(t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)rs   ro   r   z4Fresh cookies (not necessarily logged in) are needed
s_v_web_idr   )	r  r   r|   rI   r   rx   ry   rz   r   )r1   r
  rZ   r  r3   r3   r4   rh    s   

zDouyinIE._real_extractN)	r  r  r  ri  r   rk  r  ry   rh  r3   r3   r3   r4   r  :  s~   	
	
	
	
wr  c                   @   s  e Zd ZdZdZdi dddddd	d
ddddedededddddddddddeddddd d	d!d"d#d$d%i dd&dddd'd
d(dd)dededed*edddd+dd,dd-dedd.dd/d d'd0d.d#d$d1d2d3gZd4d5 Zd6S )7
TikTokVMIEzFhttps?://(?:(?:vm|vt)\.tiktok\.com|(?:www\.)tiktok\.com/t)/(?P<id>\w+)z	vm.tiktokz"https://www.tiktok.com/t/ZTRC5xgJpr   7170520270497680683r.  ri  r  z$md5:c64f6152330c2efe98093ccc8597871cr  6687535061741700102r  20221127r  r  r  r  zdhttps://www.tiktok.com/@MS4wLjABAAAAObqu3WCTXxmw2xwZ3iLEHnEecEIw7ks6rxWqOqOhaPja9BI7gqUQnjw8_5FSoDXXr  z"Wave of Mutilation: Best of Pixiesr  zre:https://.+\.webp.*r  ru  r  i:΂cr  r#  Pixiesr  zWhere Is My Mind?r  sigmachaddeus	SigmaChad)r  r  r5  z https://vm.tiktok.com/ZTR45GpSF/7106798200794926362z$md5:edc3e7ea587847f8537468f2fe51d074699769587884626841820220608r  zdhttps://www.tiktok.com/@MS4wLjABAAAAdZ_NcPPgMneaGrW0hN8O_J_bwLshwNNERRF5DxOw2HKIzk0kdlLrR8RkVl1ksrMO   iPkb	Akihitokor  
akihitoko1zhttps://vt.tiktok.com/ZSe4FqkKdTrd  c                 C   s<   | j t|| |ddidj}| |rt|| |S )Nrm   zfacebookexternalhit/1.1r  )_request_webpager   r  r
  suitabler   r  )r1   r
  new_urlr3   r3   r4   rh    s   

zTikTokVMIE._real_extractN)r  r  r  ri  r  r   rk  rh  r3   r3   r3   r4   r    s    	
	
3r  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/live7210809319192726273ri  u(   re:ウェザーニュースLiVE[\d\s:-]*u   ウェザーニュースLiVEweathernewslive6621496731283095554z'https://www.tiktok.com/@weathernewsliveis_live)	r   r.  r  r  r  r  r  live_statusconcurrent_view_countskip_downloadm3u8)r
  r&  rt  z)https://www.tiktok.com/@pilarmagenta/live7209423610325322522Pilarmagentapilarmagenta6624846890674683909z$https://www.tiktok.com/@pilarmagenta
Livestreamr<  z@https://m.tiktok.com/share/live/7209423610325322522/?language=enTrd  z&https://www.tiktok.com/@iris04201/liveNc              	   C   sZ   t | j||ddd||id|thfi d}t|ddkr |S |s(tdd	d
t|d)NFr)   ry  )ro   rs   r  r  r   zThis livestream has endedTr   r   )r   r|   rI   r   rz   r   r   )r1   r
  paramroom_idr  rA   r  r3   r3   r4   r   0  s   

zTikTokLiveIE._call_apic                    sR   |dd\}}|s)jt|d j|dd}t||ddddthf}|r-|sXj||p3|| d	}||p>|}|pKt|d
dtht	f}|pWt|d
dtht	f}|s_t
|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 ]Y\}}	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 ]5}	t d|	 d-thf}|r|||	d%krd&nd"|	d%krd'nd.|	 d/||	 d0|d1d2 qt dd3thfi d D ]!\}}t|s8q-||d"d#|  |d4|||d5 q-t|d6d s|t jd7d8||d9d t d:r|| d: d&d'd;d<|d=d2 |pt d>d?}||t|d jpd d|d@dAt dBdCdthfdDdEthfdFdGdHS )INr  r   T)r  r  r  r  roomIdr4  ))LiveRoomliveRoomUserInfor  )
UserModuleusers.r  r   z,https://webcast.tiktok.com/webcast/room/infor'  rt   r>  )
SD1ldSD2sdHD1hdFULL_HD1uhdORIGIONoriginc                    s     | d S rC   )_parse_jsonr   r8   r3   r4   r   Z  r=  z,TikTokLiveIE._real_extract.<locals>.<lambda>
stream_urllive_core_sdk_data	pull_datastream_datar  main
sdk_paramsVCodecvbitrater   rS  r   c                 S   s   t d|   S )Nz(?i)\d+x\d+|\d+p)r  matchrP  lowerr   r3   r3   r4   r   c  r  )rV  rW  r   flvzflv-)r
  r.  rU  rX  hlsri  m3u8_nativezhls-)r
  r.  protocolrU  rX  c                     s"   t  dg| hdthR S )Nr8  r>  )r   r:   )keys)	live_infoparse_innerr3   r4   
get_vcodec{  s   z.TikTokLiveIE._real_extract.<locals>.get_vcodec)rC  rtmp	_pull_urlhttpsz-pull_pull_url_paramsr5  )r
  r.  rE  rU  rV  rX  flv_pull_urlflv_pull_url_params)r
  r.  rU  rV  rX  c                 S   s   |d dkS )Nr.  ri  r3   r8  r3   r3   r4   r     r=  z'https://www.tiktok.com/api/live/detail/roomIDLiveRoomInfoliveUrlzhls-fallbackr{  r6  )	ownerInfor  )ownerrb   )rX  r.  )r   r  r  r  r  r  r  rS  rT  )rU  r  )
user_count)liveRoomStats	userCount)r  r  r  r  Fr  )rg  rP  r  r   r  r   re   r:   rc   r  r   r   r   rI   rQ   r   r   rB  rA  r   rz   r   )r1   r
  r  r'  ra   rt   r  get_qualityrX  streamr=  flv_urlhls_urlrI  r8  f_idf_urlr3   )rG  rH  r1   r4   rh  ?  s   







	"	
	
	
zTikTokLiveIE._real_extractrC   )
r  r  r  ri  r  r   r:   rk  r   rh  r3   r3   r3   r4   r    sL    
$r  )4r   r  r   r   r   r;   r  r  r   urllib.parser  r   commonr   
networkingr   utilsr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   utils.traversalr   r   r   r   r0   rl  r  r  r  r  r  r  r  r  r3   r3   r3   r4   <module>   sF    X     	  / :&: ?