U
    g=                     @   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 )	RoosterTeethBaseIEZ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 n tk
r } zxd}t|jtr|jj	d	kr| j
|jj  d d
d}|r|dp|dp|d}|r|d| 7 }| | W 5 d }~X Y nX d S )NZrt_access_tokenz)https://auth.roosterteeth.com/oauth/tokenz
Logging inZ@4338d2b4bdc8db1239360f28e72f0d9ddb1fd01e7a38fbb07b4b1f4ba4564cc5password)Z	client_idZ
grant_typeusernamer   )datazUnable to logini  FfatalZ
extra_infoZerror_descriptionerrorz: )Z_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'   A/tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/extractor/roosterteeth.py_perform_login   s.      
z!RoosterTeethBaseIE._perform_loginc           	      C   s.  g }t |dD ]6}|ddkr"q|dd |dp8i  D  q|dpRi }t |dd}|d	}t|d
}t|d}|rd|kr|d7 }n|s|}||d|t |ddt |ddt|dt|d|t|d||dt|dt|d|| j|||ddd|ddS )N)ZincludedZimagestype)Zepisode_imageZbonus_feature_imagec                 S   s"   g | ]\}}t |r||d qS ))idurl)r   ).0namer,   r'   r'   r(   
<listcomp>4   s
    z:RoosterTeethBaseIE._extract_video_info.<locals>.<listcomp>
attributestitleZdisplay_titleZis_sponsors_onlyuuidr+   Zparent_content_idz-bonusZslugdescriptioncaptionZ
show_titleZparent_content_titleseason_number	season_idnumber
channel_idlengthZoriginal_air_dateF)Zneeds_premiumZneeds_subscriptionZ
needs_auth
is_privateZis_unlistedZgenres)r+   
display_idr1   r3   seriesr5   r6   episodeepisode_number
episode_idr8   durationrelease_timestamp
thumbnailsavailabilitytags)r   r   extenditemsr   r   r	   Z_availability)	r#   r   rB   imager0   r1   Zsub_onlyr?   Zvideo_idr'   r'   r(   _extract_video_info/   sN    





   z&RoosterTeethBaseIE._extract_video_infoN)__name__
__module____qualname__Z_NETRC_MACHINE	_API_BASEr   r)   rH   r'   r'   r'   r(   r      s
   
r   c                   @   st  e Zd ZdZ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i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idd,d-d.d/d0d/dd ddd1d2d3d4d5d6d7ddidd8d9dd:d;dd d:d<d=d>d?gd@dAdBdCdDdEdFdGdHddiddIdJddKddLddMdNdKdOd d?dPgdQdRd"dSdTdUdVdWgddidXdYddZd[ddZd\ddZd]ddZd^ddZd_ddZd`ddZgZdaZdbdc Zddde ZdfS )gRoosterTeethIEzUhttps?://(?:.+?\.)?roosterteeth\.com/(?:bonus-feature|episode|watch)/(?P<id>[^/?#&]+)zfhttp://roosterteeth.com/episode/million-dollars-but-season-2-million-dollars-but-the-game-announcementZ9156zFmillion-dollars-but-season-2-million-dollars-but-the-game-announcementmp4z-Million Dollars, But... The Game Announcementz$md5:168a54b40e228e79f4ddb141e89fe4f5zre:^https?://.*\.png$zMillion Dollars, But...z	Game ShowZSketchr   public
   z$00374575-464e-11e7-a302-065410f210c4zSeason 2z$ffa27d48-464d-11e7-a302-065410f210c4z$92b6bb21-91d2-4b1b-bf95-3268fa0d9939   i W3WZ20160511)r+   r;   extr1   r3   	thumbnailr<   r=   rD   r5   rC   r>   r?   seasonr6   r8   r@   rA   release_dateZskip_downloadT)r,   	info_dictparamsz,https://roosterteeth.com/watch/rwby-bonus-25Z40432zrwby-bonus-25ZGrimmz$md5:f30ff570741213418a8d2c19868b93abz$92f780eb-ebfe-4bf5-a3b5-c6ad5460a5f1zre:^https?://.*\.(png|jpe?g)$z$f8117b13-f068-499e-803e-eec9ea2dec8c   Z	Animationz$4b8f0a9e-12c4-41ed-8caa-fed15a85bab8zSeason 1zRWBY: World of Remnantr      i#@TZ20141016)r+   r;   r1   r3   r=   r8   rS   rR   rC   r?   r>   rD   r6   rT   r<   r5   r@   rA   rU   z,https://roosterteeth.com/watch/rwby-bonus-21z33-bonuszrwby-bonus-21zVolume 5 Yang Character Shortz$md5:8c2440bc763ea90c52cfe0a68093e1f7z$f2a9f132-1fe2-44ad-8956-63d7c02677207   ZRWBY   ip&YZ20171014)r+   r;   r1   r3   r=   r8   rS   rR   rC   r?   r>   r<   r@   rA   rU   zhttps://www.roosterteeth.com/watch/achievement-hunter-achievement-hunter-fatality-walkthrough-deathstroke-lex-luthor-captain-marvel-green-lantern-and-wonder-womanZ25394z^Fatality Walkthrough: Deathstroke, Lex Luthor, Captain Marvel, Green Lantern, and Wonder Womanz$md5:91bb934698344fb9647b1c7351f16964G   z$ffaec998-464d-11e7-a302-065410f210c4zSeason 2008ZGamingzAchievement Hunterz$md5:4465ce4f001735f9d7a2ae529a543d31z$ffa13340-464d-11e7-a302-065410f210c4i  z$2cb2a70c-be50-46f5-93d7-84a1baabb4f7   it6IZ20081203)r+   rR   r1   r3   rC   rS   r=   r>   r?   rT   rD   r<   r;   r6   r5   r8   r@   rA   rU   z1https://roosterteeth.com/watch/lets-play-2013-126Z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 3i`QZ20130204)r+   rR   r1   rC   r<   r>   r6   r8   r=   r?   rS   rD   r3   r;   r5   rT   rA   rU   z'Direct m3u8 URL returned HTTP Error 403)r,   rV   Zexpected_warningsrW   zhttp://achievementhunter.roosterteeth.com/episode/off-topic-the-achievement-hunter-podcast-2016-i-didn-t-think-it-would-pass-31)r,   Z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-bransonZ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)defaultZBrightcoveNewzhttps://players.brightcove.net/z$/default_default/index.html?videoId=Zreferrerformats	subtitles)Z_search_regex_BRIGHTCOVE_ACCOUNT_IDZ_downloaderZget_info_extractorextractr   )r#   bc_idr,   m3u8_urlZ
