
    VGh                       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     `/var/www/it7/html/youtubeDownloader/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   `[/MM$0 )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                 F   | 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              = 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!\]QF$s   
	/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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   sG   & %)$;$;$A$A$C C%< T,,S7)H,MaPPH  $(#7#7#  8 t $'*4+B+BHNNSVDW'X$   #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_   r`   __DEFAULT_SCOPE__)r   rb   rN   rc   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_jsonrS   )
r1   epr\   rv   rw   ru   rr   rs   rt   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$   rl      rn   )carrier_region	op_regionbuild_numberregiontsr$   r7   openudid)r   r   timer;   uuiduuid4rR   ry   rP   r<   r=   r}   r>   rz   )r1   rv   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   )rv   rw   ru   rr   rs   rt   r   z. Retrying... (attempt z of ))rR   rX   r   report_warninglenrK   	itertoolscountwrite_debugr;   r   r   
isinstancecausejsonJSONDecodeErrorposmsg)r1   r   r\   rv   rw   ru   rr   rs   rt   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*   )rw   ru   aweme_detailsr   z#Unable to extract aweme detail infor\   )r   r   r   rN   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i      }|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 )Nrp   Mozilla/5.0)rr   ru   Fz/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_hintri   r   r   r   rN   rf   _search_nextjs_datar   bool)r1   r   r\   rr   
video_datastatusresrd   urlhr   universal_data	sigi_data	next_datas                r3   _extract_web_data_and_statusz)TikTokBaseIE._extract_web_data_and_status   sE   F
++CQ]_lPm+n%<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)rs   rt   rr   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)extrw   )r   cla_infocaption_infos.r   langFormatr   r  rr   r   subtitleInfosc                     |d   S )NUrlrE   rZ   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   rT   )r   tuplevaluesr   rN   r   r   
setdefaultr}   appendry   	enumerater   r]   rM   sorted)r1   r   r   	user_nameEXT_MAP	subtitlescaptions_infocaptioncaption_urlcaption_jsonrZ   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<  r5  r   r6  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 )NrB  r*   r=  bytevc2rN  rM  r   r	  	data_sizemp4rI  zaweme/v1)r   filesizer  rL  source_preferencerK  z(API)z(UNPLAYABLE) )delim)r"  rK  )rC  r}   r&  r   updater   )	addradd_metaparsed_metar   
is_bytevc2r   rO  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$rM  rN  c                       z  S rD   rE   )rN  rM  s   r3   r  z5TikTokBaseIE._parse_aweme_video_app.<locals>.<lambda>t  s     r5         ?	play_addrzDirect video
is_bytevc1is_h265r9  h264)r<  rK  r=  rM  rN  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   rT  r   )r<  rK  r=  rM  rN  r"  play_addr_h264)r<  rK  r=  play_addr_bytevc1bit_rate	gear_namezPlayback videoc                     | d   dz  S )Nrn  r   rE   r!  s    r3   r  z5TikTokBaseIE._parse_aweme_video_app.<locals>.<lambda>  s    a
md6J r5   FPS)r<  rK  r>  r=  fpsro   r   
statisticsmusic)hybrid_label.r  r  )matched_songtitle)matched_pgc_soundrx  )rw  author)ry  rz  rz  is_original_soundrx  zoriginal sound - {}owner_handleoriginal sound	unique_iduidnicknamesec_uid)uploaderuploader_idr   
channel_idr4  descH   leftcreate_time)rx  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  r4  r   r"  )Nrg  durationr   r:  PrivatezFriends onlyzFollowers only)
is_privateneeds_subscriptionis_unlisted)r?  r5  sizebr)channel_urluploader_urltrackr  artistsformatsr,  
thumbnailsr  availability_format_sort_fields)r   r}   r   extendr   r   _remove_duplicate_formatsr{   r|   rx   r   r   r   hostnamer~   r;   formatr   r   r   _UPLOADER_URL_FORMATrerP   extract_subtitlesany_availability)r1   r   r   
video_infor`  r  rg  r6  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_urlrO  rj  rN  r_  rk  rM  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 )2NrS  rf  rI  )r  r=  rL  r   rM  rN  c                       z  S rD   rE   )play_height
play_widths   r3   r  z3TikTokBaseIE._extract_web_formats.<locals>.<lambda>  s    k!9 r5   rb  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=  rQ  
UNPLAYABLErW  r   DataSize)rK  r"  rU  i  @  r   r   )rM  rN  r  .r   c                     |d   k(  S )NrM  rE   )rZ   rH   r  s     r3   r  z3TikTokBaseIE._extract_web_formats.<locals>.<lambda>  s    1W:;S r5   r?  playAddr)).srcNplay)r<  r   rM  rN  r?  )downloadAddr)downloadr   r  watermarkedrT  )r<  r   rK  r"  ru  playUrl	mime_typec                 &    | j                  dd      S )NrZ   rJ   )replacerq  s    r3   r  z3TikTokBaseIE._extract_web_formats.<locals>.<lambda>3  s    AIIc3,? r5   rF  audiorJ  )r<  r   r  rL  r=  zwww.tiktok.com)r   rN   r   r}   r   rC  r;   rZ  r   r   r'  _proto_relative_urlr  r  r   r   r   r   r   r  )r1   r   COMMON_FORMAT_INFOr  rk  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)
authorInforz  Nr  )authorSecIdsecUid)uniqueIdrz  )authorIdr  r4  )r   r  r  r  Fr
  Referer)r4  r  r,  http_headersr  r   r  r  )r  r  ru  rx  r  
authorNamec                 6    | rt        j                  d|       S d S )Nr  )r  rP   rq  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)rx  r  r  r  stats	playCount	diggCount
shareCountcommentCountr  r  r  )	thumbnailr  dynamicCoveroriginCover)Nr   r  rT  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|   rA  rL   rK   rR   rS   	functoolscached_propertyr4   r.   r>   rA   rX   staticmethodr]   rf   ri   r   r   r   r   r   r2  rC  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 736bb7a466c6f0a6afeb597da1e6f5b7r4  6748451240264420610r  rS  rx  z!#jassmanak #lehanga #leenabhushanr  r     rN  i   rM  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7139980461132074283rH  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7253412088251534594rF  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)Nr4  r[   Tz; trying with webpager   )i'  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_urlr7  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   _TESTSrV  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                   v    e Zd ZdZdZddddddd	d
ddddddddddddddidgZdZdZd Z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r4  rx  )r   playlist_mincountr  z+https://www.tiktok.com/@6820838815978423302   r/  r.  zhttps://www.tiktok.com/@memeiQ  LMS4wLjABAAAAiKfaDWeCsT3IHwY77zqWGtVRIy9v4ws1HbVi7auP1Vx7dJysU_hc5yRiGywojRD6memezWtiktokuser:MS4wLjABAAAAM3R2BtjzVT-uAtstkl2iugMzC6AtnpkojJbjiOdDDrdsTiTR75-8lyWJCY5VvDrZ   r4  zLMS4wLjABAAAAM3R2BtjzVT-uAtstkl2iugMzC6AtnpkojJbjiOdDDrdsTiTR75-8lyWJCY5VvDrZzPMozilla/5.0 (Windows NT 10.0; Win64; x64; rv:115.0) Gecko/20100101 Firefox/115.0z-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_   rn   )is_fullscreenis_page_visibler   r   priority_regionrefererr   screen_heightscreen_widthr  typetz_nameverifyFpwebcast_language)r>   ry   r<   rz   string	hexdigits)r1   r  rr  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              #   `  K   |xs |}t               }t        t        j                         dz        }t        j                  d      D ]  }| j                  | j                  |d| | j                  ||      d| j                  i      }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      r y  y w)N     @@r   Downloading page rp   )rv   ru   itemListc                     |d   S Nr4  rE   r  s     r3   r  z'TikTokUserIE._entries.<locals>.<lambda>  
    !D' r5   r4  Tr  r   r  c                     t        | dz        S )Nr  r   rq  s    r3   r  z'TikTokUserIE._entries.<locals>.<lambda>  s    CCL r5   i $l   4<H[hasMorePrevious)setr   r   r   r   r   _API_BASE_URLr  _USER_AGENTr   addr]   
