a
    hy                     @   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mZmZmZmZ G dd deZG dd	 d	eZG d
d deZG dd deZG dd deZG dd de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filter_dictget_element_by_classint_or_nonejoin_nonemptymake_archive_id
orderedSetparse_duration
remove_endtraverse_objtry_callunescapeHTMLunified_timestampurl_or_noneurljoinvariadicc                   @   s8   e Zd ZdZdZdd ZdddZdd	 ZdddZd
S )	NhkBaseIEz@https://nwapi.nhk.jp/nhkworld/%sod%slist/v7b/%s/%s/%s/all%s.jsonz7https?://www3\.nhk\.or\.jp/nhkworld/(?P<lang>[a-z]{2})/c                 C   sR   | j | j|rdnd|rdnd|r$dnd|||r2dndf |d	d
idd d pPg S )NvrclipZesdepisodeprogramz/all ZapikeyZ EJfK8jdS57GqlupFgAfAAwr573q01y6kquerydataepisodes)_download_json_API_URL_TEMPLATE)selfZm_idlangis_videoZ
is_episodeZis_clip r&   I/mnt/pikpak/tmp/myenv/lib/python3.9/site-packages/yt_dlp/extractor/nhk.py	_call_api   s    


zNhkBaseIE._call_apiTc                 C   sh   |s| j ddS | j ddi  | jdd dd}| d|d d| d|d d	d
}| j dd| |S )NZnhkapi_infoz9https://movie-a.nhk.or.jp/world/player/js/movie-player.jsz"Downloading stream API information)notez)prod:[^;]+\bapiUrl:\s*[\'"]([^\'"]+)[\'"]zstream API urlz(prod:[^;]+\btoken:\s*[\'"]([^\'"]+)[\'"]zstream API token)urltoken)cacheloadstore_download_webpageZ_search_regex)r#   refreshZmovie_player_jsr)   r&   r&   r'   _get_api_info&   s     zNhkBaseIE._get_api_infoc           	      C   s   dD ]}|  |}|sq|d}t| j||ddi |d|dddd	}t|d
dthfdd}|r| ||\}}i t|dthfdthfdthfdthfd||d  S qtdd S )N)FTr+   zDownloading stream url infoFjsonr   )typeZoptional_idZ
active_flg)fatalr   )metar   Z	movie_url)Zmb_autoZauto_spZauto_pcget_alldurationZpublication_dateZinsert_dateZupdate_date)r9   	timestamprelease_timestampmodified_timestamp)formats	subtitleszUnable to extract stream url)	r2   popr   r!   r   Z#_extract_m3u8_formats_and_subtitlesr	   r   r   )	r#   vod_idr1   r)   Zapi_urlr6   
stream_urlr=   r>   r&   r&   r'   _extract_stream_info7   sD    



zNhkBaseIE._extract_stream_infoNc              	      s   d u }t |ddd\}}}|dk}|rJ|d d d |dd   }|rp| |||d|d d dkd	   fd
d}|d}	|d}
g }dD ]<\}}} d| }|sq|| d||d| d q|	}|
r|	r|
 d|	 }	n|
r|	s|
}	d }
d }nd }|d | |	|d||
|d}|rV d }|i | |d|i nn|rt d d d}| j	t
d| d|ddddd|d< |d D ]}||d < qn|d!t  |d" |S )#Nr$   r4   idaudio   -TZ9999r   c                    s   t  | d p | S )NZ_clean)r   get)keyr   r&   r'   get_clean_fieldc   s    z8NhkBaseIE._extract_episode_info.<locals>.get_clean_fieldZ	sub_titletitle))r   i  ih  )Z_li   i  imagepzhttps://www3.nhk.or.jp)rC   heightwidthr+   z - description)rC   rK   rP   
thumbnailsseriesr   r@   z.m4azhttps://vod-stream.nhk.jpz/index.m3u8m4aZm3u8_nativehlsF)Zentry_protocolm3u8_idr5   r=   languageZurl_transparent)_typeie_keyr+   )NhkVodIE_match_valid_urlgroupr(   rG   appendupdaterB   r   _extract_m3u8_formatsr   rX   )r#   r+   r   Zfetch_episoder$   m_type
episode_idr%   rJ   rK   rR   rQ   swhZimg_pathZepisode_nameinfor@   Z
audio_pathfr&   rI   r'   _extract_episode_infoW   s|    

	