account_idinfor'   r'   r(   )_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 nn tk
r } zPt|jtr|jjd	kr| |jj	
  |d
dkr| | d  W 5 d }~X Y nX |d d }t|ddk}t|ddthf}z| j||dddd\}	}
W nl tk
rd } zL|rR|rRt|jtrR|jjd	krR| d | |||\}	}
n W 5 d }~X Y nX | ||dd d }||	|
d| |S )Nz/watch/z/videoszDownloading video JSON metadatazClient-TypeZweb)headersr       i  accessFz$ is only available for FIRST membersr0   r,   )r0   Zencoding_pipelineZ
brightcoveuidrN   Zm3u8_nativeZhls)Zm3u8_idzLDirect m3u8 URL returned HTTP Error 403; retrying with Brightcove extractionz!Downloading episode JSON metadata)r;   r_   r`   )	_match_idr   r   r   r   r   r   r   r   r   r    r!   r   Zraise_login_requiredr   strZ#_extract_m3u8_formats_and_subtitlesr"   rf   rH   )r#   r,   r;   Zapi_episode_urlZ
video_datar$   rd   Zis_brightcoverc   r_   r`   r=   r'   r'   r(   _real_extract   sj    
  "    ( zRoosterTeethIE._real_extractN)rI   rJ   rK   
_VALID_URL_TESTSra   rf   rm   r'   r'   r'   r(   rM   Z   s    rM   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)r+   r1   )r,   Z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)r,   Z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 ]X}t|d}|d k	rb||krbqB| jt j|d	 d
 |d| dddidE d H  qB|d kr| j j d| d|dddE d H  d S )Nc                 3   sB   t | ddd fD ]*} jtd|d d tf |V  qd S )Nr   c                 S   s   |d d S )Ncanonical_linksr#   r'   _vr'   r'   r(   <lambda>D      zGRoosterTeethSeriesIE._entries.<locals>.yield_episodes.<locals>.<lambda>zhttps://www.roosterteeth.comru   r#   )r   Z
url_resultr   rM   rH   )r   r=   r#   r'   r(   yield_episodesC  s    z5RoosterTeethSeriesIE._entries.<locals>.yield_episodesz/shows/z/seasons?order=asc&order_byr   c                 S   s   |d d S )Nlinksepisodesr'   rv   r'   r'   r(   ry   K  rz   z/RoosterTeethSeriesIE._entries.<locals>.<lambda>)r0   r7   r}   r~   zDownloading season z JSON metadataZper_pagei  )queryz0/bonus_features?order=asc&order_by&per_page=1000z(Downloading bonus features JSON metadataFr   )r   r   r   r   r   rL   )r#   	series_idr5   r;   r|   Zseries_dataZseason_dataidxr'   r{   r(   _entries@  s.    
 
 
   zRoosterTeethSeriesIE._entriesc              	   C   sT   |  |}tt|dtd}t| ||}| |t||t|d d|ddS )N)rT   rh   )Zexpected_typerh   r<   z
 - Season )delim)	rk   r   r
   r   r   r   Zplaylist_resultr   r   )r#   r,   r   r5   entriesr'   r'   r(   rm   X  s    
z"RoosterTeethSeriesIE._real_extractN)rI   rJ   rK   rn   ro   r   rm   r'   r'   r'   r(   rp      s8   rp   N)commonr   Znetworking.exceptionsr   utilsr   r   r   r   r	   r
   r   r   r   r   r   Zutils.traversalr   r   rM   rp   r'   r'   r'   r(   <module>   s   4G G