Ë
    š„j¸¹  ã                   ó’  — 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 ddlm Z m!Z!  G d„ d	e«      Z" G d
„ de"«      Z#d„ 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é   )Ú	HTTPError)ÚExtractorErrorÚUserNotLiveÚbase_urlÚ
clean_htmlÚdict_getÚfloat_or_noneÚint_or_noneÚjoin_nonemptyÚmake_archive_idÚparse_durationÚparse_iso8601Úparse_qsÚ	qualitiesÚstr_or_noneÚtry_getÚunified_timestampÚupdate_url_queryÚurl_or_noneÚurljoin)Útraverse_objÚvaluec                   ó€   — e Zd ZdZdZdZdZdZdZddd	d
ddddddddœZ	e
d„ «       Zd„ Zd„ Zdd„Zdd„Zd„ Zd„ Zdd„Zy)ÚTwitchBaseIEz&https?://(?:(?:www|go|m)\.)?twitch\.tvzhttps://api.twitch.tvzhttps://usher.ttvnw.netzhttps://www.twitch.tv/loginz https://passport.twitch.tv/loginÚtwitchÚ@016e1e4ccee0eb4698eb3bf1a04dc1c077fb746c78c82bac9a8f0289658fbd1aÚ@67004f7881e65c297936f32c75246470629557a393788fb5a69d6d9a25a8fd5fÚ@1cd671bfa12cec480499c087319f26d21925e9695d1f80225aae6a4354f23088Ú@0a02bb974443b576f5579aab0fef1d4b7f44e58a8a256f0c5adfead0db70640fÚ@5247910a19b1cd2b760939bf4cba4dcbd3d13bdf8c266decd16956f6ef814077Ú@ad022ca32220d5523d03a23cbcb5beaa1e0999889c1f8f78f9f2520dafb5cae6Ú@e1edae8122517d013405f237ffcc124515dc6ded82480a88daef69c83b53ac01Ú@9515480dee68a77e667cb19de634739d33f243572b007e98e67184b1a5d8369fÚ@45111672eea2e507f8ba44d101a61862f9c56b11dee09a15634cb75cb9b9084dÚ@71835d5ef425e154bf282453a926d99b328cdc5e32f36d3a209d0f4778b41203Ú@07e99e4d56c5a7c67117a154777b0baf85a5ffefa393b213f4bc712ccaf85dd6)ÚCollectionSideBarÚFilterableVideoTower_VideosÚClipsCards__UserÚShareClipRenderStatusÚChannelCollectionsContentÚStreamMetadataÚComscoreStreamingQueryÚVideoPreviewOverlayÚVideoMetadataÚ$VideoPlayer_ChapterSelectButtonVideoÚ"VideoPlayer_VODSeekbarPreviewVideoc                 ó4   — | j                  ddgdd¬«      d   S )NÚ	client_idÚue6666qo983tsx6so1t0vnawi233waÚTwitchT)Úie_keyÚ	casesenser   )Ú_configuration_arg)Úselfs    úN/var/www/html/GAP/venv/lib/python3.12/site-packages/yt_dlp/extractor/twitch.pyÚ
_CLIENT_IDzTwitchBaseIE._CLIENT_ID9   s3   € à×&Ñ&ØÐ:Ð;ÀHÐX\ð 'ó ^Ø^_ñað 	aó    c           	      ó.  ‡ ‡— d„ Šˆˆ fd„}‰ j                  ‰ j                  d d«      \  }}d|v r ‰t        |«      «        |||d||‰ j                  dœ«      \  }}|sy t	        j
                  d|«      � ‰ j                  d«      } |||d	|d
dœ«       y y )Nc                 ó"   — t        d| › �d¬«      ‚)NzUnable to login. Twitch said: T©Úexpected)r   )Úmessages    r=   Úfailz)TwitchBaseIE._perform_login.<locals>.fail?   s   € Ü Ø0°°	Ð:ÀTôKð Kr?   c                 óø  •— ‰j                  | «      }|j                  |«       |j                  }‰j                  d| d‰j                  d¬«      }t        ||«      }|dddœ}‰j                  |d |t        j                  |«      j                  «       |d¬	«      }t        |d
«      }	|	r ‰|	«       d|j                  dd«      v ryt        ||j                  d«      xs |d   «      }
‰j                  |
d d|¬«      S )Nz&<form[^>]+action=(["\'])(?P<url>.+?)\1zpost urlÚurl)ÚdefaultÚgroupzhttps://www.twitch.tvútext/plain;charset=UTF-8)ÚRefererÚOriginúContent-Typei�  )ÚdataÚheadersÚexpected_status)ÚerrorÚerror_descriptionÚ
error_codezAuthenticated successfullyrD   Ú )NNÚredirectÚredirect_pathzDownloading login redirect page)rO   )Ú_hidden_inputsÚupdaterG   Ú_search_regexÚ_LOGIN_POST_URLr   Ú_download_jsonÚjsonÚdumpsÚencoder   ÚgetÚ_download_webpage_handle)ÚpageÚurlhÚnoterN   ÚformÚpage_urlÚpost_urlrO   ÚresponserQ   Úredirect_urlrE   r<   s              €€r=   Ú
login_stepz/TwitchBaseIE._perform_login.<locals>.login_stepC   s  ø€ Ø×&Ñ& tÓ,ˆDØ�K‰K˜Ôà—x‘xˆHØ×)Ñ)Ø9¸4Ø D×$8Ñ$8Àð *ó GˆHô ˜x¨Ó2ˆHð $Ø1Ø :ñˆGð ×*Ñ*Ø˜$ ¬4¯:©:°dÓ+;×+BÑ+BÓ+DØ°ð +ó 6ˆHô ˜XÐ'SÓTˆEÙÙ�U”à+¨x¯|©|¸IÀrÓ/JÑJØ!ä"ØØ—‘˜ZÓ(ÒE¨H°_Ñ,EóGˆLð ×0Ñ0Ø˜dÐ$EØð 1ó !ð !r?   zDownloading login pageÚblacklist_messagez
Logging in)ÚusernameÚpasswordr6   z$(?i)<form[^>]+id="two-factor-submit"ztwo-factor authentication tokenzSubmitting TFA tokenÚtrue)Úauthy_tokenÚremember_2fa)r`   Ú_LOGIN_FORM_URLr
   r>   ÚreÚsearchÚ_get_tfa_info)	r<   rk   rl   ri   Ú
login_pageÚhandleÚredirect_pageÚ	tfa_tokenrE   s	   `       @r=   Ú_perform_loginzTwitchBaseIE._perform_login>   sÀ   ù€ ò	Kõ	!ðB "×:Ñ:Ø× Ñ  $Ð(@óBÑˆ
�Fð  *Ñ,Ù”˜JÓ'Ô(á *Ø˜ Ø$Ø$Ø!Ÿ_™_ñ/ó!Ñˆ�vñ Øä�9‰9Ð<¸mÓLÐXà×*Ñ*Ð+LÓMˆIÙ�} fÐ.DØ(Ø &ñGõ ð Yr?   c                 ó˜   — 	 t        d„ |D «       «      }d|d<   y # t        $ r& |D ]  }d|d   v sŒ|j                  dddœ«       Œ  Y y w xY w)Nc              3   ó2   K  — | ]  }|d    dk(  sŒ|–— Œ y­w)Ú	format_idÚSourceN© )Ú.0Úfs     r=   ú	<genexpr>z.TwitchBaseIE._prefer_source.<locals>.<genexpr>€   s   è ø€ ÒK °°+±À(Ó0Jœ!ÑKùs   ‚�é
   Úqualityz	/chunked/rG   r|   )r‚   Úformat_note)ÚnextÚStopIterationrX   )r<   ÚformatsÚsourcer   s       r=   Ú_prefer_sourcezTwitchBaseIE._prefer_source~   sb   € ð		ÜÑK WÔKÓKˆFØ "ˆF�9ÒøÜò 	Øò �Ø ! E¡(Ò*Ø—H‘HØ#%Ø'/ñõ òð	ús   ‚ šA	°A	ÁA	c                 óø   — d| j                   dœ}| j                  d«      j                  d«      }|rd|j                  z   |d<   | j	                  d||t        j                  |«      j                  «       ||¬«      S )	NrJ   )rM   z	Client-IDúhttps://gql.twitch.tvú
