
    ukiF                       d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	ddl
mZ ddlmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"  G d de      Z# G d	 d
e#      Z$ G d de#      Z% G d de#      Z& G d de&      Z' G d de&      Z( G d de&      Z) G d de#      Z* G d de#      Z+ G d de      Z, G d de#      Z-y)    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                   2   e Zd ZdZdZdZdddddd	ZdZdZdZ	e
j                  d
        Ze
j                  d        Ze
j                  d        Ze
j                  d        Zd Zed        Zd Zd Z	 	 ddZd Z	 	 ddZd ZddZd Zd Zd Zd ZddZy)TikTokBaseIEzhttps://www.tiktok.com/@%szhttps://www.tiktok.com/)360p540p720p1080pN
musical_lyz35.1.3
20235010300)iidapp_nameapp_versionmanifest_app_versionaidc                 T    | j                   rdgng }| j                  d|t              S )N app_infoie_key)_KNOWN_DEVICE_ID_configuration_argTikTokIE)selfdefaults     R/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/yt_dlp/extractor/tiktok.py_KNOWN_APP_INFOzTikTokBaseIE._KNOWN_APP_INFO8   s-     //2$R&&z78&LL    c                 :    | j                  dd gt              d   S )N	device_idr,   r   r/   r0   r1   s    r3   r.   zTikTokBaseIE._KNOWN_DEVICE_ID>   s!    &&{TF8&LQOOr5   c                 \    | j                   xs t        t        j                  dd            S )Nl     *{Y2$ l   B2n?- )r.   strrandomrandintr9   s    r3   
_DEVICE_IDzTikTokBaseIE._DEVICE_IDB   s%    $$eFNN;NPc,d(eer5   c                 :    | j                  ddgt              d   S )Napi_hostnamez#api16-normal-c-useast1a.tiktokv.comr,   r   r8   r9   s    r3   _API_HOSTNAMEzTikTokBaseIE._API_HOSTNAMEF   s0    &&BCH ' VVWY 	Yr5   c                 J   | j                   | j                  j                         D ci c]'  \  }}|dk7  r|| j                  ||gt              d   ) }}}| j
                  D cg c]=  }i |t        d t        | j                  |j                  d      d      D              ? c}| _         | j                   sy| j                   j                  d      | _
        | j                  d   }| j                  d	   }|d
k(  rd| }nd| d| }| d| _        yc c}}w c c}w )Nr$   r,   r   c              3   0   K   | ]  \  }}|s	||f  y wN ).0kvs      r3   	<genexpr>z2TikTokBaseIE._get_next_app_info.<locals>.<genexpr>S   s       $#q!jkQF$s   
	/F)strictr%   r'   r!   zcom.zhiliaoapp.musically/zcom.ss.android.ugc.zR (Linux; U; Android 13; en_US; Pixel 7; Build/TD1A.220804.031; Cronet/58.0.2991.0)T)_APP_INFO_POOL_APP_INFO_DEFAULTSitemsr/   r0   r4   dictzipsplitpop	_APP_INFO_APP_USER_AGENT)r1   keyr2   defaultsr+   r%   versionpackages           r3   _get_next_app_infozTikTokBaseIE._get_next_app_infoK   sJ   & %)$;$;$A$A$C C%< T,,S7)H,MaPPH  $(#7#7#  8 t $'*4+B+BHNNSVDW`e'f$   #D "",,003>>*-..!78|#1';G+H:Qwi@G")*|}1
#s   ,D'AD c                     d| xs d d| S )Nzhttps://www.tiktok.com/@_z/video/rE   )user_idvideo_ids     r3   _create_urlzTikTokBaseIE._create_urlg   s    )'.S)9
KKr5   c                 0    | j                  d|d|di       S )Nz;<script[^>]+\bid="(?:SIGI_STATE|sigi-persisted-data)"[^>]*>z
sigi state	</script>end_patternr2   )_search_jsonr1   webpage
display_ids      r3   _get_sigi_statezTikTokBaseIE._get_sigi_statek   s*      JG*, ! L 	Lr5   c           
      Z    t        | j                  d|d|di       dt        hf      xs i S )Nz;<script[^>]+\bid="__UNIVERSAL_DATA_FOR_REHYDRATION__"[^>]*>zuniversal datar`   ra   __DEFAULT_SCOPE__)r   rc   rO   rd   s      r3   _get_universal_dataz TikTokBaseIE._get_universal_datap   sF    D--JGjlB . P !4&)+ 1 /1	1r5   c	           
         | j                  | j                  ddj                  t        j                  dd                   | j                  | j                        }	|	j                  d      r*| j                  | j                  d|	d   j                         | j                  d| j                   d| d	||||| j                  d
d|xs i ||      S )Nodin_ttr*   0123456789abcdef   rG   sid_ttzhttps://z
/aweme/v1/rJ   zapplication/json)
User-AgentAccept)r]   fatalnoteerrnoteheadersquerydata)_set_cookierA   joinr<   choices_get_cookies_WEBPAGE_HOSTgetvalue_download_jsonrT   )
r1   epr]   rw   rx   rv   rs   rt   ru   webpage_cookiess
             r3   _call_api_implzTikTokBaseIE._call_api_implv   s    ++YOaeh@i8jk++D,>,>?x(T//?8;T;Z;Z[""t))**RD:XdG"22,> =b>  # ' 	'r5   c                    t        i |i dddddddt        t        j                         dz        dt        t	        j
                               d	d
d| j                  d   d| j                  d   ddj                  d | j                  d   j                  d      D              d| j                  d   d| j                  d   d| j                  d   d| j                  d   ddddddddi dd d!d"d#d$d%d&d'd(d)d*d+d,d-d*d.t        t        j                               t        j                  d/d0      z
  d1d2d3d*d4d d5d6d7d8d9d d:d;d<d=d*d*| j                  d   d*t        t        j                               | j                  j                  d>      | j                  dj                  t        j                  d?d@A            dB      S )CNdevice_platformandroidosssmixa_rticket  cdidchannel
googleplayr(   r%   version_coder*   c              3   6   K   | ]  }t        |      d   yw)02dNint)rF   rH   s     r3   rI   z0TikTokBaseIE._build_api_query.<locals>.<genexpr>   s     #fs1vclO#fs   r&   .version_namemanifest_version_coder'   update_version_code
ab_version
resolutionz	1080*2400dpii  device_typezPixel 7device_brandGooglelanguageenos_api29
os_version13acwifiis_padr#   current_regionUSapp_typenormal
sys_regionlast_install_timeiQ i# timezone_namezAmerica/New_York	residenceapp_languagetimezone_offsetz-14400host_abizarmeabi-v7alocaleac2wifi5guoo1r$   rm      ro   )carrier_region	op_regionbuild_numberregiontsr$   r7   openudid)r   r   timer;   uuiduuid4rS   rz   rQ   r<   r=   r~   r>   r{   )r1   rw   s     r3   _build_api_queryzTikTokBaseIE._build_api_query   s    ,
,
y,
 ),
 S	,

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

