
    V|h8                       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\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      r* " S S\#5      r+ " S S\5      r, " S S\#5      r-g)    N   )InfoExtractor   )HEADRequest)ExtractorErrorUnsupportedErrorUserNotLivedetermine_extfilter_dictformat_fieldint_or_nonejoin_nonemptymerge_dictsmimetype2extparse_qs	qualitiessrt_subtitles_timecodestr_or_nonetraverse_objtruncate_stringtry_calltry_geturl_or_noneurlencode_postdatac                   B   \ 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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     Q/home/james-whalen/.local/lib/python3.13/site-packages/yt_dlp/extractor/tiktok.py_KNOWN_APP_INFOTikTokBaseIE._KNOWN_APP_INFO8   s-     //2$R&&z78&LL    c                 4    U R                  SS /[        S9S   $ )N	device_idr-   r   r0   r1   r2   s    r4   r/   TikTokBaseIE._KNOWN_DEVICE_ID>   s!    &&{TF8&LQOOr7   c                 h    U R                   =(       d     [        [        R                  " SS5      5      $ )Nl     *{Y2$ l   B2n?- )r/   strrandomrandintr;   s    r4   
_DEVICE_IDTikTokBaseIE._DEVICE_IDB   s%    $$eFNN;NPc,d(eer7   c                 4    U R                  SS/[        S9S   $ )Napi_hostnamez#api16-normal-c-useast1a.tiktokv.comr-   r   r:   r;   s    r4   _API_HOSTNAMETikTokBaseIE._API_HOSTNAMEF   s0    &&BCH ' VVWY 	Yr7   c                 Z   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      5       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%   r-   r   c              3   >   #    U  H  u  pU(       d  M  X4v   M     g 7fN ).0kvs      r4   	<genexpr>2TikTokBaseIE._get_next_app_info.<locals>.<genexpr>S   s      $'Xtq\]FQF'Xs   
/Fr&   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itemsr0   r1   r5   dictzipsplitpop	_APP_INFO_APP_USER_AGENT)r2   keyr3   defaultsr,   r&   versionpackages           r4   _get_next_app_infoTikTokBaseIE._get_next_app_infoK   sL   & %)$;$;$A$A$C$CLC%< Q,,S)H,MaPP$C   $(#7#7# $8x8 t $'*4+B+BHNNSVDW'X$   #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/rJ   )user_idvideo_ids     r4   _create_urlTikTokBaseIE._create_urlg   s    )'.S)9
KKr7   c           	      *    U R                  SUSUS0 S9$ )Nz;<script[^>]+\bid="(?:SIGI_STATE|sigi-persisted-data)"[^>]*>z
sigi state	</script>end_patternr3   )_search_jsonr2   webpage
display_ids      r4   _get_sigi_stateTikTokBaseIE._get_sigi_statek   s*      JG*, ! L 	Lr7   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 datarg   rh   __DEFAULT_SCOPE__)r   rj   rT   rk   s      r4   _get_universal_data TikTokBaseIE._get_universal_datap   sF    D--JGjlB . P !4&)+ 1 /1	1r7   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   rL   sid_ttzhttps://z
/aweme/v1/rP   zapplication/json)
User-AgentAccept)rc   fatalnoteerrnoteheadersquerydata)_set_cookierE   joinr?   choices_get_cookies_WEBPAGE_HOSTgetvalue_download_jsonrY   )
r2   eprc   r   r   r   r|   r}   r~   webpage_cookiess
             r4   _call_api_implTikTokBaseIE._call_api_implv   s    ++YOaeh@i8jk++D,>,>?x((T//?8;T;Z;Z[""t))**RD:XG"22,> =b>  # ' 	'r7   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)rK   rM   s     r4   rN   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%   rv      rx   )carrier_region	op_regionbuild_numberregiontsr%   r9   openudid)r   r   timer>   uuiduuid4rX   r   rV   r?   r@   r   rA   r   )r2   r   s     r4   _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,
 , ,	r7   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 ))rX   r^   r   report_warninglenrQ   	itertoolscountwrite_debugr>   r   r   