auth-tokenzOAuth ÚAuthorizationzhttps://gql.twitch.tv/gql)rN   rO   Úfatal)r>   Ú_get_cookiesr_   r   r[   r\   r]   r^   )r<   Úvideo_idÚopsrc   r�   rO   Úgql_auths          r=   Ú_download_base_gqlzTwitchBaseIE._download_base_gqlŠ   s   € à6ØŸ™ñ
ˆð ×$Ñ$Ð%<Ó=×AÑAÀ,ÓOˆÙØ'/°(·.±.Ñ'@ˆG�OÑ$Ø×"Ñ"Ø'¨°4Ü—‘˜C“×'Ñ'Ó)Ø 5ð #ó *ð 	*r?   c                 ój   — |D ]  }dd| j                   |d      dœi|d<   Œ | j                  |||«      S )NÚpersistedQueryr   ÚoperationName)ÚversionÚ
sha256HashÚ
extensions)Ú_OPERATION_HASHESr’   )r<   r�   r�   rc   r�   Úops         r=   Ú_download_gqlzTwitchBaseIE._download_gql—   sR   € Øò 	ˆBà Ø Ø"&×"8Ñ"8¸¸OÑ9LÑ"Mñ#ð ˆBˆ|Òð	ð ×&Ñ& x°°dÓ;Ð;r?   c                 ób   — |› d�}dd|›d|›d|›d�i}| j                  ||d|› d�«      d	   |   S )
NÚPlaybackAccessTokenÚqueryz{
              z(
                z: "a  ",
                params: {
                  platform: "web",
                  playerBackend: "mediaplayer",
                  playerType: "site"
                }
              )
              {
                value
                signature
              }
            }úDownloading z access token GraphQLrN   )r’   )r<   r�   Ú
token_kindÚ
param_nameÚmethodr�   s         r=   Ú_download_access_tokenz#TwitchBaseIE._download_access_token¡   sa   € Ø�<Ð2Ð3ˆáò šJªð2ð
ˆð  ×&Ñ&Ø�cØ˜:˜,Ð&;Ð<ó>à>DñFàFLñNð 	Nr?   c                 óF   — |rt        j                  dd|«      ddœd|igS d S )Nz\d+x\d+(\.\w+)($|(?=[?#]))z0x0\g<1>r   ©rG   Ú
preferencerG   )rq   Úsub)r<   Ú	thumbnails     r=   Ú_get_thumbnailszTwitchBaseIE._get_thumbnails·   sB   € ñ ô	 —6‘6Ð7¸ÀiÓPØñ
ð �9ð
ðð 	"ð
 "ð	"r?   c                 óð  — 	 | j                  | j                  › d|› d|› d�|ddddt        j                  dd«      ddd	d||d
œ
¬«      }|D ]y  }|j!                  d«      r9|d   j)                  d«      r%|j+                  di «      j-                  dd dgi«       |sŒP|j+                  di «      j-                  d!d"d#gi«       d|d$<   Œ{ |S # t        $ �r"}t        |j                  t        «      rA|j                  j                  dk7  s(|j                  j                  j                  d«      dk7  r‚ t        |j                  j                  j                  «       t        j                  hdt        hf«      xs i }|j!                  d«      dv rFd}	| j#                  d«      j!                  d«      rt	        d|	› �d¬«      ‚| j%                  d|	› �«       t'        dd|d¬«      x}
rt	        |
d¬«      ‚‚ d }~ww xY w)%Nú/z.m3u8Úmp4rm   i@B i€–˜ ÚwebÚ	twitchwebzav1,h265,h264)
Úallow_sourceÚallow_audio_onlyÚallow_spectreÚpÚplatformÚplayerÚsupported_codecsÚplaylist_include_framerateÚsigÚtoken©rž   i“  zcontent-typezapplication/jsonr   rS   )Úvod_manifest_restrictedÚunauthorized_entitlementsz&access to this subscriber-only contentrŠ   r‹   zYour account does not have TrB   z,You must be logged into an account that has rQ   z: )Ú	from_dictÚdelimÚvcodecÚav01Údownloader_optionsÚffmpeg_args_outz-fÚffmpeg_argsz-live_start_indexÚ0Úis_from_start)Ú_extract_m3u8_formatsÚ_USHER_BASEÚrandomÚrandintr   Ú
isinstanceÚcauser   Ústatusrg   Ú
get_headerr   Úreadr\   ÚloadsÚdictr_   rŽ   Úraise_login_requiredr   Ú
startswithÚ
setdefaultrX   )r<   Úpathr�   r¸   Ú	signatureÚlive_from_startr†   ÚeÚ
error_infoÚ
common_msgÚ	error_msgÚfmts               r=   Ú_extract_twitch_m3u8_formatsz)TwitchBaseIE._extract_twitch_m3u8_formats¿   s	  € ð	Ø×0Ñ0Ø×#Ñ#Ð$ A d V¨1¨X¨J°eÐ<¸hÈØ$*Ø(.Ø%+ÜŸ™¨°Ó:Ø %Ø)Ø(7Ø28Ø$Ø"ñVð 1ó ˆGð@ ò 	,ˆCØ�w‰w�xÔ  S¨¡]×%=Ñ%=¸fÔ%Eà—‘Ð3°RÓ8×?Ñ?ÐARÐUYÐ[`ÐTaÐ@bÔcÚØ—‘Ð3°RÓ8×?Ñ?ÀÐQdÐfiÐPjÐ@kÔlØ'+��OÒ$ð	,ð ˆøô7 ó 	ä˜qŸw™w¬	Ô2Ø—7‘7—>‘> SÒ(Ø—7‘7×#Ñ#×.Ñ.¨~Ó>ÐBTÒTàä% a§g¡g×&6Ñ&6×&;Ñ&;Ó&=ÄÇÁÀÈaÔRVÐQWÐ?XÓYÒ_Ð]_ˆJØ�~‰~˜lÓ+Ð/gÑgØE�
Ø×$Ñ$Ð%<Ó=×AÑAÀ,ÔOÜ(Ð+FÀzÀlÐ)SÐ^bÔcÐcØ×)Ñ)Ð,XÐYcÐXdÐ*eÔfä)¨,¸È:Ð]aÔbÐbˆyÐbÜ$ Y¸Ô>Ð>Øûð#	ús   ‚AC	 Ã	
G5ÃDG0Ç0G5N)T)F)Ú__name__Ú
__module__Ú__qualname__Ú_VALID_URL_BASEÚ	_API_BASErÆ   rp   rZ   Ú_NETRC_MACHINEr™   Úpropertyr>   rx   rˆ   r’   r›   r£   r©   rÛ   r}   r?   r=   r   r   "   s‡   „ Ø?€Oà'€IØ+€KØ3€OØ8€OØ€Nð `Ø'iØ^Ø!cØ%gØ\Ø"dØaØ[Ø0rØ.pñÐð ñaó ðaò>ò@
ó*ó<òNò,"ô*r?   r   c                   ó”  — e Zd ZdZdZddddddd	d
ddedddddœgddœddidœdddddddddde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*d+dd,ddœd,d-d.dœd-d)d/dœgdded0œddidœd1d'd(d2d3dd)ddd*d+dd,ddœd,d-d.dœd-d)d/dœgddeeed4œd3dd5œd6œd7d8d9dd:d;ddd<d=dd;ddœgdded0œddid>gd?œd@dd"œgZdA„ ZdB„ ZdC„ Z	dD„ Z
dE„ ZdF„ ZyG)HÚTwitchVodIEz
twitch:vodal  (?x)
                    https?://
                        (?:
                            (?:(?:www|go|m)\.)?twitch\.tv/(?:[^/]+/v(?:ideo)?|videos)/|
                            player\.twitch\.tv/\?.*?\bvideo=v?|
                            www\.twitch\.tv/[^/]+/schedule\?vodID=
                        )
                        (?P<id>\d+)
                    z0http://www.twitch.tv/riotgames/v/6528877?t=5m10sÚv6528877r¬   zLCK Summer Split - Week 6 Day 1zre:^https?://.*\.jpg$i8C  iV_ŠUÚ20150624z