%,
 |,
 4>>%(,
 z2,
 BGG#fT^^M=Z=`=`ad=e#ff,
 DNN=9,
 $T^^4J%K,
 "4>>2H#I,
 $..7,
 +,
  3!,
" 9#,
$ H%,
& ',
( d),
* $+,
, &-,
. c/,
0 d1,
2 3,
4 $5,
6  TYY[!1FNN5'4R!R7,
8 /9,
: ;,
< D=,
> x?,
@ A,
B dC,
D 8E,
F 3G,
H # NN=9diik">>%%e,/AR HIW,
 , ,	r5   c	                    | j                   s3| j                         s#d}	|rt        |	d      | j                  |	       y t	        | j
                        dz   }
t        j                  d      D ]V  }| j                  t        | j                                | j                  |xs i       }	 | j                  ||||||||      c S  y # t        $ r}t        |j                  t        j                        r|j                  j                   dk(  rmt        |j                  xs |j"                        }	| j                         s|r | j                  |	       Y d }~ y | j                  |	 d| d|
 d	       Y d }~ d }~ww xY w)
Nz No working app info is availableTexpectedr   )rw   rx   rv   rs   rt   ru   r   z. Retrying... (attempt z of ))rS   rY   r   report_warninglenrL   	itertoolscountwrite_debugr;   r   r   
isinstancecausejsonJSONDecodeErrorposmsg)r1   r   r]   rw   rx   rv   rs   rt   ru   message	max_triesr   
real_queryes                 r3   	_call_apizTikTokBaseIE._call_api   s]   ~~d&=&=&?8G$Wt<<##G,++,q0	__Q' 	ES01..u{;J**
wdG + = =		 " aggt';';<PQAQ!!''"2QUU3G224 ! //8"''7)3J5'QUV_U``a(bcs%   *C	F BE;E;:E;;F c                     t        | j                  d|t        d| ddd      ddi      d	d
t        hf      }|st	        d|      | j                  |      S )Nzmulti/aweme/detail[]r#   )	aweme_idsrequest_sourcezX-Argusr*   )rx   rv   aweme_detailsr   z#Unable to extract aweme detail infor]   )r   r   r   rO   r   _parse_aweme_video_app)r1   aweme_idaweme_details      r3   _extract_aweme_appzTikTokBaseIE._extract_aweme_app   s|    #NN/@R 
!_"%T A #B  ) ,;Av*F	H
  !FQYZZ**<88r5   c                    i d}}| j                  |||d      }|du r||fS |\  }}t        j                  j                  |j                        j
                  dk(  r=d}	|r| j                  |	       | j                  |	 d| j                                 ||fS | j                  ||      x}
