
    i,                       S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r
S SKrSSKJr  SSKJr  SSKJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJ r J!r!J"r"J#r#J$r$  SSK%J&r&J'r'J(r(   " S S	\5      r) " S
 S\)5      r* " S S\)5      r+ " S S\)5      r, " S S\,5      r- " S S\,5      r. " S S\,5      r/ " S S\)5      r0 " S S\)5      r1 " S S\5      r2 " S S\)5      r3g)    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                   H   \ rS rSrSrSrSrSSSSS	S
.rSrSr	Sr
\R                  S 5       r\R                  S 5       r\R                  S 5       r\R                  S 5       rS r\S 5       rS rS r  SS jrS r  SS jrS rS rS S jrS rS rS rS rS!S jr Sr!g)"TikTokBaseIE(   z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                 X    U R                   (       a  S/O/ nU R                  SU[        S9$ )N app_infoie_key)_KNOWN_DEVICE_ID_configuration_argTikTokIE)selfdefaults     D/app/mltbenv/lib/python3.13/site-packages/yt_dlp/extractor/tiktok.py_KNOWN_APP_INFOTikTokBaseIE._KNOWN_APP_INFO;   s-     //2$R&&z78&LL    c                 4    U R                  SS /[        S9S   $ )N	device_idr0   r   r3   r4   r5   s    r7   r2   TikTokBaseIE._KNOWN_DEVICE_IDA   s!    &&{TF8&LQOOr:   c                 h    U R                   =(       d     [        [        R                  " SS5      5      $ )Nl     *{Y2$ l   B2n?- )r2   strrandomrandintr>   s    r7   
_DEVICE_IDTikTokBaseIE._DEVICE_IDE   s%    $$eFNN;NPc,d(eer:   c                 4    U R                  SS/[        S9S   $ )Napi_hostnamez#api16-normal-c-useast1a.tiktokv.comr0   r   r=   r>   s    r7   _API_HOSTNAMETikTokBaseIE._API_HOSTNAMEI   s0    &&BCH ' VVWY 	Yr:   c                 X   U R                   c  U R                  R                  5        VVs0 s H%  u  pUS:w  d  M  XR                  X/[        S9S   _M'     nnnU R
                   Vs/ s H;  n0 UE[        S [        U R                  UR                  S5      SS9 5       5      EPM=     snU l         U R                   (       d  gU R                   R                  S5      U l
        U R                  S   nU R                  S	   nUS
:X  a  SU 3nOSU SU 3nU S3U l        gs  snnf s  snf )Nr(   r0   r   c              3   >   #    U  H  u  pU(       d  M  X4v   M     g 7fN ).0kvs      r7   	<genexpr>2TikTokBaseIE._get_next_app_info.<locals>.<genexpr>V   s      $'ftqjkFQF'fs   
/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itemsr3   r4   r8   dictzipsplitpop	_APP_INFO_APP_USER_AGENT)r5   keyr6   defaultsr/   r)   versionpackages           r7   _get_next_app_infoTikTokBaseIE._get_next_app_infoN   sO   & %)$;$;$A$A$C$CLC%< Q,,S)H,MaPP$C   $(#7#7# $8x8 t $'*4+B+BHNNSVDW`e'f$   #7#D "",,003>>*-..!78|#1';G+H:Qwi@G")*|}1
#s   D!D!(AD'c                 $    SU =(       d    S SU 3$ )Nzhttps://www.tiktok.com/@_z/video/rM   )user_idvideo_ids     r7   _create_urlTikTokBaseIE._create_urlj   s    )'.S)9
KKr:   c           	      *    U R                  SUSUS0 S9$ )Nz;<script[^>]+\bid="(?:SIGI_STATE|sigi-persisted-data)"[^>]*>z
sigi state	</script>end_patternr6   )_search_jsonr5   webpage
display_ids      r7   _get_sigi_stateTikTokBaseIE._get_sigi_staten   s*      JG*, ! L 	Lr:   c                 ^    [        U R                  SUSUS0 S9S[        145      =(       d    0 $ )Nz;<script[^>]+\bid="__UNIVERSAL_DATA_FOR_REHYDRATION__"[^>]*>zuniversal datark   rl   __DEFAULT_SCOPE__)r   rn   rX   ro   s      r7   _get_universal_data TikTokBaseIE._get_universal_datas   sF    D--JGjlB . P !4&)+ 1 /1	1r:   c	                    U R                  U R                  SSR                  [        R                  " SSS95      5        U R                  U R                  5      n	U	R                  S5      (       a*  U R                  U R                  SU	S   R                  5        U R                  SU R                   SU S	3UXgUU R                  S
S.U=(       d    0 EX4S9$ )Nodin_ttr.   0123456789abcdef   rO   sid_ttzhttps://z
/aweme/v1/rS   zapplication/json)
User-AgentAccept)rg   fatalnoteerrnoteheadersquerydata)_set_cookierH   joinrB   choices_get_cookies_WEBPAGE_HOSTgetvalue_download_jsonr]   )
r5   eprg   r   r   r   r   r   r   webpage_cookiess
             r7   _call_api_implTikTokBaseIE._call_api_imply   s    ++YOaeh@i8jk++D,>,>?x((T//?8;T;Z;Z[""t))**RD:XG"22,> =b>  # ' 	'r:   c                    [        0 UE0 SS_SS_SS_S[        [        R                  " 5       S-  5      _S[        [        R
                  " 5       5      _S	S
_SU R                  S   _SU R                  S   _SSR                  S U R                  S   R                  S5       5       5      _SU R                  S   _SU R                  S   _SU R                  S   _SU R                  S   _SS_SS_SS_SS_E0 SS _S!S"_S#S$_S%S&_S'S(_S)S*_S+S,_S-S*_S.[        [        R                  " 5       5      [        R                  " S/S05      -
  _S1S2_S3S*_S4S _S5S6_S7S8_S9S _S:S;_S<S=_ES*S*U R                  S   S*[        [        R                  " 5       5      U R                  R                  S>5      U R                  SR                  [        R                  " S?S@SA95      SB.E5      $ )CNdevice_platformandroidosssmixa_rticket  cdidchannel
googleplayr,   r)   version_coder.   c              3   <   #    U  H  n[        U5      S  v   M     g7f)02dNint)rN   rP   s     r7   rQ   0TikTokBaseIE._build_api_query.<locals>.<genexpr>   s     #f=es1vclO=es   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(   rz      r|   )carrier_region	op_regionbuild_numberregiontsr(   r<   openudid)r   r   timerA   uuiduuid4r\   r   rZ   rB   rC   r   rD   r   )r5   r   s     r7   _build_api_query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,
 , ,	r:   c	                 N   U R                   (       d:  U R                  5       (       d%  Sn	U(       a
  [        U	SS9eU R                  U	5        g [	        U R
                  5      S-   n
[        R                  " S5       HU  nU R                  [        U R                   5      5        U R                  U=(       d    0 5      n U R                  XXUXgUS9s  $    g ! [         a  n[        UR                  [        R                  5      (       a  UR                  R                   S:X  a}  [        UR                  =(       d    UR"                  5      n	U R                  5       (       d  U(       a  e U R                  U	5         S nA  g U R                  U	 SU SU
 S	35         S nAGM$  e S nAff = f)
Nz No working app info is availableTexpectedr   )r   r   r   r   r   r   r   z. Retrying... (attempt z of ))r\   rb   r   report_warninglenrU   	itertoolscountwrite_debugrA   r   r   
isinstancecausejsonJSONDecodeErrorposmsg)r5   r   rg   r   r   r   r   r   r   message	max_triesr   
real_queryes                 r7   	_call_apiTikTokBaseIE._call_api   s[   ~~d&=&=&?&?8G$Wt<<##G,++,q0	__Q'ES01..u{;J**
wG + = =	 ( " aggt';';<<PQAQ!!''"2QUU3G2244 ! //8"''7)3J5'QUV_U``a(bcs%   <C
F$BF=FFF$c                     [        U R                  SU[        SU S3SS.5      SS0S9S	S
[        145      nU(       d
  [	        SUS9eU R                  U5      $ )Nzmulti/aweme/detail[]r'   )	aweme_idsrequest_sourcezX-Argusr.   )r   r   aweme_detailsr   z#Unable to extract aweme detail inforg   )r   r   r   rX   r   _parse_aweme_video_app)r5   aweme_idaweme_details      r7   _extract_aweme_appTikTokBaseIE._extract_aweme_app   s|    #NN/@R 
!_"%T A #B  ) ,;Av*F	H
  !FQYZZ**<88r:   c                 $   [        U[        SSS91[        1S[        S 1[        R
                  1[        R                  145      nU(       d  SU;   a  [        S5      e[        S5      eU R                  S	5        [        US
S[        1[        R
                  1[        S5      145      n[        US
S[        1[        R
                  1[        R                  1[        S5      145      n[        S5       Hz  n[        U5      R                  5       nUR!                  5       nUR#                  U5        UR%                  5       U:X  d  MS  [        R&                  " U5      R)                  5       US'     O   [        S5      e[        R&                  " [        R*                  " USS9R                  5       5      R)                  5       n[        U[        SSS91[        1S[        S5      145      n	[        U[        SSS91[        1S45      n
[        U[        SSS91[        1S45      n[-        [.        R.                  " 5       5      U R1                  S5      =(       d    S-   S-   nU R3                  SXUS9  U
(       a  U(       a  U R3                  SXUS9  X4$ )NcsT)idhtmlclassc                     U  S3$ )Nz===rM   xs    r7   <lambda>?TikTokBaseIE._solve_challenge_and_set_cookies.<locals>.<lambda>   s
    !Cyr:   zPlease wait...z Unable to extract challenge dataz(Unexpected response from webpage requestz7Solving JS challenge using native Python implementationrP   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_screenrA   r   hashlibsha256rangeencodecopyupdatedigest	b64encodedecodedumpsr   r   	get_paramr   )r5   rp   challenge_dataexpected_digest	base_hashinumber	test_hashwci_cookie_valuewci_cookie_namerci_cookie_namerci_cookie_valuer  s                r7    _solve_challenge_and_set_cookies-TikTokBaseIE._solve_challenge_and_set_cookies   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V]]_F!(IV$!_4&,&6&6v&>&E&E&Gs# " !!?@@!++JJ~*=DDFHHN 	 'wU./2D1Eg56719 :
 'wU./2D1Ew1P Q'T-.1C0Dg2O P $))+&$..9R*S*XWXY\__Wbc/]O[fg//r:   c                 N  ^ ^^^ 0 SpTSUU UU4S jjnU" 5       nUSL a  XE4$ T R                  UT5      nU(       d`   T R                  U5      n	U" SS9n[        S U	5       H  nT R                  R                  SSUS	9  M      USL a  XE4$ T R                  UT5      nU(       d'  S
nT(       a  [        U5      eT R                  UTS9  XE4$ [        USS[        145      =(       d    Sn[        USSS[        145      n[        US[        145      (       dU  [        US[        145      (       a=  SnT(       a  T R                  U5        T R                  U ST R                  5        3TS9  XE4$ ! [         a/  n
T(       a  e T R                  U
R                  TS9  XE4s S n
A
$ S n
A
ff = f)Nc                 ,  > TR                  TTU TSS9nUSL a  gUu  p#[        R                  R                  UR                  5      R
                  S:X  a>  SnT(       a  TR                  U5        TR                  U STR                  5        3TS9  gU$ )NTr   impersonateFz/loginz4TikTok is requiring login for access to this content. r   )	_download_webpage_handleurllibparseurlparseurlpathraise_login_requiredr   _login_hint)	r   resrp   urlhr   r   r5   r/  rg   s	        r7   get_webpage>TikTokBaseIE._extract_web_data_and_status.<locals>.get_webpage  s    //Xt5^b/cCe|MG||$$TXX.33x?P--g6##wir$2B2B2D1E$FQY#ZNr:   Fr   z)Downloading webpage with challenge cookie)r   r  rS   )domainr0  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*  )zDownloading webpage)rv   r#  r   r   orig_msgr	  	cookiejarclearr   r   rX   boolr1  r2  )r5   r/  rg   r   
video_datastatusr5  rp   universal_datacookie_namesr   cookie_namer   s   ````         r7   _extract_web_data_and_status)TikTokBaseIE._extract_web_data_and_status  s   F	 	 -e%%11'8D*#DDWM "'RSG%dL9$$M+$V  :%!))!55gxHNHG$W--(;%%n/DlUXTY.Z[`_`!.3H*Vbeidj2kl
J4&(9::|JYnqupvXw?x?x^G))'27)2d.>.>.@-A BXV!!= " *##AJJ#B!))	*s   E+ +
F$5$FF$F$c                 ^  ^ SSSS.n[        [        UR                  5       5      5      m0 n[        US[        S9nU H  n[        US[
        SS	9nU(       d  M  U R                  XS
SSS9n	U	(       d  M7  UR                  UR                  SS5      / 5      R                  SSR                  S [        U	S   5       5       5      S.5        M     U(       d  [        US[        S9 Hx  nUR                  S5      (       d  M  UR                  UR                  S5      =(       d    S/ 5      R                  US   UR                  UR                  S5      5      S.5        Mz     U(       d  U(       a"  U R                  U R                  X25      USS9u  p[        USSS 45       H`  nUR                  UR                  S5      =(       d    S/ 5      R                  US   UR                  UR                  S5      5      S.5        Mb     UR                  5        H  u  p[        UU4S jS9X['   M     U$ ) Nr   srtvtt)creator_captionrJ  webvtt)interaction_stickers.auto_video_caption_infoauto_captions.expected_type)r/  url_list.F)rR  get_allzDownloading captionszUnable to download captions)r   r   r   r   r   z

c           	   3      #    U  HP  u  pUR                  S 5      (       d  M  US-    S[        US   S-  5       S[        US   S-  5       SUS     3v   MR     g7f)textr   

start_timer   z --> end_timeN)r   r   )rN   r  lines      r7   rQ   .TikTokBaseIE._get_subtitles.<locals>.<genexpr>f  s      $^#HDHHU[L\ Zq1ugR 6tL7ID7P QRRWXnost~o  CG  pG  YH  XI  IK  LP  QW  LX  KY  Z#Hs
   A8A
utterances)extr   )r<  cla_infocaption_infos.r/  langFormatr/  r]  r   r<  subtitleInfosc                     US   $ )NUrlrM   re   rP   s     r7   r   -TikTokBaseIE._get_subtitles.<locals>.<lambda>x  s    ^_`e^fr:   LanguageCodeNamerf  c                    > T" U S   5      $ )Nr]  rM   )r   
preferences    r7   r   rh    s    j5>Rr:   r^   )r   tuplevaluesr   rX   r   r   
setdefaultr   appendr   	enumeraterG  rh   rW   sorted)r5   r   r   	user_nameEXT_MAP	subtitlescaptions_infocaptioncaption_urlcaption_jsonre   r`  	subs_listrk  s                @r7   _get_subtitlesTikTokBaseIE._get_subtitlesM  s%     &

 uW^^%567
	 %hx|~$G&w0HXcmrsK..,BLiqv / xL  Z!>CJJ $^#,\,-G#H$^ ^L  % '6aquv{{5))$$W[[%8%@D"ELL"5>";;w{{8'<=N  w "&"C"C$$Y985 #D #R'wQf6gh$$W[[1C%D%LbQXX"5>";;w{{8'<=Z  i  )0OD$Y4RSIO  1 r:   c                     U R                  SUSSSS9u  p#pEU(       d  0 S 4$ UUS:X  a  SOU[        USS	9=(       d    S [        U R                  5      " U5      S
.U4$ )Nz>v[^_]+_(?P<id>(?P<codec>[^_]+)_(?P<res>\d+p)_(?P<bitrate>\d+))zurl key)NNNN)r   codecr3  bitrate)r6   groupbytevc1h265r   scale)	format_idvcodectbrquality)_search_regexr   r   	QUALITIES)r5   url_keyr  r~  r3  r  s         r7   _parse_url_keyTikTokBaseIE._parse_url_key  s|    )-););Mw7?` *< *b&	# t8O" % 2fwd3;t 05	

  	r:   c                 
  ^ ^^^^^^ US   nUS   n0 mS m0 4UUU 4S jjn/ n[        UR                  S5      5      m[        UR                  S5      5      m[        UU4S j5      =(       d    SmUR                  S	5      (       a5  UR                  U" US	   S	S
[	        USS5      (       a  SOSTTS.5      5        UR                  S5      (       a  US   n[        UR                  S5      5      mUR                  U" USSUR                  S5      (       a  SOS-  ST[        UU4S j5      UR                  S5      (       a  SOSS.5      5        UR                  S5      (       a  UR                  U" US   SS
SS.5      5        UR                  S5      (       a  UR                  U" US   SS
SS.5      5        UR                  S/ 5       Hy  nUR                  S	5      (       d  M  UR                  U" US	   UR                  S5      S[        US 5      [	        USS5      (       a  SOSUR                  S 5      S!.5      5        M{     T R                  U5        T R                  T R                  5      R                  S"5      nU(       aP  U HJ  n	T R                  [        R                  R                  U	S#   5      R                  S"UR                  5        ML     UR                  S$5      =(       d    0 n
UR                  S%5      =(       d    0 n[	        US&[        S'9n[	        US(S)[        S'9n[	        US*S+S,[        S'9nUR                  S-5      =(       a2    UR                  S.5      S/R!                  UR                  S05      5      :H  nU(       a  U=(       d    S1UnnO$UR                  S.5      [	        US,[        145      nn[	        US,S2[        14S3["        14S4[        14S5[        14S6.45      nS7U0[	        US8[%        S9S:914S8[        14S;[         14S<.5      E[	        U
S=S>S?S@SASB.[         S'9EUE['        USCT R(                  S SD9['        USESF/T R(                  S SD9U[#        UR                  SG5      5      =(       d    S U(       a  [*        R,                  " SHU5      OS UT R/                  X[	        USESFSC5      5      SI VVs/ s H(  n[	        UUSJSK45        H  nUUUSL;   a  SOSSM.PM     M*     snn[	        USNSO[        SPSQ91[0        45      =(       d    [	        USO[         145      T R3                  SRU;   SSU;   STU;   SU9SVSW.E$ s  snnf )XNr   r<  c                 T    [        U SS9nUS:X  d  SU ;   a  SUUS:X  a  SOUSS S S.$ 0 $ )	Nm4a)default_extmp3z-music-zMusic trackaacnone)format_noter]  acodecr  widthheight)r
   rb  s     r7   
audio_meta7TikTokBaseIE._parse_aweme_video_app.<locals>.audio_meta  sN    7C c!1  -#&%<%S  : 8::r:   c                    > TR                  U R                  SS5      5      u  p#UR                  S5      S:H  nU(       a  TR                  U0 5      R                  S[        U R                  S5      5      5        TU   R                  S[        U R                  S5      5      5        UR	                  TR                  U0 5      5        UR                  S[        US S 5      5        U R                  S5      =(       d    /  Vs/ s Ho  nU[        U R                  S	5      5      S
SSU;   a  SOSS.UEUEU(       a  SOS[        UR                  S5      SU;   a  SOS U(       a  SOS SS9S.ET" U5      EPMq     sn$ s  snf )Nr  r.   r  bytevc2r  r  r&  rS  	data_sizemp4r  zaweme/v1)r/  filesizer]  r  source_preferencer  z(API)z(UNPLAYABLE) )delim)rk  r  )r  r   ro  r   r  r   )	addradd_metaparsed_metar3  
is_bytevc2r/  r  known_resolutionsr5   s	         r7   extract_addr9TikTokBaseIE._parse_aweme_video_app.<locals>.extract_addr  s   #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35 4# '(=>+5+<R"  * '1db,LL/J#<MSW&0Nd# G S/ 45 5 5s   A6E;r  r  c                     > TT -  $ rL   rM   )r  r  s   r7   r   5TikTokBaseIE._parse_aweme_video_app.<locals>.<lambda>  s	    r:         ?	play_addrzDirect video
is_bytevc1is_h265r  h264)r  r  r  r  r  download_addrzDownload video%shas_watermarkz, watermarkedr.   c                      > [        T T-  5      $ rL   r   )dl_widthratios   r7   r   r    s    3x%/?+@r:   r  r&  )r  r  r  r  r  rk  play_addr_h264)r  r  r  play_addr_bytevc1bit_rate	gear_namezPlayback videoc                     U S   S-  $ )Nr  r   rM   r   s    r7   r   r    s    a
md6Jr:   FPS)r  r  r  r  fpsr}   r/  
statisticsmusic)hybrid_label.rV  rQ  )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  r6   r  r  album
(?:, | & ))coverai_dynamic_coveranimated_coverai_dynamic_cover_bakorigin_coverdynamic_coverrS  .)r  r  r   r/  rk  )Nr  durationr   r  PrivatezFriends onlyzFollowers only)
is_privateneeds_subscriptionis_unlisted)r  r~  sizebr)channel_urluploader_urltrackr  artistsformatsru  
thumbnailsr  availability_format_sort_fields)r   r   r   extendr   r   _remove_duplicate_formatsr   r   r   r,  r-  r.  hostnamer   rA   formatr   r   r   _UPLOADER_URL_FORMATrerZ   extract_subtitlesany_availability)r5   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_urlr  r  r  r  r  r  s   `                    @@@@@@r7   r   #TikTokBaseIE._parse_aweme_video_app  s   
+!'*
		: )+ 	5 	50 JNN734Z^^H56/0:F>>+&&NN<
;(?(-$0i%9 %9&>D B   >>/**&7M"=#4#4W#=>HNN<,1
WfHgHg_mop !"#@A$.NN?$C$Cb8   >>*++NN<
3C(D-- G  
 >>-..NN<
3F(G0- J   "~~j"5G{{;''|GK,@!([!9#3"7,JK(4y): ):f?E";;u-C    6 	&&w/''(:(:;??I  !6!6qx!@!I!I8U`UfUfg  "%%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//[*m]i(jl!M
!MH ".j8ZQT:U!VI #$(04M(M"SU "W
!M
 &j'k6M5NPS3U V I
Z+,GH ..$.#1V#;,6 / 8 $FU+
 +	
0
s   /U
c                 z  ^^ SSSS.n[        US[        145      =(       d    0 n[        UR                  S5      5      m[        UR                  S5      5      m[	        UU4S j5      =(       d    S	n/ n[        US
S 45       GH<  nU R                  [        USS[        145      =(       d    S5      u  pxUR                  S5      S:H  n	UR                  U	(       a  SOS U	(       a  SOS[        USS[        145      S.5        U=(       a    [        US S 5      =n
(       a[  U
S:X  a  Sn
US:  a'  [        X-  5      nUR                  U
XS-  -
  S.5        O&[        X-  5      nUR                  XS-  -   U
S.5        [        USSS[        145       H+  nUR                  0 UEUESU R                  U5      0E5        M-     GM?     [        UU4S jS[        45      n[        US S![        145       H-  nUR                  0 UES"U R                  U5      TTUS#.E5        M/     [        US$[        145       H,  nUR                  0 UES%U R                  U5      S&S'S(.E5        M.     U R                  U5        U(       dx  [        US)S*[        145      (       a_  US)   S*   n[        [        U5      S+SS, 1[        145      =(       d    S-nUR                  S.U R                  U5      UUS-:X  a  SOUS/S0.5        U Vs/ s H7  n[         R"                  R%                  US   5      R&                  S1:w  d  M5  UPM9     sn$ s  snf )2Nr  r  r  )r]  r  r  r<  r  r  c                     > TT -  $ rL   rM   )play_height
play_widths   r7   r   3TikTokBaseIE._extract_web_formats.<locals>.<lambda>;  s
    k!9r:   r  bitrateInfoc                     US   S   $ )NPlayAddrUrlListrM   rg  s     r7   r   r  >  s    RST^R_`iRjr:   r  UrlKeyr.   r  r  
UNPLAYABLEr  r&  DataSize)r  rk  r  i  @  r   r   )r  r  r  .r/  c                    > US   T:H  $ )Nr  rM   )re   rP   r  s     r7   r   r  a  s    1W:;Sr:   r  playAddr)).srcNplay)r  r/  r  r  r  )downloadAddr)downloadr/  r$  watermarkedr  )r  r/  r  rk  r  playUrl	mime_typec                 &    U R                  SS5      $ )Nre   rS   )replacer   s    r7   r   r  |  s    AIIc3,?r:   r  audior  )r  r/  r]  r  r  zwww.tiktok.com)r   rX   r   r   r   r  rA   r  r   r   rp  _proto_relative_urlr  r  r   r   r,  r-  r.  r  )r5   r   COMMON_FORMAT_INFOr  r  r  bitrate_infoformat_infor3  r  	dimensionyr   	video_urlplay_qualityplay_urldownload_url	audio_urlr]  r  r  r  s                       @@r7   _extract_web_formats!TikTokBaseIE._extract_web_formats2  sx   

 ",4&0ABHb
 !89
!*..":;9:Df(mEj5klL#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&&!*"#1u+( 
 I-.A&&!"!e"+( 
 *,YPSVaUb8cd	  ( !  433I>   e7 mF $G.SU^`c-de$Z*>RU`Ta1bcHNN $#//9#%'  d )6[^i]j5klLNN $'//=,   m 	&&w/ <w	K=6YZZ$W-i8Ix	2R"?!@<.5R S \V[ NN$//	:#&%<%S   #c7afll&;&;AeH&E&N&NRb&b7cccs   74L8/L8c                    [        USS[        14S[        14S[        14S[        14S.4SS9nUU(       a  S OU R                  U5      U(       a  S OU R	                  XS 5      S	U0S
.UE[        USU R                  S S9[        USS/U R                  S S9S.E[        USS[        14S[        1[        4S[        1S 14S[        14S.45      E[        US[        SS914S[        14SS[        1[        4S[        14S.5      E[        USSSS S!S"S#.4[        S$9ES%S& VVs/ s H<  n[        US'U[        145        H   nUU R                  U5      US(:X  a  S)OS*S+.PM"     M>     snn0E$ s  snnf ),N)
authorInfor  Nr  )authorSecIdsecUid)uniqueIdr  )authorIdr  r   )r   r  r  r  FrT  Referer)r   r  ru  http_headersr  r  r  r  )r  r  r  r  r  
authorNamec                 B    U (       a  [         R                  " SU 5      $ S $ )Nr  )r  rZ   r   s    r7   r   5TikTokBaseIE._parse_aweme_video_web.<locals>.<lambda>  s    Z[BHH]TU<V<eae<er:   r  )r  r  r  r  r  r  r  r<  
createTime)r  r  r  r  stats	playCount	diggCount
shareCountcommentCountcollectCountr  rQ  r  )	thumbnailr  dynamicCoveroriginCover)Nr<  rL  r  r&  r  )r   rA   r   r6  r   r   r  r	  r   r   r   r+  )r5   r   webpage_urlrg   extract_flatr  r  r  s           r7   _parse_aweme_video_web#TikTokBaseIE._parse_aweme_video_web  s   "<2P"SE*4se</#75}E	S
 2
  +t1J1J<1X!-43I3I,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 !VH!-l_hYdXe<f!gI #33I>(0N(B" "h
 !V;&
 &	
:s   #AE,
)r\   rU   r]   )NNNTzDownloading API JSONzUnable to download API page)TF)"__name__
__module____qualname____firstlineno__r  r   r  rV   rU   r\   r]   	functoolscached_propertyr8   r2   rD   rH   rb   staticmethodrh   rr   rv   r   r   r   r   r#  rG  r{  r  r   r6  rP  __static_attributes__rM   r:   r7   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20h8"t5n_
BTdl.
r:   r   c                   4   \ rS rSrSrS\ S3/rSS0 SS_S	S
_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_S S!_S"\_S#\_S$\_\\S%S&S&S'.ES(S).S*S+0 SS,_S	S
_SS-_SS._SS/_SS_SS_SS0_SS1_SS2_S3S4_S5S6_S7S8_SS_SS9_S S:_S"\_\\\\/ S;QS<S=.ES>.S?0 SS@_S	S
_SSA_SSA_SSB_S7SC_SSD_SSE_S3SF_S5SG_SHSI_SJSC/_S SK_SSL_SS_SSM_S"\_\\\\SN.ESO.SP0 SSQ_S	S
_SSR_SSR_SSS_S7ST_SSU_SSV_S5SW_SHSX_S SY_SSZ_SS_SS[_S"\_S#\_S$\_\\S\.ES]S^.S_0 SS`_S	S
_SSa_SSb_SSc_S7Sd_SSe_SSf_S3Sg_S5Sh_SHSi_S Sj_SSk_SS_SSl_SJSd/_S"\_\\\\SN.ESO.Sm0 SSn_S	S
_SSo_SSo_SSp_SSq_SSr_SsSt_SuSv_SHSv_S Sw_SSx_SSy_S"\_S#\_S$\_Sz\_S{\0ES]S^.S|0 SS}_S	S~_SS_SSb_S7S_SS_SS_SS_S3S_S5S_SJS/_SHS_SS_SS_S S_S"\_S#\_\\\SS.ESO.SS0 SS_S	S
_SS_SS_S7S_SS_SS_SS_S3S_S5S_SJS/_SHSi_SS_S S_SS_S"\_S#\_\\\SSS.ES/S.SS0 SS_S	S
_SS_SS_SS_SS_SS_S5S_S7S_SJS/_SHSi_SS_S S_SS_S"\_S#\_S$\_\\SS.ESS).SS0 SS_S	S_SS_SS_SS_SS_SS_S3S_S5S_S7S_SJS/_SuS_SHS_SS_SS_S S_S"\_\\\\SS.ES>.SSS./rS rSr	g)r4   i  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]  r  r  z!#jassmanak #lehanga #leenabhushanr  r     r  i   r  r  r  leenabhushanr  6691488002098119685r  zdhttps://www.tiktok.com/@MS4wLjABAAAA_Eb4t1vodM1IuTy_cvp9CY22RAb59xqrO0Xtz9CYQJvgXaDvZxYnZYRzDWhhgJmycreatorfacestoriesbyleenabhrK  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/  ri  rj  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/  rj  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/  rj  rk  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-WCo3rbDpAharE3GQCrFuJArI3C8QJrg  zHolocron Musicr  z[Wolf Sounds (1 Hour) Enjoy the Company of the Animal That Is the Majestic King of the Nightib   20220217r  r  z@https://www.tiktok.com/@_le_cannibale_/video/71399804611320742837139980461132074283r  z!TikTok video #7139980461132074283Antaura_le_cannibale_6604511138619654149z&https://www.tiktok.com/@_le_cannibale_zdhttps://www.tiktok.com/@MS4wLjABAAAAoShJqaw_5gvy48y3azFeFcT4jeyKWbB0VVYasOCt2tTLwjNFIaDcHAM4D-QGXFOPzLMS4wLjABAAAAoShJqaw_5gvy48y3azFeFcT4jeyKWbB0VVYasOCt2tTLwjNFIaDcHAM4D-QGXFOPznathan !zgrahamscott canon
   20220905iiNczre:^https://.+\.(?:webp|jpe?g))r  r  r  rK  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  rK  r  zUnable to find video in feed)r/  ri  rj  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  rK  z6Unavailable via feed API, only audio available via webz>https://www.tiktok.com/@hara_yoimiya/video/7253412088251534594 2ff8fe0174db2dbf49c597a7bef4e47d7253412088251534594r  u   я ред флаг простите #переписка #щитпост #тревожныйтиппривязанности #р...u   я ред флаг простите #переписка #щитпост #тревожныйтиппривязанности #рекомендации hara_yoimiya6582536342634676230z$https://www.tiktok.com/@hara_yoimiyazdhttps://www.tiktok.com/@MS4wLjABAAAAIAlDxriiPWLE-p8p1R_0Bx8qWKfi-7zwmGhzU8Mv25W8sNxjfIKrol31qTczzuLBzLMS4wLjABAAAAIAlDxriiPWLE-p8p1R_0Bx8qWKfi-7zwmGhzU8Mv25W8sNxjfIKrol31qTczzuLBu   лампочка(!)u	   Øneheartzwatching the stars<   20230708iKd)r  r  r  r  rK  z<https://www.tiktok.com/@hankgreen1/video/7047596209028074758Tr/  only_matchingc                    U R                  U5      R                  SS5      u  p#U R                  (       a   U R                  U5      $ U R                  X25      nU R                  X5      u  pVU(       a  US:X  a  U R                  XQU5      $ US;   a  U R                  S5        OUS:X  a
  [	        S	SS
9e[	        SU 3US9e! [         a%  nSUl        U R                  U S35         S nANS nAff = f)Nr   rf   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  r8   r   r   r   r   rh   rG  rP  r1  )r5   r/  rg   rf   r   rB  rC  s          r7   _real_extractTikTokIE._real_extract  s     11#6<<T9MA..x88
 w1!>>sM
&A+..zII~%%%ceu_ !Vaeff@IT\]] " A!
##qc)>$?@@As   B? ?
C.	C))C.rM   N)
rS  rT  rU  rV  
_VALID_URL_EMBED_REGEXr   _TESTSr  rZ  rM   r:   r7   r4   r4     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^r:   r4   c            	           \ rS rSrSrSrSSSSS.S	/S
S0S.SSSSS.S	/S
S0S.SSSSS.S	/S
S0S.SSSS0S	/S
S0S./rSrS rS S jr	S r
S rSrg)!TikTokUserIEi  z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_retriesr  )r/  playlist_mincountrj  r  paramsz+https://www.tiktok.com/@6820838815978423302   r  r  zhttps://www.tiktok.com/@memeiQ  LMS4wLjABAAAAiKfaDWeCsT3IHwY77zqWGtVRIy9v4ws1HbVi7auP1Vx7dJysU_hc5yRiGywojRD6memezWtiktokuser:MS4wLjABAAAAM3R2BtjzVT-uAtstkl2iugMzC6AtnpkojJbjiOdDDrdsTiTR75-8lyWJCY5VvDrZ   r   zLMS4wLjABAAAAM3R2BtjzVT-uAtstkl2iugMzC6AtnpkojJbjiOdDDrdsTiTR75-8lyWJCY5VvDrZz-https://www.tiktok.com/api/creator/item_list/c                    0 SS_SS_SS_SS_S	S
_SS_SS_SS_SS_SS_SS_SU_SU R                   _SS_SS_SS_SS_SSSSS S S!S"S#US$S%S&S R                  [        R                  " [        R
                  S'S(95       3SS).E$ )*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_   r|   )is_fullscreenis_page_visibler   r   priority_regionrefererr   screen_heightscreen_widthr;  typetz_nameverifyFpwebcast_language)rD   r   rB   r   string	hexdigits)r5   r  r  s      r7   _build_web_queryTikTokUserIE._build_web_query  s+    
6 
D 
  
 	 

 I 
 f 
  
  
 | 
 f 
 T 
 f 
  
 x 
 6 
  ! 
" 3# 
$ %%!#"!"''&..9I9IQ*O"P!QR $? 
  	
r:   c              #     #    U=(       d    Un[        5       n[        [        R                  " 5       S-  5      n[        R                  " S5       GH  nU R                  5        H  nU R                  U R                  USU 3U R                  X5      S9n	[        [        U	SSS[        145      5      n
U
(       d  MX  U
[        U5      :X  d  Mi  SnU R                  (       a  [        U S	3S
S9eU ?[        U S3S
S9Ul        M     [        W	SS 45       HZ  nUS   nX;   a  M  UR!                  U5        U R#                  XM5      nU R$                  " U[&        40 U R)                  XUS
S9D6v   M\     Un[        U	SSSS 145      nU(       a  X:X  a  US-
  nUS:  d  [        U	S5      (       d    g U(       d  GMj  U(       a  GMt  U R+                  S5        GM     g 7f)N     @@r   Downloading page r   itemList.r   r  z&. Try again with a different device_idTr   z+. Taking measures to avoid an infinite loopc                     US   $ Nr   rM   rg  s     r7   r   'TikTokUserIE._entries.<locals>.<lambda>J      !D'r:   rO  r&  rD  c                     [        U S-  5      $ )Nr  r   r   s    r7   r   r  V  s    CCLr:   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  rr  r   rA   r2   r   rD   erroraddrh   
url_resultr4   rP  r1  )r5   r  rs  
fail_earlyrq   seen_idsr  pageretryresponsecurrent_batchr   r<  rg   rN  
old_cursors                   r7   _entriesTikTokUserIE._entries2  s    )'
5TYY[3&'OOA&D**,..&&
6Gv4N//@ / B !'|Hz3PTWZV[>\'] ^ =]fX6F%FFG,,,&i'MNY]_ _ "0")#NOZ^#`EK -$ &h=Q0RS ;'X&"..zDood11%h]a1bd d T  J!:r<:P9QRTFZ1#n4%\(DU-V-V
 z(()):;W 's   B5G;GC(G9GGc           
         U R                  SU 3USSSS9nU(       d  U R                  S5        g [        U R                  SUSU0 S9S	SS
U 3[        145      n[        USSS[
        145       HQ  nU R                  X5      nU R                  XTSS9u  pgU R                  XeUSS9R                  S5      nU(       d  MO  Us  $    g )Nzhttps://www.tiktok.com/embed/@zDownloading user embed pageF)r   r   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   rn   rX   rA   rh   rG  rP  r   )	r5   rs  rp   r   r   rN  rB  re   r  s	            r7   _extract_sec_uid_from_embed(TikTokUserIE._extract_sec_uid_from_embedf  s   ((,YK8))5 ) G  bcD--JVY . 4 v)5v>@
 %TKdSE+JKH**9?K ==k[`=aMJ11 2 FFIc,FW w L r:   c           	         U R                  U5      S p2[        R                  " SU5      (       a  S Up2SnOU R                  U R                  U-  USSSSS9=(       d    Sn[        U R                  XR5      S[        145      =(       d    0 n[        US	S
S[        1[        45      nU(       d'  UR                  S5      S:X  a  U R                  S5        OUS:X  a
  [        SSS9e[        US	SS[        145      nU(       a  [        US5      (       + nOU R                  U5      nSnU(       d
  [        SSS9eU R                  U R!                  X2U5      X25      $ )NzMS4wLjABAAAA[\w-]{64}TzDownloading user webpagezUnable to download user webpageFr(  r.   webapp.user-detailuserInfo)rE  statsV2
videoCountr9  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   rv   rX   r   r  r   r1  r   rA   r  playlist_resultr  )r5   r/  rs  r  r  rp   detailvideo_counts           r7   r  TikTokUserIE._real_extract}  su   !^^C0$7<<0)<<!%yw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'j$QSZffr:   rM   NrR  )rS  rT  rU  rV  IE_NAMEr  r  r  r  r  r  r  rZ  rM   r:   r7   r  r    s    G_J7`!
 GG&+	 =`*
 GG&+	 . `
 GG&+	 i`
 GG&+7#FH DM!
F2;h.gr:   r  c                        \ rS rSrS rS rSrg)TikTokBaseListIEi  c           
   #     #    U R                   USSSSSSSU R                  0n[        R                  " S5       H  nU R	                  5        H#  n U R                  U R                  X#S	U 3S
S9nM%     WR                  S/ 5       H6  n0 U R                  U5      E[         R#                  5       SSUS    3S.Ev   M8     UR                  S5      (       d    g US   US'   M     g ! [         aU  n[        UR                  [        R                  5      (       a&  UR                  R                  S:X  a  Xul         S nAM  e S nAff = f7f)Nr  r   r      r  r  r<   r   zDownloading video list page zUnable to download video list)r   r   r   
aweme_listTikTokzhttps://tiktok.com/@_/video/r   )extractor_key	extractorrN  has_more)_QUERY_NAMErD   r   r   r  r   _API_ENDPOINTr   r   r   r   r   r   r  r   r   r4   r1   )	r5   list_idrq   r   r  r  	post_listr   r<  s	            r7   r  TikTokBaseListIE._entries  sC    gaRA
 OOA&D**,	 $**J;D6B ? !/ !AI - #|R811%8%-__%6!)%A%
BSAT#U	  9 ==,,'1E(O+ ' & !!''4+?+?@@QWW[[TUEU&' 	s8   AEC$/A5E$
E.A	D>7E=D>>EEc                 f    U R                  U5      nU R                  U R                  X"5      U5      $ rL   )r  r  r  )r5   r/  r!  s      r7   r  TikTokBaseListIE._real_extract  s,    ..%##DMM'$CWMMr:   rM   N)rS  rT  rU  rV  r  r  rZ  rM   r:   r7   r  r    s    2@Nr:   r  c                   P    \ rS rSrSrSrSrSrSrSSS	S
0S/S.SSS	S0S/S./r	Sr
g)TikTokSoundIEi  z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  rj  r  zBhttps://www.tiktok.com/music/jiefei-soap-remix-7036843036118469381i  7036843036118469381rM   NrS  rT  rU  rV  r  r  _WORKINGr  r   r  rZ  rM   r:   r7   r'  r'    s_    GVJHK!MV '
 )\ T!'
 )\Fr:   r'  c                   F    \ rS rSrSrSrSrSrSrSSS	S
0S/S.SSS./r	Sr
g)TikTokEffectIEi  z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  rM   Nr.  rM   r:   r7   r1  r1    sL    GXJHK#MH )
 )\ BFr:   r1  c                   N    \ rS rSrSrSrSrSrSrSSS	S
S.S/S.SSS./r	S r
Srg)TikTokTagIEi  z
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                     U R                  U5      nU R                  XSS0S9nU R                  SUS5      nU R                  U R	                  XB5      XB5      $ )Nr~   zIfacebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)r   z"snssdk\d*://challenge/detail/(\d+)ztag ID)r  r  _html_search_regexr  r  )r5   r/  rq   rp   tag_ids        r7   r  TikTokTagIE._real_extract  sf    ^^C(
((eC
(  (()NPWYab##DMM&$EvZZr:   rM   N)rS  rT  rU  rV  r  r  r/  r  r   r  r  rZ  rM   r:   r7   r5  r5    sS    GGJHK%M1 
 )\ OF[r:   r5  c                   Z    \ rS rSrSrSrSSSS.SS	.S
SSS.SS./rSrSrS r	S r
S rSrg)TikTokCollectionIEi  z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/  rj  playlist_countzOhttps://www.tiktok.com/@imanoreotwe/collection/%F0%9F%98%82-71118871895711608757111887189571160875zimanoreotwe-%F0%9F%98%82r)  )r/  rj  r  z0https://www.tiktok.com/api/collection/item_list/r~  c                 &    SUU R                   USS.$ )Nr  113)r,   collectionIdr   r  
sourceType)_PAGE_COUNT)r5   collection_idr  s      r7   r  #TikTokCollectionIE._build_web_query$  s!    )%%
 	
r:   c              #     #    Sn[         R                  " S5       H  nU R                  U R                  USU 3U R	                  X5      S9n[        USS 45       Hd  nUS   n[        USS	[        1[        45      =(       d    S
nU R                  Xv5      nU R                  " U[        40 U R                  XXUSS9D6v   Mf     [        US5      (       d    g X R                  -  nM     g 7f)Nr   r   r  r  r  c                     US   $ r  rM   rg  s     r7   r   -TikTokCollectionIE._entries.<locals>.<lambda>4  r  r:   r   r  )r<  r;  r   re   Tr  hasMore)r   r   r   r  r  r   rA   r  rh   r  r4   rP  rI  )	r5   rJ  r  r  r  r<  rg   r  rN  s	            r7   r  TikTokCollectionIE._entries-  s     OOA&D**""M5Ftf3M++MB + DH &h=Q0RS ;%eh8TWZV[]`-abifi"..v@ood11%h]a1bd d	 T  )44&&&F 's   C'C)c                     U R                  U5      R                  SSS5      u  p#nU R                  U R                  U5      USR	                  XC45      5      $ )Nr   r  rf   -)r  r  r  r  r   )r5   r/  rJ  r  rs  s        r7   r   TikTokCollectionIE._real_extract@  sY    *.*?*?*D*J*J4QXZc*d'i##MM-(-9BT9UW 	Wr:   rM   N)rS  rT  rU  rV  r  r  r  r  rI  r  r  r  rZ  rM   r:   r7   r@  r@    sf    !GyJ _'-
  a'/
 !F" GMK
'&Wr:   r@  c                   H   \ rS rSrSrSS0 SS_SS_S	S
_SS
_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS/_S\_S \_S!\_\\S"S#.ES$.S%S&0 SS'_SS_S	S(_SS(_SS)_SS*_SS+_SS,_SS-_SS._SS/_SS0_SS1_SS-/_S\_S \_S!\_\\S"S#.ES$.S2S30 SS4_SS_S	S5_SS5_SS_SS_SS_SS_SS_SS6_SS7_SS8_SS_SS/_S\_S \_S!\_\\S"S#.ES$.S9S:S;SS<SS=S>S\\\\\S?.S@SA.SBSC0 SSD_SS_S	SE_SSE_SS_SS_SS_SS_SS_SSF_SSG_SSH_SS_SS/_S\_S \_S!\_\\S"S#.ES$./rSIrSJrSK r	SLr
gM)NDouyinIEiG  z3https?://(?:www\.)?douyin\.com/video/(?P<id>[0-9]+)z0https://www.douyin.com/video/6961737553342991651 9ecce7bc5b302601018ecb2871c63a75r   6961737553342991651r]  r  r  u-   #杨超越  小小水手带你去远航❤️r  r  
6897520xkar  110403406559r  zShttps://www.douyin.com/user/MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98r  7MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98r   u	   杨超越r     r  io`rc  20210513r  u   @杨超越创作的原声r  r  r  r  zre:https?://.+\.jpe?gr  rs  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  rc  r  r  r  r  r  r  r  zNo longer availablerh  z0https://www.douyin.com/video/6963263655114722595 1440bcf59d8700f8e014da073a4dfea86963263655114722595u8   #哪个爱豆的105度最甜 换个角度看看我哈哈   ik{`20210517zhttps://www.douyin.com/user/%szhttps://www.douyin.com/c                    U R                  U5      n[        U R                  SUSSSU0SS9S[        145      nU(       d7  [	        SU R                  U R                  5      R                  S	5      (       + S
9eU R                  U5      $ )Nz1https://www.douyin.com/aweme/v1/web/aweme/detail/zDownloading web detail JSONz"Failed to download web detail JSONr   F)r   r   r   z4Fresh cookies (not necessarily logged in) are needed
s_v_web_idr   )	r  r   r   rX   r   r   r   r   r   )r5   r/  rg   r  s       r7   r  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2r:   rM   N)rS  rT  rU  rV  r  r   r  r  r   r  rZ  rM   r:   r7   rU  rU  G  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3r:   rU  c                      \ rS rSrSrSrS0 SS_SS_S	S
_SS_SS_S\_S\_S\_SS_SS_SS_SS_SS_S\_SS_SS _S!S
_S"S#S$.ES%.S&0 SS'_SS_S	S(_SS)_SS*_S\_S\_S\_S+\_SS_SS,_SS-_SS._S\_SS/_SS0_S!S(_S1S/S$.ES%.S2S3S4./rS5 rS6r	g7)8
TikTokVMIEi  zFhttps?://(?:(?:vm|vt)\.tiktok\.com|(?:www\.)tiktok\.com/t)/(?P<id>\w+)z	vm.tiktokz"https://www.tiktok.com/t/ZTRC5xgJpr   7170520270497680683r]  r  r  z$md5:c64f6152330c2efe98093ccc8597871cr  6687535061741700102rc  20221127r  r  r  r  zdhttps://www.tiktok.com/@MS4wLjABAAAAObqu3WCTXxmw2xwZ3iLEHnEecEIw7ks6rxWqOqOhaPja9BI7gqUQnjw8_5FSoDXXr  z"Wave of Mutilation: Best of PixiesrK  zre:https://.+\.webp.*r  r  r  i:΂cr  rg  Pixiesr  zWhere Is My Mind?r  sigmachaddeus	SigmaChad)r  ra  ry  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                     U R                  [        U5      U R                  U5      SS0S9R                  nU R	                  U5      (       a  [        U5      eU R                  U5      $ )Nr~   zfacebookexternalhit/1.1r;  )_request_webpager   r  r/  suitabler   r  )r5   r/  new_urls      r7   r  TikTokVMIE._real_extract
  se    ''dnnS1LJc;d ( ffifi 	==!!"7++w''r:   rM   N)
rS  rT  rU  rV  r  r  r   r  r  rZ  rM   r:   r7   rr  rr    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(r:   rr  c                       \ rS rSrSrSrSSSSSS	S
SS\S.	SS0S.SSS\SSSSS\S.	SS.SSS.SSS./rS!S jr	S r
S rg)"TikTokLiveIEi  z(?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7210809319192726273r  u(   re:ウェザーニュースLiVE[\d\s:-]*u   ウェザーニュースLiVEweathernewslive6621496731283095554z'https://www.tiktok.com/@weathernewsliveis_live)	r   r]  r  ra  r  r  r  live_statusconcurrent_view_countskip_downloadm3u8)r/  rj  r  z)https://www.tiktok.com/@pilarmagenta/live7209423610325322522Pilarmagentapilarmagenta6624846890674683909z$https://www.tiktok.com/@pilarmagenta
Livestreamr  z@https://m.tiktok.com/share/live/7209423610325322522/?language=enTr  z&https://www.tiktok.com/@iris04201/liveNc                     [        U R                  XSSSX#0S9U[        140 S9n[        UR	                  S5      5      S:X  a  U$ U(       d
  [        SS	S
9e[        US9e)NFr,   r  )r   r   r  rC  r   zThis livestream has endedTr   r   )r   r   rX   r   r   r   r	   )r5   r/  paramroom_idr  r^   r  s          r7   r   TikTokLiveIE._call_api=  sv     3 3v. !4 ! tfr	+ x||H-.!3O !<tLL8,,r:   c                 d  ^ ^^ T R                  U5      R                  SS5      u  p#U(       dK  T R                  [        US T R                  5      USS9n[        T R                  XB5      SSSS[        145      nU(       a  U(       d|  T R                  X=(       d    UU(       + S	9nT R                  XB=(       d    U5      nU=(       d    [        US
S[        1[        45      nU=(       d    [        US
S[        1[        45      nU(       d	  [        US9e/ nT R                  SSX2SS9m[        S5      nU 4S jm[        TSSSST1S[        140 S9R                  5        H  u  p[        U	SST1S[        14S[        SS914SS 14S .45      n
[        U	SS![         145      nU(       a!  UR#                  US!S"U 3U" U5      S#.U
E5        [        U	SS$[         145      nU(       d  M  UR#                  US%S&S'U 3U" U5      S(.U
E5        M     UU4S) jnS* H]  n	[        TSU	 S+3[         145      nU(       d  M#  UR#                  UU	S$:X  a  S%OS!U	S$:X  a  S&OS,U	 S-3U" U	 S.35      U" S/5      S0.5        M_     [        TSS1[        140 S9R                  5        HM  u  nn[!        U5      (       d  M  UR#                  US!S"U 3R%                  5       U" S2U5      U" U5      S3.5        MO     [        US4 5      (       d\  ['        TT R                  S5S6X2S7S95      m[!        TR)                  S85      5      (       a!  UR#                  TS8   S%S&S9S:U" S;5      S0.5        U=(       d    [        TS<S=5      nUU[        US T R                  5      =(       d    S SUS>S?.[        TS@SAS[*        14SBSC[        14SD.SESF9E$ )GNr  r   T)r)  r  r  r  roomIdrc  ))LiveRoomliveRoomUserInfor  )
UserModuleusers.r<  r   z,https://webcast.tiktok.com/webcast/room/infor  r   rl  )
SD1ldSD2sdHD1hdFULL_HD1uhdORIGIONoriginc                 (   > TR                  U S 5      $ rL   )_parse_json)r   r5   s    r7   r   ,TikTokLiveIE._real_extract.<locals>.<lambda>g  s     0 0D 9r:   
stream_urllive_core_sdk_data	pull_datastream_datar  main
sdk_paramsVCodecvbitrater   r  r   c                 h    [         R                  " SU 5      R                  5       R                  5       $ )Nz(?i)\d+x\d+|\d+p)r  matchr  lowerr   s    r7   r   r  p  s#    ATVW8X8^8^8`8f8f8hr:   )r  r  r   flvzflv-)r/  r]  r  r  hlsr  m3u8_nativezhls-)r/  r]  protocolr  r  c                  <   > [        TS/U QT1PSP[        1P75      $ )Nr  r  )r   rA   )keys	live_infoparse_inners    r7   
get_vcodec.TikTokLiveIE._real_extract.<locals>.get_vcodec  sE    	,E#,E&1],E4<,E?Be,E F Fr:   )r  rtmp	_pull_urlhttpsz-pull_pull_url_paramsr  )r/  r]  r  r  r  r  flv_pull_urlflv_pull_url_params)r/  r]  r  r  r  c                     US   S:H  $ )Nr]  r  rM   rg  s     r7   r   r    s    !E(e2Cr:   z'https://www.tiktok.com/api/live/detail/roomIDLiveRoomInfoliveUrlzhls-fallbackr  r  )	ownerInfor<  )ownerrq   )r  r]  )r   r  r  r  r  r  r  r  r  )r  r  )
user_count)liveRoomStats	userCount)r  r  ra  r  Fr>  )r  r  r  r   r  r   rv   rA   rr   r  r	   r   r   rX   rW   r   r   rp  r  r   r   r   )r5   r/  r  r  rp   r   r  get_qualityr  streamr  flv_urlhls_urlr  r  f_idf_urlr  r  s   `                @@r7   r  TikTokLiveIE._real_extractL  sh    11#6<<ZN,,XtT-F-FG_c - eG"((;%z68cUKMG w,,S2EgQX[,YG''1DWED Fd 6./7#5E "FG   H< 8./9C5#7G $HH x00NN:Iw^d # f	   op9+I2Kvv8/8: <<AEG DOG &fv|k]#cU+"[t%<$=>+.h-ijU / J #6FEK=+IJG" #'y!1*73	 
 !   #6FEK=+IJGw"  -#'y!1*73  !  - D>	F &F%i,6()@TWbVc1deJz%$*eO5175g$*85!1(F83C)DE*95   & (	L.SWRX3YcefllnKD%u%%NN#D6]002$%:DA&t,  o G%CDD#It~~98W\j 0> 0l mI9==344$Y/  -!/$*84   j|I7PRij  (49R9RS[W[#5
 9  6{mL?*X[fZg)h	'
 
 	
r:   rM   rL   )rS  rT  rU  rV  r  r  r   rA   r  r   r  rZ  rM   r:   r7   r  r    s    	J G >'@5)0E$%(

 #F+ ;'%&0B$%(

  R 8?"FH-t
r:   r  )4r
  rW  r  r   r   rB   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   r4   r  r  r'  r1  r5  r@  rU  rr  r  rM   r:   r7   <module>r     s          	     ! $     , B AN

= N

bj^| j^Z	vg< vgr#N| #NL$ 0% ([" [87W 7WtI3| I3X<( <(~n
< n
r:   