Riot GamesÚ	riotgamesi6  r   zLeague of Legends©Ú
start_timeÚend_timeÚtitleÚwas_live)ÚidÚextrë   r¨   ÚdurationÚ	timestampÚupload_dateÚuploaderÚuploader_idÚ
view_countré   ÚchaptersÚlive_statusÚskip_downloadT©rG   Ú	info_dictÚparamsz(http://www.twitch.tv/belkao_o/v/11230755Ú	v11230755úUntitled Broadcastif  i”ÊÐUÚ20150816ÚBelkAO_oÚbelkao_o)
rí   rî   rë   r¨   rï   rð   rñ   rò   ró   rô   zHTTP Error 404: Not Found©rG   rù   rú   Úskipz/http://player.twitch.tv/?t=5m10s&video=v6528877©rG   Úonly_matchingz$https://www.twitch.tv/videos/6528877z+https://m.twitch.tv/beagsandjam/v/247478721z2https://www.twitch.tv/northernlion/video/291940395z)https://player.twitch.tv/?video=480452374z&https://www.twitch.tv/videos/635475444Ú
v635475444i{-  i‰;Ñ^Ú20200529i=  iR  zLegends of RuneterraÚArt)rí   rî   rë   rï   rò   ró   rð   rñ   rõ   rö   r¨   rô   ÚStoryboardsÚsb0Úmhtml)rí   r{   rî   rë   rï   rò   ró   rð   rñ   rõ   rö   r¨   rô   ÚcolumnsÚrows)Úformatr÷   )rc   rG   rù   rú   zVOD with single chapterz'https://www.twitch.tv/videos/1536751224Úv1536751224z8Porter Robinson Star Guardian Stream Tour with LilyPichui¡   iS(×bÚ20220719z;Unable to download JSON metadata: HTTP Error 403: Forbidden)rc   rG   rù   rú   Úexpected_warningsz8https://www.twitch.tv/tangotek/schedule?vodID=1822395420c           	      óì   — | j                  |dd|dœdœdd|dœdœdd|dœdœgd	«      }t        |d
d¬«      }|€t        d|› d�d¬«      ‚t        |d«      |d<   t        |ddddt        hfd¬«      |d<   |S )Nr2   rT   )ÚchannelLoginÚvideoID©r•   Ú	variablesr3   F)ÚincludePrivater  r4   z#Downloading stream metadata GraphQL).rN   Úvideo)Úget_allzVideo ú does not existTrB   ).rN   r  ÚmomentsÚedges.Únoder  .rN   r  ÚseekPreviewsURLÚ
storyboard)r›   r   r   r   )r<   Úitem_idrN   r  s       r=   Ú_download_infozTwitchVodIE._download_info¡  sÉ   € Ø×!Ñ!ØØ!0à$&Ø&ññð "Hà&+Ø&ññð "Fà&+Ø&ññðð& 2ó)3ˆô, ˜TÐ#9À5ÔIˆØˆ=Ü  6¨'¨°/Ð!BÈTÔRÐRä'¨Ð.eÓfˆˆiÑÜ*Ø�3˜ Ð):¼[¸MÐJÐTYô[ˆˆlÑð ˆr?   c                 ó¤  — |j                  d«      }|dk(  rd}n
|dk(  rd}nd }d}t        |«      }g }|j                  d«      }t        |t        «      rE|j	                  «       D ]2  \  }}	t        |	«      }	|	sŒ||vrŒ|j                  |	 ||«      dœ«       Œ4 |d	   |j                  d
«      xs d|j                  d«      t        |j                  d«      «      ||j                  di «      j                  d«      |j                  di «      j                  d«      t        |j                  d«      «      t        |j                  d«      «      |ddœS )NrË   Ú	recordingTÚrecordedF)ÚsmallÚmediumÚlargeÚpreviewr¥   Ú_idrë   rü   ÚdescriptionÚlengthÚchannelÚdisplay_nameÚnameÚrecorded_atÚviews)rí   rë   r(  rï   Ú
thumbnailsrò   ró   rð   rô   Úis_liverì   )	r_   r   rÉ   rÏ   Úitemsr   Úappendr   r   )
r<   ÚinforË   r0  Ú
_QUALITIESÚquality_keyr/  r&  Úthumbnail_idÚthumbnail_urls
             r=   Ú_extract_infozTwitchVodIE._extract_infoÂ  sM  € Ø—‘˜(Ó#ˆØ�[Ò Ø‰GØ�zÒ!Ø‰GàˆGØ1ˆ
Ü 
Ó+ˆØˆ
Ø—(‘(˜9Ó%ˆÜ�gœtÔ$Ø/6¯}©}«ò 	Ñ+�˜mÜ +¨MÓ :�Ù$ØØ zÑ1ØØ×!Ñ!Ø(Ù"-¨lÓ";ñ#õ ð	ð �u‘+Ø—X‘X˜gÓ&Ò>Ð*>ØŸ8™8 MÓ2Ü# D§H¡H¨XÓ$6Ó7Ø$ØŸ™ ¨BÓ/×3Ñ3°NÓCØŸ8™8 I¨rÓ2×6Ñ6°vÓ>Ü& t§x¡x°Ó'>Ó?Ü% d§h¡h¨wÓ&7Ó8ØØñ
ð 	
r?   c              #   óV  K  — |j                  d«      st        |d«      }|rd|i–— y |d   D ]w  }t        |j                  d«      d«      }t        |j                  d«      d«      }t        |j                  d«      «      }|�|€| j	                  d|› �|«       Œm|||z   |d	œ–— Œy y ­w)
Nr  )ÚgameÚdisplayNamerë   ÚpositionMillisecondsiè  ÚdurationMillisecondsr(  z2Important chapter information missing for chapter rè   )r_   r   r   r   Úreport_warning)r<   r3  r  r:  Úmomentré   rï   r,  s           r=   Ú_extract_chapterszTwitchVodIE._extract_chaptersç  sÂ   è ø€ Ø�x‰x˜	Ô"Ü Ð&=Ó>ˆDÙØ �oÒ%Øà˜9‘oò 	ˆFÜ$ V§Z¡ZÐ0FÓ%GÈÓNˆJÜ" 6§:¡:Ð.DÓ#EÀtÓLˆHÜ˜vŸz™z¨-Ó8Ó9ˆDàÐ! XÐ%5Ø×#Ñ#Ð&XÐY]ÐX^Ð$_ÐahÔiØà(Ø&¨Ñ1Øñó ñ	ùs   ‚B'B)c                 ób  — |j                  d«      xs |}|d   dk7  rd|› �}t        |j                  d«      «      }d }|r/t        j                  d|«      r|j                  d«      dk(  }d }nd}||j                  d	«      xs d
|j                  d«      t	        |j                  d«      «      | j                  |«      t        |d„ t        «      t        |d„ t        «      t        |j                  d«      «      t	        |j                  d«      «      t        | j                  ||«      «      |ddœS )Nrí   r   ÚvÚpreviewThumbnailURLz/404_processing_[^.?#]+\.pngÚbroadcastTypeÚARCHIVEFrë   rü   r(  ÚlengthSecondsc                 ó   — | d   d   S )NÚownerr;  r}   ©Úxs    r=   ú<lambda>z/TwitchVodIE._extract_info_gql.<locals>.<lambda>  s   € °°'±
¸=Ñ0I€ r?   c                 ó   — | d   d   S )NrH  Úloginr}   rI  s    r=   rK  z/TwitchVodIE._extract_info_gql.<locals>.<lambda>  s   € °1°W±:¸gÑ3F€ r?   ÚpublishedAtÚ	viewCountT)rí   rë   r(  rï   r/  rò   ró   rð   rô   rõ   r0  rì   )r_   r   rq   Úfindallr   r©   r   Ústrr   Úlistr@  )r<   r3  r  Úvod_idr¨   r0  s         r=   Ú_extract_info_gqlzTwitchVodIE._extract_info_gqlü  s  € Ø—‘˜$“Ò* 7ˆà�!‰9˜ÒØ˜˜�\ˆFÜ §¡Ð)>Ó ?Ó@ˆ	ØˆÙÜ�z‰zÐ9¸9ÔEð Ÿ(™( ?Ó3°yÑ@�Ø ‘	à�ð Ø—X‘X˜gÓ&Ò>Ð*>ØŸ8™8 MÓ2Ü# D§H¡H¨_Ó$=Ó>Ø×.Ñ.¨yÓ9Ü Ñ&IÌ3ÓOÜ" 4Ñ)FÌÓLÜ*¨4¯8©8°MÓ+BÓCÜ% d§h¡h¨{Ó&;Ó<Ü˜T×3Ñ3°D¸'ÓBÓCØØñ
ð 	
r?   c              #   ór  K  — |r|sy | j                  ||dd¬«      xs g }|j                  d„ d¬«       t        |«      }t        |«      D ]ã  \  }}t	        |j                  d«      «      }|j                  d«      }	|	r|sŒ6|t        |	«      z  }
d	|› �d
ddddt        ||	d   «      t	        |j                  d«      «      t	        |j                  d«      «      ||z  t	        |j                  d«      «      t	        |j                  d«      «      |	D �cg c]  }t        ||«      |
dœ‘Œ c}dœ–— Œå y c c}w ­w)Nz$Downloading storyboard metadata JSONF©r�   c                 ó>   — t        | j                  d«      «      xs dS )NÚwidthr   )r   r_   rI  s    r=   rK  z1TwitchVodIE._extract_storyboard.<locals>.<lambda>!  s   € ¤¨A¯E©E°'«NÓ ;Ò @¸q€ r?   T)ÚkeyÚreverseÚcountÚimagesÚsbr  r	  Únoner   rX  Úheightr  Úcols)rG   rï   )r{   rƒ   rî   ÚprotocolÚacodecr¾   rG   rX  r_  Úfpsr  r
  Ú	fragments)r[   Úsortr	   Ú	enumerater   r_   Úlenr   )r<   r  Ústoryboard_json_urlrï   ÚspecÚbaseÚiÚsr[  r\  Úfragment_durationrÓ   s               r=   Ú_extract_storyboardzTwitchVodIE._extract_storyboard  sB  è ø€ ÙÑ2ØØ×"Ñ"Ð#6¸ÐAgÐotÐ"ÓuÒ{Ðy{ˆð 	�	‰	Ñ@È$ˆ	ÔOÜÐ+Ó,ˆÜ˜d“Oò 	‰DˆAˆqÜ §¡ g£Ó/ˆEØ—U‘U˜8“_ˆFÙ™uØØ (¬3¨v«;Ñ 6Ðà! ! ˜XØ+ØØ#Ø Ø Ü˜t V¨A¡YÓ/Ü$ Q§U¡U¨7£^Ó4Ü% a§e¡e¨H£oÓ6Ø˜xÑ'Ü# A§E¡E¨&£MÓ2Ü& q§u¡u¨V£}Ó5ð %ö&ð ô # 4¨Ó.Ø 1óò &ñó ñ	ùò&&ùs   ‚DD7ÄD2Ä(D7c           	      óV  — | j                  |«      }| j                  |«      }| j                  ||«      }| j                  |dd«      }| j	                  d||d   |d   | j                  d«      ¬«      }|j                  | j                  ||j                  d«      |j                  d	«      «      «       | j                  |«       ||d
<   t        j                  j                  |«      }t        j                  j                  |j                  «      }d|v rt        |d   d   «      |d<   |S )Nr  rí   Úvodr   rÔ   rÕ   )rÕ   r  rï   r†   Útr   ré   )Ú	_match_idr  rT  r£   rÛ   Ú	get_paramÚextendrn  r_   rˆ   ÚurllibÚparseÚurlparser   rž   r   )	r<   rG   rS  r  r3  Úaccess_tokenr†   Ú
parsed_urlrž   s	            r=   Ú_real_extractzTwitchVodIE._real_extract<  s  € Ø—‘ Ó$ˆà×#Ñ# FÓ+ˆØ×%Ñ% e¨VÓ4ˆØ×2Ñ2°6¸7ÀDÓIˆà×3Ñ3Ø�6˜<¨Ñ0°,¸{Ñ2KØ ŸN™NÐ+<Ó=ð 4ó ?ˆð 	�‰�t×/Ñ/°¸¿	¹	À,Ó8OÐQU×QYÑQYÐZdÓQeÓfÔgà×Ñ˜GÔ$Ø!ˆˆY‰ä—\‘\×*Ñ*¨3Ó/ˆ
Ü—‘×%Ñ% j×&6Ñ&6Ó7ˆØ�%‰<Ü!/°°c±
¸1±Ó!>ˆD�Ñàˆr?   N)rÜ   rÝ   rÞ   ÚIE_NAMEÚ
_VALID_URLÚintÚ_TESTSr  r8  r@  rT  rn  rz  r}   r?   r=   rä   rä   ì   sv  „ Ø€Gð€Jð BàØØ6Ø1ØØ#Ø%Ø$Ø&ØØð #$Ø %Ø0ñðð &ñ'
ð. ˜Tð
ñ/ð: :àØØ)Ø1ØØ#Ø%Ø"Ø%Øñ
ð ˜Tð
ð ,ñ'ð* AØñð 6Øñð =Øñð DØñð ;Øñð 8àØØ!ØØ$Ø&Ø#Ø%ð #$Ø #Ø0ñð #&Ø $Ø3ñð #'Ø %Ø"ñðð" &Ø1Øñ9
ð> ˜Tð
ñA#ðH Ø7àØØØ!ØØ$Ø&Ø#Ø%ð #$Ø #Ø0ñð #&Ø $Ø3ñð #'Ø %Ø"ñðð" &Ø1ØØØñ? 
ðD Ø!ñ
ñI(ðR *Ø8àØØOØØ$Ø&Ø#Ø%ð #$Ø $Ø0ñðð &Ø1Øñ%
ð* ˜Tð
ð \Ð\ñ5ð8 JØñðIg€FòRòB#
òJò*
ò>óBr?   rä   c                 ó0  — t        | t        «      sJ ‚| j                  d«      }|sy dt        j	                  «       d|z   d|› �| j                  d«      | j                  d«      t        | j                  d«      «      t        | j                  d«      «      d	œS )
Nrí   Úurl_transparentrB  úhttps://www.twitch.tv/videos/rë   rC  rF  rO  )Ú_typer9   rí   rG   rë   r¨   rï   rô   )rÉ   rÏ   r_   rä   r9   r   r   ©r  r�   s     r=   Ú_make_video_resultr„  S  sŠ   € Ü�dœDÔ!Ð!Ð!Ø�x‰x˜‹~€HÙØà"Ü×$Ñ$Ó&Ø�H‰nØ.¨x¨jÐ9Ø—‘˜'Ó"Ø—X‘XÐ3Ó4Ü! $§(¡(¨?Ó";Ó<Ü! $§(¡(¨;Ó"7Ó8ñ	ð 	r?   c                   ó2   — e Zd ZdZdZddddœddœgZd	Zd
„ Zy)ÚTwitchCollectionIEztwitch:collectionz@https?://(?:(?:www|go|m)\.)?twitch\.tv/collections/(?P<id>[^/]+)z0https://www.twitch.tv/collections/o9zZer3IQBhTJwÚo9zZer3IQBhTJwzPlaythrough Archives©rí   rë   é   ©rG   rù   Úplaylist_mincountr*   c                 óˆ  — | j                  |«      }| j                  || j                  d|idœgd«      d   d   d   }|j                  d«      }g }|d   d	   D ]T  }t	        |t
        «      sŒ|j                  d
