o
    j,                    @   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   J/home/kuhnn/.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   s  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ddhthdf}
t |tdddhthdf}tt | dpd d }| jd|	||d |
r|r| jd|
||d |	|
fS )NcsT)idhtmlclassc                 S   s
   |  dS )Nz===r3   xr3   r3   r4   <lambda>   s   
 z?TikTokBaseIE._solve_challenge_and_set_cookies.<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rcirssleep_interval_requestsr   x   .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wci_cookie_valuewci_cookie_namerci_cookie_namerci_cookie_valuer   r3   r3   r4    _solve_challenge_and_set_cookies   s\   


z-TikTokBaseIE._solve_challenge_and_set_cookiesc              
      s  i d}}d fdd	}| }|du r||fS  |}|soz|}	W n! tyJ }
 z r4 j|
jd ||fW  Y d }
~
S d }
~
ww |dd}td |	D ]}jjd	d
|d qU|du ri||fS  |}|sd} ryt|j|d ||fS t|ddt	hfpd}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   r   rG   )domainr  namez0Unable 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   	cookiejarclearr   r   rI   boolr  r  )r1   r  rZ   ro   
video_datastatusr  ra   universal_datacookie_namesr   cookie_namer   r3   r  r4   _extract_web_data_and_status  sH   

 
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)r1  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   f  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   x      z-TikTokBaseIE._get_subtitles.<locals>.<lambda>LanguageCodeNamerC  c                    s    | d S )Nr:  r3   r   
preferencer3   r4   r         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   r=  	subs_listr3   rG  r4   _get_subtitlesM  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_keyra  rZ  r  r[  r3   r3   r4   _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
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:  acodecrb  widthheight)r	   r?  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 )Nrg  r*   rb  bytevc2rq  rp  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mp4rl  zaweme/v1r  )r  filesizer:  ro  source_preferencern  z(API)Nz(UNPLAYABLE) )delim)rH  rn  )r   rz   r   )r@   r  )add_metaaddrrr  
is_bytevc2parsed_metar3   r4   rO     s(    
zMTikTokBaseIE._parse_aweme_video_app.<locals>.extract_addr.<locals>.<listcomp>r2  )rh  rz   rM  r   r   )r}  r|  r  )rr  known_resolutionsr1   )r|  r}  r~  r  r4   extract_addr  s   z9TikTokBaseIE._parse_aweme_video_app.<locals>.extract_addrrp  rq  c                           S rC   r3   r3   )rq  rp  r3   r4   r     rE  z5TikTokBaseIE._parse_aweme_video_app.<locals>.<lambda>      ?	play_addrzDirect video
is_bytevc1is_h265r^  h264)ra  rn  rb  rp  rq  download_addrzDownload video%shas_watermarkz, watermarkedr*   c                      s   t   S rC   r   r3   )dl_widthratior3   r4   r     rI  rv  r  )ra  rn  rb  rp  rq  rH  play_addr_h264)ra  rn  rb  play_addr_bytevc1bit_rate	gear_namezPlayback videoc                 S   s   | d d S )Nr  r   r3   r   r3   r3   r4   r     rI  FPS)ra  rn  rc  rb  fpsrl   r  
statisticsmusic)hybrid_label.r4  r0  )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 )r2  .)coverorigin_coverr  rv  r   r  rH  )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   r_  PrivatezFriends onlyzFollowers only)
is_privateneeds_subscriptionis_unlisted)rd  rZ  sizebr)channel_urluploader_urltrackr  artistsformatsrS  
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   r  r  r  r[  auth_cookief
stats_info
music_infolabelscontained_music_trackcontained_music_authoris_generic_og_tracknamemusic_trackmusic_authorauthor_infor3   )rr  r  rq  r  r  r1   r  rp  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 )4Nru  r  rl  )r:  rb  ro  r  rp  rq  c                      r  rC   r3   r3   play_height
play_widthr3   r4   r   ;  rE  z3TikTokBaseIE._extract_web_formats.<locals>.<lambda>r  bitrateInfoc                 S   s   |d d S )NPlayAddrUrlListr3   rD  r3   r3   r4   r   >  rI  r  UrlKeyr*   rb  rs  
UNPLAYABLEry  r  DataSize)rn  rH  rw  i  @  r   r   )rp  rq  r  .r  c                    s   |d  kS )Nrp  r3   rD  )r  r3   r4   r   a  rI  rd  playAddr)).srcNplay)ra  r  rp  rq  rd  )downloadAddr)downloadr  r  watermarkedrv  )ra  r  rn  rH  r  playUrl	mime_typec                 S   s   |  ddS )NrX   rG   )replacer   r3   r3   r4   r   |  rI  ri  audiorm  )ra  r  r:  ro  rb  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     s   & z5TikTokBaseIE._extract_web_formats.<locals>.<listcomp>)r   rI   r   rz   r   rh  r:   r   r   r   rN  _proto_relative_urlr  r  r   r   )r1   r   COMMON_FORMAT_INFOr  r  r  bitrate_infoformat_infor  r~  	dimensionyr   	video_urlplay_qualityplay_urldownload_url	audio_urlr:  r3   r  r4   _extract_web_formats2  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r3  Referer)r   r  rS  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  r0  r  c                    sB   g | ]}t  d |thfD ]}|||dkrdnddqqS ))Nr  dynamicCoverrv  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   rf  rK   rP   rS   rT   	functoolscached_propertyr5   r.   r=   r?   rW   staticmethodr[   rc   re   r   r   r   r   r  r(  rY  rh  r   r  r  r3   r3   r3   r4   r   (   sT    






/


4: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:  ru  r  z!#jassmanak #lehanga #leenabhushanr  r     rq  i   rp  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  r1  r2  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  r2  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  r2  r3  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7139980461132074283rk  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  r1  r2  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7253412088251534594ri  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_urlr\  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   _TESTSrt  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_retriesrY  )r  playlist_mincountr2  rb  paramsz+https://www.tiktok.com/@6820838815978423302   rM  rL  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   r}  z&. Try again with a different device_idTr   z+. Taking measures to avoid an infinite loopc                 S   rB  Nr   r3   rD  r3   r3   r4   r   J  rE  z'TikTokUserIE._entries.<locals>.<lambda>r  r  r  c                 S   s   t | d S )Nr  r   r   r3   r3   r4   r   V  rI  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  rP  r   r:   r.   r   r=   erroraddr[   
url_resultr0   r  r  )r1   r  rQ  
fail_earlyrb   seen_idsr  pageretryresponsecurrent_batchr   r  rZ   r  
old_cursorr3   r3   r4   _entries2  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   r@  Tr  r  )
_download_webpager   r   r_   rI   r:   r[   r(  r  rz   )	r1   rQ  ra   rt   r   r  r#  rX   r  r3   r3   r4   _extract_sec_uid_from_embedf  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  rr  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  rQ  r  r  ra   detailvideo_countr3   r3   r4   rt  }  sD   


zTikTokUserIE._real_extractNr  )r  r  r   IE_NAMEru  rw  r  r  r  r  rt  r3   r3   r3   r4   rx    sP    


$
#4rx  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  r  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   rt    s   
zTikTokBaseListIE._real_extractN)r  r  r   r  rt  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  r  r2  rb  zBhttps://www.tiktok.com/music/jiefei-soap-remix-7036843036118469381i  7036843036118469381N	r  r  r   r  ru  _WORKINGr  r  rw  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-479565Trp  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	hello2018r|  r  r  u=   https://tiktok.com/tag/fypシ?is_copy_url=0&is_from_webapp=v1Trp  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   rt    s   
zTikTokTagIE._real_extractN)
r  r  r   r  ru  r  r  r  rw  rt  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-testr|  	   )r  r2  playlist_countzOhttps://www.tiktok.com/@imanoreotwe/collection/%F0%9F%98%82-71118871895711608757111887189571160875zimanoreotwe-%F0%9F%98%82r  )r  r2  r  z0https://www.tiktok.com/api/collection/item_list/rF  c                 C   s   d|| j |ddS )Nr  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   rB  r  r3   rD  r3   r3   r4   r   4  rE  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   -)rs  r\  r  r  rv   )r1   r  r  r  rQ  r3   r3   r4   rt  @  s   z TikTokCollectionIE._real_extractN)r  r  r   r  ru  rw  r  r  r  r  rt  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:  ru  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?gri  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 availabler0  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   rt    s   

