続・玩式草子 ―戯れせんとや生まれけん―

第63回最近の『らじる★らじる』(その1)

暑くて長い夏がやっと一段落したと思ったら急に冷えこみだし、カレンダーも残りわずかとなりました。毎度のことながら一年の早さを思い知る今日このごろ、皆さまいかがお過ごしでしょうか。

さて、本連載では過去に何度かNHKのインターネットラジオ「らじる★らじる」を取りあげたことがあります。もっとも、最後に取りあげたのは第48回、2年ほど前のことで、その後配信方法が変更されて当時の設定のままでは正しく受け取れなくなっています。

また、NHKラジオは2026年度から現在の3波体制が2波に整理されるそうで、1波減る分、従来よりも「らじる★らじる」が重視されるようになりました。そのせいか、以前は聞けなかったようなマイナーな番組も「聴き逃し配信」で聞けるようになっています。そこで久しぶりに「らじる★らじる」の遊び方を取り上げてみることにしました。

なお、今回取りあげる「らじる★らじる」は10月1日より始まったNHKのインターネット配信サービス「NHK ONE」とは別物です。⁠NHK ONE」はNHKとの受信契約を前提とした総合的なインターネットサービスなのに対し、⁠らじる★らじる」は従来通りNHKラジオの配信に特化したサービスで、NHKとの受信契約とは関係なく誰でも利用できます。

動的サイトと「ウェブ開発ツール」

「らじる★らじる」のページを調べる前に、今回使うツールについて簡単に紹介しておきましょう。以前「らじる★らじる」を取り上げたころは、手探りだったこともあり、HTMLファイルからJavaScriptを探し、それらしいスクリプトをわからないなりに読んでいく、といった面倒な作業をしていました。

しかしながら、その後あれこれと経験を積むうちにずいぶん便利なツールがごく身近にあることに気づきました。それはFirefoxブラウザに組み込まれているウェブ開発ツールです。このツールを使えば、従来は面倒だったJavaScriptで構成されたページの解析がずいぶん簡単になります。

筆者のような旧世代の人間だと、ウェブサイトを解析する際、まずは「ページのソースコードの表示」機能を使って、そのページの設計図であるソースコード(HTMLファイル)を調べます。昔々の静的なウェブサイトはそれで間に合ったものの、最近のウェブサイトはCSSやJavaScriptを駆使した動的な作りになっており、ブラウザは各ページをDOM(Document Object Model)として扱います。

ブラウザが、読み込んだHTMLファイルを元にCSSで修飾しJavaScriptの処理を施した結果がDOMです。DOMそのものはブラウザのメモリ上に構成されたツリー状のデータ構造で、それを可視化したのがウェブページとなります。今回紹介する「ウェブ開発ツール」は、ウェブページの元となるDOMの内容を表示したり変更するためのツールです。

「らじる★らじる」「インスペクター」

まずは現状の「らじる★らじる」を見てみましょう。URLは従来通りhttps://www.nhk.or.jp/radio/です。ページを開くと、ラジオ第1、第2、FMでそれぞれ配信中の番組が表示され、クリックすると別ウィンドウが開いてその番組の音声が流れます。

図1 「らじる★らじる」のページ
「らじる★らじる」のページ

