
    yfG&                         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 ddlmZ  G d de      Z G d	 d
e      Z G d de      Zy)    N   )InfoExtractor   )ExtractorError
clean_htmltime_secondstry_callunified_timestampupdate_url_query)traverse_objc                   D    e Zd ZdZdZdZdZdZd Zd Z	d Z
d	 Zd
 Zd Zy)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           
         | j                  dd dddddd      \  }}|j                  }|d	   }t        |d
         }t        |d         }| j                         |||z    }t	        j
                  |      j                         }| j                  dd ddd||d      j                  d      d   }	|	dk(  r| j                  dg       ||	f}
| j                  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   s              9/usr/lib/python3/dist-packages/yt_dlp/extractor/radiko.py_negotiate_tokenzRadikoBaseIE._negotiate_token'   s!   77,d4U *(/#'!-	 8 < $++!"67
2342340022b2g>&&7>>@((,d4D#'!-&0'2	 )  uSz! e%%%7)	

;	:    c           	          | j                   j                  dd      }|&| j                  dd dd|d   |d   d	      }|d
k(  r|S | j                         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$   r4   )r)   	cachedataresponses      r3   _auth_clientzRadikoBaseIE._auth_clientH   so    JJOOHk:	 --5t=Tfi/8|PYZ[P\] . _H 4  $$&&r5   c                     | j                   r| j                   S | j                  dd d      }| j                  d|ddd      }|r|j                         }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_keys      r3   r    zRadikoBaseIE._extract_full_keyR   su    >>>>!''7- ( / %%bJe9 & > (HBH!r5   c                 *   | j                  d|z  |d|z        }d }|j                  d      D ]G  }|j                  d   |j                  d   }}t        |d      }	t        |d      }
|	|k  s?||
k  sE|} n |st	        d      	sJ 
       |||	fS )	Nz2https://radiko.jp/v3/program/station/weekly/%s.xmlz(Downloading radio program for %s 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_strrJ   rK   s              r3   _find_programzRadikoBaseIE._find_programe   s    ,,@7JH;gE - G  ((3 	AXXd^QXXd^FF"651B"651BV|	  !MNN2r_b&&88r5   c	                    | j                  d| d|d      }	g }
t               }|rdnd}|	j                  d| d      D ]+  }|j                  }||v r|j	                  |       t        |d	|i|d
dj                  t        j                  dd            dd      }|rd n||z
  }t        j                  j                  |      j                  }| j                  ||ddd|d| ||d      }|D ]e  }||j                  | j                        z  s|s%|j                  | j                         r
d|d<   d|d<   |rK|dk(  sQ|sTddt#        |      gi|d<   g |
j%                  |       . |
S )Nz-https://radiko.jp/v3/station/stream/pc_html5/z.xmlz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 )r7   r   )extliverB   m3u8_idr@   r   i
preferenceznot preferredformat_noteffmpeg_argsz-ssdownloader_options)rL   setrM   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)   rO   rP   is_onairrJ   rQ   r-   r2   querym3u8_playlist_dataformatsfoundtimefree_intelementpcuplaylist_urltime_to_skipdomain
subformatssfs                       r3   _extract_formatszRadikoBaseIE._extract_formatsw   s   !//;G9DI81 0 3 $q!)114F|nTj2kl 	'G,,Ce|IIcN+Cg22 /AR HI2 L $,4"L\\**<8??F33hE9&B'.*4	 4 J ! [s~~d.B.BCC$8d8d)e'+B|$(7B}%LA$5,0=s<GX?Y/ZB+,[ NN:&?	'B r5   c                 N    t        |ddd hdt        j                  hf      xs d S )Nz
pfm/text().c                 .    t        j                  d|       S )Nu   [/／、　,，])rer%   )xs    r3   <lambda>z2RadikoBaseIE._extract_performers.<locals>.<lambda>   s    "((3F*J r5   )r   ry   strip)r)   rS   s     r3   _extract_performersz RadikoBaseIE._extract_performers   s;    D# JKSSVS\S\R]#_ ` hcg	hr5   )__name__
__module____qualname___GEO_BYPASSrD   rx   %_HOSTS_FOR_TIME_FREE_FFMPEG_SUPPORTEDrw   r4   r=   r    rW   r   r    r5   r3   r   r      sD    KI/+-)OB'&9$+Zhr5   r   c                   2    e Zd ZdZdddddddddgZd Zy)	RadikoIEzGhttps?://(?:www\.)?radiko\.jp/#!/ts/(?P<station>[A-Z0-9-]+)/(?P<id>\d+)z*https://radiko.jp/#!/ts/QRR/20210425101300Turlonly_matchingz*https://radiko.jp/#!/ts/FMT/20210810150000z.https://radiko.jp/#!/ts/JOAK-FM/20210509090000c                   	
 | j                  |      j                         \  }}t        |d      }| j                  |||      \  }	
| j	                         \  }}|t        fd      | j                        t        t        fd            t        fd      ||t        	
fd      d| j                  ||d||||		

|d      d	
S )
NFc                  :     j                  d      j                  S )Ntitlefindrl   rS   s   r3   r   z(RadikoIE._real_extract.<locals>.<lambda>   s    dii&8&=&= r5   c                  :     j                  d      j                  S )Ninfor   r   s   r3   r   z(RadikoIE._real_extract.<locals>.<lambda>   s    tyy7H7M7M r5   c                  :     j                  d      j                  S )N.//namer   )rR   s   r3   r   z(RadikoIE._real_extract.<locals>.<lambda>   s    )=)=i)H)M)M r5   c                  6    t        d      t         d      z
  S )NF)r
   )radio_begin	radio_ends   r3   r   z(RadikoIE._real_extract.<locals>.<lambda>   s    ):9e)LO`alnsOt)t r5   T)start_atrJ   end_atrK   seekrO   rP   r{   rJ   rQ   r-   r2   r|   )
idr   castdescriptionuploaderuploader_id	timestampdurationis_liver~   )	_match_valid_urlgroupsr
   rW   r=   r	   r   r   r   )r)   r   rP   rO   vid_intrJ   r-   r2   rS   r   r   rR   s           @@@@r3   _real_extractzRadikoIE._real_extract   s     11#6==?#He4<@<N<NxY`bi<j9or;	"//1
G =>,,T2%h/M&NO !MN"  !tu,,!7Ug*g +%'#$ - 

 	
r5   Nr   r   r   
_VALID_URL_TESTSr   r   r5   r3   r   r      s;    [J < <
 @F
r5   r   c                   2    e Zd ZdZdddddddddgZd Zy)	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           
         | j                  |      }| j                  d       | j                         \  }}t        d      }| j	                  |||      \  }}}}	}	|j                  d      j                  }
t        |j                  d      j                        }|j                  d      j                  }| j                  ||d||||i       }||
| j                  |      |||||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   r~   r   )
	_match_idreport_warningr=   r   rW   r   rl   r   r   r   )r)   r   rP   r-   r2   vid_nowrS   rR   rJ   r*   r   r   station_namer~   s                 r3   r   zRadikoRadioIE._real_extract   s    ..%fg"//1
GQ'*.*<*<Wgw*W'or1a		'"'' 6!2!7!78&++I6;;''g'j' (  ,,T2&$"

 
	
r5   Nr   r   r5   r3   r   r      s:    LJ / /
 3F
r5   r   )r!   ro   r   urllib.parserq   commonr   utilsr   r   r   r	   r
   r   utils.traversalr   r   r   r   r   r5   r3   <module>r      sM      	  !  +Th= Thn,
| ,
^-
L -
r5   