zDouyinIE._real_extractN)	r  r  r   ru  r   rw  r  ry   rt  r3   r3   r3   r4   r  G  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:  ru  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  r  r  i:΂cr  r/  Pixiesr  zWhere Is My Mind?r  sigmachaddeus	SigmaChad)r  r)  rA  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/ZSe4FqkKdTrp  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   rt  
  s   

zTikTokVMIE._real_extractN)r  r  r   ru  r  r   rw  rt  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7210809319192726273ru  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  r2  r  z)https://www.tiktok.com/@pilarmagenta/live7209423610325322522Pilarmagentapilarmagenta6624846890674683909z$https://www.tiktok.com/@pilarmagenta
LivestreamrH  z@https://m.tiktok.com/share/live/7209423610325322522/?language=enTrp  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)   r  )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   =  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  roomIdr@  ))LiveRoomliveRoomUserInfor  )
UserModuleusers.r  r   z,https://webcast.tiktok.com/webcast/room/infor3  rt   rJ  )
SD1ldSD2sdHD1hdFULL_HD1uhdORIGIONoriginc                    s     | d S rC   )_parse_jsonr   r8   r3   r4   r   g  rI  z,TikTokLiveIE._real_extract.<locals>.<lambda>
stream_urllive_core_sdk_data	pull_datastream_datar  main
sdk_paramsVCodecvbitrater   r_  r   c                 S   s   t d|   S )Nz(?i)\d+x\d+|\d+p)r  matchr\  lowerr   r3   r3   r4   r   p  r  )rb  rc  r   flvzflv-)r  r:  ra  rd  hlsru  m3u8_nativezhls-)r  r:  protocolra  rd  c                     s"   t  dg| hdthR S )NrD  rJ  )r   r:   )keys)	live_infoparse_innerr3   r4   
get_vcodec  s   z.TikTokLiveIE._real_extract.<locals>.get_vcodec)rO  rtmp	_pull_urlhttpsz-pull_pull_url_paramsrA  )r  r:  rQ  ra  rb  rd  flv_pull_urlflv_pull_url_params)r  r:  ra  rb  rd  c                 S   s   |d dkS )Nr:  ru  r3   rD  r3   r3   r4   r     rI  z'https://www.tiktok.com/api/live/detail/roomIDLiveRoomInfoliveUrlzhls-fallbackr  rB  )	ownerInfor  )ownerrb   )rd  r:  )r   r  r  r(  r  r  r  r_  r`  )ra  r  )
user_count)liveRoomStats	userCount)r  r  r)  r*  Fr
  )rs  r\  r  r   r  r   re   r:   rc   r  r   r   r   rI   rQ   r   r   rN  rM  r   rz   r   )r1   r  r  r3  ra   rt   r  get_qualityrd  streamrI  flv_urlhls_urlrU  rD  f_idf_urlr3   )rS  rT  r1   r4   rt  L  s   







	"	
	
	
zTikTokLiveIE._real_extractrC   )
r  r  r   ru  r  r   r:   rw  r   rt  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   rx  r  r  r  r  r  r  r  r$  r3   r3   r3   r4   <module>   sF    X       / :&: ?