o
    i@                     @   s   d dl 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 ddlmZmZ G dd deZG d	d
 d
eZdS )    N   )StreaksBaseIE   )ExtractorErrorGeoRestrictedError
clean_htmlint_or_nonejoin_nonemptymake_archive_idsmuggle_urlstr_or_nonestrip_or_nonetime_secondsunified_timestampupdate_url_queryurl_or_none)requiretraverse_objc                	   @   s  e Zd ZdZdgZdZ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,d-d.di dd
dddddddddd/dddd0ddd1g dddddddd2d!d3d4d(d5d)d+d,d6d7d8d9d:giiid;d<d=d>d?d=d>d@dAdBdCdDdEdFd+ddCdGdHdId=d>gZdJZdKdLdMdNZi Z	i Z
dOdP ZdXdRdSZdTdU ZdVdW ZdQS )YTVerIEzbhttps?://(?:www\.)?tver\.jp/(?:(?P<type>lp|corner|series|episodes?|feature)/)+(?P<id>[a-zA-Z0-9]+)JPFz#https://tver.jp/episodes/epc1hdugbkid
epc1hdugbkextmp4
display_idz(ref:baeebeac-a2a6-4dbf-9eb3-c40d59b40068titleuR   神回だけ見せます！ #2 壮烈！車大騎馬戦（木曜スペシャル）	alt_titleu\   神回だけ見せます！ #2 壮烈！車大騎馬戦（木曜スペシャル） 日テレdescriptionz$md5:2726f742d5e3886edeaf72fb6d740fefuploader_idztver-ntvchannelu	   日テレdurationgjt@	thumbnailzShttps://statics.tver.jp/images/content/thumbnail/episode/xlarge/epc1hdugbk.jpg?v=16seriesu   神回だけ見せます！episodeu6   #2 壮烈！車大騎馬戦（木曜スペシャル）episode_numberr   	timestampigupload_date20250110modified_timestampixgmodified_date20250114not_livei-ob20220502z6brightcovenew ref:baeebeac-a2a6-4dbf-9eb3-c40d59b40068
sru35hwdd2
ss2lcn4af6)live_statusrelease_timestamprelease_date_old_archive_ids	series_id	season_idurl	info_dict4394098882001gClg@tagsis0nb20220501r0   r1   )r3   r4   extractor_argstverbackend
brightcove)r6   r7   paramszhttps://tver.jp/corner/f0103888T)r6   only_matchingzhttps://tver.jp/lp/f0033031z!https://tver.jp/series/srtxft431v
srtxft431vu   名探偵コナン)r   r      )r6   r7   playlist_mincountz!https://tver.jp/series/sru35hwdd2   )r6   r7   playlist_countz!https://tver.jp/series/srkq2shp9dzFhttp://players.brightcove.net/%s/default_default/index.html?videoId=%swebhttps://tver.jphttps://tver.jp/)zx-tver-platform-typeOriginRefererc                 C   s>   | j dd ddd}t|ddddf| _|  d	d d
d| _d S )NzAhttps://platform-api.tver.jp/v2/api/platform_users/browser/createzCreating sessions   device_type=pc)dataresultplatform_uidplatform_token)rM   rN   z2https://player.tver.jp/player/streaks_info_v2.jsonzDownloading STREAKS API infoz#Unable to download STREAKS API info)_download_jsonr   _PLATFORM_QUERY_STREAKS_API_INFO)selfsession_info rT   I/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/extractor/tver.py_real_initializep   s   
zTVerIE._real_initializeNc                 C   s,   | j d| |||| ji | j|pi dS )Nz)https://platform-api.tver.jp/service/api/)fatalheadersquery)rO   _HEADERSrP   )rR   pathvideo_idnoterW   rY   rT   rT   rU   _call_platform_api|   s   zTVerIE._call_platform_apic              	   c   s    | j d| |d| jd}t|dddd dd	thfD ]!}| d
| |d| d}t|dddd dd	thfE d H  qd S )Nz5https://service-api.tver.jp/api/v1/callSeriesSeasons/zDownloading seasons info)rX   rL   contentsc                 S      |d dkS )NtypeseasonrT   _vrT   rT   rU   <lambda>       z6TVerIE._yield_episode_ids_for_series.<locals>.<lambda>contentr   zv1/callSeasonEpisodes/zDownloading season z episodes infoc                 S   r`   )Nra   r#   rT   rc   rT   rT   rU   rf      rg   )rO   rZ   r   strr^   )rR   r3   seasons_infor4   episodes_inforT   rT   rU   _yield_episode_ids_for_series   s   z$TVerIE._yield_episode_ids_for_seriesc              
      s  |  |dd\}| ddgd }|dvr!td| dd	|d