zNhkBaseIE._extract_episode_info)T)N)	__name__
__module____qualname__r"   _BASE_URL_REGEXr(   r2   rB   rf   r&   r&   r&   r'   r      s   	
 r   c                   @   s  e Zd Zej dej dej dg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	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-d0d,d-d1d2dd3d4d5d6d7d8d9d:d;d<dd=d>d?d	d@dAdBd:dCdDddEdFd	ddGdHdIdJdddKdLdMddNdOddPdQddRdSdTdUdVddWd	dXdYddZd[dd\d]d^d_d`dad	dbdcddddddedfddgdhdidjd	dkdldmdndmdodmdpddqdrddsdtdudvd	dwdxdyddzddd{dd|d,d-d}d,d-gZd~d ZdS )rY   z>shows/(?:(?P<type>video)/)?(?P<id>\d{4}[\da-z]\d+)/?(?:$|[?#])zB(?:ondemand|shows)/(?P<type>audio)/(?P<id>[^/?#]+?-\d{8}-[\da-z]+)z0ondemand/(?P<type>video)/(?P<id>\d{4}[\da-z]\d+)z:https://www3.nhk.or.jp/nhkworld/en/ondemand/video/2049126/Z1nw_vod_v_en_2049_126_20230413233000_01_1681398302mp4z?Japan Railway Journal - The Tohoku Shinkansen: Full Speed Aheadz$md5:49f7c5b206e03868a2fdf0d0814b92f6zre:https://.+/.+\.jpgz'The Tohoku Shinkansen: Full Speed AheadJapan Railway Journalieix8diPdi  Z20230413Z20240206Z20230905)rC   extrK   rP   	thumbnailr   rR   r<   r:   r;   r9   upload_datemodified_daterelease_dater+   	info_dictz:https://www3.nhk.or.jp/nhkworld/en/ondemand/video/9999011/Z 153c3016dfd252ba09726588149cf0e7z lpZXIwaDE6_Z-976CPsFdxyICyWUzlT5z?Dining with the Chef - Chef Saito's Family recipe: MENCHI-KATSUz$md5:5aee4a9f9d81c26281862382103b0ea5zDining with the Chefz(Chef Saito's Family recipe: MENCHI-KATSU   Z20190816Z20230902i\di9W])rC   rm   rK   rP   rn   rR   r   r9   ro   rq   r;   r<   rp   r:   )r+   md5rs   zKhttps://www3.nhk.or.jp/nhkworld/en/ondemand/audio/livinginjapan-20231001-1/zlivinginjapan-20231001-1-enrS   zFLiving in Japan - Tips for Travelers to Japan / Ramen Vending MachinesLiving in Japanz$md5:0a0e2077d8f07a03071e990a6f51bfabz4Tips for Travelers to Japan / Ramen Vending Machines)rC   rm   rK   rR   rP   rn   r   z:https://www3.nhk.or.jp/nhkworld/en/ondemand/video/2015173/Tr+   Zonly_matchingzDhttps://www3.nhk.or.jp/nhkworld/en/ondemand/audio/plugin-20190404-1/zDhttps://www3.nhk.or.jp/nhkworld/fr/ondemand/audio/plugin-20190404-1/zChttps://www3.nhk.or.jp/nhkworld/en/ondemand/audio/j_art-20150903-1/z:https://www3.nhk.or.jp/nhkworld/en/ondemand/video/9999a34/Zqfjay6cgu(   DESIGN TALKS plus - Fishermen’s Fineryz$md5:8a8f958aaafb0d7cb59d38de53f1e448z0re:^https?:/(/[a-z0-9.-]+)+\.jpg\?w=1920&h=1080$Z20210615i`)rC   rm   rK   rP   rn   ro   r:   z404 Not Found)r+   rs   skipz=https://www3.nhk.or.jp/nhkworld/ja/ondemand/video/0020271111/Znw_ja_v_jvod_ohayou_20231008u1   おはよう日本（7時台） - 10月8日放送u   おはよう日本（7時台）u   10月8日放送z$md5:9c1d6cbeadb827b955b20e99ab920ff0)rC   rm   rK   rR   r   rn   rP   zexpires 2023-10-15z:https://www3.nhk.or.jp/nhkworld/en/ondemand/video/3004952/Z1nw_vod_v_en_3004_952_20230723091000_01_1690074552z7Barakan Discovers - AMAMI OSHIMA: Isson's Treasure Islaz$md5:5db620c46a0698451cc59add8816b797ihdi{  idZ20230723z#AMAMI OSHIMA: Isson's Treasure IslazBarakan Discovers)rC   rm   rK   rP   rn   rq   r:   r9   r;   ro   r<   rp   r   rR   z:https://www3.nhk.or.jp/nhkworld/en/ondemand/video/9999a07/znw_c_en_9999-a07z?Mini-Dramas on SDGs: Ep 1 Close the Gender Gap [Director's Cut]zMini-Dramas on SDGszUMini-Dramas on SDGs - Mini-Dramas on SDGs: Ep 1 Close the Gender Gap [Director's Cut]z$md5:3f9dcb4db22fceb675d90448a040d3f6ix.`   Z20230903Z20210525iOd)rC   rm   r   rR   rp   rK   rP   r:   r9   rq   r<   ro   rn   r;   z:https://www3.nhk.or.jp/nhkworld/en/ondemand/video/9999d17/znw_c_en_9999-d17z2Flowers of snow blossom - The 72 Pentads of Yamatou   Today’s focus: Snowi8dZ20230904Z20220128ia   r   )rC   rm   rK   rP   r;   rq   ro   r:   rn   r9   rR   rp   r<   z1https://www3.nhk.or.jp/nhkworld/en/shows/2032307/Z1nw_vod_v_en_2032_307_20240321113000_01_1710990282z1Japanology Plus - 20th Anniversary Special Part 1z$md5:817d41fc8e54339ad2a916161ea24fafz20th Anniversary Special Part 1zJapanology Plusi  i8eZ20240321i["eiBe)rC   rm   rK   rP   r   rR   rn   r9   r:   ro   r;   rq   r<   rp   z1https://www3.nhk.or.jp/nhkworld/en/shows/3020025/Z1nw_vod_v_en_3020_025_20230325144000_01_1679723944z3100 Ideas to Save the World - Working Styles Evolvez$md5:9e6c7778eaaf4f7b4af83569649f84d9zWorking Styles Evolvez100 Ideas to Save the Worldi  Z20230325idiܐd)rC   rm   rK   rP   r   rR   rn   r9   ro   r:   rq   r;   rp   r<   zHhttps://www3.nhk.or.jp/nhkworld/en/shows/audio/livinginjapan-20231001-1/z1https://www3.nhk.or.jp/nhkworld/en/shows/9999o80/c                 C   s
   |  |S N)rf   r#   r+   r&   r&   r'   _real_extracth  s    zNhkVodIE._real_extractN)rg   rh   ri   r   rj   