r?| j                  d       t        |
d	d
t        hf      xs d}t        |
d	ddt        hf      }n| j                  ||      x}r>| j                  d       t        |dd
t        hf      xs d}t        |d|t        hf      }nd| j                  ||i       x}rA| j                  d       t        |ddd
t        hf      xs d}t        |ddddt        hf      }n|rt!        d      t        |dt        hf      sNt        |dt"        hf      r;d}	|r| j                  |	       | j                  |	 d| j                          |       ||fS )NTrs   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r2   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_hintrj   r   r   r   rO   rg   _search_nextjs_datar   bool)r1   r   r]   rs   
video_datastatusresre   urlhr   universal_data	sigi_data	next_datas                r3   _extract_web_data_and_statusz)TikTokBaseIE._extract_web_data_and_status   s?   F
++CTX+Y%<v%%<<  *//8;LG))'27)2d.>.>.@-A BCv%%!55gx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27Hb2QQYQ12!)g{LSVRW-XY^]^F%i';
T`cgbh1ijJ !GHHJ4&(9:|JYnqupvXw?x^G))'27)2d.>.>.@-A BXV6!!r5   c                 $   dddd}t        t        |j                                     i }t        |dt              }|D ]  }t        |dt
        d	      }|s| j                  ||d
dd      }	|	s2|j                  |j                  dd      g       j                  ddj                  d t        |	d         D              d        |st        |dt              D ]l  }|j                  d      s|j                  |j                  d      xs dg       j                  |d   |j                  |j                  d            d       n |s|r'| j                  | j                  ||      |d      \  }}
t        |ddd f      D ]Z  }|j                  |j                  d      xs dg       j                  |d   |j                  |j                  d            d       \ |j                         D ]  \  }}t        |fd      ||<    |S ) Nr   srtvtt)creator_captionr  webvtt)interaction_stickers.auto_video_caption_infoauto_captions.expected_type)r   url_list.F)r
  get_allzDownloading captionszUnable to download captions)rt   ru   rs   r   r   z

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

start_timer   z --> end_timeN)r~   r   )rF   ilines      r3   rI   z.TikTokBaseIE._get_subtitles.<locals>.<genexpr>  s      $^4DHHU[L\ 1ugR 6tL7ID7P QRRWXnost~o  CG  pG  YH  XI  IK  LP  QW  LX  KY  Z$^s   AA
utterances)extrx   )r   cla_infocaption_infos.r   langFormatr   r  rs   r   subtitleInfosc                     |d   S )NUrlrE   r[   rH   s     r3   <lambda>z-TikTokBaseIE._get_subtitles.<locals>.<lambda>0  s    ^_`e^f r5   LanguageCodeNamer  c                      | d         S )Nr  rE   )x
preferences    r3   r   z-TikTokBaseIE._get_subtitles.<locals>.<lambda>8  s    j5>R r5   rU   )r   tuplevaluesr   rO   r   r   
setdefaultr~   appendrz   	enumerater   r^   rN   sorted)r1   r   r   	user_nameEXT_MAP	subtitlescaptions_infocaptioncaption_urlcaption_jsonr[   r  	subs_listr$  s                @r3   _get_subtitleszTikTokBaseIE._get_subtitles  s@     &

 uW^^%567
	 %hx|~$ 	G&w0HXcmrsK..X,BLiqv / xL  Z!>CJJ $^#,\,-G#H$^ ^L 	 '6aquv {{5)$$W[[%8%@D"ELL"5>";;w{{8'<=N  "&"C"C$$Y985 #D #Ra'wQf6gh $$W[[1C%D%LbQXX"5>";;w{{8'<=Z   )0 	TOD)$Y4RSIdO	T r5   c                     | j                  d|ddd      \  }}}}|si d fS ||dk(  rdn|t        |d	      xs d  t        | j                        |      d
|fS )Nz>v[^_]+_(?P<id>(?P<codec>[^_]+)_(?P<res>\d+p)_(?P<bitrate>\d+))zurl key)NNNN)idcodecr   bitrate)r2   groupbytevc1h265r   scale)	format_idvcodectbrquality)_search_regexr   r   	QUALITIES)r1   url_keyr>  r7  r   r8  s         r3   _parse_url_keyzTikTokBaseIE._parse_url_key<  s    )-););Mw7?` *< *b&	5#w t8O" % 2fwd3;t0y05	

  	r5   c                 	    |d   }|d   }i d i f fd	}g }t        |j                  d            t        |j                  d            t        fd      xs d|j                  d	      r0|j                   ||d	   d	d
t	        |dd      rdndd             |j                  d      rt|d   }t        |j                  d            |j                   ||dd|j                  d      rdndz  dt        fd      |j                  d      rdndd             |j                  d      r|j                   ||d   dd
dd             |j                  d      r|j                   ||d   dd
dd             |j                  dg       D ]m  }|j                  d	      s|j                   ||d	   |j                  d      dt        |d       t	        |dd      rdnd|j                  d       d!             o  j                  |        j                   j                        j                  d"      }|rN|D ]I  }	 j                  t        j                  j                  |	d#         j                  d"|j                         K |j                  d$      xs i }
|j                  d%      xs i }t	        |d&t        '      }t	        |d(d)t        '      }t	        |d*d+d,t        '      }|j                  d-      xr2 |j                  d.      d/j!                  |j                  d0            k(  }|r	|xs d1|}}n$|j                  d.      t	        |d,t        hf      }}t	        |d,d2t        hfd3t"        hfd4t        hfd5t        hfd6f      }d7|it	        |d8t%        d9:      hfd8t        hfd;t         hfd<      t	        |
d=d>d?d@dAt         '      |t'        |dB j(                  d C      t'        |dDdEg j(                  d C      |t#        |j                  dF            xs d |rt+        j,                  dG|      nd | j/                  ||t	        |dDdEdB            dHD cg c]"  }t	        ||dIdJf      D ]  }|||dKv rdnddL $ c}}t	        |dMdNt        dOP      ht0        f      xs t	        |dNt         hf       j3                  dQ|v dR|v dS|v T      dUdVS c c}}w )WNr   r   c                 R    t        | d      }|dk(  sd| v rd||dk(  rdn|dd d dS i S )	Nm4a)default_extmp3z-music-zMusic trackaacnone)format_noter  acodecr?  widthheight)r
   r  s     r3   
audio_metaz7TikTokBaseIE._parse_aweme_video_app.<locals>.audio_metaN  sN    7C c!1  -#&%<%S  : 8::r5   c                    j                  | j                  dd            \  }}|j                  d      dk(  }|rj                  |i       j                  dt        | j                  d                   |   j                  dt        | j                  d                   |j	                  j                  |i              |j                  dt        |d d              | j                  d      xs g D cg c]c  }|t        | j                  d	            d
dd|v rdndd|||rdndt        |j                  d      d|v rdnd |rdnd d      d |      e c}S c c}w )NrD  r*   r?  bytevc2rP  rO  r   r  	data_sizemp4rK  zaweme/v1)r   filesizer  rN  source_preferencerM  z(API)z(UNPLAYABLE) )delim)r$  rM  )rE  r~   r(  r   updater   )	addradd_metaparsed_metar   
is_bytevc2r   rQ  known_resolutionsr1   s	         r3   extract_addrz9TikTokBaseIE._parse_aweme_video_app.<locals>.extract_addrY  sw   #22488Ir3JKK$2i?J!,,S"5@@;W[W_W_`hWiKjk!#&11';txxPWGX;YZ""#4#8#8b#AB##Hk#cr(.CD *-35  '(=>+5+<R"  * '1db,LL/J#<MSW&0Nd# G S/ 5 5 5s   9A(E$rO  rP  c                       z  S rD   rE   )rP  rO  s   r3   r   z5TikTokBaseIE._parse_aweme_video_app.<locals>.<lambda>t  s     r5         ?	play_addrzDirect video
is_bytevc1is_h265r;  h264)r>  rM  r?  rO  rP  download_addrzDownload video%shas_watermarkz, watermarkedr*   c                       t         z        S rD   r   )dl_widthratios   r3   r   z5TikTokBaseIE._parse_aweme_video_app.<locals>.<lambda>  s    3x%/?+@ r5   rV  r   )r>  rM  r?  rO  rP  r$  play_addr_h264)r>  rM  r?  play_addr_bytevc1bit_rate	gear_namezPlayback videoc                     | d   dz  S )Nrp  r   rE   r#  s    r3   r   z5TikTokBaseIE._parse_aweme_video_app.<locals>.<lambda>  s    a
md6J r5   FPS)r>  rM  r@  r?  fpsrp   r   
statisticsmusic)hybrid_label.r  r	  )matched_songtitle)matched_pgc_soundrz  )ry  author)r{  r|  r|  is_original_soundrz  zoriginal sound - {}owner_handleoriginal sound	unique_iduidnicknamesec_uid)uploaderuploader_idr   
channel_idr6  descH   leftcreate_time)rz  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  r6  r   r$  )Nri  durationr   r<  PrivatezFriends onlyzFollowers only)
is_privateneeds_subscriptionis_unlisted)rA  r7  sizebr)channel_urluploader_urltrackr  artistsformatsr.  
thumbnailsr  availability_format_sort_fields)r   r~   r   extendr   r   _remove_duplicate_formatsr|   r}   ry   r   r   r   hostnamer   r;   formatr   r   r   _UPLOADER_URL_FORMATrerQ   extract_subtitlesany_availability)r1   r   r   
video_inforb  r  ri  r8  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_urlrQ  rl  rP  ra  rm  rO  s   `                    @@@@@@r3   r   z#TikTokBaseIE._parse_aweme_video_appI  s   
+!'*
		: )+ 	50 JNN734Z^^H56/0:F>>+&NN<
;(?(-$0i%9&>D B   >>/*&7M"=#4#4W#=>HNN<,1
WfHg_mop !"#@A$.NN?$Cb8   >>*+NN<
3C(D-- G  
 >>-.NN<
3F(G0- J   "~~j"5 		G{{;'|GK,@!([!9#3"7,JK(4y):f?E";;u-C   		 	&&w/''(:(:;??I h  !6!6qx!@!I!I8U`UfUfgh "%%l39r
!%%g.4"
l,IY\] ,13Qad!f!-24SU]mp"r #-..1D"E  #b*..Y`Jaez  fB  fB  CM  CQ  CQ  R`  Ca  fb  Kb"(=(QAQSiK(2w(?j[cfiejZkAlK"<($se,!K=1"SE*$se,	=
 2  (*
< ?#;"<= &+k];* *
 :** -!0	(
 )**
 *
 (\4C\C\fjk(j-8$:S:S]ac  !89AT@Lrxx|<RV//h[*m]i(jl!M
  ".j8ZQT:U!V
  #$(04M(M"SU

 &j'k6M5NPS3U V I
Z+,GH ..$.#1V#;,6 / 8 $FS*
 *	
.
s   6'S1c                    dddd}t        |dt        hf      xs i }t        |j                  d            t        |j                  d            t	        fd      xs d	}g }t        |d
d f      D ]#  }| j                  t        |ddt        hf      xs d      \  }}|j                  d      dk(  }	|j                  |	rdnd |	rdndt        |ddt        hf      d       |xr t        |d d       x}
r]|
dk(  rd}
|dk  r)t        |
|z        }|j                  |
||dz  z
  d       n(t        |
|z        }|j                  ||dz  z   |
d       t        |dddt        hf      D ]*  }|j                  i ||d| j                  |      i       , & t        |fddt        f      }t        |d d!t        hf      D ],  }|j                  i |d"| j                  |      |d#       . t        |d$t        hf      D ]+  }|j                  i |d%| j                  |      d&d'd(       - | j                  |       |smt        |d)d*t        hf      rY|d)   d*   }t        t        |      d+dd, ht        hf      xs d-}|j                  d.| j                  |      ||d-k(  rdn|d/d0       |D cg c]4  }t         j"                  j%                  |d         j&                  d1k7  s3|6 c}S c c}w )2NrU  rh  rK  )r  r?  rN  r   rO  rP  c                       z  S rD   rE   )play_height
play_widths   r3   r   z3TikTokBaseIE._extract_web_formats.<locals>.<lambda>  s    k!9 r5   rd  bitrateInfoc                     |d   d   S )NPlayAddrUrlListrE   r  s     r3   r   z3TikTokBaseIE._extract_web_formats.<locals>.<lambda>  s    RST^R_`iRj r5   r  UrlKeyr*   r?  rS  
UNPLAYABLErY  r   DataSize)rM  r$  rW  i  @  r   r   )rO  rP  r  .r   c                     |d   k(  S )NrO  rE   )r[   rH   r  s     r3   r   z3TikTokBaseIE._extract_web_formats.<locals>.<lambda>  s    1W:;S r5   rA  playAddr)).srcNplay)r>  r   rO  rP  rA  )downloadAddr)downloadr   r  watermarkedrV  )r>  r   rM  r$  rw  playUrl	mime_typec                 &    | j                  dd      S )Nr[   rJ   )replacers  s    r3   r   z3TikTokBaseIE._extract_web_formats.<locals>.<lambda>3  s    AIIc3,? r5   rH  audiorL  )r>  r   r  rN  r?  zwww.tiktok.com)r   rO   r   r~   r   rE  r;   r\  r   r   r)  _proto_relative_urlr  r  r   r   r   r   r   r  )r1   r   COMMON_FORMAT_INFOr  rm  r  bitrate_infoformat_infor   r`  	dimensionyr#  	video_urlplay_qualityplay_urldownload_url	audio_urlr  r  r  r  s                       @@r3   _extract_web_formatsz!TikTokBaseIE._extract_web_formats  s   

 ",4&0ABHb
 !89