krG| d d}| j| t|ddddthft	dd dS |dkr]| j
|dd}| | d|d| jd ddddid}t|dpri }t|dthfd d! | jd" d#d$d% id&d'id(}t|d}	t|d)}
t|
|	d*d+pt|d}t|d,}t|d-} fd.d/d0D }||
|	t|||d*d+||d1t|d2thfd3d4thfd5thfd6thfd7thfd8}t|d9d:thtf}|r| sd;| }t|dd<thf}|r|d;sd;| }|d=ks#|s\|d=kr/| jd>d? |s8td@dd	t|d9dAthtdBdd	hf}i |dCt| j||f dD| jidEdFS |d dG }tjtdHdItjj j!dJ psdJ}z| "||dKd'| j#| dL dM|  dN}W n t$y } z| j%|j&| jddO i }W Y d }~nd }~ww i |||rt'dE|gdPS d dPS )QNr   ra   r=   streaksr   )r>   rm   zInvalid backend value: Texpectedr"   zv2/callSeries/zDownloading series inforL   rh   r   c                 S   s
   d|  S )Nzhttps://tver.jp/episodes/rT   )xrT   rT   rU   rf      s   
 z&TVerIE._real_extract.<locals>.<lambda>)iegetterepisodeszResolving to new URL)r]   )z-canonical"\s*href="(https?://tver\.jp/[^"]+)"z$&link=(https?://tver\.jp/[^?&]+)[?&]z	url regexzv1/callEpisode/zDownloading episode infoFrequire_dataz<mylist,later[epefy106ur],good[epefy106ur],resume[epefy106ur])rW   rY   )rL   r#   rh   version5)defaultz(https://statics.tver.jp/content/episode/z.jsonzDownloading video infore   rJ   rH   )rY   rX   seriesTitle )delimproductionProviderNamebroadcastDateLabelc              	      s8   g | ]\}}}|t d | d dd i||dqS )z9https://statics.tver.jp/images/content/thumbnail/episode//z.jpgre   )r   r6   widthheight)r   ).0qualityr~   r   ru   r\   rT   rU   
<listcomp>   s    	z(TVerIE._real_extract.<locals>.<listcomp>))smalli  i  )mediumi  ih  )largei  i  )xlargei   i  )r   r"   r#   r   r   
thumbnailsr   
viewStatusstartAtnoseriesIDseasonID)r   r0   r$   r3   r4   video)
videoRefIDvideoIDref:r   r>   z:No STREAKS ID found; falling back to Brightcove extraction)r\   z)Unable to extract brightcove reference ID	accountIDzbrightcove account IDurl_transparentgeo_countriesBrightcoveNew)_typer6   ie_key	projectID	   )hours   rG   api_keykey0rI   rJ   zX-Streaks-Api-Key)	countriesmetadata_available)r   r2   )(_match_valid_urlgroup_configuration_argr   r^   playlist_from_matchesrl   r   ri   r   _download_webpage	_match_id_search_regexr   rO   r   getr	   r   any	isdecimal
startswithreport_warningr   r   BRIGHTCOVE_URL_TEMPLATE_GEO_COUNTRIESdtdatetimefromtimestampr   timezoneutcmonth_extract_from_streaks_apirQ   r   raise_geo_restrictedorig_msgr
   )rR   r6   