_VALID_URL_TESTSr}   r&   r&   r&   r'   rY      sb  


		  ?rY   c                	       s   e Zd Zdej 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dddd	ddddddd	dddgZe fddZdd Z	d d! Z
  ZS )"NhkVodProgramIEz(?x)
        z(?:shows|tv)/
        (?:(?P<type>audio)/programs/)?(?P<id>\w+)/?
        (?:\?(?:[^#]+&)?type=(?P<episode_type>clip|(?:radio|tv)Episode))?z.https://www3.nhk.or.jp/nhkworld/en/shows/sumo/ZsumozGRAND SUMO Highlightsz$md5:fc20d02dc6ce85e4b72e0273aa52fdbf)rC   rK   rP   r   r+   rs   playlist_mincountz6https://www3.nhk.or.jp/nhkworld/en/shows/japanrailway/Zjapanrailwayrl   z$md5:ea39d93af7d05835baadf10d1aae0e3f   z@https://www3.nhk.or.jp/nhkworld/en/shows/japanrailway/?type=clipzFhttps://www3.nhk.or.jp/nhkworld/en/shows/audio/programs/livinginjapan/Zlivinginjapanrv   z$md5:665bb36ec2a12c5a7f598ee713fc2b54z6https://www3.nhk.or.jp/nhkworld/en/tv/designtalksplus/ZdesigntalkspluszDESIGN TALKS plusz$md5:47b3b3a9f10d4ac7b33b53b70a7d2837   z>https://www3.nhk.or.jp/nhkworld/en/shows/10yearshayaomiyazaki/Trw   c                    s   t |rdS t |S )NF)rY   suitablesuper)clsr+   	__class__r&   r'   r     s    zNhkVodProgramIE.suitablec                 C   s(   |D ]}t t|| }r|  S qd S r{   )r   r   )r#   Zclass_valueshtmlZclass_valuevaluer&   r&   r'   !_extract_meta_from_class_elements  s    z1NhkVodProgramIE._extract_meta_from_class_elementsc           
         s    dddd\}}}}|||dkd|dk  fdd	}|}g d
|}g d|}	| |||	S )Nr$   r4   rC   episode_typerD   Fr   c                  3   s0    D ]&} |  d }rt|| V  qd S )Nr+   )rG   rf   r   )r   Zepisode_pathr    r#   r+   r&   r'   entries  s    z.NhkVodProgramIE._real_extract.<locals>.entries)zp-programDetail__titleZpProgramHero__logoTextZtAudioProgramMain__titlezp-program-name)zp-programDetail__textZpProgramHero__descriptionZtAudioProgramMain__infozp-program-description)rZ   r[   r(   r0   r   playlist_result)
r#   r+   r$   r_   
program_idr   r   r   program_titleZprogram_descriptionr&   r   r'   r}     s    