«      }t	        |t
        «      sŒ6t        |«      }|sŒD|j                  |«       ŒV | j                  |||¬«      S )NÚcollectionIDr  zDownloading collection GraphQLr   rN   Ú
collectionrë   r1  r  r  ©Úplaylist_idÚplaylist_title)	rr  r›   Ú_OPERATION_NAMEr_   rÉ   rÏ   r„  r2  Úplaylist_result)	r<   rG   Úcollection_idrŽ  rë   ÚentriesÚedger  r  s	            r=   rz  z TwitchCollectionIE._real_extractr  sõ   € ØŸ™ sÓ+ˆØ×'Ñ'ØØ!%×!5Ñ!5Ø,¨mÐ<ñð ð -ó.ð
 /0ñ1ð
 28ñ9ð
 :FñGˆ
ð —‘˜wÓ'ˆØˆØ˜wÑ'¨Ñ0ò 	&ˆDÜ˜d¤DÔ)ØØ—8‘8˜FÓ#ˆDÜ˜d¤DÔ)ØÜ& tÓ,ˆEÚØ—‘˜uÕ%ð	&ð ×#Ñ#Ø ¸uð $ó Fð 	Fr?   N)rÜ   rÝ   rÞ   r{  r|  r~  r’  rz  r}   r?   r=   r†  r†  d  s8   „ Ø!€GØT€JàAà"Ø+ñ
ð  ñð €Fð *€OóFr?   r†  c                   ó   — e Zd ZdZd„ Zy)ÚTwitchPlaylistBaseIEéd   c           	   '   ó6  ‡K  — d} | j                   |g|¢­Ž }| j                  › d�Št        j                  d«      D �]W  }|j	                  «       }| j
                  |d<   |r||d<   | j                  || j                  |dœgd| j                  › d|› �d	¬