isinstancecausejsonJSONDecodeErrorposmsg)r2   r   rc   r   r   r   r|   r}   r~   message	max_triesr   
real_queryes                 r4   	_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rc   )r   r   r   rT   r   _parse_aweme_video_app)r2   aweme_idaweme_details      r4   _extract_aweme_appTikTokBaseIE._extract_aweme_app   s|    #NN/@R 
!_"%T A #B  ) ,;Av*F	H
  !FQYZZ**<88r7   c                 ^   0 SpTU R                  XUSS9nUSL a  XE4$ Uu  px[        R                  R                  UR                  5      R
                  S:X  aA  Sn	U(       a  U R                  U	5        U R                  U	 SU R                  5        35        XE4$ U R                  Xr5      =n
(       aD  U R                  S5        [        U
S	S
[        145      =(       d    Sn[        U
S	SS[        145      nOU R                  Xr5      =n(       aC  U R                  S5        [        USS
[        145      =(       d    Sn[        USU[        145      nOoU R                  Xr0 S9=n(       aF  U R                  S5        [        USSS
[        145      =(       d    Sn[        USSSS[        145      nOU(       a  [!        S5      e[        US[        145      (       dU  [        US["        145      (       a=  Sn	U(       a  U R                  U	5        U R                  U	 SU R                  5        3US9  XE4$ )NTr|   impersonateFz/loginz4TikTok is requiring login for access to this contentz. z$Found universal data for rehydrationzwebapp.video-detail
statusCoder   itemInfo
itemStructzFound sigi state data	VideoPage
ItemModuler3   zFound next.js dataprops	pagePropsz$Unable to extract webpage video datavideoisContentClassifiedzFThis post may not be comfortable for some audiences. Log in for accessr   )_download_webpage_handleurllibparseurlparseurlpathraise_login_requiredr   _login_hintrr   r   r   r   rT   rn   _search_nextjs_datar   bool)r2   r  rc   r|   
video_datastatusresrl   urlhr   universal_data	sigi_data	next_datas                r4   _extract_web_data_and_status)TikTokBaseIE._extract_web_data_and_status   s3   F++CTX+Y%<%%<<  *//8;LG))'27)2d.>.>.@-A BC%%!55gHH>HCD!.3H,Y\X]2^_dcdF%n7LjZfimhn6opJ..wAAYA45!)k<#-OPUTUF%i,4&1QRJ227b2QQYQ12!)g{LSVRW-XY^]^F%i';
T`cgbh1ijJ !GHHJ4&(9::|JYnqupvXw?x?x^G))'27)2d.>.>.@-A BXV!!r7   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_captionr  webvtt)interaction_stickers.auto_video_caption_infoauto_captions.expected_type)r  url_list.F)r  get_allzDownloading captionszUnable to download captions)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   )rK   ilines      r4   rN   .TikTokBaseIE._get_subtitles.<locals>.<genexpr>  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UrlrJ   ra   rM   s     r4   <lambda>-TikTokBaseIE._get_subtitles.<locals>.<lambda>0  s    ^_`e^fr7   LanguageCodeNamer.  c                    > T" U S   5      $ )Nr%  rJ   )x
preferences    r4   r0  r1  8  s    j5>Rr7   rZ   )r   tuplevaluesr   rT   r   r   
setdefaultr   appendr   	enumerater  rd   rS   sorted)r2   r   r   	user_nameEXT_MAP	subtitlescaptions_infocaptioncaption_urlcaption_jsonra   r(  	subs_listr5  s                @r4   _get_subtitlesTikTokBaseIE._get_subtitles  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 r7   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)idcodecr	  bitrate)r3   groupbytevc1h265r   scale)	format_idvcodectbrquality)_search_regexr   r   	QUALITIES)r2   url_keyrP  rI  r	  rJ  s         r4   _parse_url_keyTikTokBaseIE._parse_url_key<  s|    )-););Mw7?` *< *b&	# t8O" % 2fwd3;t 05	

  	r7   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@SA.[         S'9EUE['        USBT R(                  S SC9['        USDSE/T R(                  S SC9U[#        UR                  SF5      5      =(       d    S U(       a  [*        R,                  " SGU5      OS UT R/                  X[	        USDSESB5      5      SH VVs/ s H(  n[	        UUSISJ45        H  nUUUSK;   a  SOSSL.PM     M*     snn[	        USMSN[        SOSP91[0        45      =(       d    [	        USN[         145      T R3                  SQU;   SRU;   SSU;   ST9SUSV.E$ s  snnf )WNr   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%  acodecrQ  widthheight)r
   r*  s     r4   
audio_meta7TikTokBaseIE._parse_aweme_video_app.<locals>.audio_metaN  sN    7C c!1  -#&%<%S  : 8::r7   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 )NrV  r+   rQ  bytevc2rc  rb  r   r  	data_sizemp4r^  zaweme/v1)r  filesizer%  ra  source_preferencer`  z(API)z(UNPLAYABLE) )delim)r5  r`  )rW  r   r9  r   updater   )	addradd_metaparsed_metar	  
is_bytevc2r  rd  known_resolutionsr2   s	         r4   extract_addr9TikTokBaseIE._parse_aweme_video_app.<locals>.extract_addrY  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;rb  rc  c                     > TT -  $ rI   rJ   )rc  rb  s   r4   r0  5TikTokBaseIE._parse_aweme_video_app.<locals>.<lambda>t  s	    r7         ?	play_addrzDirect video
is_bytevc1is_h265rM  h264)rP  r`  rQ  rb  rc  download_addrzDownload video%shas_watermarkz, watermarkedr+   c                      > [        T T-  5      $ rI   r   )dl_widthratios   r4   r0  ry    s    3x%/?+@r7   rj  r   )rP  r`  rQ  rb  rc  r5  play_addr_h264)rP  r`  rQ  play_addr_bytevc1bit_rate	gear_namezPlayback videoc                     U S   S-  $ )Nr  r   rJ   r4  s    r4   r0  ry    s    a
md6Jr7   FPS)rP  r`  rR  rQ  fpsry   r  
statisticsmusic)hybrid_label.r  r  )matched_songtitle)matched_pgc_soundr  )r  author)r  r  r  is_original_soundr  zoriginal sound - {}owner_handleoriginal sound	unique_iduidnicknamesec_uid)uploaderuploader_idr   
channel_idrH  descH   leftcreate_time)r  description	timestamp
play_count
digg_countshare_countcomment_count
view_count
like_countrepost_countr  r  r   r  r  album
(?:, | & ))coverai_dynamic_coveranimated_coverai_dynamic_cover_bakorigin_coverdynamic_coverr  .)r  r  rH  r  r5  )Nr  durationr   rN  PrivatezFriends onlyzFollowers only)
is_privateneeds_subscriptionis_unlisted)rS  rI  sizebr)channel_urluploader_urltrackr  artistsformatsr?  
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rerV   extract_subtitlesany_availability)r2   r   r   
video_inforv  r  r  rJ  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_urlrd  r  rc  ru  r  rb  s   `                    @@@@@@r4   r   #TikTokBaseIE._parse_aweme_video_appI  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S*
 *	
.
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 )2Nri  r~  r^  )r%  rQ  ra  r   rb  rc  c                     > TT -  $ rI   rJ   )play_height
play_widths   r4   r0  3TikTokBaseIE._extract_web_formats.<locals>.<lambda>  s
    k!9r7   rz  bitrateInfoc                     US   S   $ )NPlayAddrUrlListrJ   r/  s     r4   r0  r    s    RST^R_`iRjr7   r  UrlKeyr+   rQ  rg  
UNPLAYABLErm  r   DataSize)r`  r5  rk  i  @  r   r   )rb  rc  r  .r  c                    > US   T:H  $ )Nrb  rJ   )ra   rM   r  s     r4   r0  r    s    1W:;Sr7   rS  playAddr)).srcNplay)rP  r  rb  rc  rS  )downloadAddr)downloadr  r  watermarkedrj  )rP  r  r`  r5  r  playUrl	mime_typec                 &    U R                  SS5      $ )Nra   rP   )replacer  s    r4   r0  r  3  s    AIIc3,?r7   r[  audior_  )rP  r  r%  ra  rQ  zwww.tiktok.com)r   rT   r   r   r   rW  r>   rp  r   r   r:  _proto_relative_urlr  r  r   r   r   r   r   r  )r2   r   COMMON_FORMAT_INFOr  r  r  bitrate_infoformat_infor	  rt  	dimensionyr4  	video_urlplay_qualityplay_urldownload_url	audio_urlr%  r  r  r  s                       @@r4   _extract_web_formats!TikTokBaseIE._extract_web_formats  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".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  rH  )r   r  r  r  Fr  Referer)rH  r  r?  http_headersr  r   r  r  )r  r  r  r  r  
authorNamec                 B    U (       a  [         R                  " SU 5      $ S $ )Nr  )r  rV   r  s    r4   r0  5TikTokBaseIE._parse_aweme_video_web.<locals>.<lambda>S  s    Z[BHH]TU<V<eae<er7   r  )r  r  r  r  r  r  r  r   
createTime)r  r  r  r  stats	playCount	diggCount
shareCountcommentCountr  r  r  )	thumbnailr  dynamicCoveroriginCover)Nr   r  rj  r   r  )r   r>   r   r   r  r   r  filterr   r   r   r  )r2   r   webpage_urlrc   extract_flatr  r  r  s           r4   _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 *
 *+-%
8  !V !VH!-l_hYdXe<f!gI #33I>(0N(B" "h
 !V9%
 %	
8s   "AE+
)rX   rQ   rY   )NNNTzDownloading API JSONzUnable to download API page)TF)!__name__
__module____qualname____firstlineno__r  r   rU  rR   rQ   rX   rY   	functoolscached_propertyr5   r/   rA   rE   r^   staticmethodrd   rn   rr   r   r   r   r   r  rE  rW  r   r   r  __static_attributes__rJ   r7   r4   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'"R5n^
@Tdl-
r7   r   c                      \ 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\\0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$\_S\\_S]S^.Sz0 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)r1   io  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 736bb7a466c6f0a6afeb597da1e6f5b7rH  6748451240264420610r%  ri  r  z!#jassmanak #lehanga #leenabhushanr  r     rc  i   rb  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  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  r3  r4  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  r4  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   20211217r  zThis video is unavailabler  r4  r5  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-WCo3rbDpAharE3GQCrFuJArI3C8QJr1  zHolocron Musicr  z[Wolf Sounds (1 Hour) Enjoy the Company of the Animal That Is the Majestic King of the Nightib   20220217z@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  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  zUnable to find video in feed)r  r3  r4  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  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  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)NrH  rb   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_urlrK  r5   r   r   r   r   rd   r  r  r  )r2   r  rc   rb   r   r  r  s          r4   _real_extractTikTokIE._real_extractz  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.rJ   N)
r  r  r  r   
_VALID_URL_EMBED_REGEXr   _TESTSrw  r$  rJ   r7   r4   r1   r1   o  s	   aJCJ<qQRL P1
'
5
 8
 >	

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

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

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

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

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

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

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

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

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

 
 0
 B
   B
 h
 ,
 }
 )
 )
 
 :
  !
" ##
$  :+
	: NCEFN^r7   r1   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rH  r  &TikTok API keeps sending the same pageextractor_retriesr[  )r  playlist_mincountr4  rd  paramsz+https://www.tiktok.com/@6820838815978423302   rO  rN  zhttps://www.tiktok.com/@memeiQ  LMS4wLjABAAAAiKfaDWeCsT3IHwY77zqWGtVRIy9v4ws1HbVi7auP1Vx7dJysU_hc5yRiGywojRD6memezWtiktokuser:MS4wLjABAAAAM3R2BtjzVT-uAtstkl2iugMzC6AtnpkojJbjiOdDDrdsTiTR75-8lyWJCY5VvDrZ   rH  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cursorr9   r   web_pcfocus_state	from_pageuserhistory_len2falsewindowsr+   r   10801920r   UTCverify_   rx   )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)r2   r  r  s      r4   _build_web_queryTikTokUserIE._build_web_query  s+    
6 
D 
  
 	 

 I 
 f 
  
  
 | 
 f 
 T 
 f 
  
 x 
 6 
  ! 
" 3# 
$ %%!#"!"''&..9I9IQ*O"P!QR $? 
  	
r7   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.rH  r  z&. Try again with a different device_idTr   z+. Taking measures to avoid an infinite loopc                     US   $ NrH  rJ   r/  s     r4   r0  'TikTokUserIE._entries.<locals>.<lambda>      !D'r7   r  r   r  c                     [        U S-  5      $ )Nr  r   r  s    r4   r0  r    s    CCLr7   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  r<  r   r>   r/   r   rA   erroraddrd   
url_resultr1   r  r  )r2   r  r=  
fail_earlyrm   seen_idsr  pageretryresponsecurrent_batchr   r   rc   r  
old_cursors                   r4   _entries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 ;'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.rH  r+  Tr  r  )
_download_webpager   r   rj   rT   r>   rd   r  r  r   )	r2   r=  rl   r   r   r  r  ra   r  s	            r4   _extract_sec_uid_from_embed(TikTokUserIE._extract_sec_uid_from_embed  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 r7   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)r  statsV2
videoCountr   ru  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   rr   rT   r   r  r   r  r   r>   r  playlist_resultr  )r2   r  r=  r  r  rl   detailvideo_counts           r4   rw  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fr7   rJ   Nr  )r  r  r  r   IE_NAMEry  r{  r  r  r  r  rw  r$  rJ   r7   r4   r}  r}    s    G_J7`!
 GG&+	 =`*
 GG&+	 . `
 GG&+	 i`
 GG&+7#FH DM!
F2;h.gr7   r}  c                        \ rS rSrS rS rSrg)TikTokBaseListIEiK  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  r9   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	extractorr  has_more)_QUERY_NAMErA   r   r   r  r   _API_ENDPOINTr   r   r   r   r   r   r  r   r   r1   r.   )	r2   list_idrm   r   r  r  	post_listr   r   s	            r4   r  TikTokBaseListIE._entriesL  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      $ rI   )r  r  r  )r2   r  r  s      r4   rw  TikTokBaseListIE._real_extractl  s,    ..%##DMM'$CWMMr7   rJ   N)r  r  r  r   r  rw  r$  rJ   r7   r4   r  r  K  s    2@Nr7   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)TikTokSoundIEiq  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   rH  6956990112127585029Retryingr  r  r4  rd  zBhttps://www.tiktok.com/music/jiefei-soap-remix-7036843036118469381i  7036843036118469381rJ   Nr  r  r  r   r  ry  _WORKINGr  r  r{  r$  rJ   r7   r4   r  r  q  s_    GVJHK!MV '
 )\ T!'
 )\Fr7   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  rH  1258156r  r  z0https://www.tiktok.com/sticker/Elf-Friend-479565Trr  rJ   Nr  rJ   r7   r4   r  r    sL    GXJHK#MH )
 )\ BFr7   r  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=v1Trr  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      $ )Nrz   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  )r2   r  rm   rl   tag_ids        r4   rw  TikTokTagIE._real_extract  sf    ^^C(
((eC
(  (()NPWYab##DMM&$EvZZr7   rJ   N)r  r  r  r   r  ry  r  r  r  r{  rw  r$  rJ   r7   r4   r  r    sS    GGJHK%M1 
 )\ OF[r7   r  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  r4  playlist_countzOhttps://www.tiktok.com/@imanoreotwe/collection/%F0%9F%98%82-71118871895711608757111887189571160875zimanoreotwe-%F0%9F%98%82r  )r  r4  r  z0https://www.tiktok.com/api/collection/item_list/rH  c                 &    SUU R                   USS.$ )Nr  113)r)   collectionIdr   r  
sourceType)_PAGE_COUNT)r2   collection_idr  s      r4   r  #TikTokCollectionIE._build_web_query  s!    )%%
 	
r7   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  rJ   r/  s     r4   r0  -TikTokCollectionIE._entries.<locals>.<lambda>  r  r7   rH  r  )r  r  rH  ra   Tr  hasMore)r   r   r   r  r  r   r>   r  rd   r  r1   r  r  )	r2   r  r  r  r  r   rc   r  r  s	            r4   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      $ )NrH  r  rb   -)rv  rK  r  r  r   )r2   r  r  r  r=  s        r4   rw   TikTokCollectionIE._real_extract  sY    *.*?*?*D*J*J4QXZc*d'i##MM-(-9BT9UW 	Wr7   rJ   N)r  r  r  r   r  ry  r{  r  r  r  r  rw  r$  rJ   r7   r4   r
  r
    sf    !GyJ _'-
  a'/
 !F" GMK
'&Wr7   r
  c                   >   \ 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DouyinIEi  z3https?://(?:www\.)?douyin\.com/video/(?P<id>[0-9]+)z0https://www.douyin.com/video/6961737553342991651 9ecce7bc5b302601018ecb2871c63a75rH  6961737553342991651r%  ri  r  u-   #杨超越  小小水手带你去远航❤️r  r  
6897520xkar  110403406559r  zShttps://www.douyin.com/user/MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98r  7MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98r   u	   杨超越r     r  io`r-  20210513r  u   @杨超越创作的原声r  r  r  r  zre:https?://.+\.jpe?grk  r=  z0https://www.douyin.com/video/6982497745948921092 15c5e660b7048af3707304e3cc02bbb56982497745948921092u8   这个夏日和小羊@杨超越 一起遇见白色幻想0731chaoyue408654318141572zShttps://www.douyin.com/user/MS4wLjABAAAAZJpnglcjW2f_CMVcnqA_6oVBXKWMpH0F8LIHuUu8-lAz7MS4wLjABAAAAZJpnglcjW2f_CMVcnqA_6oVBXKWMpH0F8LIHuUu8-lAu   杨超越工作室*   i`20210708u"   @杨超越工作室创作的原声z0https://www.douyin.com/video/6953975910773099811 0e6443758b8355db9a3c34864a4276be6953975910773099811u'   #一起看海  出现在你的夏日里   iD|`20210422z0https://www.douyin.com/video/6950251282489675042 b4db86aec367ef810ddd38b1737d2fed6950251282489675042u'   哈哈哈，成功了哈哈哈哈哈哈20210412i@t`)rH  r%  r  r  r-  r  r  r  r  r  r  zNo longer availabler2  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   rT   r   r   r   r   r   )r2   r  rc   r  s       r4   rw  DouyinIE._real_extractj  s    >>#&d11?)+Ox( 2 7 :H$8PR  F!..t/A/ABFF|TTV V **622r7   rJ   N)r  r  r  r   ry  r   r{  r  r   rw  r$  rJ   r7   r4   r  r    s   GJA1
'
5
 D
 J	

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

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

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

 
 >
 q
 S
 {
 
 
 :
 0
 }
 #
  #!