zNhkVodProgramIE._real_extract)rg   rh   ri   r   rj   r~   r   classmethodr   r   r}   __classcell__r&   r&   r   r'   r   l  s\   


1r   c                	   @   s:   e Zd ZdZdddddddd	d
ddidgZdd ZdS )NhkForSchoolBangumiIEzbhttps?://www2\.nhk\.or\.jp/school/movie/(?P<type>bangumi|clip)\.cgi\?das_id=(?P<id>[a-zA-Z0-9_-]+)zHhttps://www2.nhk.or.jp/school/movie/bangumi.cgi?das_id=D0005150191_00000ZD0005150191_00003u   にている かなgE@iP;SZ20140402rk   zcount:12)rC   rK   r9   r:   ro   rm   chaptersZskip_downloadT)r+   rs   paramsc                 C   sb  |  | \}}| d| d| |}dd td|D }dd td|D }dd	 td
|D }dd	 td|D }|dp|d}	|	r|dd  d|	 }| jd|dd  d| d|ddd}
t|d}d }|r8|r8t	|t	|kr8|}g |dd  |}dd	 t
|||D }||dt|dt|d |
|dS )Nz$https://www2.nhk.or.jp/school/movie/z.cgi?das_id=c                 S   s   i | ]}| d | dqS )r   r   r[   .0gr&   r&   r'   
<dictcomp>      z7NhkForSchoolBangumiIE._real_extract.<locals>.<dictcomp>z$var\s+([a-zA-Z_]+)\s*=\s*"([^"]+?)";c                 S   s   i | ]}| d | dqS )r      r   r   r&   r&   r'   r     r   z:(?:program|clip)Obj\.([a-zA-Z_]+)\s*=\s*(["\'])([^"]+?)\2;c                 S   s   g | ]}t |d qS )r   )r   r[   r   r&   r&   r'   
<listcomp>  r   z7NhkForSchoolBangumiIE._real_extract.<locals>.<listcomp>z$chapterTime\.push\(\'([0-9:]+?)\'\);c              	   S   s2   g | ]*}d  |dpdt|dg qS ) r   r   r   )joinr[   r   stripr   r&   r&   r'   r     r   z><div class="cpTitle"><span>(scene\s*\d+)?</span>([^<]+?)</div>Z	r_versionversion_r   z#https://nhks-vh.akamaihd.net/i/das/   /z_V_000.f4v/master.m3u8rk   rT   )rm   rU   Z
r_durationr   c                 S   s   g | ]\}}}|||d qS ))
start_timeend_timerK   r&   )r   ra   etr&   r&   r'   r     s
   nameZr_upload)rC   rK   r9   r:   r=   r   )rZ   groupsr0   refinditerrG   splitr^   r   lenzipr   )r#   r+   Zprogram_typeZvideo_idwebpageZbase_valuesZprogram_valuesZchapter_durationsZchapter_titlesr   r=   r9   r   r   r   r&   r&   r'   r}     s<    

z#NhkForSchoolBangumiIE._real_extractNrg   rh   ri   r~   r   r}   r&   r&   r&   r'   r     s   r   c                   @   sZ   e Zd ZdZdZdddd eD Zddd	d
dddddd
ddgZdd Z	dS )NhkForSchoolSubjectIEup   Portal page for each school subjects, like Japanese (kokugo, 国語) or math (sansuu/suugaku or 算数・数学))rikaZsyakaiZkokugoZsansuuZseikatsuZdoutokuZongakuZtaiikuZzukouZgijutsuZkateisougouZeigoZtokkatsuZtokushiZsonotaz:https?://www\.nhk\.or\.jp/school/(?P<id>{})/?(?:[\?#].*)?$|c                 c   s   | ]}t |V  qd S r{   r   escaper   ra   r&   r&   r'   	<genexpr>  r   zNhkForSchoolSubjectIE.<genexpr>z$https://www.nhk.or.jp/school/sougou/r   u   総合的な学習の時間rC   rK      r   z"https://www.nhk.or.jp/school/rika/r   u   理科   c              
      sR   |   }|  |}| tdt| d||| jd|ddd fddS )	Nz-href="((?:https?://www\.nhk\.or\.jp)?/school/z	/[^/]+/)"zB(?s)<span\s+class="subjectName">\s*<img\s*[^<]+>\s*([^<]+?)</span>rK   Fr5   c                    s   t  | dS )Nr   )r   r[   )r   r+   r&   r'   <lambda>+  r   z5NhkForSchoolSubjectIE._real_extract.<locals>.<lambda>)	_match_idr0   Zplaylist_from_matchesr   r   r   _html_search_regex)r#   r+   Z