«      }t        |ddddt        hf«      dk(  rt        d|› d�d¬«      ‚|s yt        |ˆfd„t        «      }|s y|D ]œ  }	t        |	t        «      sŒ|	j!                  d«      | j"                  k7  rŒ3|	j!                  d«      }
t        |
t        «      sŒU|
j!                  d«      | j                  k7  rŒt| j%                  |
«      }|sŒˆ|	j!                  d«      }|–— Œž |rt        |t        «      r�ŒX y y­w)z 
        Subclasses must define _make_variables() and _extract_entry(),
        as well as set _OPERATION_NAME, _ENTRY_KIND, _EDGE_KIND, and _NODE_KIND
        Nrl  r   ÚlimitÚcursorr  rŸ   zs GraphQL page FrV  r   rN   Úuserrí   rT   z	Channel "z" not foundTrB   c                 ó&   •— | d   d   d   ‰   d   S )Nr   rN   r�  r  r}   )rJ  Úentries_keys    €r=   rK  z/TwitchPlaylistBaseIE._entries.<locals>.<lambda>§  s   ø€   !¡ V¡¨VÑ 4°[Ñ AÀ'Ñ J€ r?   Ú
__typenamer  )Ú_make_variablesÚ_ENTRY_KINDÚ	itertoolsr[  ÚcopyÚ_PAGE_LIMITr›   r’  Ú
_NODE_KINDr   rQ  r   r   rR  rÉ   rÏ   r_   Ú
_EDGE_KINDÚ_extract_entry)r<   Úchannel_nameÚargsrœ  Úvariables_commonÚpage_numr  ra   r  r–  r  ÚentryrŸ  s               @r=   Ú_entrieszTwitchPlaylistBaseIE._entriesŒ  s·  øè ø€ ð
 ˆØ/˜4×/Ñ/°ÐD¸tÒDÐØ×)Ñ)Ð*¨!Ð,ˆÜ!Ÿ™¨Ó*ó %	ˆHØ(×-Ñ-Ó/ˆIØ!%×!1Ñ!1ˆI�gÑÙØ&,�	˜(Ñ#Ø×%Ñ%ØØ%)×%9Ñ%9Ø!*ñ ð ð ˜tŸ™Ð/¨¸x¸jÐIØð &ó ˆDô ˜D 1 f¨f°d¼S¸EÐ"BÓCÀrÒIÜ$ y°°¸kÐ%JÐUYÔZÐZÙÙÜØÓJÌDóRˆEáÙØò  �Ü! $¬Ô-ØØ—8‘8˜LÓ)¨T¯_©_Ò<ØØ—x‘x Ó'�Ü! $¬Ô-ØØ—8‘8˜LÓ)¨T¯_©_Ò<ØØ×+Ñ+¨DÓ1�ÚØ!ŸX™X hÓ/�FØ“Kð ñ ¤¨F´CÖ!8ÙñK%	ùs   ƒE&FÅ*)FÆFN)rÜ   rÝ   rÞ   r¥  r®  r}   r?   r=   r˜  r˜  ‰  s   „ Ø€Kó-r?   r˜  c                   ó,   — e Zd ZdZdZdZdZed„ «       Zy)ÚTwitchVideosBaseIEr+   r  Ú	VideoEdgeÚVideoc                 ó*   — | ||j                  «       dœS )N)ÚchannelOwnerLoginrD  Ú	videoSort)Úupper)r©  Úbroadcast_typere  s      r=   r¡  z"TwitchVideosBaseIE._make_variablesÂ  s   € ð ".Ø+ØŸ™›ñ
ð 	
r?   N)	rÜ   rÝ   rÞ   r’  r¢  r§  r¦  Ústaticmethodr¡  r}   r?   r=   r°  r°  ¼  s(   „ Ø3€OØ€KØ€JØ€Jàñ
ó ñ
r?   r°  c                   óT  ‡ — 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œddœddddœddœddddœddœdddœdddœdddœg	Z ej                  dddg«      Z ed d!«      Z	 ed"d#«       ed$d%«       ed&d'«       ed(d)«      e	d*œZ
d+Zed,d-œZeˆ fd.„«       Zed/„ «       Zd0„ Zˆ xZS )1ÚTwitchVideosIEztwitch:videoszGhttps?://(?:(?:www|go|m)\.)?twitch\.tv/(?P<id>[^/]+)/(?:videos|profile)z0https://www.twitch.tv/spamfish/videos?filter=allÚspamfishz$spamfish - All Videos sorted by Daterˆ  iï  rŠ  z;https://www.twitch.tv/spamfish/videos?filter=all&sort=viewsz'spamfish - All Videos sorted by Populariò  z5https://www.twitch.tv/spamfish/videos?filter=archivesz)spamfish - Past Broadcasts sorted by Dateé   z7https://www.twitch.tv/spamfish/videos?filter=highlightsz$spamfish - Highlights sorted by Datez>https://www.twitch.tv/esl_csgo/videos?filter=uploads&sort=timeÚesl_csgoz!esl_csgo - Uploads sorted by Dateé   z;https://www.twitch.tv/spamfish/videos?filter=past_premieresz(spamfish - Past Premieres sorted by Dater   z)https://www.twitch.tv/spamfish/videos/allTr  z'https://m.twitch.tv/spamfish/videos/allz%https://www.twitch.tv/spamfish/videosÚ	BroadcastÚtypeÚlabelNz
All VideosrE  zPast BroadcastsÚ	HIGHLIGHTÚ
HighlightsÚUPLOADÚUploadsÚPAST_PREMIEREzPast Premieres)ÚarchivesÚ
highlightsÚuploadsÚpast_premieresÚallÚDateÚPopular)Útimer.  c                 ód   •‡— t        ˆfd„t        t        fD «       «      rdS t        ‰| �  ‰«      S )Nc              3   ó@   •K  — | ]  }|j                  ‰«      –— Œ y ­w©N©Úsuitable©r~   ÚierG   s     €r=   r€   z*TwitchVideosIE.suitable.<locals>.<genexpr>   s   øè ø€ ò 0¨B�r—{‘{ 3×'ñ 0ùó   ƒF)ÚanyÚTwitchVideosClipsIEÚTwitchVideosCollectionsIEÚsuperrÓ  ©ÚclsrG   Ú	__class__s    `€r=   rÓ  zTwitchVideosIE.suitable  s@   ù€ ô ó 0Ü'Ü-ð3/ô 0ô 0ð ð 	,ô ‘WÑ% cÓ*ð		,r?   c                 ó   — t        | «      S rÑ  )r„  )r  s    r=   r¨  zTwitchVideosIE._extract_entry%  s   € ä! $Ó'Ð'r?   c                 ó¨  — | j                  |«      }t        |«      }|j                  ddg«      d   }|j                  ddg«      d   }| j                  j                  || j                  «      }| j                  | j                  ||j                  |«      ||› d|j                  › d| j                  j                  || j                  «      › �¬«      S )	NÚfilterrË  r   re  rÎ  z - z sorted by r�  )rr  r   r_   Ú_BROADCASTSÚ_DEFAULT_BROADCASTr“  r®  rÀ  rÁ  Ú
_SORTED_BYÚ_DEFAULT_SORTED_BY)r<   rG   r©  ÚqsÚvideo_filterre  Ú	broadcasts          r=   rz  zTwitchVideosIE._real_extract)  sÎ   € Ø—~‘~ cÓ*ˆÜ�c‹]ˆØ—v‘v˜h¨¨Ó0°Ñ3ˆØ�v‰v�f˜v˜hÓ'¨Ñ*ˆØ×$Ñ$×(Ñ(¨°t×7NÑ7NÓOˆ	Ø×#Ñ#Ø�M‰M˜,¨	¯©¸Ó=Ø$à�.  I§O¡OÐ#4ð 5Ø!Ÿ_™_×0Ñ0°°t×7NÑ7NÓOÐPðRð	 $ó Tð 	Tr?   )rÜ   rÝ   rÞ   r{  r|  r~  ÚcollectionsÚ
namedtupler¿  râ  rá  rä  rã  ÚclassmethodrÓ  r¸  r¨  rz  Ú__classcell__©rÝ  s   @r=   rº  rº  Ë  s~  ø„ Ø€GØ[€Jð BàØ;ñ
ð !ñð MàØ>ñ
ð !ñð GàØ@ñ
ð  ñ	ð IàØ;ñ
ð !ñð PàØ8ñ
ð ñ	ð MàØ?ñ
ð ñ	ð ;Øñð 9Øñð 7Øñðs<€Fð| '�×&Ñ& {°V¸WÐ4EÓF€Iá" 4¨Ó6Ðá˜iÐ):Ó;Ù ¨\Ó:Ù˜X yÓ1Ù# OÐ5EÓFØ!ñ€Kð  Ðà"Øñ€Jð
 ó,ó ð,ð ñ(ó ð(öTr?   rº  c                   óÞ   — e Zd ZdZdZddddœddœd	d
dœgZ ej                  dddg«      Z edd«      Z	 edd«      e	 edd«       edd«      dœZ
dZdZdZdZdZed„ «       Zed„ «       Zd„ Zy) rØ  ztwitch:videos:clipsz[https?://(?:(?:www|go|m)\.)?twitch\.tv/(?P<id>[^/]+)/(?:clips|videos/*?\?.*?\bfilter=clips)z<https://www.twitch.tv/vanillatv/clips?filter=clips&range=allÚ	vanillatvzvanillatv - Clips Top Allrˆ  r   rŠ  z=https://www.twitch.tv/dota2ruhub/videos?filter=clips&range=7dTr  ÚCliprà  rÁ  Ú	LAST_WEEKzTop 7DÚLAST_DAYzTop 24HÚ
LAST_MONTHzTop 30DÚALL_TIMEzTop All)Ú24hrÚ7dÚ30drË  é   r,   ÚclipÚClipEdgec                 ó   — | d|idœS )Nrà  )rM  Úcriteriar}   )r©  Úchannel_filters     r=   r¡  z#TwitchVideosClipsIE._make_variablesY  s   € ð "à˜.ðñ
ð 	
r?   c                 ó¦  — t        | t        «      sJ ‚t        | j                  d«      «      }|sy dt        j                  «       | j                  d«      || j                  d«      | j                  d«      t        | j                  d«      «      t        | j                  d«      «      t        | j                  d«      «      | j                  d	«      d
œ
S )NrG   r€  rí   rë   ÚthumbnailURLÚdurationSecondsÚ	createdAtrO  Úlanguage)
r‚  r9   rí   rG   rë   r¨   rï   rð   rô   r  )	rÉ   rÏ   r   r_   ÚTwitchClipsIEr9   r   r   r   )r  Úclip_urls     r=   r¨  z"TwitchVideosClipsIE._extract_entryb  s©   € ä˜$¤Ô%Ð%Ð%Ü˜tŸx™x¨›Ó/ˆÙØà&Ü#×*Ñ*Ó,Ø—(‘(˜4“.ØØ—X‘X˜gÓ&ØŸ™ .Ó1Ü% d§h¡hÐ/@Ó&AÓBÜ*¨4¯8©8°KÓ+@ÓAÜ% d§h¡h¨{Ó&;Ó<ØŸ™ Ó,ñ
ð 	
r?   c                 ó,  — | j                  |«      }t        |«      }|j                  ddg«      d   }| j                  j                  || j                  «      }| j                  | j                  ||j                  «      ||› d|j                  › �¬«      S )NÚrangerõ  r   z	 - Clips r�  )	rr  r   r_   Ú_RANGEÚ_DEFAULT_CLIPr“  r®  rà  rÁ  )r<   rG   r©  rå  Ú
date_rangerø  s         r=   rz  z!TwitchVideosClipsIE._real_extractu  s‹   € Ø—~‘~ cÓ*ˆÜ�c‹]ˆØ—V‘V˜G d VÓ,¨QÑ/ˆ
Ø�{‰{�‰˜z¨4×+=Ñ+=Ó>ˆØ×#Ñ#Ø�M‰M˜,¨¯©Ó4Ø$Ø*˜^¨9°T·Z±Z°LÐAð $ó Cð 	Cr?   N)rÜ   rÝ   rÞ   r{  r|  r~  rè  ré  rï  r  r  r¥  r’  r¢  r§  r¦  r¸  r¡  r¨  rz  r}   r?   r=   rØ  rØ  7  sÒ   „ Ø#€GØo€Jð NàØ0ñ
ð ñð OØñð€Fð "ˆ;×!Ñ! &¨8°WÐ*=Ó>€Dá˜ hÓ/€Má�Z Ó+ØÙ�L )Ó,Ù�J 	Ó*ñ	€Fð €Kà(€OØ€KØ€JØ€Jàñ
ó ð
ð ñ
ó ð
ó$Cr?   rØ  c                   ón   — 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	e
d„ «       Ze
d„ «       Zd„ Zy)rÙ  ztwitch:videos:collectionszWhttps?://(?:(?:www|go|m)\.)?twitch\.tv/(?P<id>[^/]+)/videos/*?\?.*?\bfilter=collectionsz8https://www.twitch.tv/spamfish/videos?filter=collectionsr»  zspamfish - Collectionsrˆ  é   rŠ  z:https://www.twitch.tv/monstercat/videos?filter=collectionsÚ
monstercatzmonstercat - Collectionsé   r.   rŽ  ÚCollectionsItemEdgeÚ
Collectionc                 ó
   — d| iS )NÚ