url_resultr0   r  )r1   r  r*  re   seen_idsrr  pageresponser   r\   r  
old_cursors               r3   _entrieszTikTokUserIE._entries  sd    )'
5TYY[3&'OOA& 	D**""J2CD60J++GV<|UYUeUeFf + hH &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/	s   D'D.*D.c           
         | j                  ||dddid| dd| d      xs d}t        | j                  ||      d	d
ddt        hf      xs6 t        | j	                  ||      ddddt        hfddddt        ht
        f      S )NFrp   r   zDownloading z webpagezUnable to download )rr   ru   rs   rt   r*   zwebapp.user-detailuserInforv  r  LiveRoomliveRoomUserInfo
UserModuleusers.)_download_webpager   ri   r;   rf   r  )r1   user_urlr*  r   rd   s        r3   _get_sec_uidzTikTokUserIE._get_sec_uid  s    ((iu|]6SuH-9LSEQY7Z ) \ b_a 	 T55gyI2JSVRWXZ T 4 4Wi H!+-?TWSX Y!-wXuc RT	Ur5   c           	         | j                  |      d }}t        j                  d|      x}rd |j                  d      }}nE| j	                  | j
                  |z  |d      xs# | j	                  | j
                  | dz  |d      }|s| j                  d| |dd	      xs d
}t        | j                  d|d|i       ddd| t        hf      }t        |dddt        hf      D ]S  }| j                  ||      }| j                  ||d      \  }	}
| j                  |	||d      j                  d      }|sS n |st        dd      | j!                  | j#                  ||      ||      S )NzMS4wLjABAAAA[\w-]{64}r   rv  z/livelivezhttps://www.tiktok.com/embed/@zDownloading user embed pageF)rs   rr   r*   z;<script[^>]+\bid=[\'"]__FRONTITY_CONNECT_STATE__[\'"][^>]*>rw   r   sourcez/embed/@	videoList.r4  r  Tr  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)r   )	_match_idr  	fullmatchr7  r  r  r  r   rb   rN   r;   r]   r   r  r}   r   playlist_resultr  )r1   r   r*  r  mobjrd   rw   r   r  r   rZ   s              r3   rV  zTikTokUserIE._real_extract  s   !^^C0$7	<< 8)DD4D!%tzz!}wI(()B)BY)NPY[ab p++D,E,E9+UZH[,[]fhno  ,,0<i2% - A GDF    1 1NB !2 !8 6Xi[#9D6BDD
 )S$/NO "..y(C $ A A+x_d A e