subject_idr   r&   r   r'   r}   #  s    

z#NhkForSchoolSubjectIE._real_extractN)
rg   rh   ri   IE_DESCKNOWN_SUBJECTSformatr   r~   r   r}   r&   r&   r&   r'   r     s&   r   c                   @   sD   e Zd Zdddd ejD Zddddd	d
gZdd Z	dS )NhkForSchoolProgramListIEz>https?://www\.nhk\.or\.jp/school/(?P<id>(?:{})/[a-zA-Z0-9_-]+)r   c                 c   s   | ]}t |V  qd S r{   r   r   r&   r&   r'   r   0  r   z#NhkForSchoolProgramListIE.<genexpr>z&https://www.nhk.or.jp/school/sougou/q/zsougou/qu!   Ｑ～こどものための哲学r   r   r   c                    s     |} d| d|} d|p: jd|ddd}|rNtdd|nd } jd	|d
ddd} d| d|} fddt|dpg D } ||||S )Nzhttps://www.nhk.or.jp/school/r   r   u   <h3>([^<]+?)とは？\s*</h3>rK   Fr   z\s*\|\s*NHK\s+for\s+School\s*$z3(?s)<div\s+class="programDetail\s*">\s*<p>[^<]+</p>rP   r   )r5   r[   z/meta/program.jsonc                    s   g | ]}  d | qS )z7https://www2.nhk.or.jp/school/movie/bangumi.cgi?das_id=)
url_result)r   xr#   r&   r'   r   I  s   z;NhkForSchoolProgramListIE._real_extract.<locals>.<listcomp>)part.zpart-video-dasid)	r   r0   Z_generic_titler   r   subr!   r   r   )r#   r+   r   r   rK   rP   Zbangumi_listZbangumisr&   r   r'   r}   :  s"    