ownerLoginr}   )r©  s    r=   r¡  z)TwitchVideosCollectionsIE._make_variables™  s   € ð ˜,ð
ð 	
r?   c                 ó\  — t        | t        «      sJ ‚| j                  d«      }|sy dt        j	                  «       |d|› �| j                  d«      | j                  d«      t        | j                  d«      «      t        | j                  d«      «      t        | j                  d«      «      d	œ	S )
Nrí   r€  z"https://www.twitch.tv/collections/rë   rþ  rF  Ú	updatedAtrO  )	r‚  r9   rí   rG   rë   r¨   rï   rð   rô   )rÉ   rÏ   r_   r†  r9   r   r   r   )r  r”  s     r=   r¨  z(TwitchVideosCollectionsIE._extract_entryŸ  s–   € ä˜$¤Ô%Ð%Ð%ØŸ™ ›ˆÙØà&Ü(×/Ñ/Ó1ØØ7¸°ÐGØ—X‘X˜gÓ&ØŸ™ .Ó1Ü% d§h¡h¨Ó&?Ó@Ü*¨4¯8©8°KÓ+@ÓAÜ% d§h¡h¨{Ó&;Ó<ñ

ð 
	
r?   c                 óp   — | j                  |«      }| j                  | j                  |«      ||› d�¬«      S )Nz - Collectionsr�  )rr  r“  r®  )r<   rG   r©  s      r=   rz  z'TwitchVideosCollectionsIE._real_extract±  s@   € Ø—~‘~ cÓ*ˆØ×#Ñ#Ø�M‰M˜,Ó'°\Ø*˜^¨>Ð:ð $ó <ð 	<r?   N)rÜ   rÝ   rÞ   r{  r|  r~  r’  r¢  r§  r¦  r¸  r¡  r¨  rz  r}   r?   r=   rÙ  rÙ  €  sŠ   „ Ø)€GØk€Jð JàØ-ñ
ð ñð LàØ/ñ
ð  ñð€Fð" 2€OØ€KØ&€JØ€Jàñ
ó ð
ð
 ñ