!*..":;9:Df(mEj5kl  	L#22\J3%+HIOR QK %2i?J/9|t&0db(
JQ\P]7^_   !2SSb]3y3# #I19I-.A&&!*"#q1u+( 
 I-.A&&!"a!e"+( 
 *,YPSVaUb8cd 	  ( !  433I>  7 	F $G.SU^`c-de$Z*>RU`Ta1bc 	HNN $#//9#%' 	 )6[^i]j5kl 	LNN $'//=,  	 	&&w/ <w	K=6YZ$W-i8Ix	2R"?!@<.5R S \V[ NN$//	:#&%<%S   #cafll&;&;AeH&E&N&NRb&bcccs   =4K92K9c                    t        |ddt        hfdt        hfdt        hfdt        hfdfd      }||rd n| j                  |      |rd n| j	                  ||d       d	|id
|t        |d| j                  d       t        |ddg| j                  d       dt        |ddt        hfdt        ht        fdt        hd hfdt        hfdf      t        |dt        d      hfdt        hfddt        ht        fdt        hfd      t        |dddd d!d"ft        #      d$d%D cg c]7  }t        |d&|t        hf      D ]  }|| j                  |      |d'k(  rd(nd)d*  9 c}}iS c c}}w )+N)
authorInfor|  Nr  )authorSecIdsecUid)uniqueIdr|  )authorIdr  r6  )r   r  r  r  Fr  Referer)r6  r  r.  http_headersr  r   r  r  )r  r  rw  rz  r  
authorNamec                 6    | rt        j                  d|       S d S )Nr  )r  rQ   rs  s    r3   r   z5TikTokBaseIE._parse_aweme_video_web.<locals>.<lambda>S  s    Z[BHH]TU<V ae r5   r  )r  r  r  r  r  r  r  r   
createTime)rz  r  r  r  stats	playCount	diggCount
shareCountcommentCountr  r	  r  )	thumbnailr  dynamicCoveroriginCover)Nr   r  rV  r   r  )r   r;   r   r  r  r   r  filterr   r   r   r  )r1   r   webpage_urlr]   extract_flatr  r  r  s           r3   _parse_aweme_video_webz#TikTokBaseIE._parse_aweme_video_web?  s   "<2P"SE*4se</#75}E	S
 2
  +t1J1J<1X!-43I3I,X`bf3g&4	%

 %
 (\4C\C\fjk(j-8$:S:S]ac%
 <'!C5)!C5&1(3%2e1fg'+7	4 * %
 < ?#;"<= &$j;-H*[M:* %
, <')) ,!/	4 *
 *+-%
8  !V !-l_hYdXe<f!g  #33I>(0N(B"9%
 %	
8s   (<E*
)NNNTzDownloading API JSONzUnable to download API page)TF)__name__
__module____qualname__r  r}   rC  rM   rL   rS   rT   	functoolscached_propertyr4   r.   r>   rA   rY   staticmethodr^   rg   rj   r   r   r   r   r   r4  rE  r   r  r   rE   r5   r3   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-
r5   r   c                      e Zd ZdZde dgZddi dddd	d
ddddddddddddddddddddddd d!ed"ed#eed$d%d%d&d'd(d)d*i dd+dd	d
d,dd-dd.dddddd/dd0dd1d2d3d4d5d6d7dddd8dd9d!eeeeg d:d;d<d=d>i dd?dd	d
d@dd@ddAd6dBddCddDd2dEd4dFdGdHdIdBgddJddKddddLd!eeeedMdNdOi ddPdd	d
dQddQddRd6dSddTddUd4dVdGdWddXddYddddZd!ed"ed#ed[eid\d]d^i dd_dd	d
d`ddaddbd6dcddddded2dfd4dgdGdhddiddjddddkdIdcgd!eeeedMdNdli ddmdd	d
dnddnddoddpddqdrdsdtdudGduddvddwddxd!ed"ed#ed[ed\d]dyi ddzdd{d
d|ddad6d}dd~ddddd2dd4ddIdgdGdddddddd!ed"eeedddNddi dddd	d
dddd6dddddddd2dd4ddIdgdGdhddddddd!ed"eeeddddgdddi dddd	d
dddddddddd4dd6ddIdgdGdhddddddd!ed"ed#eedddd(ddi ddddd
dddddddddd2dd4dd6ddIdgdtddGdddddddd!eeeeddd=dddgZd Zy)r0   zMhttps?://www\.tiktok\.com/(?:embed|@(?P<user_id>[\w\.-]+)?/video)/(?P<id>\d+)z,<(?:script|iframe)[^>]+\bsrc=(["\'])(?P<url>r   z>https://www.tiktok.com/@leenabhushan/video/6748451240264420610 736bb7a466c6f0a6afeb597da1e6f5b7r6  6748451240264420610r  rU  rz  z!#jassmanak #lehanga #leenabhushanr  r     rP  i   rO  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   r  r  z<https://www.tiktok.com/@barudakhb_/video/69841386513368384026984138651336838402u.   Balas @yolaaftwsr hayu yu ? #SquadRandom_ 🔥
barudakhb_z$md5:29f238c49bc0c176cb3cef1a9cea9fa66974687867511718913z"https://www.tiktok.com/@barudakhb_zdhttps://www.tiktok.com/@MS4wLjABAAAAbhBwQC-R1iKoix6jDFsF-vBdfx2ABoDjaZrM9fX6arU3w71q3cOWgWuTXn1soZ7dzLMS4wLjABAAAAbhBwQC-R1iKoix6jDFsF-vBdfx2ABoDjaZrM9fX6arU3w71q3cOWgWuTXn1soZ7dr  z
Boka Dancer  i`   20210712)r  r  r  r   r  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   r  r  z?https://www.tiktok.com/@pokemonlife22/video/70596983745676116947059698374567611694z!TikTok video #7059698374567611694r*   pokemonlife22Pokemon6820838815978423302z%https://www.tiktok.com/@pokemonlife22zdhttps://www.tiktok.com/@MS4wLjABAAAA0tF1nBwQVVMyrGu3CqttkNgM68Do1OXUFuCY0CRQk8fEtSVDj89HqoqvbSTmUP2WLMS4wLjABAAAA0tF1nBwQVVMyrGu3CqttkNgM68Do1OXUFuCY0CRQk8fEtSVDj89HqoqvbSTmUP2Wr  iKa   20220201z:https://www.tiktok.com/@denidil6/video/70657990231306437137065799023130643713u   #denidil#денидилdenidil67046664115636405250zdhttps://www.tiktok.com/@MS4wLjABAAAAsvMSzFdQ4ikl3uR2TEJwMBbB2yZh2Zxwhx-WCo3rbDpAharE3GQCrFuJArI3C8QJr  zHolocron Musicr  z[Wolf Sounds (1 Hour) Enjoy the Company of the Animal That Is the Majestic King of the Nightib   20220217z@https://www.tiktok.com/@_le_cannibale_/video/71399804611320742837139980461132074283rJ  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   r  r  expected_warningsz;https://www.tiktok.com/@tatemcrae/video/7107337212743830830 982512017a8a917124d5a08c8ae796217107337212743830830uO   new music video 4 don’t come backkkk🧸🖤 i hope u enjoy !! @musicontiktok	tatemcrae86328792343818240zdhttps://www.tiktok.com/@MS4wLjABAAAA-0bQT0CqebTRr6I4IkYvMDMKSRSJHLNPBo5HrSklJwyA2psXLSZG5FP-LMNpHnJdzLMS4wLjABAAAA-0bQT0CqebTRr6I4IkYvMDMKSRSJHLNPBo5HrSklJwyA2psXLSZG5FP-LMNpHnJdz
tate mcrae20220609iUb   zre:^https://.+\.webpr  r  z6Unavailable via feed API, only audio available via webz>https://www.tiktok.com/@hara_yoimiya/video/7253412088251534594 2ff8fe0174db2dbf49c597a7bef4e47d7253412088251534594rH  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                    | j                  |      j                  dd      \  }}| j                  r	 | j                  |      S | j                  ||      }| j                  ||      \  }}|r|dk(  r| j                  |||      S |dv r| j                  d       n|dk(  rt	        d	d
      t	        d| |      # t        $ r%}d|_        | j                  | d       Y d }~d }~ww xY w)Nr6  r\   Tz; trying with webpager   )i'  '  zQYou do not have permission to view this post. Log into an account that has accessi'  z3Your IP address is blocked from accessing this postr   z!Video not available, status code r   )_match_valid_urlr9  r4   r   r   r   r   r^   r   r   r   )r1   r   r]   r\   r   r   r   s          r3   _real_extractzTikTokIE._real_extractz  s    11#6<<T9M'A..x88
 w1!>>sHM
F&A+..z3II~%%%ceu_ !Vaeff@IT\]] " A!
##qc)>$?@@As   B< <	C*C%%C*N)r  r  r  
_VALID_URL_EMBED_REGEXr   _TESTSrZ  rE   r5   r3   r0   r0   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^r5   r0   c            	           e Zd ZdZdZddddddgd	d
idddddddgd	d
idddddddgd	d
idddddidgd	d
idgZdZd ZddZd Z	d Z
y)TikTokUserIEztiktok:userzK(?:tiktokuser:|https?://(?:www\.)?tiktok\.com/@)(?P<id>[\w.-]+)/?(?:$|[#?])z&https://tiktok.com/@corgibobaa?lang=en-   LMS4wLjABAAAAepiJKgwWhulvCpSuUVsp7sgVVsFJbbNaLeQ6OQ0oAJERGDUIXhb2yxxHZedsItgT
corgibobaar6  rz  &TikTok API keeps sending the same pageextractor_retriesr>  )r   playlist_mincountr  rG  paramsz+https://www.tiktok.com/@6820838815978423302   r2  r1  zhttps://www.tiktok.com/@memeiQ  LMS4wLjABAAAAiKfaDWeCsT3IHwY77zqWGtVRIy9v4ws1HbVi7auP1Vx7dJysU_hc5yRiGywojRD6memezWtiktokuser:MS4wLjABAAAAM3R2BtjzVT-uAtstkl2iugMzC6AtnpkojJbjiOdDDrdsTiTR75-8lyWJCY5VvDrZ   r6  zLMS4wLjABAAAAM3R2BtjzVT-uAtstkl2iugMzC6AtnpkojJbjiOdDDrdsTiTR75-8lyWJCY5VvDrZz-https://www.tiktok.com/api/creator/item_list/c                    i ddddddddd	d
ddddddddddddd|d| j                   ddddddddddddd d d!d"d#|d$d%d&d j                  t        j                  t        j
                  d'(             dd)S )*Nr(   1988r   r   r%   
tiktok_webbrowser_languagezen-USbrowser_nameMozillabrowser_onlinetruebrowser_platformWin32browser_versionz5.0 (Windows)r   cookie_enabledr   15cursorr7   r   web_pcfocus_state	from_pageuserhistory_len2falsewindowsr*   r   10801920r   UTCverify_   ro   )is_fullscreenis_page_visibler   r   priority_regionrefererr   screen_heightscreen_widthr  typetz_nameverifyFpwebcast_language)r>   rz   r<   r{   string	hexdigits)r1   r  ry  s      r3   _build_web_queryzTikTokUserIE._build_web_query  s+    
6 
D 
  
 	 

 I 
 f 
  
  
 | 
 f 
 T 
 f 
  
 x 
 6 
  ! 
" 3# 
$ %%!#"!"''&..9I9IQ*O"P!QR $? 
  	
r5   c              #   p  K   |xs |}t               }t        t        j                         dz        }t        j                  d      D ]i  }| j                         D ]  }| j                  | j                  |d| | j                  ||            }	t        t        |	dddt        hf            }
|
sV|
t        |      k(  sed}| j                  rt        | d	d
      | `t        | dd
      |_         t        	dd f      D ]\  }|d   }||v r|j!                  |       | j#                  ||      } | j$                  |t&        fi | j)                  |||d
       ^ |}t        |	dddd hf      }|r||k(  r|dz
  }|dk  st        |	d      s y |sU|rY| j+                  d       l y w)N     @@r   Downloading page rw   itemList.r6  rd  z&. Try again with a different device_idTr   z+. Taking measures to avoid an infinite loopc                     |d   S Nr6  rE   r  s     r3   r   z'TikTokUserIE._entries.<locals>.<lambda>  
    !D' r5   r  r   r  c                     t        | dz        S )Nr  r   rs  s    r3   r   z'TikTokUserIE._entries.<locals>.<lambda>  s    CCL r5   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   r>   erroraddr^   