z'NhkForSchoolProgramListIE._real_extractN)
rg   rh   ri   r   r   r   r   r~   r   r}   r&   r&   r&   r'   r   .  s   	r   c                   @   s  e Zd ZdgZdZdZdddddd	d
d
ddddgdg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,d-d.dd/d0d1d1d2d3d4d5d6d7d6d8d9gd:gZd;Zd<d= Zd>d? Z	d@dA Z
dBdC ZdDdE ZdSdGdHZdIdJ ZdKdL ZdMdN ZdOdP ZdQdR Zd;S )TNhkRadiruIEJPu   NHK らじる (Radiru/Rajiru)zhttps?://www\.nhk\.or\.jp/radio/(?:player/ondemand|ondemand/detail)\.html\?p=(?P<site>[\da-zA-Z]+)_(?P<corner>[\da-zA-Z]+)(?:_(?P<headline>[\da-zA-Z]+))?zHhttps://www.nhk.or.jp/radio/player/ondemand.html?p=LG96ZW5KZ4_01_4251382zEpisode expires on 2025-07-14u]   クラシックの庭　特集「ドボルザークを聴く」（１）交響曲を中心にZLG96ZW5KZ4_01_4251382rS   z$md5:652d3c38a25b77959c716421eba1617au   NHK FM・東京g     Ź@zzhttps://www.nhk.jp/static/assets/images/radioseries/rs/LG96ZW5KZ4/LG96ZW5KZ4-eyecatch_a67c6e949325016c0724f2ed3eec8a2f.jpgu   音楽u   クラシック・オペラu   田添菜穂子u   クラシックの庭Z
LG96ZW5KZ4u?   特集「ドボルザークを聴く」(1)交響曲を中心にZ
QP1Q2ZXZY3inkhZ20250707iSTkh)rK   rC   rm   rP   uploaderchannelr9   rn   
categoriescastrR   	series_idr   r`   r:   ro   r;   rq   )r+   rx   rs   z@https://www.nhk.or.jp/radio/ondemand/detail.html?p=Z9L1V2M24L_01ZZ9L1V2M24L_01u   ベストオブクラシックuZ   世界中の上質な演奏会をじっくり堪能する本格派クラシック番組。zzhttps://www.nhk.jp/static/assets/images/radioseries/rs/Z9L1V2M24L/Z9L1V2M24L-eyecatch_83ed28b4782907998875965fee60a351.jpgzNHK FM)rC   rK   rP   rn   r   r   r   rR   r   r   zHhttps://www.nhk.or.jp/radio/player/ondemand.html?p=18439M2W42_02_4251212zExpires on 2025-07-15Z18439M2W42_02_4251212u:   マイあさ! 午前5時のNHKニュース 2025年7月8日   NHKラジオ第1Phttps://www.nhk.or.jp/radioondemand/json/18439M2W42/img/series_945_thumbnail.jpg   NHKラジオニュースi<+lhi@'lh)rC   rm   rK   r   r   rn   rR   r:   ro   r;   rq   zHhttps://www.nhk.or.jp/radio/player/ondemand.html?p=J8792PY43V_20_4253945zExpires on 2025-09-01ZJ8792PY43V_20_4253945uE   「後絶たない筋肉増強剤の使用」ワールドリポートu   大濱 敦（ソウル支局）zNHK R1zShttps://www.nhk.or.jp/radioondemand/json/J8792PY43V/img/corner/box_31_thumbnail.jpgu(   マイあさ！ ワールドリポートZJ8792PY43V_20ijhZ20250706ijh)rC   rm   rK   rP   r   r   rn   rR   r   r:   ro   r;   rq   z?Failed to download extended metadata: HTTP Error 404: Not Found)r+   rx   rs   Zexpected_warningsNc           
   	   C   s   i }t |dthfD ],}|d}||vr2g ||< || | qg }| D ]p\}}t|D ]^\}}|dkr|d urd| dnd}|d }	r||	 d7 }|t||d	dd
 q^qNt|ddiS )N.roler   u   【u   】r   rK   u   …r   delimr   u   ，)r   dictrG   r\   items	enumerater
   )
r#   Zact_listZrole_groupsZactr   Zformatted_rolesZactsiresrK   r&   r&   r'   _format_act_list  s    
 zNhkRadiruIE._format_act_listc                 C   sp   g }t ||dthfD ]J}tt |dtdjhfdtdjhfdtffthfddi }r|| qd	|pnd S )
N.r   u   {}…r   u   （{}）r   r   r   u   、)r   r   r
   filterr   strr\   r   )r#   trackrH   ZartistsZartistr   r&   r&   r'   _make_artists  s    
zNhkRadiruIE._make_artistsc           	      C   s   t ||thf}|d u rd S t|d\}}t|d\}}d}|dkrV|t| d7 }|dkrp|t| d7 }|t|dd7 }|S )	Ni  <   u   （r   u   時間u   分02u   秒）)r   r   divmodint)	r#   r   rH   dhours	remainderminutessecondsr   r&   r&   r'   _make_duration  s    zNhkRadiruIE._make_durationc              	   C   s   g }t |dthfD ]}t |dtdjhfdtdjhfdtdjhfdtd	jhffthf}|| |d
 || |d tddd|d }r|d| d t |dthf }r|d| d |t|ddi qd	|S )N.r   u   「{}」Zlyricistu	   {}:作詞Zcomposeru	   {}:作曲Zarrangeru	   {}:編曲ZbyArtistr9   labelcoder   r   	from_dictu   ＜u   ＞locationu   ～r   


)
r   r   r   r   r   r\   r   r   r
   r   )r#   Z
music_listZtracksr   Ztrack_detailsr   r   r&   r&   r'   _format_music_list  s$    zNhkRadiruIE._format_music_listc                 C   sP   t |dthfpi }ttddd|dt |dd| jhft |dd| jhfdd	S )
NZdetailedDescriptionZepg80Zepg200r   r   miscactListZ	musicListr   )r   r   r
   r   r   )r#   responseZdetailed_descriptionr&   r&   r'   _format_description  s    zNhkRadiruIE._format_descriptionc              
   C   s|   g }t |g t|ttttftjhdd R D ]D\}}||d t|	dt|	d|t
||d |d8 }q2|S )Nc                 S   s   |d dkot |d d S )Nr   	copyrightr   r+   )r   r   r   r&   r&   r'   r     r   z-NhkRadiruIE._get_thumbnails.<locals>.<lambda>r+   rO   rN   )r+   rO   rN   
preferencerC   r   )r   r   r   bytesr   setr   r\   r	   rG   r
   )r#   r   keysr   r   rQ   sizeZthumbr&   r&   r'   _get_thumbnails  s"    
zNhkRadiruIE._get_thumbnailsc                    s  t |dthdd hf\} |d t fdd}|sDi S j||dddd	d
}|sbi S t |dthf }rdtdd|dd  i S t |ddthf}g }||d t	t |dD ]$\}	}
||
d td|	d q||ddd t
|t |ddddthf|dt |dthfdthfd thfd!thfd"t |d#d$thfd%thfd&thfd'thfd(dd)d*gthtthfd+f||d,S )-Nr   c                 S   s   | pd dS )Nr   ,	partitionr   r&   r&   r'   r     r   z8NhkRadiruIE._extract_extended_metadata.<locals>.<lambda>r   c                      s   j jt dS )N)ZbroadcastEventId)_API_URL_TMPLr   r
   r&   areaZdate_idr#   Zservicer&   r'   r     r   zDownloading extended metadataz$Failed to download extended metadataFi  )r5   Zexpected_statuserrorz4Failed to get extended metadata. API returned Error Z
statuscodemessagez: )r   r   publishedOnbroadcastDisplayName)abouteyecatch)r  ZeyecatchList.list)r  ZpartOfSeriesr  rR   r   r   .r   )rP   r   rQ   ZendDateZ	startDater9   )rK   r:   r;   r9   ZidentifierGroupZradioSeriesNameZradioSeriesIdZradioEpisodeNameZradioEpisodeIdZgenreZname1Zname2)rR   r   r   r`   r   )r   r   )r   r   r   r!   r   Zreport_warningr
   extendr  r   r   r   r   r   allr   )r#   r`   aa_vinfor   Z