ó ð
ó"<r?   rÙ  c                   ó¾   ‡ — e Zd ZdZdZddddddd	d
ddde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ddd œdd!id"œgZd#Zeˆ fd$„«       Z	e
d%„ «       Zd&„ Zˆ xZS )'ÚTwitchStreamIEztwitch:streama  (?x)
                    https?://
                        (?:
                            (?:(?:www|go|m)\.)?twitch\.tv/|
                            player\.twitch\.tv/\?.*?\bchannel=
                        )
                        (?P<id>[^/#?]+)
                    zhttp://www.twitch.tv/shroomztvÚ12772022048Ú	shroomztvr¬   z;re:^ShroomzTV [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$zGH1Z1 - lonewolfing with ShroomzTV | A3 Battle Royale later - @ShroomzTVTieæÀTÚ20150122Ú	ShroomzTV)rí   Ú
display_idrî   rë   r(  r0  rð   rñ   rò   ró   rô   r÷   zUser does not existr   z+http://www.twitch.tv/miracle_doto#profile-0r  z)https://player.twitch.tv/?channel=lotsofszhttps://go.twitch.tv/foodzhttps://m.twitch.tv/foodz https://www.twitch.tv/monstercatÚ40500071752r  zre:Monstercatz$md5:0945ad625e615bc8f0469396537d87d9iöŸöcÚ20230222Ú
Monstercatr0  zre:https://.*.jpg)rí   r  rë   r(  r0  rð   rñ   rò   ró   rö   r¨   rî   Ú
Livestreamrø   r   c           	      óŒ   •‡— t        ˆfd„t        t        t        t        t
        t        fD «       «      rdS t        ‰| �!  ‰«      S )Nc              3   ó@   •K  — | ]  }|j                  ‰«      –— Œ y ­wrÑ  rÒ  rÔ  s     €r=   r€   z*TwitchStreamIE.suitable.<locals>.<genexpr>ü  s   øè ø€ ò $¨B�r—{‘{ 3×'ñ $ùrÖ  F)	r×  rä   r†  rº  rØ  rÙ  r  rÚ  rÓ  rÛ  s    `€r=   rÓ  zTwitchStreamIE.suitableù  sL   ù€ ô ó $ÜÜ&Ü"Ü'Ü-Ü!ð3#ô $ô $ð ð 	,ô ‘WÑ% cÓ*ð	,r?   c           
      óè   — t        | t        «      r| j                  d«      sy | d   }dt        j	                  «       d|z   d|› �| j                  d«      t        | j                  d«      «      xs ddœS )	Nrí   rG   rB  r�  rë   rN  r   )r‚  r9   rí   rG   rë   rð   )rÉ   rÏ   r_   rä   r9   r   rƒ  s     r=   r¨  zTwitchStreamIE._extract_entry  sn   € ä˜$¤Ô%¨T¯X©X°d¬^ØØ˜‘:ˆàÜ!×(Ñ(Ó*Ø˜‘.Ø2°8°*Ð=Ø—X‘X˜gÓ&Ü*¨4¯8©8°MÓ+BÓCÒHÀqñ
ð 	
r?   c                 ó  — | j                  |«      j                  «       }| j                  |d|ddœdœd|ddddddœdœd	d
|idœgd«      }|d   d   d   }|st        |› d�d¬«      ‚|d   }|st	        |¬«      ‚t        |j                  d«      «      }| j                  d«      ri| j                  |› d�«       t        | j                  |d d«      d «      }|r#|j                  d«      |xs t        d«      k\  r|S | j                  d|¬«       | j                  |dd«      }|j                  d«      xs |}	| j                  d||d   |d   «      }
| j!                  |
«       |j                  d«      }t#        |d „ t$        «      xs i }|j                  d!«      }t#        |d"„ t&        «      }t)        t#        |d#„ t&        «      «      }|xs |}|j                  d$«      }|d%v r	|d&|› d'�z  }|	|||| j+                  |«      |||||
|d(k(  d)œS )*Nr/   T)r  ÚincludeIsDJr  r0   rT   F)r*  ÚclipSlugÚisClipÚisLiveÚisVodOrCollectionÚvodIDr1   rM  zDownloading stream GraphQLr   rN   r�  r  rB   Ústream)r�   r   rÕ   z,: Extracting VOD to download live from startrÎ  rð   Úinfz9Unable to extract the VOD associated with this livestreamÚchannelNamerí   zapi/channel/hlsr   rÔ   Úviewersc                 ó   — | d   d   d   S )Nr   rN   r�  r}   rI  s    r=   rK  z.TwitchStreamIE._real_extract.<locals>.<lambda>L  s   € ¨¨1©¨f©°fÑ)=€ r?   r;  c                 ó   — | d   d   S )NÚbroadcastSettingsrë   r}   rI  s    r=   rK  z.TwitchStreamIE._real_extract.<locals>.<lambda>O  s   € ˜qÐ!4Ñ5°gÑ>€ r?   c                 ó$   — | d   d   d   d   d   S )Nr   rN   r�  r)  ÚpreviewImageURLr}   rI  s    r=   rK  z.TwitchStreamIE._real_extract.<locals>.<lambda>R  s   € ˜1˜Q™4 ™<¨Ñ/°Ñ9Ð:KÑL€ r?   rÀ  )ÚrerunÚlivez (ú)r3  )rí   r  rë   r(  r/  rò   ró   rð   rô   r†   r0  )rr  Úlowerr›   r   r   r   r_   rs  Ú	to_screenr„   r®  ÚpopÚfloatr>  r£   rÛ   rˆ   r   rÏ   rQ  r   r©   )r<   rG   r©  Úgqlr�  r)  rð   r­  rx  Ú	stream_idr†   rô   Úsq_userrò   r(  r¨   rë   Ústream_types                     r=   rz  zTwitchStreamIE._real_extract  s‚  € Ø—~‘~ cÓ*×0Ñ0Ó2ˆà× Ñ ØØ!1à$0Ø#'ññð ":à+Ø "Ø#Ø"Ø).Øññ
ð "7Ø% |Ð4ñð!ð( )ó+*ˆð. �1‰v�f‰~˜fÑ%ˆáÜ Ø�. Ð0¸4ôAð Að �h‘ˆáÜ |Ô4Ð4ä% f§j¡j°Ó&=Ó>ˆ	à�>‰>Ð+Ô,Ø�N‰N˜l˜^Ð+WÐXÔYÜ˜Ÿ™ |°T¸6ÓBÀDÓIˆEÙ˜Ÿ™ ;Ó/°IÒ4MÄÀuÃÒNØ�Ø×ÑØKÐVbð  ô dð ×2Ñ2Ø˜( Mó3ˆð —J‘J˜tÓ$Ò4¨ˆ	Ø×3Ñ3Ø˜|¨\¸'Ñ-BÀLÐQ\ÑD]ó_ˆà×Ñ˜GÔ$à—Z‘Z 	Ó*ˆ
ä˜#Ñ=¼tÓDÒJÈˆØ—;‘;˜}Ó-ˆÜØÑ>ÄóEˆô  ¤ØÑLÜó!ó ˆ	ð Ò(˜LˆØ—j‘j Ó(ˆØÐ+Ñ+Ø�r˜+˜ aÐ(Ñ(ˆEð Ø&ØØ&Ø×.Ñ.¨yÓ9Ø Ø'Ø"Ø$ØØ" fÑ,ñ
ð 	
r?   )rÜ   rÝ   rÞ   r{  r|  r}  r~  r¥  rê  rÓ  r¸  r¨  rz  rë  rì  s   @r=   r  r  ¸  sÿ   ø„ Ø€Gð€Jð 0àØ%ØØRØdØØ#Ø%Ø#Ø&Øñ
ð ˜Tð
ð &ñ'ð* =Øñð ;Øñð +Øñð *Øñð 2àØ&Ø$ØAØØ#Ø%Ø$Ø'Ø$Ø,Øñ
ð ˜\ð
ñ!ðA3€Fðh €Kàó	,ó ð	,ð ñ
ó ð
öS
r?   r  c            
       ó.  — e Zd ZdZdZddi dd“dd“d	d
