o
    i&                     @   s   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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 )    N   )InfoExtractor   )ExtractorError
clean_htmljoin_nonemptytime_secondstry_callunified_timestampupdate_url_query)traverse_objc                   @   sP   e Zd ZdZdZdZdZdZdd Zdd	 Z	d
d Z
dd Zdd Zdd ZdS )RadikoBaseIEFN)z https://c-rpaa.smartstream.ne.jpz%https://si-c-radiko.smartstream.ne.jpz*https://tf-f-rpaa-radiko.smartstream.ne.jpz*https://tf-c-rpaa-radiko.smartstream.ne.jpz%https://si-f-radiko.smartstream.ne.jpzhttps://rpaa.smartstream.ne.jp)z%https://rd-wowza-radiko.radiko-cf.comzhttps://radiko.jpz"https://f-radiko.smartstream.ne.jp)z"https://c-radiko.smartstream.ne.jpc              	   C   s   | j dd ddddddd\}}|j}|d	 }t|d
 }t|d }|  |||  }t| }| jdd ddd||dddd }	|	dkrR| j	dgd ||	f}
| j
dd|
 |
S )Nzhttps://radiko.jp/v2/api/auth1zDownloading authentication pagepc_html5z0.0.1pc
dummy_user)zx-radiko-appzx-radiko-app-versionx-radiko-devicex-radiko-user)headersX-Radiko-AuthTokenzX-Radiko-KeyLengthzX-Radiko-KeyOffsetzhttps://radiko.jp/v2/api/auth2Authenticating)r   r   zx-radiko-authtokenzx-radiko-partialkey,r   OUTJP)	countriesradiko	auth_data)_download_webpage_handler   int_extract_full_keybase64	b64encodedecode_download_webpagesplitraise_geo_restrictedcachestore)self_auth1_handleauth1_header
auth_tokenklkoraw_partial_keypartial_keyarea_idr    r1   K/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/extractor/radiko.py_negotiate_token(   s:   
	zRadikoBaseIE._negotiate_tokenc                 C   sL   | j dd}|d ur"| jdd dd|d |d dd	}|d
kr"|S |  S )Nr   r   z#https://radiko.jp/v2/api/auth_checkzChecking cached tokeni  r   r   )r   X-Radiko-AreaId)expected_statusr   OK)r%   loadr"   r3   )r'   	cachedataresponser1   r1   r2   _auth_clientI   s   zRadikoBaseIE._auth_clientc                 C   sL   | j r| j S | jdd dd}| jd|dddd}|r| }nd	}|| _ |S )
Nz)https://radiko.jp/apps/js/playerCommon.jszDownloading player js codenotezRRadikoJSPlayer\([^,]*,\s*(['\"])pc_html5\1,\s*(['\"])(?P<fullkey>[0-9a-f]+)\2,\s*{zfull keyFfullkey)fatalgroups(   bcd151073c03b352e1ef2fd66c32209da9ca0afa)	_FULL_KEYr"   _search_regexencode)r'   jscodefull_keyr1   r1   r2   r   S   s   
zRadikoBaseIE._extract_full_keyc                 C   s   | j d| d|d| dd}d }|dD ]#}|jd |jd }}t|d	}	t|d	}
|	|kr:||
k r:|} nq|sAtd
|	sGJ |
|||	||fS )Nz,https://radiko.jp/v3/program/station/weekly/.xmlzDownloading radio program for z stationr;   z.//progfttoFz*Cannot identify radio program to download!)_download_xmlfindallattribr
   r   )r'   video_idstationcursorstation_programprogpft_strto_strrF   rG   r1   r1   r2   _find_programf   s"   