video_typer=   series_infowebpageepisode_infoepisode_content
video_infor#   r"   r   provideronair_labelr   metadatabrightcove_id
streaks_id
account_id
project_idkey_idxstreaks_infoerT   r   rU   _real_extract   s   
	



	$zTVerIE._real_extract)NTN)__name__
__module____qualname__
_VALID_URLr   _GEO_BYPASS_TESTSr   rZ   rP   rQ   rV   r^   rl   r   rT   rT   rT   rU   r      s    	
	
M
r   c                   @   sl   e Zd ZdZdZdZdddddd	d
deddddddddddddddddeddddddgZdd ZdS ) TVerOlympicIEztver:olympicz https://olympic-data.tver.jp/apiz[https?://(?:www\.)?tver\.jp/olympic/milanocortina2026/(?P<type>live|video)/play/(?P<id>\w+)zVhttps://tver.jp/olympic/milanocortina2026/video/play/3b1d4462150b42558d9cc8aabb5238d0/ 3b1d4462150b42558d9cc8aabb5238d0r   u0   【開会式】ぎゅっと凝縮ハイライトz$ref:3b1d4462150b42558d9cc8aabb5238d0g(\@@r+   zre:\d{8}zcount:1zre:https://.+\.(?:jpg|png)iwi20260206tver-olympic)r   r   r   r   r    r/   r)   r(   r9   r!   r%   r&   r   r5   zAhttps://tver.jp/olympic/milanocortina2026/live/play/glts313itwvj/glts313itwvju   開会式ハイライトntvzref:sp_260207_spc_01_dvri   was_liveiLxitver-olympic-live)r   r   r   
channel_idr   r    r/   r)   r(   r!   r%   r&   r   c                 C   s  |  |dd\}}| d}|dkrd}d}t| | j d| |ddthf}t|d	thf}t }	t|d
thf}
t	|
dd}|sJt
dt|dt	ddhtdhf}|	|k rn| jd|
 ddd |d|dS ||	  krx|k rn n	d}|r|d7 }n>||	krt|dt	ddhf}|r|	|k rd}|d7 }n"t
dddnd}d}|}d}t| | j d| |ddthf}i | j|d | d!d"|d#|d$t|d%thtfd&thtfd'thtfd(thtfd)thttfd
t	ddhfd*thtfd+||d,S )-Nra   r   live_from_startliver    a35ebb1ca7d443758dc7fcc5d99b1f72z/live/r_   r\   onair_start_dater   )	tz_offsetz#Unable to extract on-air start timeonair_end_datezon-air end timez&This program is scheduled to start at z JSTTrn   is_upcoming)r   r/   r0   is_live_dvrdvr_end_dater   z#This program is no longer availabler    4b55a4db3cce4ad38df6dd8543e3e46ar+   z/video/r   r   rG   rH   r   )r   r   	sub_titler   r   )r   description_ldescription_s)picture_l_urlpicture_m_urlpicture_s_url)r   r   r   r   r   r%   r!   )r   r/   )r   r   	get_paramr   rO   	_API_BASEdictri   r   r   r   r   raise_no_formatsr   r   filterr   r   )rR   r6   r   r\   r   r   r   olympic_datamedia_idnowstart_timestamp_strstart_timestampend_timestampr/   dvr_end_timestamprT   rT   rU   r   2  s   









zTVerOlympicIE._real_extractN)	r   r   r   IE_NAMEr   r   intr   r   rT   rT   rT   rU   r   	  sL    $r   )r   r   rm   r   utilsr   r   r   r   r	   r
   r   r   r   r   r   r   r   utils.traversalr   r   r   r   rT   rT   rT   rU   <module>   s    < t