
    =Ґig)                       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	e      Z) G d
 de)      Z* G d de)      Z+ G d de)      Z, G d de,      Z- G d de,      Z. G d de,      Z/ G d de)      Z0 G d de)      Z1 G d de      Z2 G d de)      Z3y)    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                   8   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
        Ze
j                  d        Ze
j                  d        Ze
j                  d        Zd Zed        Zd Zd Z	 	 ddZd Z	 	 ddZd Zd ZddZd Zd Zd Zd ZddZy) 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                 T    | j                   rdgng }| j                  d|t              S )N app_infoie_key)_KNOWN_DEVICE_ID_configuration_argTikTokIE)selfdefaults     P/var/www/descvideos/venv/lib/python3.12/site-packages/yt_dlp/extractor/tiktok.py_KNOWN_APP_INFOzTikTokBaseIE._KNOWN_APP_INFO;   s-     //2$R&&z78&LL    c                 :    | j                  dd gt              d   S )N	device_idr/   r   r2   r3   r4   s    r6   r1   zTikTokBaseIE._KNOWN_DEVICE_IDA   s!    &&{TF8&LQOOr8   c                 \    | j                   xs t        t        j                  dd            S )Nl     *{Y2$ l   B2n?- )r1   strrandomrandintr<   s    r6   
_DEVICE_IDzTikTokBaseIE._DEVICE_IDE   s%    $$eFNN;NPc,d(eer8   c                 :    | j                  ddgt              d   S )Napi_hostnamez#api16-normal-c-useast1a.tiktokv.comr/   r   r;   r<   s    r6   _API_HOSTNAMEzTikTokBaseIE._API_HOSTNAMEI   s0    &&BCH ' VVWY 	Yr8   c                 J   | j                   | j                  j                         D ci c]'  \  }}|dk7  r|| j                  ||gt              d   ) }}}| j
                  D cg c]=  }i |t        d t        | j                  |j                  d      d      D              ? c}| _         | j                   sy| j                   j                  d      | _
        | j                  d   }| j                  d	   }|d
k(  rd| }nd| d| }| d| _        yc c}}w c c}w )Nr'   r/   r   c              3   0   K   | ]  \  }}|s	||f  y wN ).0kvs      r6   	<genexpr>z2TikTokBaseIE._get_next_app_info.<locals>.<genexpr>V   s       $#q!jkQF$s   
	/F)strictr(   r*   r$   zcom.zhiliaoapp.musically/zcom.ss.android.ugc.zR (Linux; U; Android 13; en_US; Pixel 7; Build/TD1A.220804.031; Cronet/58.0.2991.0)T)_APP_INFO_POOL_APP_INFO_DEFAULTSitemsr2   r3   r7   dictzipsplitpop	_APP_INFO_APP_USER_AGENT)r4   keyr5   defaultsr.   r(   versionpackages           r6   _get_next_app_infozTikTokBaseIE._get_next_app_infoN   sJ   & %)$;$;$A$A$C C%< T,,S7)H,MaPPH  $(#7#7#  8 t $'*4+B+BHNNSVDW`e'f$   #D "",,003>>*-..!78|#1';G+H:Qwi@G")*|}1
#s   ,D'AD c                     d| xs d d| S )Nzhttps://www.tiktok.com/@_z/video/rH   )user_idvideo_ids     r6   _create_urlzTikTokBaseIE._create_urlj   s    )'.S)9
KKr8   c                 0    | j                  d|d|di       S )Nz;<script[^>]+\bid="(?:SIGI_STATE|sigi-persisted-data)"[^>]*>z
sigi state	</script>end_patternr5   )_search_jsonr4   webpage
display_ids      r6   _get_sigi_statezTikTokBaseIE._get_sigi_staten   s*      JG*, ! L 	Lr8   c           
      Z    t        | j                  d|d|di       dt        hf      xs i S )Nz;<script[^>]+\bid="__UNIVERSAL_DATA_FOR_REHYDRATION__"[^>]*>zuniversal datarc   rd   __DEFAULT_SCOPE__)r   rf   rR   rg   s      r6   _get_universal_dataz TikTokBaseIE._get_universal_datas   sF    D--JGjlB . P !4&)+ 1 /1	1r8   c	           
         | j                  | j                  ddj                  t        j                  dd                   | j                  | j                        }	|	j                  d      r*| j                  | j                  d|	d   j                         | j                  d| j                   d| d	||||| j                  d
d|xs i ||      S )Nodin_ttr-   0123456789abcdef   rJ   sid_ttzhttps://z
/aweme/v1/rM   zapplication/json)
User-AgentAccept)r`   fatalnoteerrnoteheadersquerydata)_set_cookierD   joinr?   choices_get_cookies_WEBPAGE_HOSTgetvalue_download_jsonrW   )
r4   epr`   rz   r{   ry   rv   rw   rx   webpage_cookiess
             r6   _call_api_implzTikTokBaseIE._call_api_imply   s    ++YOaeh@i8jk++D,>,>?x(T//?8;T;Z;Z[""t))**RD:XdG"22,> =b>  # ' 	'r8   c                    t        i |i dddddddt        t        j                         dz        dt        t	        j
                               d	d
d| j                  d   d| j                  d   ddj                  d | j                  d   j                  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        j                               t        j                  d/d0      z
  d1d2d3d*d4d d5d6d7d8d9d d:d;d<d=d*d*| j                  d   d*t        t        j                               | j                  j                  d>      | j                  dj                  t        j                  d?d@A            dB      S )CNdevice_platformandroidosssmixa_rticket  cdidchannel
googleplayr+   r(   version_coder-   c              3   6   K   | ]  }t        |      d   yw)02dNint)rI   rK   s     r6   rL   z0TikTokBaseIE._build_api_query.<locals>.<genexpr>   s     #fs1vclO#fs   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'   rp      rr   )carrier_region	op_regionbuild_numberregiontsr'   r:   openudid)r   r   timer>   uuiduuid4rV   r}   rT   r?   r@   r   rA   r~   )r4   rz   s     r6   _build_api_queryzTikTokBaseIE._build_api_query   s    ,
,
y,
 ),
 S	,

 DIIK$./,
 C