A55XD 6 JJM#lJ[   KUY[ [
 ##DMM'9$EwPYZZr5   N)r  r   r  IE_NAMErW  rY  r  r  r  r  r  rV  rE   r5   r3   r[  r[    s    G_J7`!
 =`*
 . `
 i`
+F8 eKCM!
F<U[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)Nrr  r   r      r  ra  r7   r   zDownloading video list page zUnable to download video list)rv   rs   rt   
aweme_listTikTokzhttps://tiktok.com/@_/video/r   )extractor_key	extractorr  has_more)_QUERY_NAMEr>   r   r   RetryManagerr   _API_ENDPOINTr   r   r   r   r   r   errorr}   r   r0   r-   )	r1   list_idre   rv   r  retry	post_listr   r   s	            r3   r  zTikTokBaseListIE._entries"  sQ    gaRA
 OOA& 	2D**, 
	 $**Je;D6B ? !/ !AI
 #|R8 11%8%-__%6!)%A%
BSAT#U	  ==,'1E(O+	2 & !!''4+?+?@QWW[[TUEU&' 	s8   AD7#C2A*D7	D4%AD/)D7.D//D44D7c                 h    | j                  |      }| j                  | j                  ||      |      S rD   )r  r  r  )r1   r   r  s      r3   rV  zTikTokBaseListIE._real_extractB  s.    ..%##DMM'7$CWMMr5   N)r  r   r  r  rV  rE   r5   r3   r  r  !  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   r4  6956990112127585029Retryingr   r`  r  rD  zBhttps://www.tiktok.com/music/jiefei-soap-remix-7036843036118469381i  7036843036118469381N	r  r   r  r  rW  _WORKINGr  r  rY  rE   r5   r3   r  r  G  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  r4  1258156r  r  z0https://www.tiktok.com/sticker/Elf-Friend-479565TrR  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	hello2018r_  r  r  u=   https://tiktok.com/tag/fypシ?is_copy_url=0&is_from_webapp=v1TrR  c                     | j                  |      }| j                  ||ddi      }| j                  d|d      }| j                  | j	                  ||      ||      S )Nrp   zIfacebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)ru   z"snssdk\d*://challenge/detail/(\d+)ztag ID)r  r  _html_search_regexr  r  )r1   r   re   rd   tag_ids        r3   rV  zTikTokTagIE._real_extract  sl    ^^C(
((jeC
(  (()NPWYab##DMM&*$EvzZZr5   N)
r  r   r  r  rW  r  r  r  rY  rV  rE   r5   r3   r  r  s  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-testr_  	   )r   r  playlist_countzOhttps://www.tiktok.com/@imanoreotwe/collection/%F0%9F%98%82-71118871895711608757111887189571160875zimanoreotwe-%F0%9F%98%82r  )r   r  r`  z0https://www.tiktok.com/api/collection/item_list/r(  c                 &    d|| j                   |ddS )Nrf  113)r(   collectionIdr   rr  
sourceType)_PAGE_COUNT)r1   collection_idrr  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  )rv   r  c                     |d   S r  rE   r  s     r3   r  z-TikTokCollectionIE._entries.<locals>.<lambda>  r  r5   r4  rz  )r  r  r4  rZ   Tr  hasMore)r   r   r   r  r  r   r;   r  r]   r  r0   r  r  )	r1   r  rr  r  r  r   r\   rz  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 )Nr4  rx  r[   -)rU  r7  r  r  ry   )r1   r   r  rx  r*  s        r3   rV  z TikTokCollectionIE._real_extract  s]    *.*?*?*D*J*J4QXZc*d'ui##MM-(-9eBT9UW 	Wr5   N)r  r   r  r  rW  rY  r  r  r  r  rV  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 9ecce7bc5b302601018ecb2871c63a75r4  6961737553342991651r  rS  rx  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`)r4  r  rx  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)rv   rr   r   z4Fresh cookies (not necessarily logged in) are needed
s_v_web_idr   )	r  r   r   rN   r   r{   r|   r}   r   )r1   r   r\   details       r3   rV  zDouyinIE._real_extract@  s    >>#&d11?)+Ox( 2 7 :H$8PR  F!..t/A/ABFF|TTV V **622r5   N)	r  r   r  rW  r   rY  r  r|   rV  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/ZTRC5xgJpr4  7170520270497680683r  rS  rx  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  ra  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/ZSe4FqkKdTrR  c                     | j                  t        |      | j                  |      ddi      j                  }| j	                  |      rt        |      | j                  |      S )Nrp   zfacebookexternalhit/1.1r  )_request_webpager   r  r   suitabler   r  )r1   r   new_urls      r3   rV  zTikTokVMIE._real_extract  sb    ''dnnS1LJc;d ( ffifi 	==!"7++w''r5   N)r  r   r  rW  r  r   rY  rV  rE   r5   r3   r  r  P  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7210809319192726273rS  u(   re:ウェザーニュースLiVE[\d\s:-]*u   ウェザーニュースLiVEweathernewslive6621496731283095554z'https://www.tiktok.com/@weathernewsliveis_live)	r4  r  rx  r  r  r  r  live_statusconcurrent_view_countskip_downloadm3u8)r   r  paramsz)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=enTrR  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(   rf  )rr   rv   r   r   r   zThis livestream has endedTr   r   )r   r   rN   r   r}   r   r	   )r1   r   paramroom_idr  rT   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                 b     j                  |      j                  dd      \  }} j                  ||xs |ddi|       }|r^ j                  ||xs |      }t	        |ddt
        ht        f      xs  j                  d|d	|
      }|xs t	        |dddt
              }|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/ ||	 d0       |d1      d2       V t	        dd3t        hfi 
      j                         D ]F  \  }}t        |      s|j                  |d#d$| j!                          |d4|       ||      d5       H t	        |d6       s[t#         j                  d7d8||d9            t        j%                  d:            r!|j                  d:   d'd(d;d< |d=      d2       |xs t	        d>d?      }||t'        |d  j(                        xs d d@|dAdBt	        dCdDdt*        hfdEdFt        hfdGdH      S )INr  r4  rp   r   )ru   rr   ))r  r  rv  )r  r  .roomIdzsnssdk\d*://live\?room_id=(\d+)zroom IDr   )r  r  rv  r  )r  r  .r  F)r
  r  r   z,https://webcast.tiktok.com/webcast/room/infor.  rw   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_datamain