zRadikoBaseIE._find_programc	                 C   s>  | j d| d|dd}	g }
t }|rdnd}|	d| dD ]|}|j}||v r*q || t|d	|i|d
dtjddddd}|rJd n|| }t	j
|j}| j||ddd|d| ||dd}|D ],}||| jA s||s|| jrd|d< d|d< |s|dkr|rddt|gi|d< qj|
| q |
S )Nz-https://radiko.jp/v3/station/stream/pc_html5/rE   zDownloading stream informationr;   r   r   z.//url[@timefree="z"]/playlist_create_url
station_id15 0123456789abcdef    )kb)llsidtypem4aTFz"Downloading m3u8 information from )r4   r   )extliver>   m3u8_idr<   r   i
preferenceznot preferredformat_noteffmpeg_argsz-ssdownloader_options)rH   setrI   textaddr   joinrandomchoicesurllibparseurlparsenetloc_extract_m3u8_formats
startswith_HOSTS_FOR_LIVE'_HOSTS_FOR_TIME_FREE_FFMPEG_UNSUPPORTEDstrextend)r'   rK   rL   is_onairrF   rM   r+   r0   querym3u8_playlist_dataformatsfoundtimefree_intelementpcuplaylist_urltime_to_skipdomain
subformatssfr1   r1   r2   _extract_formatsx   sX   


zRadikoBaseIE._extract_formatsc                 C   s"   t |dddd hdtjhfpd S )Nz
pfm/text().c                 S   s   t d| S )Nu   [/／、　,，])rer#   )xr1   r1   r2   <lambda>       z2RadikoBaseIE._extract_performers.<locals>.<lambda>)r   rt   strip)r'   rO   r1   r1   r2   _extract_performers   s
   z RadikoBaseIE._extract_performers)__name__
__module____qualname___GEO_BYPASSr@   rs   %_HOSTS_FOR_TIME_FREE_FFMPEG_SUPPORTEDrr   r3   r:   r   rS   r   r   r1   r1   r1   r2   r      s    !
-r   c                   @   4   e Zd ZdZdddddddddgZdd Zd	S )
RadikoIEzOhttps?://(?:www\.)?radiko\.jp/#!/ts/(?P<station>[A-Z0-9-]+)/(?P<timestring>\d+)z*https://radiko.jp/#!/ts/QRR/20210425101300Turlonly_matchingz*https://radiko.jp/#!/ts/FMT/20210810150000z.https://radiko.jp/#!/ts/JOAK-FM/20210509090000c           	         s   |  |dd\}}t||}t|d}| |||\ }|  \}}|t fdd|  tt fddtfdd||tfddd	| j	||d|||||d
dd
S )NrL   
timestringFc                           djS )Ntitlefindrg   r1   rO   r1   r2   r      r   z(RadikoIE._real_extract.<locals>.<lambda>c                      r   )Ninfor   r1   r   r1   r2   r      r   c                      r   )N.//namer   r1   )rN   r1   r2   r      r   c                      s   t dt  d S )NF)r
   r1   )radio_begin	radio_endr1   r2   r      s    T)start_atrF   end_atrG   seekrK   rL   rv   rF   rM   r+   r0   rw   )
idr   castdescriptionuploaderuploader_id	timestampdurationis_livery   )
_match_valid_urlr?   r   r
   rS   r:   r	   r   r   r   )	r'   r   rL   r   rK   vid_intrF   r+   r0   r1   )rO   r   r   rN   r2   _real_extract   s2   

zRadikoIE._real_extractNr   r   r   
_VALID_URL_TESTSr   r1   r1   r1   r2   r          r   c                   @   r   )
RadikoRadioIEz8https?://(?:www\.)?radiko\.jp/#!/live/(?P<id>[A-Z0-9-]+)zhttps://radiko.jp/#!/live/QRRTr   zhttps://radiko.jp/#!/live/FMTz!https://radiko.jp/#!/live/JOAK-FMc              
   C   s   |  |}| d |  \}}tdd}| |||\}}}}	}	|dj}
t|dj}|dj}| j||d||||i d}||
| 	||||||dd		S )
NzHDownloader will not stop at the end of the program! Press Ctrl+C to stop	   )hoursr   r   r   Tr   )	r   r   r   r   r   r   r   ry   r   )
	_match_idreport_warningr:   r   rS   r   rg   r   r   r   )r'   r   rL   r+   r0   vid_nowrO   rN   rF   r(   r   r   station_namery   r1   r1   r2   r      s.   


zRadikoRadioIE._real_extractNr   r1   r1   r1   r2   r      r   r   )r   rj   r   urllib.parserl   commonr   utilsr   r   r   r   r	   r
   r   utils.traversalr   r   r   r   r1   r1   r1   r2   <module>   s    $	 0