url_resultr0   r   r   )r1   r  r,  
fail_earlyrf   seen_idsry  pageretryresponsecurrent_batchr   r   r]   r  
old_cursors                   r3   _entrieszTikTokUserIE._entries  s    )'
5TYY[3&'OOA& -	;D**, `..&&
6Gv4N//@ / B !'|Hz3PTWZV[>\'] ^ ]fX6F%FFG,,,&i'MNY]_ _ "0")#NOZ^#`EK`$ &h=Q0RS d ;x'X&"..z8D%dood11%h]a1bd dd  J!:r<:P9QRTFZ61#n4%\(DU-V
 ()):;W-	;s   B/F62F6CF6F6!F6c           	         | j                  d| |ddd      }|s| j                  d       y t        | j                  d|d|i       d	dd
| t        hf      }t        |dddt
        hf      D ]U  }| j                  ||      }| j                  ||d      \  }}| j                  |||d      j                  d      }|sS|c S  y )Nzhttps://www.tiktok.com/embed/@zDownloading user embed pageF)ru   rs   z?This user's account is either private or has embedding disabledz;<script[^>]+\bid=[\'"]__FRONTITY_CONNECT_STATE__[\'"][^>]*>rx   r   sourcez/embed/@	videoList.r6  r  Tr  r  )