“dd“dd“de“dd“dd“dd“ddg“dd“dd“dd“de“dd“d d!“d"œd#d$i dd%“dd&“d	d
“dd'“dd(“de“dd“dd)“dd*“dd+g“dd+“dd,“dd-“de“dd.“d d/“d0d1g“d"œd2d-d3œd4d-d3œd5d-d3œd6d-d3œd7d-d3œd8d-d3œgZd9„ Zy:);r  ztwitch:clipsa2  (?x)
                    https?://
                        (?:
                            clips\.twitch\.tv/(?:embed\?.*?\bclip=|(?:[^/]+/)*)|
                            (?:(?:www|go|m)\.)?twitch\.tv/(?:[^/]+/)?clip/
                        )
                        (?P<id>[^/?#&]+)
                    z0https://clips.twitch.tv/FaintLightGullWholeWheatÚ 761769e1eafce0ffebfb4089cb3847cdrí   Ú	396245304r  ÚFaintLightGullWholeWheatrî   r¬   rë   z'EA Play 2016 Live from the Novo Theatrerï   é    rô   r¨   zre:^https?://.*\.jpgrð   iáÕ]Wrñ   Ú20160612ÚcreatorsÚEAr*  Ú
channel_idÚ25163635Úchannel_is_verifiedFÚchannel_follower_countrò   Ústereotype_ró   Ú43566419)rG   Úmd5rù   zLhttps://www.twitch.tv/xqc/clip/CulturedAmazingKuduDatSheffy-TiZ_-ixAGYR3y2UyÚ e90fe616b36e722a8cfa562547c543f0Ú
3207364882z-CulturedAmazingKuduDatSheffy-TiZ_-ixAGYR3y2UyzA day in the life of xQcé<   ioâgÚ20250325ÚxQcÚ71092938TÚ
okSTFUdudeÚ	744085721Ú
categorieszJust Chattingz;https://clips.twitch.tv/rflegendary/UninterestedBeeDAESuppyr  zDhttps://www.twitch.tv/sergeynixon/clip/StormyThankfulSproutFutureManzEhttps://clips.twitch.tv/embed?clip=InquisitiveBreakableYogurtJebaitedzChttps://m.twitch.tv/rossbroadcast/clip/ConfidentBraveHumanChefFrankzDhttps://go.twitch.tv/rossbroadcast/clip/ConfidentBraveHumanChefFrankz1https://m.twitch.tv/clip/FaintLightGullWholeWheatc                 óö  — | j                  |«      }| j                  |dd|idœgd«      d   d   d   }|st        dd	¬
«      ‚|d   d   |d   d   dœ}t        |ddt        hf«      xs i }t        |ddt        hf«      xs i }g }t        |j                  d«      «      }|j                  t        |dd„ dt        |¬«      hfdt        hfdt        hfdt
        hft        |«      hdœf«      «       t        |j                  d«      «      }	t        |dd„ f«      D ]p  }
|j                  t        |
d   |«      t        d|
j                  d«      «      t        |
j                  d«      «      t        |
j                  d«      «      |	ddœ«       Œr g }t        |j                  d«      «      }|r|j                  d|ddœ«       t        |j                  d«      «      x}r|j                  d|d dœ«       t        |j                  d«      «      }|r||k7  r|j                  d!|ddœ«       | j                  d"|d    d#   d$d ¬%«      }|j                  d&«      xs ||rt!        | |«      gnd |||d'œt        |d(t        hfd)t        hfd*t        hfd+t"        hfd,d-t        ht$        t&        fd,d-t        hfd,d&t        hfd,d.d/t        hfd,d0t(        hfd1d-t        hfd1d&t        hfd2d-t        ht$        t&        t$        fd3œ«      ¥S )4Nr-   Úslugr  zDownloading clip GraphQLr   rN   rø  z This clip is no longer availableTrB   ÚplaybackAccessTokenrÔ   r   )r·   r¸   Úassetsr   ÚaspectRatioÚvideoQualitiesc                 ó   — t        |d   «      S ©NÚ	sourceURL©r   ©Ú_rB  s     r=   rK  z-TwitchClipsIE._real_extract.<locals>.<lambda>Ë  ó   € ÔS^Ð_`ÐalÑ_mÓSn€ r?   r]  r¹   r‚   Ú	frameRate)rG   r{   r_  rc  Úaspect_ratioc                 ó   — t        |d   «      S r\  r^  r_  s     r=   rK  z-TwitchClipsIE._real_extract.<locals>.<lambda>Ó  ra  r?   Úportraitéþÿÿÿ)rG   r{   r_  rc  rc  r‚   rþ  rH   )rí   rG   r¦   éÿÿÿÿr#  z%7C(\d+)(?:-\d+)?.mp4rG   zold id)rH   rí   )rí   Ú_old_archive_idsr  r†   r/  rë   rÿ  rO  r   Úbroadcasterr;  Ú	followersÚ
totalCountÚ	isPartnerÚcuratorr:  )rë   rï   rô   rð   rC  r*  rE  rH  rG  rò   ró   rT  )rr  r›   r   r   rÏ   r   r_   rt  r   rQ  r   r   r2  r   r   rY   r   r   rà  rË  Úbool)r<   rG   rV  rø  Úaccess_queryÚasset_defaultÚasset_portraitr†   Údefault_aspect_ratioÚportrait_aspect_ratior‡   r/  Úthumb_asset_default_urlÚthumb_asset_portrait_urlÚthumb_default_urlÚold_ids                   r=   rz  zTwitchClipsIE._real_extract´  s—  € Ø�~‰~˜cÓ"ˆà×!Ñ!ØØ!8Ø$ d˜^ñð ð 'ó(ð
 )*ñ+ð
 ,2ñ3ð
 4:ñ;ˆñ Ü Ø2¸TôCð Cð Ð-Ñ.¨{Ñ;ØÐ/Ñ0°Ñ9ñ
ˆô % T¨H°a¼$¸Ð+@ÓAÒGÀRˆÜ% d¨X°q¼4¸&Ð,AÓBÒHÀbˆàˆÜ,¨]×->Ñ->¸}Ó-MÓNÐØ�‰”| MÐ4DÑFnØÔ"2¸Ô"FÐ!GÐHØ#¤c UÐ+Ø ¤; -Ð0Ø¤- Ð1Ü"Ð#7Ó8Ð9ñq
ð 4ó ô 	ô !.¨n×.@Ñ.@ÀÓ.OÓ PÐÜ" >Ð4DÑFnÐ3oÓpò 	ˆFØ�N‰NÜ'¨¨{Ñ(;¸\ÓJÜ*¨:°v·z±zÀ)Ó7LÓMÜ% f§j¡j°Ó&;Ó<Ü$ V§Z¡Z°Ó%<Ó=Ø 5Øñõ ð	ð ˆ
Ü"-¨m×.?Ñ.?ÀÓ.OÓ"PÐÙ"Ø×ÑØØ.Øñô ô
 (3°>×3EÑ3EÀnÓ3UÓ'VÐVÐ#ÐVØ×ÑØ Ø/Ø ñô ô
 (¨¯©°Ó(@ÓAÐÙÐ!2Ð6MÒ!MØ×ÑØØ(Ø ñô ð ×#Ñ#Ð$<¸gÀb¹kÈ%Ñ>PÐRZÐdhÐ#Óiˆð —(‘(˜4“.Ò( DÙCI¤°°vÓ!>Ñ ?ÈtØØØ$ñ
ô ˜4Ø!¤C 5Ð)Ø.´°Ð>Ø*¬[¨MÐ:Ø)¬M¨?Ð;Ø*¨M¼C¸5Ä&Ì#ÐNØ)¨=¼3¸%Ð@Ø,¨d´S°EÐ:Ø+8¸+À|ÔVaÐUbÐ*cØ(5°{ÄTÀFÐ'KØ&¨¼°uÐ=Ø )¨4´#°Ð7Ø% }´s°e¼VÄSÌ&ÐQñ"ó ð
ð 	
r?   N)rÜ   rÝ   rÞ   r{  r|  r}  r~  rz  r}   r?   r=   r  r  i  s(  „ Ø€Gð€Jð BØ1ð
Ø�+ð
àÐ4ð
ð �5ð
ð Ð>ð	
ð
 ˜ð
ð ˜#ð
ð Ð0ð
ð ˜ð
ð ˜:ð
ð ˜˜ð
ð �tð
ð ˜*ð
ð " 5ð
ð % cð
ð ˜ð
ð  ˜:ð!
ñð, ^Ø1ð
Ø�,ð
àÐIð
ð �5ð
ð Ð/ð	
ð
 ˜ð
ð ˜#ð
ð Ð0ð
ð ˜ð
ð ˜:ð
ð ˜˜ð
ð �uð
ð ˜*ð
ð " 4ð
ð % cð
ð ˜ð
ð  ˜;ð!
ð" ˜?Ð+ð#
ñð0 MØñð
 VØñð WØñð UØñð VØñð CØñðw>€Fó@U
r?   r  )-rè  r£  r\   rÇ   rq   Úurllib.parseru  Úcommonr   Únetworking.exceptionsr   Úutilsr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Úutils.traversalr   r   r   rä   r„  r†  r˜  r°  rº  rØ  rÙ  r  r  r}   r?   r=   ú<module>r}     sÜ   ðÛ Û Û Û Û 	Û å !Ý -÷÷ ÷ ÷ ÷ ñ ÷* 2ôG�=ô GôTd�,ô dòNô""F˜ô "FôJ0˜<ô 0ôf
Ð-ô 
ôiTÐ'ô iTôXFCÐ.ô FCôR5<Ð 4ô 5<ôpn
Ð'ô n
ôb`
�Lõ `
r?   