detail_urlr   r
  stationrQ   numdctr&   r  r'   _extract_extended_metadata  sf    
z&NhkRadiruIE._extract_extended_metadatac           
   
   C   s   | d|d  }t |ddd hf}| ||}t |dthdd hf\}}}	i ||| j|d|d	d
dd|d|dt|	t|d|S )Nr   rC   Zaa_contents_idc                 S   s
   |  dS )N;r   r  r&   r&   r'   r   1  r   z3NhkRadiruIE._extract_episode_info.<locals>.<lambda>rE   c                 S   s   | pd dS )Nr   r   r  r  r&   r&   r'   r   4  r   rA   Fr   m4a_dashTr   Zprogram_sub_title)rC   r=   	containerwas_liverK   rP   r:   r;   )r   r  r   r^   rG   r   )
r#   r   programme_idseries_metar`   r  Zextended_metadataZfallback_start_timer   Zfallback_end_timer&   r&   r'   rf   /  s(    

z!NhkRadiruIE._extract_episode_infoc              
   C   s   | d|d  }t |ddthf}i ||| j|d|dddd	|d
t|dpb|ddt |dthfdthfdthfddd hthfdS )Nr   headline_id	file_listr   	file_nameFr   r  TrK   Zheadline_imagern   )rC   r=   r  r  rR   rn   Z
file_titleZfile_title_subZ	open_timeZ	aa_vinfo4c                 S   s   |  dd S )Nr   r   r  r  r&   r&   r'   r   S  r   z0NhkRadiruIE._extract_news_info.<locals>.<lambda>)rK   rP   r:   r;   )r   r   r^   rG   r   r   r   )r#   headliner  r   r`   r   r&   r&   r'   _extract_news_infoC  s&    zNhkRadiruIE._extract_news_infoc                    s2   | j r
d S | jdd ddd t fddt_ d S )N1https://www.nhk.or.jp/radio/config/config_web.xmlzDownloading API configFr   c                      s   d  dj S )Nhttps:z.//url_program_detail)findtextr&   Z
api_configr&   r'   r   \  r   z.NhkRadiruIE._real_initialize.<locals>.<lambda>)r  _download_xmlr   r   r   r&   r*  r'   _real_initializeW  s    zNhkRadiruIE._real_initializec           	         s   |ddd\}} | d| |dkr܈dd tdthfd	thfd	thfd
thfddd rtd fddtf}|stddd|S fdd}j	| fd
diS jd||ddtdtdthfdd}tdd dd!td"thf||d# rrtd$ fd%dtf}|sdtddd|S fd&d'}j	| f
d(
d)d*S )+NsiteZcornerr$  r   Z
18439M2W42z=https://www.nhk.or.jp/s-media/news/news-site/list/v1/all.jsonmainZprogram_nameZ
media_name)Zthumbnail_cZthumbnail_p)rK   r   r   rn   Fr7   detail_listc                    s   |d  kS )Nr!  r&   r   r!  r&   r'   r   p  r   z+NhkRadiruIE._real_extract.<locals>.<lambda>z-Content not found; it has most likely expiredTexpectedc                  3   s,   t  ddthfD ]} | V  qd S )Nr/  .)r   r   r%  )r$  r6   r  r#   r   r&   r'   news_entriesu  s    z/NhkRadiruIE._real_extract.<locals>.news_entriesrP   Zsite_detailz:https://www.nhk.or.jp/radio-api/app/v1/web/ondemand/series)site_idZcorner_site_idr   ZNHKZradio_broadcastr   r   rK   Zcorner_namer   Zthumbnail_url)rR   r   rn   r   r   r    c                    s   |d t  kS )NrC   )r   r   r0  r&   r'   r     r   c                  3   s,   t  ddthfD ]} | V  qd S )Nr    .)r   r   rf   rI   r3  r&   r'   r     s    z*NhkRadiruIE._real_extract.<locals>.entriesrR   Zseries_description)rK   rP   )rZ   r[   r!   r   r   r   anyr   r%  r   rG   r
   rf   )	r#   r+   r5  Z	corner_idr$  r4  Zfallback_stationr   r   r&   )r!  r6   r  r#   r   r'   r}   ^  st    zNhkRadiruIE._real_extract)Nr   )rg   rh   ri   _GEO_COUNTRIESr   r~   r   r  r   r   r   r   r   r  r  rf   r%  r,  r}   r&   r&   r&   r'   r   P  s   