_download_webpager   r   rc   rO   r;   r^   r   r   r~   )	r1   r,  re   rx   r   r  r   r[   r  s	            r3   _extract_sec_uid_from_embedz(TikTokUserIE._extract_sec_uid_from_embed  s   ((,YK8))5 ) G  bcD--JVY . 4 v)5v>@
 %TKdSE+JK 	H**9h?K ==k8[`=aMJ11K 2 FFIc,FW 	 r5   c                 ~   | j                  |      d }}t        j                  d|      rd |}}d}n| j                  | j                  |z  |dddd      xs d}t        | j                  ||      dt        hf      xs i }t        |d	d
dt        ht        f      }|s&|j                  d      dk(  r| j                  d       n|dk(  rt        dd      t        |d	ddt        hf      }|rt        |d       }n| j                  |      }d}|st        dd      | j                  | j!                  |||      ||      S )NzMS4wLjABAAAA[\w-]{64}TzDownloading user webpagezUnable to download user webpageFr   r*   webapp.user-detailuserInfo)r  statsV2
videoCountr   rX  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   rj   rO   r   r  r~   r   r   r;   r  playlist_resultr  )r1   r   r,  r  r  re   detailvideo_counts           r3   rZ  zTikTokUserIE._real_extract)  s}   !^^C0$7	<<0)<!%ywIJ,,))I5y*,M - / 5 35  "(()<?SVZU[>\^ dac &v
<PR^ad`egj/klK6::l#;u#D))Z\!$%S^bcc"6J3%+PQG!-f6S!TT
::9E"
 KUY[ [
 ##DMM'9j$QSZ\effr5   Nr  )r  r  r  IE_NAMEr[  r]  r  r  r  r  rZ  rE   r5   r3   r_  r_    s    G_J7`!
 GG&+	 =`*
 GG&+	 . `
 GG&+	 i`
 GG&+7#FH DM!
F2;h.gr5   r_  c                       e Zd Zd Zd Zy)TikTokBaseListIEc           
   #   r  K   | j                   |ddddddd| j                  i}t        j                  d      D ]  }| j	                         D ]&  }	 | j                  | j                  ||d	| d
      }( j                  dg       D ]5  }i | j                  |      t         j#                         dd|d    d 7 |j                  d      s y |d   |d<    y # t        $ rO}t        |j                  t        j                        r%|j                  j                  dk(  r||_        Y d }~ d }~ww xY ww)Nry  r   r      r  rh  r7   r   zDownloading video list page zUnable to download video list)rw   rt   ru   
aweme_listTikTokzhttps://tiktok.com/@_/video/r   )extractor_key	extractorr  has_more)_QUERY_NAMEr>   r   r   r  r   _API_ENDPOINTr   r   r   r   r   r   r  r~   r   r0   r-   )	r1   list_idrf   rw   r  r  	post_listr   r   s	            r3   r  zTikTokBaseListIE._entriesL  sQ    gaRA
 OOA& 	2D**, 
	 $**Je;D6B ? !/ !AI
 #|R8 11%8%-__%6!)%A%
BSAT#U	  ==,'1E(O+	2 & !!''4+?+?@QWW[[TUEU&' 	s8   AD7#C2A*D7	D4%AD/)D7.D//D44D7c                 h    | j                  |      }| j                  | j                  ||      |      S rD   )r  r  r  )r1   r   r  s      r3   rZ  zTikTokBaseListIE._real_extractl  s.    ..%##DMM'7$CWMMr5   N)r  r  r  r  rZ  rE   r5   r3   r  r  K  s    2@Nr5   r  c                   H    e Zd ZdZdZdZdZdZdddd	id
gdddddid
gdgZy)TikTokSoundIEztiktok:soundzBhttps?://(?:www\.)?tiktok\.com/music/[\w\.-]+-(?P<id>[\d]+)[/?#&]?Fmusic_idzmusic/awemezEhttps://www.tiktok.com/music/Build-a-Btch-6956990112127585029?lang=end   r6  6956990112127585029Retryingr   rf  r  rG  zBhttps://www.tiktok.com/music/jiefei-soap-remix-7036843036118469381i  7036843036118469381N	r  r  r  r  r[  _WORKINGr  r  r]  rE   r5   r3   r  r  q  s_    GVJHK!MV '
 )\ T!'
 )\Fr5   r  c                   >    e Zd ZdZdZdZdZdZdddd	id
gddddgZy)TikTokEffectIEztiktok:effectzDhttps?://(?:www\.)?tiktok\.com/sticker/[\w\.-]+-(?P<id>[\d]+)[/?#&]?F
sticker_idzsticker/awemez7https://www.tiktok.com/sticker/MATERIAL-GWOOORL-1258156r  r6  1258156r  r  z0https://www.tiktok.com/sticker/Elf-Friend-479565TrU  Nr  rE   r5   r3   r  r    sL    GXJHK#MH )
 )\ BFr5   r  c                   F    e Zd ZdZdZdZdZdZdddd	d
dgddddgZd Z	y)TikTokTagIEz
tiktok:tagz3https?://(?:www\.)?tiktok\.com/tag/(?P<id>[^/?#&]+)Fch_idzchallenge/awemez https://tiktok.com/tag/hello2018'   46294678	hello2018rc  r  r  u=   https://tiktok.com/tag/fypシ?is_copy_url=0&is_from_webapp=v1TrU  c                     | j                  |      }| j                  ||ddi      }| j                  d|d      }| j                  | j	                  ||      ||      S )Nrq   zIfacebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)rv   z"snssdk\d*://challenge/detail/(\d+)ztag ID)r  r  _html_search_regexr  r  )r1   r   rf   re   tag_ids        r3   rZ  zTikTokTagIE._real_extract  sl    ^^C(
((jeC
(  (()NPWYab##DMM&*$EvzZZr5   N)
r  r  r  r  r[  r  r  r  r]  rZ  rE   r5   r3   r  r    sS    GGJHK%M1 
 )\ OF[r5   r  c                   R    e Zd ZdZdZddddddd	d
ddddgZdZdZd Zd Z	d Z
y)TikTokCollectionIEztiktok:collectionzehttps?://www\.tiktok\.com/@(?P<user_id>[\w.-]+)/collection/(?P<title>[^/?#]+)-(?P<id>\d+)/?(?:[?#]|$)zMhttps://www.tiktok.com/@imanoreotwe/collection/count-test-73713301593763704627371330159376370462zimanoreotwe-count-testrc  	   )r   r  playlist_countzOhttps://www.tiktok.com/@imanoreotwe/collection/%F0%9F%98%82-71118871895711608757111887189571160875zimanoreotwe-%F0%9F%98%82r  )r   r  rf  z0https://www.tiktok.com/api/collection/item_list/r+  c                 &    d|| j                   |ddS )Nrm  113)r(   collectionIdr   ry  
sourceType)_PAGE_COUNT)r1   collection_idry  s      r3   r  z#TikTokCollectionIE._build_web_query  s!    )%%
 	
r5   c              #     K   d}t        j                  d      D ]  }| j                  | j                  |d| | j	                  ||            }t        |dd f      D ]c  }|d   }t        |dd	t        ht        f      xs d
}| j                  ||      } | j                  |t        fi | j                  |||d       e t        |d      s y || j                  z  } y w)Nr   r   r  r  r  c                     |d   S r  rE   r  s     r3   r   z-TikTokCollectionIE._entries.<locals>.<lambda>  r  r5   r6  r|  )r  r  r6  r[   Tr  hasMore)r   r   r   r  r  r   r;   r  r^   r  r0   r   r  )	r1   r  ry  r  r  r   r]   r|  r  s	            r3   r  zTikTokCollectionIE._entries  s    OOA& 	'D**""M5Ftf3M++M6B + DH &h=Q0RS d ;%eh8TWZV[]`-abifi"..vx@%dood11%h]a1bd d	d  )4d&&&F	's   C"C$c                     | j                  |      j                  ddd      \  }}}| j                  | j                  |      |dj	                  ||f            S )Nr6  rz  r\   -)rY  r9  r  r  rz   )r1   r   r  rz  r,  s        r3   rZ  z TikTokCollectionIE._real_extract  s]    *.*?*?*D*J*J4QXZc*d'ui##MM-(-9eBT9UW 	Wr5   N)r  r  r  r  r[  r]  r  r  r  r  rZ  rE   r5   r3   r  r    sf    !GyJ _'-
  a'/
 !F" GMK
