o
    i=                     @   s   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 ddlmZ G dd deZG dd	 d	eZG d
d deZdS )   )InfoExtractor   )	HTTPError)ExtractorErrorLazyListint_or_nonejoin_nonemptyparse_iso8601parse_qssmuggle_urlstr_or_noneurl_or_noneurlencode_postdataurljoin)traverse_objc                   @   s.   e Zd ZdZdZe dZdd Zdd ZdS )	RoosterTeethBaseIEroosterteethz https://svod-be.roosterteeth.comz/api/v1c              
   C   s   |  | jdrd S z| jdd dtdd||dd W d S  tyk } zAd}t|jtr[|jj	d	kr[| j
|jj  d d
d}|r[|dpR|dpR|d}|r[|d| 7 }| | W Y d }~d S d }~ww )Nrt_access_tokenz)https://auth.roosterteeth.com/oauth/tokenz
Logging in@4338d2b4bdc8db1239360f28e72f0d9ddb1fd01e7a38fbb07b4b1f4ba4564cc5password)	client_id
grant_typeusernamer   )datazUnable to logini  Ffatal
extra_infoerror_descriptionerrorz: )_get_cookies_API_BASE_URLget_download_jsonr   r   
isinstancecauser   status_parse_jsonresponsereaddecodereport_warning)selfr   r   emsgrespr    r/   Q/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/extractor/roosterteeth.py_perform_login   s.   z!RoosterTeethBaseIE._perform_loginc           	   	   C   sl  g }t |dD ]}|ddvrq|dd |dpi  D  q|dp)i }t |dd}|d	}t|d
}t|d}|rNd|v rN|d7 }n|sR|}i d|d|dd|dt |dddt |dddt|ddt|dd|dt|dd|d|ddt|ddt|dd |d!| j|||d"d"d#d$|d%S )&N)includedimagestype)episode_imagebonus_feature_imagec                 S   s"   g | ]\}}t |r||d qS ))idurl)r   ).0namer8   r/   r/   r0   
<listcomp>4   s    
z:RoosterTeethBaseIE._extract_video_info.<locals>.<listcomp>
attributestitledisplay_titleis_sponsors_onlyuuidr7   parent_content_idz-bonus
display_idslugdescriptioncaptionseries
show_titleparent_content_titleseason_number	season_idepisodeepisode_numbernumber
episode_id
channel_iddurationlengthrelease_timestamporiginal_air_date
thumbnailsavailabilityF)needs_premiumneeds_subscription
needs_auth
is_privateis_unlistedtagsgenres)r   r!   extenditemsr   r   r	   _availability)	r+   r   rT   imager<   r=   sub_onlyrN   video_idr/   r/   r0   _extract_video_info/   sh   




	