M
3r   c                	   @   s4   e Zd ZdZddddddddd	d
gZdd ZdS )NhkRadioNewsPageIEz/https?://www\.nhk\.or\.jp/radionews/?(?:$|[?#])z https://www.nhk.or.jp/radionews/   Z18439M2W42_01r   z$md5:bf2c5b397e44bc7eb26de98d8f15d79dr   r   )rC   rn   rP   r   r   rK   )r+   r   rs   c                 C   s   |  dtS )Nz@https://www.nhk.or.jp/radio/ondemand/detail.html?p=18439M2W42_01)r   r   r|   r&   r&   r'   r}     s    z NhkRadioNewsPageIE._real_extractNr   r&   r&   r&   r'   r8    s   r8  c                   @   s   e Zd ZdgZdZddddddd	gd
ddddddgiiiddddddgd
ddddddgiiiddddddgd
dgZddddZd d! Zd"S )#NhkRadiruLiveIEr   z<https?://www\.nhk\.or\.jp/radio/player/\?ch=(?P<id>r[12]|fm)z)https://www.nhk.or.jp/radio/player/?ch=r1z	bs-r1-130u    re:^NHKラジオ第1・東京.+$rS   zChttps://www.nhk.jp/assets/images/broadcastservice/bs/r1/r1-logo.svgis_liveznhkradirulive r1-tokyo)rC   rK   rm   rn   Zlive_status_old_archive_idsrr   z)https://www.nhk.or.jp/radio/player/?ch=r2Zextractor_argsZnhkradiruliver	  Zfukuokaz	bs-r2-400u   re:^NHKラジオ第2.+$zChttps://www.nhk.jp/assets/images/broadcastservice/bs/r2/r2-logo.svgznhkradirulive r2-fukuoka)r+   r   rs   z)https://www.nhk.or.jp/radio/player/?ch=fmZsapporoz	bs-r3-010u   re:^NHK FM・札幌.+$zChttps://www.nhk.jp/assets/images/broadcastservice/bs/r3/r3-logo.svgznhkradirulive fm-sapporor1r2Zr3)r=  r>  Zfmc              
   C   s(  |  |}| ddgd }| d|d}|d| d}|shtdd	d
d |dD dd| jd|dj	 j|dj	d|d| ddd}t
|| j|df}i t
|dthfdthfdt| t||gt
|ddddthfdthfd f| || d!j	|dd"S )#Nr	  Ztokyor   r&  zDownloading area informationz.//data//area[.="z"]/..z!Invalid area. Valid areas are: {}z, c                 S   s   g | ]
}|j qS r&   )r)  )r   r   r&   r&   r'   r     r   z1NhkRadiruLiveIE._real_extract.<locals>.<listcomp>z.//data//areaTr1  r'  z.//url_program_noaZareakey)r	  zDownloading z station metadataF)r*   r5   r  r  rC   )rK   rC   Zlogo.r+   rO   rN   )r+   rO   rN   rT   )r<  rQ   r=   r;  )r   Z_configuration_argr+  r(  r   r   r   findallr!   r)  r   _NOA_STATION_IDSrG   r   r   r
   r	   r^   )r#   r+   r  r	  configr   Znoa_infoZbroadcast_servicer&   r&   r'   r}     s@    

 zNhkRadiruLiveIE._real_extractN)rg   rh   ri   r7  r~   r   r@  r}   r&   r&   r&   r'   r:    sD   &r:  )r   commonr   utilsr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   rY   r   r   r   r   r   r8  r:  r&   r&   r&   r'   <module>   s   L 
 KXB("  L