'&Wr5   r  c                   6   e Zd ZdZddi dddddd	d
d	ddddddddddddddddddddgdeded eed!d"d#d$d%i dd&dddd'd
d'dd(dd)dd*dd+dd,dd-dd.dd/dd0dd,gdeded eed!d"d#d1d2i dd3dddd4d
d4dddddddddddd5dd6dd7ddddgdeded eed!d"d#d8d9d:dd;dd<d=deeeed>d?d@dAdBi ddCddddDd
dDddddddddddddEddFddGddddgdeded eed!d"d#gZdHZdIZdJ ZyK)LDouyinIEz3https?://(?:www\.)?douyin\.com/video/(?P<id>[0-9]+)z0https://www.douyin.com/video/6961737553342991651 9ecce7bc5b302601018ecb2871c63a75r6  6961737553342991651r  rU  rz  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?grN  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`)r6  r  rz  r  r  r  r  r  r  r  r  zNo longer availabler  z0https://www.douyin.com/video/6963263655114722595 1440bcf59d8700f8e014da073a4dfea86963263655114722595u8   #哪个爱豆的105度最甜 换个角度看看我哈哈   ik{`20210517zhttps://www.douyin.com/user/%szhttps://www.douyin.com/c           
      
   | j                  |      }t        | j                  d|ddd|id      dt        hf      }|s6t	        d| j                  | j                        j                  d	       
      | j                  |      S )Nz1https://www.douyin.com/aweme/v1/web/aweme/detail/zDownloading web detail JSONz"Failed to download web detail JSONr   F)rw   rs   r   z4Fresh cookies (not necessarily logged in) are needed