z&RoosterTeethBaseIE._extract_video_infoN)__name__
__module____qualname___NETRC_MACHINE	_API_BASEr    r1   rc   r/   r/   r/   r0   r      s    
r   c                   @   s  e Zd ZdZdi ddddddd	d
dddddddd
dddgdddddddddddd d!d"d#d$d%d&d'd(d)id*d+i dd,dd-d	d.dd/dd.d!d0dd1dddddd2dd3dd4gdd5dd6dd7dd8d#d9d:d;d'd(d)id*d<d=d>d?d@d?d0d1dddAdBdCdDdEdFdGd(d)id*dHi ddIddd	dJddKdddd1ddJddLddMddNddOgddPddQddRddSd!dTd#dUdVdWd'd(d)id*dXi ddYddd	dZdddd[dddd\d!d]ddZdd^dd1ddOd_gdd`ddadd3ddbdcdddedfidggd(d)idhdid)djdkd)djdld)djdmd)djdnd)djdod)djdpd)djgZdqZdrds Zdtdu ZdvS )wRoosterTeethIEzUhttps?://(?:.+?\.)?roosterteeth\.com/(?:bonus-feature|episode|watch)/(?P<id>[^/?#&]+)zfhttp://roosterteeth.com/episode/million-dollars-but-season-2-million-dollars-but-the-game-announcementr7   9156rB   zFmillion-dollars-but-season-2-million-dollars-but-the-game-announcementextmp4r=   z-Million Dollars, But... The Game AnnouncementrD   z$md5:168a54b40e228e79f4ddb141e89fe4f5	thumbnailzre:^https?://.*\.png$rF   zMillion Dollars, But...rK   r[   z	Game ShowSketchrI   r   rU   publicrL   
   rN   z$00374575-464e-11e7-a302-065410f210c4seasonzSeason 2rJ   z$ffa27d48-464d-11e7-a302-065410f210c4rO   z$92b6bb21-91d2-4b1b-bf95-3268fa0d9939rP      i W3W20160511)rR   release_dateskip_downloadT)r8   	info_dictparamsz,https://roosterteeth.com/watch/rwby-bonus-2540432zrwby-bonus-25Grimmz$md5:f30ff570741213418a8d2c19868b93abz$92f780eb-ebfe-4bf5-a3b5-c6ad5460a5f1zre:^https?://.*\.(png|jpe?g)$z$f8117b13-f068-499e-803e-eec9ea2dec8c   	Animationz$4b8f0a9e-12c4-41ed-8caa-fed15a85bab8zSeason 1zRWBY: World of Remnantr      i#@T20141016z,https://roosterteeth.com/watch/rwby-bonus-21z33-bonuszrwby-bonus-21zVolume 5 Yang Character Shortz$md5:8c2440bc763ea90c52cfe0a68093e1f7z$f2a9f132-1fe2-44ad-8956-63d7c02677207   RWBY   ip&Y20171014)r7   rB   r=   rD   rK   rO   rm   rk   rU   rN   rL   rF   rP   rR   rt   zhttps://www.roosterteeth.com/watch/achievement-hunter-achievement-hunter-fatality-walkthrough-deathstroke-lex-luthor-captain-marvel-green-lantern-and-wonder-woman25394z^Fatality Walkthrough: Deathstroke, Lex Luthor, Captain Marvel, Green Lantern, and Wonder Womanz$md5:91bb934698344fb9647b1c7351f16964G   z$ffaec998-464d-11e7-a302-065410f210c4zSeason 2008GamingzAchievement Hunterz$md5:4465ce4f001735f9d7a2ae529a543d31z$ffa13340-464d-11e7-a302-065410f210c4i  z$2cb2a70c-be50-46f5-93d7-84a1baabb4f7   it6I20081203z1https://roosterteeth.com/watch/lets-play-2013-12617845zWWE '13z
Let's Playz$ffa23d9c-464d-11e7-a302-065410f210c4z$75ba87e8-06fd-4482-bad9-52a4da2c6181z$ffdbe55e-464d-11e7-a302-065410f210c4zOur Favoritesz$md5:b4a5226d2bbcf0dafbde11a2ba27262dzlets-play-2013-126zSeason 3rR   i`Qrt   20130204z'Direct m3u8 URL returned HTTP Error 403)r8   rv   expected_warningsrw   zhttp://achievementhunter.roosterteeth.com/episode/off-topic-the-achievement-hunter-podcast-2016-i-didn-t-think-it-would-pass-31)r8   only_matchingzWhttp://funhaus.roosterteeth.com/episode/funhaus-shorts-2016-austin-sucks-funhaus-shortszRhttp://screwattack.roosterteeth.com/episode/death-battle-season-3-mewtwo-vs-shadowzahttp://theknow.roosterteeth.com/episode/the-know-game-news-season-1-boring-steam-sales-are-betterzhttp://roosterteeth.com/episode/rt-docs-the-world-s-greatest-head-massage-the-world-s-greatest-head-massage-an-asmr-journey-part-onezehttps://roosterteeth.com/watch/million-dollars-but-season-2-million-dollars-but-the-game-announcementznhttps://roosterteeth.com/bonus-feature/camp-camp-soundtrack-another-rap-song-about-foreign-cars-richie-branson6203312018001c                 C   sL   | j d|d| jd}| jdtd| d| d|i}|d |d	 fS )
Nz/accounts/(\d+)/videos/z
account id)defaultBrightcoveNewzhttps://players.brightcove.net/z$/default_default/index.html?videoId=referrerformats	subtitles)_search_regex_BRIGHTCOVE_ACCOUNT_ID_downloaderget_info_extractorextractr   )r+   bc_idr8   m3u8_url
account_idinfor/   r/   r0   )_extract_brightcove_formats_and_subtitles   s   
z8RoosterTeethIE._extract_brightcove_formats_and_subtitlesc              
   C   s  |  |}| j d| }z| j|d |dddidd d }W n2 tyR } z&t|jtrM|jjd	krM| |jj	
  |d