このようなページを解析する際には「ウェブ開発ツール」インスペクターが役に立ちます。Firefoxでは「ウェブ開発ツール」は右上のメニューボタンのその他のツール⁠→ウェブ開発ツールと呼び出します。あるいはCtrlShiftIのショートカットでも呼び出し可能です。なお、⁠ウェブ開発ツール」「メニュー設定(メニューバー右端⁠⁠」から表示形式を変更することができ、今回は「ウィンドウ分割」を指定して独立したウィンドウ内に表示するようにしています。

図2 「インスペクター」の画面
「インスペクター」の画面

「インスペクター」では、CSSやJavaScriptの処理を終えたDOMがHTMLの形で左側のペインに表示され、カーソルでフォーカスするとその部分に対応するブラウザ側のパーツの色が変るので、調べたい箇所の処理を簡単に確認できます。

今回は、音声プレイヤーがどうやって配信URLを扱っているかといったあたりを調べたいので、ウェブページ上のプレイヤー部分に該当する箇所を「インスペクター」で探ってみました。⁠インスペクター」では、入れ子状になっている部分は[...]で畳み込まれているので、右側の画面の色を手掛りに畳み込まれた部分を展開していくと、該当箇所は簡単に見つかりました。

図3 「インスペクター」とウェブ画面表示
「インスペクター」とウェブ画面表示

「インスペクター」中の青く反転している部分を取り出すとこんな感じでした。

  <div class="nol_audio_player" data-exvolume="true" data-hlsurl="https://simul.drdi.st.nhk/live/5/joined/master.m3u8" data-skin="raFM" data-aa="simul;  クラシックの庭 シューベルトのピアノ・ソナタ ト長調;r3,130;2025111969155;2025-11-19T07:25:00+09:00_2025-11-19T09:15:00+09:00" data-type="LIVE" data-autoplay="true">
  <iframe id="_apIfr0" name="_apIfr0" scrolling="no" frameborder="0" title="音声再生プレーヤー" src="https://www.nhk.or.jp/common/aplayer/ifr.html" style="height: 85px; overflow: hidden;"></iframe>
  </div>

ざっと見、⁠音声再生プレイヤー」本体はこの部分から呼び出しているifr.html側にありそうなものの、とりあえず配信元のURLはhttps://simul.drdi.st.nhk/live/5/joined/master.m3u8らしいと読み取れます。

この⁠.m3u8⁠という拡張子はHLS(HTTP Live Streaming)用のURLで、mpvやvlcといったHLS対応のメディアプレイヤーを使えば直接再生することができます。下記の例ではハンドシェイク回りでエラーが出ているものの、最終的にはHLS経由で配信が再生できました。

$ mpv https://simul.drdi.st.nhk/live/5/joined/master.m3u8
 [ffmpeg] https: Cannot reuse HTTP connection for different host: simul.drdi.st.nhk:-1 != simulosa.drdi.st.nhk:-1
 [ffmpeg/demuxer] hls: keepalive request failed for 'https://simulosa.drdi.st.nhk/live/5/joined/audio/media.m3u8' with error: 'Invalid argument' when parsing playlist
● Audio  --aid=1  (aac 2ch 48000 Hz 97 kbps)
○ Audio  --aid=2  (aac 2ch 48000 Hz 97 kbps)
AO: [pipewire] 48000Hz stereo 2ch floatp
A: 00:00:17 / 00:00:30 (56%) Cache: 13s/487KB

すこし試したところ、⁠/live/3⁠がR1(ラジオ第1⁠⁠、⁠4⁠がR2(ラジオ第2⁠⁠、⁠5⁠がFMという割り当てになっていました。NHKラジオは札幌から福岡まで8つの放送局があり、⁠らじる★らじる」もそれに準じた構成になっています。R2は各局共通で⁠4⁠⁠、R1とFMは各局の独自番組のため放送エリアごとに別番号を割り当ててあるようです。

「らじる★らじる」「デバッガー」

さて、とりあえず現在配信中のURLはわかったものの、このURLがどのようにタイトルや曲目といった番組情報等と結びついているかはもう少し遡って調べる必要があります。というのも、DOMはHTMLファイルを元にCSSやJavaScriptが処理を行った「最終結果」であり、どこから、どのように、URLや番組情報を引っぱってくるかを調べるには、実際の処理を行っているJavaScriptを調べる必要があるからです。

その際に便利なのが「ウェブ開発ツール」に含まれるデバッガーです。⁠デバッガー」はDOMを作る際に読み込んだJavaScriptをデバッグするためのツールで、スクリプトの一覧表示や定義された関数の検索機能等を持っています。加えて、読み込んだスクリプトの整形機能も用意されており、ソースコードのリストペイン下にある⁠{ }⁠を押すと、改行無しに詰めこまれたスクリプトが整形され見易くなります。

図4 「デバッガー」の画面例
「デバッガー」の画面例

左側のペインにあるスクリプトの一覧を見てみると、このページではwww.nhk.or.jpの⁠radio/assets/js/⁠から読み込んだplayer.jsというスクリプトがURLや番組情報の管理を引き受け、実際の音声再生はvideo8.10.0.jsというHTML5用の汎用ビデオプレイヤーを利用する、という仕組みになっているようです。

そこでplayer.jsを見てみると、先頭部分でconfig_web.xml?250303というファイルを読み込んでいました。

/////////らじる★らじる 音声プレーヤー/////////
$(function() {
    $.ajax({
        url: "/radio/config/config_web.xml?250303",
        cache: !0,
        dataType: "xml",

名前からしてこれが設定ファイルだろうと調べてみれば、ビンゴ!⁠、まさにこのXMLファイルに各地の放送局別の配信URLやエリアID等が記載されていました。

<?xml version="1.0" encoding="UTF-8"?>
<radiru_config>

        <!-- お知らせ -->
        <info><![CDATA[/radio/include/oshirase.txt]]></info>
        
        <!-- 各地域のストリームURL -->
        <stream_url>
                <data>
                        <areajp>札幌</areajp>
                        <area>sapporo</area>
                        <apikey>700</apikey>
                        <areakey>010</areakey>
                        
                        <r1hls><![CDATA[https://simul.drdi.st.nhk/live/6/joined/master.m3u8]]></r1hls>
                        <r2hls><![CDATA[https://simul.drdi.st.nhk/live/4/joined/master.m3u8]]></r2hls>
                        <fmhls><![CDATA[https://simul.drdi.st.nhk/live/7/joined/master.m3u8]]></fmhls>
                        
                </data>

このファイルの最後の方には、番組情報へのアクセスポイントらしき記述もあります。

         <!-- noa api -->
         <url_program_noa><![CDATA[//api.nhk.jp/r7/pg/now/radio/{area}/now.json]]></url_program_noa>

一方、player.jsの方では「{area}部を各地区のareakeyに置き替える」という、このURLの叩き方も見つかりました。

 function getAPI() {
     $.ajax({
         url: $config.url_program_noa.replace(/{area}/, findAreakey($area)),
         cache: !0,
         dataType: "json",

このAPIを使えば放送中の番組(Now On Air)の情報が取れそうなので、試しに⁠010⁠(札幌放送局のareakey)を使って叩いてみました。curlの出力を食わしているjqはJSONデータを操作するツールです。

$ curl https://api.nhk.jp/r7/pg/now/radio/010/now.json | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 76338    0 76338    0     0   525k      0 --:--:-- --:--:-- --:--:--  528k
{
  "r1": {
    "previous": {
      "type": "BroadcastEvent",
      "id": "r1-010-2025112169523",
      "name": "大相撲(2025年) 九州場所 十三日目",
      "description": "<中断>(5:00)ニュース",
      "startDate": "2025-11-21T16:05:00+09:00",
      ....

届いたJSONファイルを調べると、各チャンネルを示す⁠r1⁠⁠、⁠r2⁠⁠、⁠r3⁠それぞれに、["previous"](1つ前の番組⁠⁠、["present"](現在の番組⁠⁠、["following"](次の番組)の3種のデータ(配列)が用意され、その中で番組タイトルや概要、出演者、曲目等の情報が登録されていました。

とりあえずこれくらいわかれば十分なので、まずはこれらの情報を以前書いたタイマー予約用スクリプトに反映させることにしました。


今回は最近の「らじる★らじる」の同時配信方法について調べてみました。最初にも触れたように、NHKラジオは来年度から2波体制になる予定のため、今回の記事の賞味期限はあまり長くないかも知れません(苦笑⁠⁠。しかしながら、今回紹介した「ウェブ開発ツール」を使えば変更への追従も容易でしょう。次回は「らじる★らじる」のもうひとつの魅力である「聴き逃し配信」について調べてみます。

おすすめ記事

記事・ニュース一覧