%,
 |,
 4>>%(,
 z2,
 BGG#fT^^M=Z=`=`ad=e#ff,
 DNN=9,
 $T^^4J%K,
 "4>>2H#I,
 $..7,
 +,
  3!,
" 9#,
$ H%,
& ',
( d),
* $+,
, &-,
. c/,
0 d1,
2 3,
4 $5,
6  TYY[!1FNN5'4R!R7,
8 /9,
: ;,
< D=,
> x?,
@ A,
B dC,
D 8E,
F 3G,
H # NN=9diik">>%%e,/AR HIW,
 , ,	r8   c	                    | j                   s3| j                         s#d}	|rt        |	d      | j                  |	       y t	        | j
                        dz   }
t        j                  d      D ]V  }| j                  t        | j                                | j                  |xs i       }	 | j                  ||||||||      c S  y # t        $ r}t        |j                  t        j                        r|j                  j                   dk(  rmt        |j                  xs |j"                        }	| j                         s|r | j                  |	       Y d }~ y | j                  |	 d| d|
 d	       Y d }~ d }~ww xY w)
Nz No working app info is availableTexpectedr   )rz   r{   ry   rv   rw   rx   r   z. Retrying... (attempt z of ))rV   r\   r   report_warninglenrO   	itertoolscountwrite_debugr>   r   r   
isinstancecausejsonJSONDecodeErrorposmsg)r4   r   r`   rz   r{   ry   rv   rw   rx   message	max_triesr   
real_queryes                 r6   	_call_apizTikTokBaseIE._call_api   s]   ~~d&=&=&?8G$Wt<<##G,++,q0	__Q' 	ES01..u{;J**
wdG + = =		 " aggt';';<PQAQ!!''"2QUU3G224 ! //8"''7)3J5'QUV_U``a(bcs%   *C	F BE;E;:E;;F c                     t        | j                  d|t        d| ddd      ddi      d	d
t        hf      }|st	        d|      | j                  |      S )Nzmulti/aweme/detail[]r&   )	aweme_idsrequest_sourcezX-Argusr-   )r{   ry   aweme_detailsr   z#Unable to extract aweme detail infor`   )r   r   r   rR   r   _parse_aweme_video_app)r4   aweme_idaweme_details      r6   _extract_aweme_appzTikTokBaseIE._extract_aweme_app   s|    #NN/@R 
!_"%T A #B  ) ,;Av*F	H
  !FQYZZ**<88r8   c                 b   t        |t        dd      ht        hdt        d ht        j
                  ht        j                  hf      }|sd|v rt        d      t        d      | j                  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 ]w  }t        |      j                         }|j!                         }|j#                  |       |j%                         |k(  sQt	        j&                  |      j)                         |d<    n t        d      t	        j&                  t        j*                  |d      j                               j)                         }t        |t        dd      ht        hdt        d      hf      }	t-        t/        j.                               | j1                  d      xs dz   dz   }
| j3                  d|	||
       y )NcsT)idhtmlclassc                     |  dS )Nz===rH   xs    r6   <lambda>z>TikTokBaseIE._solve_challenge_and_set_cookie.<locals>.<lambda>   s    !Cy r8   zPlease wait...z Unable to extract challenge dataz(Unexpected response from webpage requestz7Solving JS challenge using native Python implementationrK   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_paramr|   )r4   rh   challenge_dataexpected_digest	base_hashinumber	test_hashcookie_valuecookie_namer   s              r6   _solve_challenge_and_set_cookiez,TikTokBaseIE._solve_challenge_and_set_cookie   s   %gT-.1C0Dg()F,<,<+=

|0M N 7*$%GHH !KLLPQ&~sef../01284 5 !sef../^^w'<=>2@ A	 y! 	AAV]]_F!(IV$!_4&,&6&6v&>&E&E&Gs#	A !!?@@''JJ~*=DDFHHN 	 #7U./2D1Eg567-9 :
 $))+&$..9R*S*XWXY\]]\{[r8   c                     i d}}d fd	} |       }|du r||fS  j                  |      }|s5	  j                  |        |d      }|du r||fS  j                  |      }|s&d}
rt        |
       j                  |
       ||fS t        |dd	t        hf      xs d
}t        |dddt        hf      }t        |dt        hf      sNt        |dt        hf      r;d}
r j                  |
        j                  |
 d j                                 ||fS # t        $ r.}	r  j                  |	j                         ||fcY d }	~	S d }	~	ww xY w)Nc                 ,   j                  | d      }|du ry|\  }}t        j                  j                  |j                        j
                  dk(  r<d}rj                  |       j                  | dj                                 y|S )NTrv   impersonateFz/loginz4TikTok is requiring login for access to this content. r   )	_download_webpage_handleurllibparseurlparseurlpathraise_login_requiredr   _login_hint)	rw   resrh   urlhr   rv   r4   r  r`   s	        r6   get_webpagez>TikTokBaseIE._extract_web_data_and_status.<locals>.get_webpage  s    //Xt5^b/cCe|MGT||$$TXX.33x?P--g6##wir$2B2B2D1E$FQY#ZNr8   Fr   z)Downloading webpage with challenge cookie)rw   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  )zDownloading webpage)rm   r  r   r   orig_msgr   r   rR   boolr  r  )r4   r  r`   rv   
video_datastatusr  rh   universal_datar   r   s   ````       r6   _extract_web_data_and_statusz)TikTokBaseIE._extract_web_data_and_status	  s   F
	 	 -ev%%11'8D*44W= "'RSG%!6))!55gxHNHG$W--(;v%%n/DlUXTY.Z[`_`!.3H*Vbeidj2kl
J4&(9:|JYnqupvXw?x^G))'27)2d.>.>.@-A BXV6!!7 " *##AJJ#B!6))	*s   D$ $	E-#EEEc                 $   dddd}t        t        |j                                     i }t        |dt              }|D ]  }t        |dt
        d	      }|s| j                  ||d
dd      }	|	s2|j                  |j                  dd      g       j                  ddj                  d t        |	d         D              d        |st        |dt              D ]l  }|j                  d      s|j                  |j                  d      xs dg       j                  |d   |j                  |j                  d            d       n |s|r'| j                  | j                  ||      |d      \  }}
t        |ddd f      D ]Z  }|j                  |j                  d      xs dg       j                  |d   |j                  |j                  d            d       \ |j                         D ]  \  }}t        |fd      ||<    |S ) Nr   srtvtt)creator_captionr+  webvtt)interaction_stickers.auto_video_caption_infoauto_captions.expected_type)r  url_list.F)r3  get_allzDownloading captionszUnable to download captions)rw   rx   rv   r   r   z