sdk_paramsVCodecvbitrater   r:  r   c                 f    t        j                  d|       j                         j                         S )Nz(?i)\d+x\d+|\d+p)r  matchr7  lowerrq  s    r3   r  z,TikTokLiveIE._real_extract.<locals>.<lambda>  s%    ATVW8X8^8^8`8f8f8h r5   )r=  r>  r   flvzflv-)r   r  r<  r?  hlsrS  m3u8_nativezhls-)r   r  protocolr<  r?  c                  <    t        dg| hdt        h      S )Nr=  rC  )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   )rI  rtmp	_pull_urlhttpsz-pull_pull_url_paramsr9  )r   r  rK  r<  r=  r?  flv_pull_urlflv_pull_url_params)r   r  r<  r=  r?  c                     |d   dk(  S )Nr  rS  rE   r  s     r3   r  z,TikTokLiveIE._real_extract.<locals>.<lambda>  s    !E(e2C r5   z'https://www.tiktok.com/api/live/detail/roomIDLiveRoomInfoliveUrlzhls-fallbackrf  r:  )	ownerInfor  )ownerre   T)r?  r  )r4  r  r  r!  r  r  rx  r[  r\  )r]  r  )
user_count)liveRoomStats	userCount)rx  r  r  r#  r  )rU  r7  r  rf   r   r;   r  r@  r	   r   r   rN   rM   r   r   r'  rG  r   r}   r   r  r   )r1   r   r  r.  rd   rw   r  get_qualityr?  streamrB  flv_urlhls_urlrP  r=  f_idf_urlrN  rO  s   `                @@r3   rV  zTikTokLiveIE._real_extract  s7    11#6<<ZN'(($W|].KW^S^ ) ` ''1DWEDT %23;cUC$I J o %%&H'S\fm%n	 
   \<J8%WZ$\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  rW  r  r   r;   rY  r   rV  rE   r5   r3   r  r    s    	J G >'@5)0E$%(

 #F+ ;'%&0B$%(

  R 8?"FH-q
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>rk     s        	     ! $     0G	
= G	
T`^| `^F	L[< L[^#N| #NL$ 0% ([" [87W 7WtD3| D3N;( ;(|k
< k
r5   