du rM| | d  d }~ww |d d }t|ddk}t|ddthf}z| j||dddd\}	}
W n2 ty } z&|r|rt|jtr|jjd	kr| d | |||\}	}
n W Y d }~nd }~ww | ||dd d }||	|
d| |S )Nz/watch/z/videoszDownloading video JSON metadatazClient-Typeweb)headersr       i  accessFz$ is only available for FIRST membersr<   r8   )r<   encoding_pipeline
brightcoveuidrl   m3u8_nativehls)m3u8_idzLDirect m3u8 URL returned HTTP Error 403; retrying with Brightcove extractionz!Downloading episode JSON metadata)rB   r   r   )	_match_idr    r"   r   r#   r$   r   r%   r&   r'   r(   r)   r!   raise_login_requiredr   str#_extract_m3u8_formats_and_subtitlesr*   r   rc   )r+   r8   rB   api_episode_url
video_datar,   r   is_brightcover   r   r   rK   r/   r/   r0   _real_extract   sf   

"
 zRoosterTeethIE._real_extractN)rd   re   rf   
_VALID_URL_TESTSr   r   r   r/   r/   r/   r0   ri   Z   s   	
	
	
	
  ri   c                   @   sd   e 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gZdd Zdd ZdS )RoosterTeethSeriesIEz<https?://(?:.+?\.)?roosterteeth\.com/series/(?P<id>[^/?#&]+)z-https://roosterteeth.com/series/rwby?season=7   zrwby-7zRWBY - Season 7)r7   r=   )r8   playlist_countrv   z/https://roosterteeth.com/series/the-weird-place   zthe-weird-placezThe Weird Placez/https://roosterteeth.com/series/role-initiative   zrole-initiativezRole Initiative)r8   playlist_mincountrv   z=https://roosterteeth.com/series/let-s-play-minecraft?season=92   zlet-s-play-minecraft-9zLet's Play Minecraft - Season 9c                 #   s    t ||} fdd}  j d| d|}t|ddd fD ],}t|d}|d ur2||kr2q"| jt j|d	 d
 |d| dddidE d H  q"|d u rj| j j d| d|dddE d H  d S d S )Nc                 3   sH    t | ddd fD ]} jtd|d d tfi  |V  q
d S )Nr   c                 S      |d d S )Ncanonical_linksr+   r/   _vr/   r/   r0   <lambda>D      zGRoosterTeethSeriesIE._entries.<locals>.yield_episodes.<locals>.<lambda>zhttps://www.roosterteeth.comr   r+   )r   
url_resultr   ri   rc   )r   rK   r+   r/   r0   yield_episodesC  s   
z5RoosterTeethSeriesIE._entries.<locals>.yield_episodesz/shows/z/seasons?order=asc&order_byr   c                 S   r   )Nlinksepisodesr/   r   r/   r/   r0   r   K  r   z/RoosterTeethSeriesIE._entries.<locals>.<lambda>)r<   rM   r   r   zDownloading season z JSON metadataper_pagei  )queryz0/bonus_features?order=asc&order_by&per_page=1000z(Downloading bonus features JSON metadataFr   )r   r"   r    r   r   rh   )r+   	series_idrI   rB   r   series_dataseason_dataidxr/   r   r0   _entries@  s(   

zRoosterTeethSeriesIE._entriesc              	   C   sT   |  |}tt|dtd}t| ||}| |t||t|d d|ddS )N)rq   r   )expected_typer   rF   z
 - Season )delim)	r   r   r
   r   r   r   playlist_resultr   r!   )r+   r8   r   rI   entriesr/   r/   r0   r   X  s   
z"RoosterTeethSeriesIE._real_extractN)rd   re   rf   r   r   r   r   r/   r/   r/   r0   r      s:    r   N)commonr   networking.exceptionsr   utilsr   r   r   r   r	   r
   r   r   r   r   r   utils.traversalr   r   ri   r   r/   r/   r/   r0   <module>   s    4G G