s_v_web_idr   )	r  r   r   rO   r   r|   r}   r~   r   )r1   r   r]   r  s       r3   rZ  z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2r5   N)	r  r  r  r[  r   r]  r  r}   rZ  rE   r5   r3   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3r5   r  c                      e Zd ZdZdZdi dddddd	d
ddddedededddddddddddeddddd d	d!d"d#d$d%i dd&dddd'd
d(dd)dedededddd*dd+dd,dedd-dd.d d'd/d0d1d-id$d2d3d4gZd5 Zy6)7
TikTokVMIEzFhttps?://(?:(?:vm|vt)\.tiktok\.com|(?:www\.)tiktok\.com/t)/(?P<id>\w+)z	vm.tiktokz"https://www.tiktok.com/t/ZTRC5xgJpr6  7170520270497680683r  rU  rz  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  rh  r  i:΂cr  r  Pixiesr  zWhere Is My Mind?r  sigmachaddeus	SigmaChad)r  r  r&  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/ZSe4FqkKdTrU  c                     | j                  t        |      | j                  |      ddi      j                  }| j	                  |      rt        |      | j                  |      S )Nrq   zfacebookexternalhit/1.1r  )_request_webpager   r  r   suitabler   r  )r1   r   new_urls      r3   rZ  zTikTokVMIE._real_extract  sb    ''dnnS1LJc;d ( ffifi 	==!"7++w''r5   N)r  r  r  r[  r  r   r]  rZ  rE   r5   r3   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(r5   r  c                   v    e Zd ZdZdZddddddd	d
ded	ddiddddeddddded	ddddddddgZddZd Z	y) TikTokLiveIEz(?x)https?://(?:
        (?:www\.)?tiktok\.com/@(?P<uploader>[\w.-]+)/live|
        m\.tiktok\.com/share/live/(?P<id>\d+)
    )ztiktok:livez,https://www.tiktok.com/@weathernewslive/live7210809319192726273rU  u(   re:ウェザーニュースLiVE[\d\s:-]*u   ウェザーニュースLiVEweathernewslive6621496731283095554z'https://www.tiktok.com/@weathernewsliveis_live)	r6  r  rz  r  r  r  r  live_statusconcurrent_view_countskip_downloadm3u8)r   r  rg  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=enTrU  z&https://www.tiktok.com/@iris04201/liveNc                     t        | j                  ||ddd||i      |t        hfi       }t        |j	                  d            dk(  r|S |st        dd	
      t        |      )NFr(   rm  )rs   rw   r   r   r   zThis livestream has endedTr   r   )r   r   rO   r   r~   r   r	   )r1   r   paramroom_idr  rU   r  s          r3   r   zTikTokLiveIE._call_api  sz     3 3vw. !4 ! tfr	+ x||H-.!3O !<tLL8,,r5   c                      j                  |      j                  dd      \  }}|sO j                  t        |d  j                        |d      }t         j                  ||      ddddt        hf      }|r|si j                  ||xs || 	      } j                  ||xs |      }|xs t        |d
dt        ht        f      }|xs t        |d
dt        ht        f      }|st        |      g } j                  dd||d      t        d      } fdt        ddddhdt        hfi       j                         D ]  \  }}	t        |	ddhdt        hfdt        d      hfdd hfd f      }
t        |	dd!t         hf      }|r!|j#                  |d!d"|  ||      d#|
       t        |	dd$t         hf      }|s|j#                  |d%d&d'|  ||      d(|
        fd)}d*D ]T  }	t        d|	 d+t         hf      }|s|j#                  ||	d$k(  rd%nd!|	d$k(  rd&nd,|	 d- ||	 d.       |d/      d0       V t        dd1t        hfi       j                         D ]F  \  }}t!        |      s|j#                  |d!d"| j%                          |d2|       ||      d3       H t        |d4       s[t'         j                  d5d6||d7            t!        j)                  d8            r!|j#                  d8   d%d&d9d: |d;      d0       |xs t        d<d=      }||t        |d  j                        xs d d|d>d?t        d@dAdt*        hfdBdCt        hfdDdEF      S )GNr  r6  T)r   r  r  r}  roomIdr  ))LiveRoomliveRoomUserInfor}  )
UserModuleusers.r  r   z,https://webcast.tiktok.com/webcast/room/infor3  rx   r%  )
SD1ldSD2sdHD1hdFULL_HD1uhdORIGIONoriginc                 (    j                  | d       S rD   )_parse_json)r#  r1   s    r3   r   z,TikTokLiveIE._real_extract.<locals>.<lambda>  s     0 0D 9 r5   
stream_urllive_core_sdk_data	pull_datastream_datar   main
sdk_paramsVCodecvbitrater   r<  r   c                 f    t        j                  d|       j                         j                         S )Nz(?i)\d+x\d+|\d+p)r  matchr9  lowerrs  s    r3   r   z,TikTokLiveIE._real_extract.<locals>.<lambda>  s%    ATVW8X8^8^8`8f8f8h r5   )r?  r@  r   flvzflv-)r   r  r>  rA  hlsrU  m3u8_nativezhls-)r   r  protocolr>  rA  c                  <    t        dg| hdt        h      S )NrF  rL  )r   r;   )keys	live_infoparse_inners    r3   
get_vcodecz.TikTokLiveIE._real_extract.<locals>.get_vcodec.  sE    	,E#,E&1],E4<,E?Be,E F Fr5   )rR  rtmp	_pull_urlhttpsz-pull_pull_url_paramsrB  )r   r  rT  r>  r?  rA  flv_pull_urlflv_pull_url_params)r   r  r>  r?  rA  c                     |d   dk(  S )Nr  rU  rE   r  s     r3   r   z,TikTokLiveIE._real_extract.<locals>.<lambda>J  s    !E(e2C r5   z'https://www.tiktok.com/api/live/detail/roomIDLiveRoomInfoliveUrlzhls-fallbackrh  rC  )	ownerInfor  )ownerrf   )rA  r  )r6  r  r  r'  r  r  rz  rd  re  )rf  r  )
user_count)liveRoomStats	userCount)rz  r  r  r)  Fr  )rY  r9  r  r   r  r   rj   r;   rg   r  r	   r   r   rO   rN   r   r   r)  rP  r   r~   r   )r1   r   r  r3  re   rx   r  get_qualityrA  streamrK  flv_urlhls_urlrY  rF  f_idf_urlrW  rX  s   `                @@r3   rZ  zTikTokLiveIE._real_extract  sq    11#6<<ZN',,XtT-F-FG_c - eG"(((;%z68cUKMG w,,S(2EgQX[,YG''1DWED Fd 6./7#5E "FG   H< 8./9C5#7G $HH x00NN:IwPX^d # f	   op9+I2Kvv8/8: <<AEG	OGV &fv|k]#cU+"[t%<$=>+.h-ijU / J #6FEK=+IJG" #'y!1*73	 
 !   #6FEK=+IJG"  -#'y!1*73  !  -	>	F & 
	F%i,6()@TWbVc1deJ%$*eO5175g$*85!1(F83C)DE*95  
	 (	L.SWRX3Yceflln 		KD%u%NN#D6]002$%:DA&t, 		 G%CD#It~~98Wh\j 0> 0l mI9==34$Y/  -!/$*84   j|I7PRij  (49R9RS[W[#5
 9  6{mL?*X[fZg)h	'
 
 	
r5   rD   )
r  r  r  r[  r  r   r;   r]  r   rZ  rE   r5   r3   r#  r#    s    	J G >'@5)0E$%(

 #F+ ;'%&0B$%(

  R 8?"FH-t
r5   r#  ).r  r   r   r<   r  r  r   urllib.parser   r   commonr   
networkingr   utilsr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r0   r_  r  r  r  r  r  r  r  r#  rE   r5   r3   <module>rt     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
r5   