" C#
$ !1'
sqFd <-M3r7   r  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/_S!S(_S0S1_S2S.0ES%.S3S4S5./rS6 rS7r	g8)9
TikTokVMIEiz  zFhttps?://(?:(?:vm|vt)\.tiktok\.com|(?:www\.)tiktok\.com/t)/(?P<id>\w+)z	vm.tiktokz"https://www.tiktok.com/t/ZTRC5xgJprH  7170520270497680683r%  ri  r  z$md5:c64f6152330c2efe98093ccc8597871cr  6687535061741700102r-  20221127r  r  r  r  zdhttps://www.tiktok.com/@MS4wLjABAAAAObqu3WCTXxmw2xwZ3iLEHnEecEIw7ks6rxWqOqOhaPja9BI7gqUQnjw8_5FSoDXXr  z"Wave of Mutilation: Best of Pixiesr  zre:https://.+\.webp.*r  r  r  i:΂cr  r1  Pixiesr  zWhere Is My Mind?r  sigmachaddeus	SigmaChad)r  r+  rC  z https://vm.tiktok.com/ZTR45GpSF/7106798200794926362z$md5:edc3e7ea587847f8537468f2fe51d074699769587884626841820220608zdhttps://www.tiktok.com/@MS4wLjABAAAAdZ_NcPPgMneaGrW0hN8O_J_bwLshwNNERRF5DxOw2HKIzk0kdlLrR8RkVl1ksrMO   iPkb	Akihitokor  r  
akihitoko1r+  zhttps://vt.tiktok.com/ZSe4FqkKdTrr  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      $ )Nrz   zfacebookexternalhit/1.1r  )_request_webpager   r  r  suitabler   r  )r2   r  new_urls      r4   rw  TikTokVMIE._real_extract  se    ''dnnS1LJc;d ( ffifi 	==!!"7++w''r7   rJ   N)
r  r  r  r   ry  r  r   r{  rw  r$  rJ   r7   r4   r<  r<  z  s   ZJG 4
'
5
 ;
 0	

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

 :
 #
 #
 S
 1
   C
 
 
 C
 k
 %
  A!
" #
$ {%
. 1[0Fd(r7   r<  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7210809319192726273ri  u(   re:ウェザーニュースLiVE[\d\s:-]*u   ウェザーニュースLiVEweathernewslive6621496731283095554z'https://www.tiktok.com/@weathernewsliveis_live)	rH  r%  r  r+  r  r  r  live_statusconcurrent_view_countskip_downloadm3u8)r  r4  r  z)https://www.tiktok.com/@pilarmagenta/live7209423610325322522Pilarmagentapilarmagenta6624846890674683909z$https://www.tiktok.com/@pilarmagenta
LivestreamrJ  z@https://m.tiktok.com/share/live/7209423610325322522/?language=enTrr  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   r  r   zThis livestream has endedTr   r   )r   r   rT   r   r   r   r	   )r2   r  paramroom_idr  rZ   r  s          r4   r   TikTokLiveIE._call_api  sv     3 3v. !4 ! tfr	+ x||H-.!3O !<tLL8,,r7   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  rH  T)r   r  r  r  roomIdr+  ))LiveRoomliveRoomUserInfor  )
UserModuleusers.r  r   z,https://webcast.tiktok.com/webcast/room/infor_  r   r6  )
SD1ldSD2sdHD1hdFULL_HD1uhdORIGIONoriginc                 (   > TR                  U S 5      $ rI   )_parse_json)r4  r2   s    r4   r0  ,TikTokLiveIE._real_extract.<locals>.<lambda>  s     0 0D 9r7   
stream_urllive_core_sdk_data	pull_datastream_datar   main
sdk_paramsVCodecvbitrater   rN  r   c                 h    [         R                  " SU 5      R                  5       R                  5       $ )Nz(?i)\d+x\d+|\d+p)r  matchrK  lowerr  s    r4   r0  rs    s#    ATVW8X8^8^8`8f8f8hr7   )rQ  rR  r   flvzflv-)r  r%  rP  rS  hlsri  m3u8_nativezhls-)r  r%  protocolrP  rS  c                  <   > [        TS/U QT1PSP[        1P75      $ )Nrt  rz  )r   r>   )keys	live_infoparse_inners    r4   
get_vcodec.TikTokLiveIE._real_extract.<locals>.get_vcodec.  sE    	,E#,E&1],E4<,E?Be,E F Fr7   )r  rtmp	_pull_urlhttpsz-pull_pull_url_paramsro  )r  r%  r  rP  rQ  rS  flv_pull_urlflv_pull_url_params)r  r%  rP  rQ  rS  c                     US   S:H  $ )Nr%  ri  rJ   r/  s     r4   r0  rs  J  s    !E(e2Cr7   z'https://www.tiktok.com/api/live/detail/roomIDLiveRoomInfoliveUrlzhls-fallbackr~  rp  )	ownerInfor  )ownerrm   )rS  r%  )rH  r  r  rS  r  r  r  r  r  )r  r  )
user_count)liveRoomStats	userCount)r  r  r+  rU  Fr  )rv  rK  r  r   r  r   rr   r>   rn   r  r	   r   r   rT   rS   r   r   r:  r~  r   r   r   )r2   r  r  r_  rl   r   r  get_qualityrS  streamry  flv_urlhls_urlr  rt  f_idf_urlr  r  s   `                @@r4   rw  TikTokLiveIE._real_extract  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	'
 
 	
r7   rJ   rI   )r  r  r  r   ry  r  r   r>   r{  r   rw  r$  rJ   r7   r4   rO  rO    s    	J G >'@5)0E$%(

 #F+ ;'%&0B$%(

  R 8?"FH-t
r7   rO  ).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   r   r1   r}  r  r  r  r  r
  r  r<  rO  rJ   r7   r4   <module>r     s        	     ! $     0G	
= G	
T`^| `^F	vg< vgr#N| #NL$ 0% ([" [87W 7WtD3| D3N;( ;(|n
< n
r7   