c           	   3      K   | ]I  \  }}|j                  d       r3|dz    dt        |d   dz         dt        |d   dz         d|d      K yw)textr   

start_timer   z --> end_timeN)r   r   )rI   r  lines      r6   rL   z.TikTokBaseIE._get_subtitles.<locals>.<genexpr>Y  s      $^4DHHU[L\ 1ugR 6tL7ID7P QRRWXnost~o  CG  pG  YH  XI  IK  LP  QW  LX  KY  Z$^s   AA
utterances)extr{   )r"  cla_infocaption_infos.r  langFormatr  r=  rv   r"  subtitleInfosc                     |d   S )NUrlrH   r^   rK   s     r6   r   z-TikTokBaseIE._get_subtitles.<locals>.<lambda>k  s    ^_`e^f r8   LanguageCodeNamerF  c                      | d         S )Nr=  rH   )r   
preferences    r6   r   z-TikTokBaseIE._get_subtitles.<locals>.<lambda>s  s    j5>R r8   rX   )r   tuplevaluesr   rR   r   r   
setdefaultr   appendr}   	enumerater)  ra   rQ   sorted)r4   r   r   	user_nameEXT_MAP	subtitlescaptions_infocaptioncaption_urlcaption_jsonr^   r@  	subs_listrJ  s                @r6   _get_subtitleszTikTokBaseIE._get_subtitles@  s@     &

 uW^^%567
	 %hx|~$ 	G&w0HXcmrsK..X,BLiqv / xL  Z!>CJJ $^#,\,-G#H$^ ^L 	 '6aquv {{5)$$W[[%8%@D"ELL"5>";;w{{8'<=N  "&"C"C$$Y985 #D #Ra'wQf6gh $$W[[1C%D%LbQXX"5>";;w{{8'<=Z   )0 	TOD)$Y4RSIdO	T r8   c                     | j                  d|ddd      \  }}}}|si d fS ||dk(  rdn|t        |d	      xs 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)r5   groupbytevc1h265r   scale)	format_idvcodectbrquality)_search_regexr   r   	QUALITIES)r4   url_keyrc  r\  r  r]  s         r6   _parse_url_keyzTikTokBaseIE._parse_url_keyw  s    )-););Mw7?` *< *b&	5#w t8O" % 2fwd3;t0y05	

  	r8   c                 	    |d   }|d   }i d i f fd	}g }t        |j                  d            t        |j                  d            t        fd      xs d|j                  d	      r0|j                   ||d	   d	d
t	        |dd      rdndd             |j                  d      rt|d   }t        |j                  d            |j                   ||dd|j                  d      rdndz  dt        fd      |j                  d      rdndd             |j                  d      r|j                   ||d   dd
dd             |j                  d      r|j                   ||d   dd
dd             |j                  dg       D ]m  }|j                  d	      s|j                   ||d	   |j                  d      dt        |d       t	        |dd      rdnd|j                  d       d!             o  j                  |        j                   j                        j                  d"      }|rN|D ]I  }	 j                  t        j                  j                  |	d#         j                  d"|j                         K |j                  d$      xs i }
|j                  d%      xs i }t	        |d&t        '      }t	        |d(d)t        '      }t	        |d*d+d,t        '      }|j                  d-      xr2 |j                  d.      d/j!                  |j                  d0            k(  }|r	|xs d1|}}n$|j                  d.      t	        |d,t        hf      }}t	        |d,d2t        hfd3t"        hfd4t        hfd5t        hfd6f      }d7|it	        |d8t%        d9:      hfd8t        hfd;t         hfd<      t	        |
d=d>d?d@dAdBt         '      |t'        |dC j(                  d D      t'        |dEdFg j(                  d D      |t#        |j                  dG            xs d |rt+        j,                  dH|      nd | j/                  ||t	        |dEdFdC            dID cg c]"  }t	        ||dJdKf      D ]  }|||dLv rdnddM $ c}}t	        |dNdOt        dPQ      ht0        f      xs t	        |dOt         hf       j3                  dR|v dS|v dT|v U      dVdWS c c}}w )XNr   r"  c                 R    t        | 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=  acodecrd  widthheight)r
   rB  s     r6   
audio_metaz7TikTokBaseIE._parse_aweme_video_app.<locals>.audio_meta  sN    7C c!1  -#&%<%S  : 8::r8   c                    j                  | j                  dd            \  }}|j                  d      dk(  }|rj                  |i       j                  dt        | j                  d                   |   j                  dt        | j                  d                   |j	                  j                  |i              |j                  dt        |d d              | j                  d      xs g D cg c]c  }|t        | j                  d	            d
dd|v rdndd|||rdndt        |j                  d      d|v rdnd |rdnd d      d |      e c}S c c}w )Nri  r-   rd  bytevc2ru  rt  r  r4  	data_sizemp4rp  zaweme/v1)r  filesizer=  rs  source_preferencerr  z(API)z(UNPLAYABLE) )delim)rJ  rr  )rj  r   rN  r   r   r   )	addradd_metaparsed_metar  
is_bytevc2r  rv  known_resolutionsr4   s	         r6   extract_addrz9TikTokBaseIE._parse_aweme_video_app.<locals>.extract_addr  sw   #22488Ir3JKK$2i?J!,,S"5@@;W[W_W_`hWiKjk!#&11';txxPWGX;YZ""#4#8#8b#AB##Hk#cr(.CD *-35  '(=>+5+<R"  * '1db,LL/J#<MSW&0Nd# G S/ 5 5 5s   9A(E$rt  ru  c                       z  S rG   rH   )ru  rt  s   r6   r   z5TikTokBaseIE._parse_aweme_video_app.<locals>.<lambda>  s     r8         ?	play_addrzDirect video
is_bytevc1is_h265r`  h264)rc  rr  rd  rt  ru  download_addrzDownload video%shas_watermarkz, watermarkedr-   c                       t         z        S rG   r   )dl_widthratios   r6   r   z5TikTokBaseIE._parse_aweme_video_app.<locals>.<lambda>  s    3x%/?+@ r8   r{  r  )rc  rr  rd  rt  ru  rJ  play_addr_h264)rc  rr  rd  play_addr_bytevc1bit_rate	gear_namezPlayback videoc                     | d   dz  S )Nr  r   rH   r   s    r6   r   z5TikTokBaseIE._parse_aweme_video_app.<locals>.<lambda>  s    a
md6J r8   FPS)rc  rr  re  rd  fpsrs   r  
statisticsmusic)hybrid_label.r7  r2  )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  r5   r  r  album
(?:, | & ))coverai_dynamic_coveranimated_coverai_dynamic_cover_bakorigin_coverdynamic_coverr4  .)r  r  r   r  rJ  )Nr  durationr   ra  PrivatezFriends onlyzFollowers only)
is_privateneeds_subscriptionis_unlisted)rf  r\  sizebr)channel_urluploader_urltrackr  artistsformatsrT  
thumbnailsr  availability_format_sort_fields)r   r   r   extendr   r   _remove_duplicate_formatsr   r   r|   r  r  r  hostnamer   r>   formatr   r   r   _UPLOADER_URL_FORMATrerT   extract_subtitlesany_availability)r4   r   r   
video_infor  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_infocover_id	cover_urlrv  r  ru  r  r  rt  s   `                    @@@@@@r6   r   z#TikTokBaseIE._parse_aweme_video_app  s   
+!'*
		: )+ 	50 JNN734Z^^H56/0:F>>+&NN<
;(?(-$0i%9&>D B   >>/*&7M"=#4#4W#=>HNN<,1
WfHg_mop !"#@A$.NN?$Cb8   >>*+NN<
3C(D-- G  
 >>-.NN<
3F(G0- J   "~~j"5 		G{{;'|GK,@!([!9#3"7,JK(4y):f?E";;u-C   		 	&&w/''(:(:;??I h  !6!6qx!@!I!I8U`UfUfgh "%%l39r
!%%g.4"
l,IY\] ,13Qad!f!-24SU]mp"r #-..1D"E  #b*..Y`Jaez  fB  fB  CM  CQ  CQ  R`  Ca  fb  Kb"(=(QAQSiK(2w(?j[cfiejZkAlK"<($se,!K=1"SE*$se,	=
 2  (+
< ?#;"<= &+k];* +
 :** -!0-( )*+
 +
 (\4C\C\fjk(j-8$:S:S]ac  !89AT@Lrxx|<RV//h[*m]i(jl!M
  ".j8ZQT:U!V
  #$(04M(M"SU

 &j'k6M5NPS3U V I
Z+,GH ..$.#1V#;,6 / 8 $FU+
 +	
0
s   7'S2c                    dddd}t        |dt        hf      xs i }t        |j                  d            t        |j                  d            t	        fd      xs d	}g }t        |d
d f      D ]#  }| j                  t        |ddt        hf      xs d      \  }}|j                  d      dk(  }	|j                  |	rdnd |	rdndt        |ddt        hf      d       |xr t        |d d       x}
r]|
dk(  rd}
|dk  r)t        |
|z        }|j                  |
||dz  z
  d       n(t        |
|z        }|j                  ||dz  z   |
d       t        |dddt        hf      D ]*  }|j                  i ||d| j                  |      i       , & t        |fddt        f      }t        |d d!t        hf      D ],  }|j                  i |d"| j                  |      |d#       . t        |d$t        hf      D ]+  }|j                  i |d%| j                  |      d&d'd(       - | j                  |       |smt        |d)d*t        hf      rY|d)   d*   }t        t        |      d+dd, ht        hf      xs d-}|j                  d.| j                  |      ||d-k(  rdn|d/d0       |D cg c]4  }t         j"                  j%                  |d         j&                  d1k7  s3|6 c}S c c}w )2Nrz  r  rp  )r=  rd  rs  r"  rt  ru  c                       z  S rG   rH   )play_height
play_widths   r6   r   z3TikTokBaseIE._extract_web_formats.<locals>.<lambda>.  s    k!9 r8   r  bitrateInfoc                     |d   d   S )NPlayAddrUrlListrH   rG  s     r6   r   z3TikTokBaseIE._extract_web_formats.<locals>.<lambda>1  s    RST^R_`iRj r8   r  UrlKeyr-   rd  rx  
UNPLAYABLEr~  r  DataSize)rr  rJ  r|  i  @  r   r   )rt  ru  r  .r  c                     |d   k(  S )Nrt  rH   )r^   rK   r  s     r6   r   z3TikTokBaseIE._extract_web_formats.<locals>.<lambda>T  s    1W:;S r8   rf  playAddr)).srcNplay)rc  r  rt  ru  rf  )downloadAddr)downloadr  r  watermarkedr{  )rc  r  rr  rJ  r  playUrl	mime_typec                 &    | j                  dd      S )Nr^   rM   )replacer   s    r6   r   z3TikTokBaseIE._extract_web_formats.<locals>.<lambda>o  s    AIIc3,? r8   rm  audiorq  )rc  r  r=  rs  rd  zwww.tiktok.com)r   rR   r   r   r   rj  r>   r   r   r   rO  _proto_relative_urlr  r  r   r   r  r  r  r  )r4   r   COMMON_FORMAT_INFOr  r  r  bitrate_infoformat_infor  r  	dimensionyr   	video_urlplay_qualityplay_urldownload_url	audio_urlr=  r  r  r  s                       @@r6   _extract_web_formatsz!TikTokBaseIE._extract_web_formats%  s   

 ",4&0ABHb
 !89
!*..":;9:Df(mEj5kl  	L#22\J3%+HIOR QK %2i?J/9|t&0db(
JQ\P]7^_   !2SSb]3y3# #I19I-.A&&!*"#q1u+( 
 I-.A&&!"a!e"+( 
 *,YPSVaUb8cd 	  ( !  433I>  7 	F $G.SU^`c-de$Z*>RU`Ta1bc 	HNN $#//9#%' 	 )6[^i]j5kl 	LNN $'//=,  	 	&&w/ <w	K=6YZ$W-i8Ix	2R"?!@<.5R S \V[ NN$//	:#&%<%S   #cafll&;&;AeH&E&N&NRb&bcccs   =4K92K9c                    t        |ddt        hfdt        hfdt        hfdt        hfdfd      }||rd n| j                  |      |rd n| j	                  ||d       d	|id
|t        |d| j                  d       t        |ddg| j                  d       dt        |ddt        hfdt        ht        fdt        hd hfdt        hfdf      t        |dt        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&D cg c]7  }t        |d'|t        hf      D ]  }|| j                  |      |d(k(  rd)nd*d+  9 c}}iS c c}}w ),N)
authorInfor  Nr  )authorSecIdsecUid)uniqueIdr  )authorIdr  r   )r   r  r  r  Fr5  Referer)r   r  rT  http_headersr  r  r  r  )r  r  r  r  r  
authorNamec                 6    | rt        j                  d|       S d S )Nr  )r  rT   r   s    r6   r   z5TikTokBaseIE._parse_aweme_video_web.<locals>.<lambda>  s    Z[BHH]TU<V ae r8   r  )r  r  r  r  r  r  r  r"  
createTime)r  r  r  r  stats	playCount	diggCount
shareCountcommentCountcollectCountr  r2  r  )	thumbnailr  dynamicCoveroriginCover)Nr"  r"  r{  r  r  )r   r>   r   r  r  r   r  r   r   r   r   r  )r4   r   webpage_urlr`   extract_flatr  r  r  s           r6   _parse_aweme_video_webz#TikTokBaseIE._parse_aweme_video_web{  s   "<2P"SE*4se</#75}E	S
 2
  +t1J1J<1X!-43I3I,X`bf3g&4	&

 &
 (\4C\C\fjk(j-8$:S:S]ac&
 <'!C5)!C5&1(3%2e1fg'+7	4 * &
 < ?#;"<= &$j;-H*[M:* &
, <')) ,!/,4 * *+-&
:  !V !-l_hYdXe<f!g  #33I>(0N(B";&
 &	
:s   )<E+
)NNNTzDownloading API JSONzUnable to download API page)TF) __name__
__module____qualname__r  r   rh  rP   rO   rV   rW   	functoolscached_propertyr7   r1   rA   rD   r\   staticmethodra   rj   rm   r   r   r   r   r  r)  rZ  rj  r   r  r&  rH   r8   r6   r   r   (   s%   7-M1I   ,	 NIOM M
 P P f f Y Y8 L LL
1 W[<Y'-^ RV7T>9(\T5"n5n_
BTdl.
r8   r   c                   ,   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d Zy)r3   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=  rz  r  z!#jassmanak #lehanga #leenabhushanr  r     ru  i   rt  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7139980461132074283ro  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7253412088251534594rm  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                    | j                  |      j                  dd      \  }}| j                  r	 | j                  |      S | j                  ||      }| j                  ||      \  }}|r|dk(  r| j                  |||      S |dv r| j                  d       n|dk(  rt	        d	d
      t	        d| |      # t        $ r%}d|_        | j                  | d       Y d }~d }~ww xY w)Nr   r_   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^  r7   r   r   r   r   ra   r)  r&  r  )r4   r  r`   r_   r   r&  r'  s          r6   _real_extractzTikTokIE._real_extract  s    11#6<<T9M'A..x88
 w1!>>sHM
F&A+..z3II~%%%ceu_ !Vaeff@IT\]] " A!
##qc)>$?@@As   B< <	C*C%%C*N)r(  r)  r*  
_VALID_URL_EMBED_REGEXr   _TESTSr  rH   r8   r6   r3   r3     s
   aJCJ<qQRL P1
'
5
 8
 >	

 
 d
 S
 
 0
   C
 -
 F
 :
 
 #
  #!
" C#
$ ! -
0  7: a1
'
5
 e
 A	

 
 d
 S
 
 :
 <
 l
 S
 x
 F
 :
  !
" ##
$  n/
< N
'
5
 E
 K	

 
 =
 0
 @
   B
 h
 \
 >?
 
 
 F
  :!
" ##
$  +
8 P
'
5
 _
 ?	

 
 ~
 0
   C
 h
 %
 
 
 F
 :
 #
  #!
" C#
$ !'
* ,16 Q
'
5
 8
 2	

 
 y
 0
 C
   B
 h
 %
 
 
 F
 :
  	{!
" ##
$  +
8 L
'
5
 .
 4	

 

 0
   C
 &
 r
 r
 
 
 :
 #
 #
  C!
" S#
$ #%
( ,/4 R
'
5
 8
 2	

 y
 (
 0
 D
   B
 h
 
|
 (
 
 :
 
  #!
" ##
$   :+
8 M1
'
5
 ;
 A	

 {
 
 0
 ?
   B
 h
 ./
 %
 :
 
 
  #!
" ##
$   *#-
0 ==9> M1
'
5
 f
 l	

 
 .
   C
 h
 |
 ~
 %
 :
 
 
 #
  #!
" C#
$ !0)
, I5: P1
'
5
   Z
   t	

 
 0
 B
   B
 h
 ,
 }
 )
 )
 
 :
  !
" ##
$  :-
	< NWOFb^r8   r3   c            	           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 ZddZd Z	d Z
y)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_retriesrd  )r  playlist_mincountr=  rm  paramsz+https://www.tiktok.com/@6820838815978423302   rX  rW  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                    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 j                  t        j                  t        j
                  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cursorr:   r   web_pcfocus_state	from_pageuserhistory_len2falsewindowsr-   r   10801920r   UTCverify_   rr   )is_fullscreenis_page_visibler   r   priority_regionrefererr   screen_heightscreen_widthr  typetz_nameverifyFpwebcast_language)rA   r}   r?   r~   string	hexdigits)r4   r  r  s      r6   _build_web_queryzTikTokUserIE._build_web_query  s+    
6 
D 
  
 	 

 I 
 f 
  
  
 | 
 f 
 T 
 f 
  
 x 
 6 
  ! 
" 3# 
$ %%!#"!"''&..9I9IQ*O"P!QR $? 
  	
r8   c              #   p  K   |xs |}t               }t        t        j                         dz        }t        j                  d      D ]i  }| j                         D ]  }| j                  | j                  |d| | j                  ||            }	t        t        |	dddt        hf            }
|
sV|
t        |      k(  sed}| j                  rt        | d	d
      | `t        | dd
      |_         t        	dd f      D ]\  }|d   }||v r|j!                  |       | j#                  ||      } | j$                  |t&        fi | j)                  |||d
       ^ |}t        |	dddd hf      }|r||k(  r|dz
  }|dk  st        |	d      s y |sU|rY| j+                  d       l y w)N     @@r   Downloading page rz   itemList.r   r  z&. Try again with a different device_idTr   z+. Taking measures to avoid an infinite loopc                     |d   S Nr   rH   rG  s     r6   r   z'TikTokUserIE._entries.<locals>.<lambda>=  
    !D' r8   r%  r  r  c                     t        | dz        S )Nr  r   r   s    r6   r   z'TikTokUserIE._entries.<locals>.<lambda>I  s    CCL r8   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  rQ  r   r>   r1   r   rA   erroraddra   
url_resultr3   r&  r  )r4   r  rR  
fail_earlyri   seen_idsr  pageretryresponsecurrent_batchr   r"  r`   r$  
old_cursors                   r6   _entrieszTikTokUserIE._entries%  s    )'
5TYY[3&'OOA& -	;D**, `..&&
6Gv4N//@ / B !'|Hz3PTWZV[>\'] ^ ]fX6F%FFG,,,&i'MNY]_ _ "0")#NOZ^#`EK`$ &h=Q0RS d ;x'X&"..z8D%dood11%h]a1bd dd  J!:r<:P9QRTFZ61#n4%\(DU-V
 ()):;W-	;s   B/F62F6CF6F6!F6c           	         | j                  d| |ddd      }|s| j                  d       y t        | j                  d|d|i       d	dd
| t        hf      }t        |dddt
        hf      D ]U  }| j                  ||      }| j                  ||d      \  }}| j                  |||d      j                  d      }|sS|c S  y )Nzhttps://www.tiktok.com/embed/@zDownloading user embed pageF)rx   rv   z?This user's account is either private or has embedding disabledz;<script[^>]+\bid=[\'"]__FRONTITY_CONNECT_STATE__[\'"][^>]*>r{   r  sourcez/embed/@	videoList.r   rC  Tr  r  )
_download_webpager   r   rf   rR   r>   ra   r)  r&  r   )	r4   rR  rh   r{   r   r$  r&  r^   r  s	            r6   _extract_sec_uid_from_embedz(TikTokUserIE._extract_sec_uid_from_embedY  s   ((,YK8))5 ) G  bcD--JVY . 4 v)5v>@
 %TKdSE+JK 	H**9h?K ==k8[`=aMJ11K 2 FFIc,FW 	 r8   c                 ~   | j                  |      d }}t        j                  d|      rd |}}d}n| j                  | j                  |z  |dddd      xs d}t        | j                  ||      dt        hf      xs i }t        |d	d
dt        ht        f      }|s&|j                  d      dk(  r| j                  d       n|dk(  rt        dd      t        |d	ddt        hf      }|rt        |d       }n| j                  |      }d}|st        dd      | j                  | j!                  |||      ||      S )NzMS4wLjABAAAA[\w-]{64}TzDownloading user webpagezUnable to download user webpageFr  r-   webapp.user-detailuserInfo)r  statsV2
videoCountr  r~  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   rm   rR   r   r  r   r  r   r>   r  playlist_resultr  )r4   r  rR  r  r  rh   detailvideo_counts           r6   r  zTikTokUserIE._real_extractp  s}   !^^C0$7	<<0)<!%ywIJ,,))I5y*,M - / 5 35  "(()<?SVZU[>\^ dac &v
<PR^ad`egj/klK6::l#;u#D))Z\!$%S^bcc"6J3%+PQG!-f6S!TT
::9E"
 KUY[ [
 ##DMM'9j$QSZ\effr8   Nr'  )r(  r)  r*  IE_NAMEr  r  r  r  r  r  r  rH   r8   r6   r  r    s    G_J7`!
 GG&+	 =`*
 GG&+	 . `
 GG&+	 i`
 GG&+7#FH DM!
F2;h.gr8   r  c                       e Zd Zd Zd Zy)TikTokBaseListIEc           
   #   r  K   | j                   |ddddddd| j                  i}t        j                  d      D ]  }| j	                         D ]&  }	 | j                  | j                  ||d	| d
      }( j                  dg       D ]5  }i | j                  |      t         j#                         dd|d    d 7 |j                  d      s y |d   |d<    y # t        $ rO}t        |j                  t        j                        r%|j                  j                  dk(  r||_        Y d }~ d }~ww xY ww)Nr  r   r      r  r  r:   r   zDownloading video list page zUnable to download video list)rz   rw   rx   
aweme_listTikTokzhttps://tiktok.com/@_/video/r   )extractor_key	extractorr$  has_more)_QUERY_NAMErA   r   r   r  r   _API_ENDPOINTr   r   r   r   r   r   r  r   r   r3   r0   )	r4   list_idri   rz   r  r  	post_listr   r"  s	            r6   r  zTikTokBaseListIE._entries  sQ    gaRA
 OOA& 	2D**, 
	 $**Je;D6B ? !/ !AI
 #|R8 11%8%-__%6!)%A%
BSAT#U	  ==,'1E(O+	2 & !!''4+?+?@QWW[[TUEU&' 	s8   AD7#C2A*D7	D4%AD/)D7.D//D44D7c                 h    | j                  |      }| j                  | j                  ||      |      S rG   )r  r  r  )r4   r  r  s      r6   r  zTikTokBaseListIE._real_extract  s.    ..%##DMM'7$CWMMr8   N)r(  r)  r*  r  r  rH   r8   r6   r  r    s    2@Nr8   r  c                   H    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y)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  r=  rm  zBhttps://www.tiktok.com/music/jiefei-soap-remix-7036843036118469381i  7036843036118469381N	r(  r)  r*  r  r  _WORKINGr  r  r  rH   r8   r6   r  r    s_    GVJHK!MV '
 )\ T!'
 )\Fr8   r  c                   >    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y)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-479565Tr{  Nr  rH   r8   r6   r  r    sL    GXJHK#MH )
 )\ BFr8   r  c                   F    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 Z	y)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=v1Tr{  c                     | j                  |      }| j                  ||ddi      }| j                  d|d      }| j                  | j	                  ||      ||      S )Nrt   zIfacebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)ry   z"snssdk\d*://challenge/detail/(\d+)ztag ID)r  r  _html_search_regexr  r  )r4   r  ri   rh   tag_ids        r6   r  zTikTokTagIE._real_extract  sl    ^^C(
((jeC
(  (()NPWYab##DMM&*$EvzZZr8   N)
r(  r)  r*  r  r  r  r  r  r  r  rH   r8   r6   r   r     sS    GGJHK%M1 
 )\ OF[r8   r   c                   R    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 Zd Z	d Z
y)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  r=  playlist_countzOhttps://www.tiktok.com/@imanoreotwe/collection/%F0%9F%98%82-71118871895711608757111887189571160875zimanoreotwe-%F0%9F%98%82r  )r  r=  r  z0https://www.tiktok.com/api/collection/item_list/rQ  c                 &    d|| j                   |ddS )Nr  113)r+   collectionIdr   r  
sourceType)_PAGE_COUNT)r4   collection_idr  s      r6   r  z#TikTokCollectionIE._build_web_query  s!    )%%
 	
r8   c              #     K   d}t        j                  d      D ]  }| j                  | j                  |d| | j	                  ||            }t        |dd f      D ]c  }|d   }t        |dd	t        ht        f      xs d
}| j                  ||      } | j                  |t        fi | j                  |||d       e t        |d      s y || j                  z  } y w)Nr   r   r  r  r  c                     |d   S r  rH   rG  s     r6   r   z-TikTokCollectionIE._entries.<locals>.<lambda>'  r  r8   r   r  )r  r  r   r^   Tr  hasMore)r   r   r   r  r  r   r>   r  ra   r  r3   r&  r  )	r4   r  r  r  r  r"  r`   r  r$  s	            r6   r  zTikTokCollectionIE._entries   s    OOA& 	'D**""M5Ftf3M++M6B + DH &h=Q0RS d ;%eh8TWZV[]`-abifi"..vx@%dood11%h]a1bd d	d  )4d&&&F	's   C"C$c                     | j                  |      j                  ddd      \  }}}| j                  | j                  |      |dj	                  ||f            S )Nr   r  r_   -)r  r^  r  r  r}   )r4   r  r  r  rR  s        r6   r  z TikTokCollectionIE._real_extract3  s]    *.*?*?*D*J*J4QXZc*d'ui##MM-(-9eBT9UW 	Wr8   N)r(  r)  r*  r  r  r  r  r  r  r  r  rH   r8   r6   r
  r
     sf    !GyJ _'-
  a'/
 !F" GMK
'&Wr8   r
  c                   @   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dJ ZyK)LDouyinIEz3https?://(?:www\.)?douyin\.com/video/(?P<id>[0-9]+)z0https://www.douyin.com/video/6961737553342991651 9ecce7bc5b302601018ecb2871c63a75r   6961737553342991651r=  rz  r  u-   #杨超越  小小水手带你去远航❤️r  r  
6897520xkar  110403406559r  zShttps://www.douyin.com/user/MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98r  7MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98r   u	   杨超越r     r  io`r6  20210513r  u   @杨超越创作的原声r  r  r  r  zre:https?://.+\.jpe?grt  rF  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  r6  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           
      
   | j                  |      }t        | j                  d|ddd|id      dt        hf      }|s6t	        d| j                  | j                        j                  d	       
      | j                  |      S )Nz1https://www.douyin.com/aweme/v1/web/aweme/detail/zDownloading web detail JSONz"Failed to download web detail JSONr   F)rz   rv   r   z4Fresh cookies (not necessarily logged in) are needed
s_v_web_idr   )	r  r   r   rR   r   r   r   r   r   )r4   r  r`   r  s       r6   r  zDouyinIE._real_extract  s    >>#&d11?)+Ox( 2 7 :H$8PR  F!..t/A/ABFF|TTV V **622r8   N)	r(  r)  r*  r  r   r  r  r   r  rH   r8   r6   r  r  :  s,   GJA1
'
5
 D
 J	

 
 >
 q
 S
 {
 
 
 :
 0
 }
 #
  #!
" C#
$ !1)
4 B1
'
5
 O
 U	

 
 ,
 q
 S
 +
 
 
 :
 9
 ,-
 #
  #!
" C#
$ !1)
4 B1
'
5
 >
 D	

 
 >
 q
 S
 {
 
 
 :
 0
 }
 #
  #!
" C#
$ !1)
4 B1'>#%#) 
 &#& B1
'
5
 O
 U	

 
 >
 q
 S
 {
 
 
 :
 0
 }
 #
  #!
" C#
$ !1)
{vFn <-M3r8   r  c                      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d4 Zy5)6
TikTokVMIEzFhttps?://(?:(?:vm|vt)\.tiktok\.com|(?:www\.)tiktok\.com/t)/(?P<id>\w+)z	vm.tiktokz"https://www.tiktok.com/t/ZTRC5xgJpr   7170520270497680683r=  rz  r  z$md5:c64f6152330c2efe98093ccc8597871cr  6687535061741700102r6  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  r4  rL  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/ZSe4FqkKdTr{  c                     | j                  t        |      | j                  |      ddi      j                  }| j	                  |      rt        |      | j                  |      S )Nrt   zfacebookexternalhit/1.1r  )_request_webpager   r  r  suitabler   r  )r4   r  new_urls      r6   r  zTikTokVMIE._real_extract  sb    ''dnnS1LJc;d ( ffifi 	==!"7++w''r8   N)r(  r)  r*  r  r  r   r  r  rH   r8   r6   r7  r7    s   ZJG 4
'
5
 ;
 0	

 :
 #
 #
 S
   C
 9
 1
 
 
 C
 h
  (!
" A#
$ ("'
0 2
'
5
 ;
 0	

 :
 #
 #
 S
 #
 1
   C
 
 
 C
 k
  %!
" A#
$ %"'
0 1]1Ff(r8   r7  c                   v    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Zd Z	y) 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7210809319192726273rz  u(   re:ウェザーニュースLiVE[\d\s:-]*u   ウェザーニュースLiVEweathernewslive6621496731283095554z'https://www.tiktok.com/@weathernewsliveis_live)	r   r=  r  r4  r  r  r  live_statusconcurrent_view_countskip_downloadm3u8)r  r=  r  z)https://www.tiktok.com/@pilarmagenta/live7209423610325322522Pilarmagentapilarmagenta6624846890674683909z$https://www.tiktok.com/@pilarmagenta
LivestreamrS  z@https://m.tiktok.com/share/live/7209423610325322522/?language=enTr{  z&https://www.tiktok.com/@iris04201/liveNc                     t        | j                  ||ddd||i      |t        hfi       }t        |j	                  d            dk(  r|S |st        dd	
      t        |      )NFr+   r  )rv   rz   r  r'  r   zThis livestream has endedTr   r   )r   r   rR   r   r   r   r	   )r4   r  paramroom_idr  rX   r  s          r6   r   zTikTokLiveIE._call_api0  sz     3 3vw. !4 ! tfr	+ x||H-.!3O !<tLL8,,r8   c                      j                  |      j                  dd      \  }}|sO j                  t        |d  j                        |d      }t         j                  ||      ddddt        hf      }|r|si j                  ||xs || 	      } j                  ||xs |      }|xs t        |d
dt        ht        f      }|xs t        |d
dt        ht        f      }|st        |      g } j                  dd||d      t        d      } fdt        ddddhdt        hfi       j                         D ]  \  }}	t        |	ddhdt        hfdt        d      hfdd hfd f      }
t        |	dd!t         hf      }|r!|j#                  |d!d"|  ||      d#|
       t        |	dd$t         hf      }|s|j#                  |d%d&d'|  ||      d(|
        fd)}d*D ]T  }	t        d|	 d+t         hf      }|s|j#                  ||	d$k(  rd%nd!|	d$k(  rd&nd,|	 d- ||	 d.       |d/      d0       V t        dd1t        hfi       j                         D ]F  \  }}t!        |      s|j#                  |d!d"| j%                          |d2|       ||      d3       H t        |d4       s[t'         j                  d5d6||d7            t!        j)                  d8            r!|j#                  d8   d%d&d9d: |d;      d0       |xs t        d<d=      }||t        |d  j                        xs d d|d>d?t        d@dAdt*        hfdBdCt        hfdDdEF      S )GNr  r   T)r  r  r  r  roomIdrC  ))LiveRoomliveRoomUserInfor  )
UserModuleusers.r  r   z,https://webcast.tiktok.com/webcast/room/inforY  r{   rK  )
SD1ldSD2sdHD1hdFULL_HD1uhdORIGIONoriginc                 (    j                  | d       S rG   )_parse_json)r   r4   s    r6   r   z,TikTokLiveIE._real_extract.<locals>.<lambda>Z  s     0 0D 9 r8   
stream_urllive_core_sdk_data	pull_datastream_datar  main
sdk_paramsVCodecvbitrater   ra  r   c                 f    t        j                  d|       j                         j                         S )Nz(?i)\d+x\d+|\d+p)r  matchr^  lowerr   s    r6   r   z,TikTokLiveIE._real_extract.<locals>.<lambda>c  s%    ATVW8X8^8^8`8f8f8h r8   )rd  re  r   flvzflv-)r  r=  rc  rf  hlsrz  m3u8_nativezhls-)r  r=  protocolrc  rf  c                  <    t        dg| hdt        h      S )Nrl  rr  )r   r>   )keys	live_infoparse_inners    r6   
get_vcodecz.TikTokLiveIE._real_extract.<locals>.get_vcodec{  sE    	,E#,E&1],E4<,E?Be,E F Fr8   )rx  rtmp	_pull_urlhttpsz-pull_pull_url_paramsrh  )r  r=  rz  rc  rd  rf  flv_pull_urlflv_pull_url_params)r  r=  rc  rd  rf  c                     |d   dk(  S )Nr=  rz  rH   rG  s     r6   r   z,TikTokLiveIE._real_extract.<locals>.<lambda>  s    !E(e2C r8   z'https://www.tiktok.com/api/live/detail/roomIDLiveRoomInfoliveUrlzhls-fallbackr  ri  )	ownerInfor  )ownerri   )rf  r=  )r   r  r  rM  r  r  r  r  r  )r  r  )
user_count)liveRoomStats	userCount)r  r  r4  rO  Fr  )r  r^  r  r   r  r   rm   r>   rj   r  r	   r   r   rR   rQ   r   r   rO  rv  r   r   r   )r4   r  r  rY  rh   r{   r  get_qualityrf  streamrq  flv_urlhls_urlr  rl  f_idf_urlr}  r~  s   `                @@r6   r  zTikTokLiveIE._real_extract?  sq    11#6<<ZN',,XtT-F-FG_c - eG"(((;%z68cUKMG w,,S(2EgQX[,YG''1DWED Fd 6./7#5E "FG   H< 8./9C5#7G $HH x00NN:IwPX^d # f	   op9+I2Kvv8/8: <<AEG	OGV &fv|k]#cU+"[t%<$=>+.h-ijU / J #6FEK=+IJG" #'y!1*73	 
 !   #6FEK=+IJG"  -#'y!1*73  !  -	>	F & 
	F%i,6()@TWbVc1deJ%$*eO5175g$*85!1(F83C)DE*95  
	 (	L.SWRX3Yceflln 		KD%u%NN#D6]002$%:DA&t, 		 G%CD#It~~98Wh\j 0> 0l mI9==34$Y/  -!/$*84   j|I7PRij  (49R9RS[W[#5
 9  6{mL?*X[fZg)h	'
 
 	
r8   rG   )
r(  r)  r*  r  r  r   r>   r  r   r  rH   r8   r6   rI  rI    s    	J G >'@5)0E$%(

 #F+ ;'%&0B$%(

  R 8?"FH-t
r8   rI  )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   r3   r  r  r  r  r   r
  r  r7  rI  rH   r8   r6   <module>r     s          	     ! $     , B AA

= A

Hj^| j^Z	vg< vgr#N| #NL$ 0% ([" [87W 7WtI3| I3X<( <(~n
< n
r8   