TOKYO FMのjet streamをphpで録音したい。

## 初めに
私は、ある時から東京FMで深夜12：00〜1：00で放送されるジェットストリームというラジオ番組にハマってしまい、毎日聞くことがことが日課になっています。
そこで、どんな音楽が今日流れていたのか、などを昼に確認したかったので、phpで東京FMを録音するスクリプトを作ってみました。
**注意!・このスクリプトはradikoのシステムにアクセスをします。ddos攻撃的なことになりかねませんので、最低1分間、実行間隔を空けてください。**

## 欲しい機能

 - ラジオを録音する
 - できれば東京FM以外も録音できるように。

## 案1・受信
ラジオを受信することを考えてみはしたのですが、さすがに無理だと思い、断念。

## 案2・php以外で?（ラズパイとか）
予算の関係で、断念。

## 案3・HLSを受信するか・・・
これはいけそうな気がする。やってみよう。

### どこで配信しているのか探してみる。
まずは東京FMのホームページを開いてみます。
するとメニューに「ポッドキャスト」という項目がある。
「使えるかも？」と思って、みてみたけどjet streamはないみたい。
まあ、これでやったら東京FMしか聞けなくなっちゃうからどっちにしろやめるだろうけど。

と、がっかりしていると、東京FMのホームページの下の方にこんなことが書かれていました。
![2E7E4D4A-ED86-4343-A4AF-BBD0A1384D9E.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740290/403b716c-af6e-ecdf-307a-a066939742aa.jpeg)
ひらめいた！radikoを使えばいいんだ。

### radikoのHLSを探してみる。
radikoのHLSを探してみましょう。
開発者ツールのネットワークから、m3p8を探して...
ありました。
さあ、アクセスしてみましょう。

### ガーン😨
アクセスはしてみたものの、黒い画面が表示されるだけ。
![D5949312-629C-428B-A4B3-6783D062EAC3.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740290/463fed44-bb0d-2bf0-916c-bbdaa0e63927.jpeg)

どうやらアクセストークンとか色々必要らしいです。
どうしよう・・・

### 検索してみたら。

どうしよう・・・と思って、検索していたらこんな神サイトを見つけました。
https://blog.bluedeer.net/archives/216
radiko録音(ダウンロード)への道 その1
「途中まで僕のやろうとしてることと一緒やないかい！」

### 言われた通りに実装してみる。
```php
<pre>
<?php
ini_set('display_errors', 'On');
?>
<?php
global $auth_t;
global $pry;
$headers = array(
    'HTTP/1.0',
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Encoding:gzip ,deflate',
    'Accept-Language:ja,en-us;q=0.7,en;q=0.3',
    'Connection:keep-alive',
    'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:26.0) Gecko/20100101 Firefox/26.0',
    'X-Radiko-App: pc_html5',
    'X-Radiko-App-Version: 0.0.1',
    'X-Radiko-Device: pc',
    'X-Radiko-User: dummy_user',
    );

$url = 'https://radiko.jp/v2/api/auth1';
$ch = curl_init(); // はじめ
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true); // ヘッダも出力したい場合
//ヘッダー追加オプション
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$html = curl_exec($ch);
$html = mb_convert_encoding($html, 'UTF-8', 'EUC-JP');
//var_dump($html);
$html0 = explode("\n", $html);
var_dump($html0);
$auth_t = $html0[8];
$auth_1 = $html0[11];
$auth_2 = $html0[12];
$auth_1 = str_replace('X-Radiko-KeyLength: ', '', $auth_1);
$auth_2 = str_replace('X-Radiko-KeyOffset: ', '', $auth_2);
curl_close($ch); //終了
?>
<?php
$auth = 'bcd151073c03b352e1ef2fd66c32209da9ca0afa';
$pry = base64_encode(mb_substr($auth, ($auth_2), $auth_1));
echo "\n";
$headers2 = array(
    'HTTP/1.0',
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Encoding:gzip ,deflate',
    'Accept-Language:ja,en-us;q=0.7,en;q=0.3',
    'Connection:keep-alive',
    'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:26.0) Gecko/20100101 Firefox/26.0',
    $auth_t,
    'X-Radiko-PartialKey: '.$pry,
    'X-Radiko-User: dummy_user',
    'X-Radiko-Device: pc',
    );
var_dump($headers2);

$url2 = 'https://radiko.jp/v2/api/auth2';
$ch2 = curl_init(); // はじめ
curl_setopt($ch2, CURLOPT_URL, $url2);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_HEADER, true); // ヘッダも出力したい場合
//ヘッダー追加オプション
curl_setopt($ch2, CURLOPT_HTTPHEADER, $headers2);

$html2 = curl_exec($ch2);
$html2 = mb_convert_encoding($html2, 'UTF-8', 'EUC-JP');
var_dump($html2);
curl_close($ch2); //終了

$headers3 = array(
    'HTTP/1.0',
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Encoding:gzip ,deflate',
    'Accept-Language:ja,en-us;q=0.7,en;q=0.3',
    'Connection:keep-alive',
    'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:26.0) Gecko/20100101 Firefox/26.0',
    $auth_t,
    'X-Radiko-PartialKey: '.$pry,
    'X-Radiko-User: dummy_user',
    'X-Radiko-Device: pc',
    );

//$url3 = "https://radiko.jp/v2/api/ts/playlist.m3u8?station_id=FMT&l=15&ft=1658404794&to=1658404794";
//$url3 = "https://radiko.jp/v2/station/stream_smh_multi/FMT.xml";
//$url3 = "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/playlist.m3u8";
$url3 = 'http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/chunklist_w1377524876.m3u8';
echo $url3;
$ch3 = curl_init(); // はじめ
curl_setopt($ch3, CURLOPT_URL, $url3);
curl_setopt($ch3, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch3, CURLOPT_HEADER, true); // ヘッダも出力したい場合
//ヘッダー追加オプション
curl_setopt($ch3, CURLOPT_HTTPHEADER, $headers3);

$html3 = curl_exec($ch3);
$html3 = mb_convert_encoding($html3, 'UTF-8', 'EUC-JP');
var_dump($html3);
curl_close($ch3); //終了


$html4 = explode("\n", $html3);
echo '=========';
var_dump($html4);

function save($media)
{
    global $auth_t;
    global $pry;
    $headers4 = array(
    'HTTP/1.0',
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Encoding:gzip ,deflate',
    'Accept-Language:ja,en-us;q=0.7,en;q=0.3',
    'Connection:keep-alive',
    'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:26.0) Gecko/20100101 Firefox/26.0',
    $auth_t,
    'X-Radiko-PartialKey: '.$pry,
    'X-Radiko-User: dummy_user',
    'X-Radiko-Device: pc',
    );

//$url3 = "https://radiko.jp/v2/api/ts/playlist.m3u8?station_id=FMT&l=15&ft=1658404794&to=1658404794";
//$url3 = "https://radiko.jp/v2/station/stream_smh_multi/FMT.xml";
//$url3 = "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/playlist.m3u8";
$url4 = $media;
    echo $url4;
    $ch4 = curl_init(); // はじめ
curl_setopt($ch4, CURLOPT_URL, $url4);
    curl_setopt($ch4, CURLOPT_RETURNTRANSFER, true);

    curl_setopt($ch4, CURLOPT_HEADER, true); // ヘッダも出力したい場合
//ヘッダー追加オプション
curl_setopt($ch4, CURLOPT_HTTPHEADER, $headers4);

    $html5 = curl_exec($ch4);

    $okokokokok = curl_close($ch4); //終了

echo $media;
    echo '<BR>';
    $name = explode('/', rtrim($media));
    var_dump($okokokokok);
/*$fh = fopen("./radio/".$name[6], "w");
fwrite($fh,$okokokokok);
fclose($fh);*/
var_dump(file_put_contents($name[6], $okokokokok));
}

function download_image1($image_url, $image_file)
{
    $name = explode('/', rtrim($image_url));
    $image_file = $name[6];

    $fp = fopen('./radio/'.$image_file, 'w+');              // open file handle

global $auth_t;
    global $pry;
    $headers4 = array(
    'HTTP/1.0',
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Encoding:gzip ,deflate',
    'Accept-Language:ja,en-us;q=0.7,en;q=0.3',
    'Connection:keep-alive',
    'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:26.0) Gecko/20100101 Firefox/26.0',
    $auth_t,
    'X-Radiko-PartialKey: '.$pry,
    'X-Radiko-User: dummy_user',
    'X-Radiko-Device: pc',
    );

    $ch = curl_init($image_url);
    // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // enable if you want
    curl_setopt($ch, CURLOPT_FILE, $fp);          // output to file
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 1000);      // some large value to allow curl to run for a long time
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0');
    curl_setopt($ch4, CURLOPT_HTTPHEADER, $headers4);
    // curl_setopt($ch, CURLOPT_VERBOSE, true);   // Enable this line to see debug prints
    curl_exec($ch);

    curl_close($ch);                              // closing curl handle
    fclose($fp);                                  // closing file handle
}
$coco = count($html4);

download_image1($html4[74], 'local_image1.jpg');
download_image1($html4[76], 'local_image1.jpg');
download_image1($html4[78], 'local_image1.jpg');
download_image1($html4[80], 'local_image1.jpg');
download_image1($html4[82], 'local_image1.jpg');
download_image1($html4[84], 'local_image1.jpg');
download_image1($html4[86], 'local_image1.jpg');
download_image1($html4[88], 'local_image1.jpg');
download_image1($html4[90], 'local_image1.jpg');
download_image1($html4[92], 'local_image1.jpg');
download_image1($html4[94], 'local_image1.jpg');
download_image1($html4[96], 'local_image1.jpg');

?>
</pre>
```
めっちゃ頑張りました。特に最後の関数（笑）

### こんな感じで出力がされる
デバッグのために```var_dump()```で出力してます。
```出力
array(17) {
  [0]=>
  string(16) "HTTP/1.1 200 OK
"
  [1]=>
  string(14) "Server: nginx
"
  [2]=>
  string(36) "Date: Fri, 22 Jul 2022 08:50:44 GMT
"
  [3]=>
  string(25) "Content-Type: text/plain
"
  [4]=>
  string(27) "Transfer-Encoding: chunked
"
  [5]=>
  string(23) "Connection: keep-alive
"
  [6]=>
  string(21) "X-Radiko-AppType: pc
"
  [7]=>
  string(22) "X-Radiko-AppType2: pc
"
  [8]=>
  string(43) "X-Radiko-AuthToken: i-nRmKY62ZYAdEAWgZQW2w
"
  [9]=>
  string(21) "X-Radiko-AuthWait: 0
"
  [10]=>
  string(19) "X-Radiko-Delay: 15
"
  [11]=>
  string(23) "X-Radiko-KeyLength: 16
"
  [12]=>
  string(22) "X-Radiko-KeyOffset: 0
"
  [13]=>
  string(185) "Access-Control-Expose-Headers: X-Radiko-AuthToken, X-Radiko-Partialkey, X-Radiko-AppType, X-Radiko-AuthWait, X-Radiko-Delay, X-Radiko-KeyLength, X-Radiko-KeyOffset, X-Radiko-SubStation
"
  [14]=>
  string(39) "Access-Control-Allow-Credentials: true
"
  [15]=>
  string(1) "
"
  [16]=>
  string(25) "please send a part of key"
}



array(10) {
  [0]=>
  string(8) "HTTP/1.0"
  [1]=>
  string(71) "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
  [2]=>
  string(29) "Accept-Encoding:gzip ,deflate"
  [3]=>
  string(39) "Accept-Language:ja,en-us;q=0.7,en;q=0.3"
  [4]=>
  string(21) "Connection:keep-alive"
  [5]=>
  string(92) "User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:26.0) Gecko/20100101 Firefox/26.0"
  [6]=>
  string(43) "X-Radiko-AuthToken: i-nRmKY62ZYAdEAWgZQW2w
"
  [7]=>
  string(45) "X-Radiko-PartialKey: YmNkMTUxMDczYzAzYjM1Mg=="
  [8]=>
  string(25) "X-Radiko-User: dummy_user"
  [9]=>
  string(19) "X-Radiko-Device: pc"
}
string(402) "HTTP/1.1 200 OK
Server: nginx
Date: Fri, 22 Jul 2022 08:50:44 GMT
Content-Type: text/plain
Transfer-Encoding: chunked
Connection: keep-alive
Access-Control-Expose-Headers: X-Radiko-AuthToken, X-Radiko-Partialkey, X-Radiko-AppType, X-Radiko-AuthWait, X-Radiko-Delay, X-Radiko-KeyLength, X-Radiko-KeyOffset, X-Radiko-SubStation
Access-Control-Allow-Credentials: true

JP13,?延根??tokyo Japan
"
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/chunklist_w1377524876.m3u8string(5437) "HTTP/1.1 200 OK
Accept-Ranges: bytes
Access-Control-Expose-Headers: Date, Server, Content-Type, Content-Length
Server: WowzaStreamingEngine/4.8.5.05
Cache-Control: max-age=1
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: OPTIONS, GET, POST, HEAD
Connection: Keep-Alive
Access-Control-Allow-Headers: Content-Type, User-Agent, If-Modified-Since, Cache-Control, Range, X-Radiko-AuthToken, X-Radiko-AreaId
Date: Fri, 22 Jul 2022 08:50:44 GMT
Content-Type: application/vnd.apple.mpegurl
Content-Length: 4866

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:804518
#EXT-X-DISCONTINUITY-SEQUENCE:0
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804518.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804519.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804520.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804521.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804522.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804523.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804524.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804525.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804526.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804527.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804528.aac
#EXTINF:5.12,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804529.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804530.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804531.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804532.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804533.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804534.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804535.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804536.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804537.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804538.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804539.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804540.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804541.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804542.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804543.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804544.aac
#EXTINF:5.12,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804545.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804546.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804547.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804548.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804549.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804550.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804551.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804552.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804553.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804554.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804555.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804556.aac
"
=========array(98) {
  [0]=>
  string(16) "HTTP/1.1 200 OK
"
  [1]=>
  string(21) "Accept-Ranges: bytes
"
  [2]=>
  string(74) "Access-Control-Expose-Headers: Date, Server, Content-Type, Content-Length
"
  [3]=>
  string(38) "Server: WowzaStreamingEngine/4.8.5.05
"
  [4]=>
  string(25) "Cache-Control: max-age=1
"
  [5]=>
  string(31) "Access-Control-Allow-Origin: *
"
  [6]=>
  string(39) "Access-Control-Allow-Credentials: true
"
  [7]=>
  string(55) "Access-Control-Allow-Methods: OPTIONS, GET, POST, HEAD
"
  [8]=>
  string(23) "Connection: Keep-Alive
"
  [9]=>
  string(133) "Access-Control-Allow-Headers: Content-Type, User-Agent, If-Modified-Since, Cache-Control, Range, X-Radiko-AuthToken, X-Radiko-AreaId
"
  [10]=>
  string(36) "Date: Fri, 22 Jul 2022 08:50:44 GMT
"
  [11]=>
  string(44) "Content-Type: application/vnd.apple.mpegurl
"
  [12]=>
  string(21) "Content-Length: 4866
"
  [13]=>
  string(1) "
"
  [14]=>
  string(7) "#EXTM3U"
  [15]=>
  string(16) "#EXT-X-VERSION:3"
  [16]=>
  string(23) "#EXT-X-TARGETDURATION:6"
  [17]=>
  string(28) "#EXT-X-MEDIA-SEQUENCE:804518"
  [18]=>
  string(31) "#EXT-X-DISCONTINUITY-SEQUENCE:0"
  [19]=>
  string(14) "#EXTINF:4.992,"
  [20]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804518.aac"
  [21]=>
  string(14) "#EXTINF:4.992,"
  [22]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804519.aac"
  [23]=>
  string(14) "#EXTINF:4.992,"
  [24]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804520.aac"
  [25]=>
  string(14) "#EXTINF:4.992,"
  [26]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804521.aac"
  [27]=>
  string(14) "#EXTINF:4.992,"
  [28]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804522.aac"
  [29]=>
  string(14) "#EXTINF:4.992,"
  [30]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804523.aac"
  [31]=>
  string(14) "#EXTINF:4.992,"
  [32]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804524.aac"
  [33]=>
  string(14) "#EXTINF:4.992,"
  [34]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804525.aac"
  [35]=>
  string(14) "#EXTINF:4.992,"
  [36]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804526.aac"
  [37]=>
  string(14) "#EXTINF:4.992,"
  [38]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804527.aac"
  [39]=>
  string(14) "#EXTINF:4.992,"
  [40]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804528.aac"
  [41]=>
  string(13) "#EXTINF:5.12,"
  [42]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804529.aac"
  [43]=>
  string(14) "#EXTINF:4.992,"
  [44]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804530.aac"
  [45]=>
  string(14) "#EXTINF:4.992,"
  [46]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804531.aac"
  [47]=>
  string(14) "#EXTINF:4.992,"
  [48]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804532.aac"
  [49]=>
  string(14) "#EXTINF:4.992,"
  [50]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804533.aac"
  [51]=>
  string(14) "#EXTINF:4.992,"
  [52]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804534.aac"
  [53]=>
  string(14) "#EXTINF:4.992,"
  [54]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804535.aac"
  [55]=>
  string(14) "#EXTINF:4.992,"
  [56]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804536.aac"
  [57]=>
  string(14) "#EXTINF:4.992,"
  [58]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804537.aac"
  [59]=>
  string(14) "#EXTINF:4.992,"
  [60]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804538.aac"
  [61]=>
  string(14) "#EXTINF:4.992,"
  [62]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804539.aac"
  [63]=>
  string(14) "#EXTINF:4.992,"
  [64]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804540.aac"
  [65]=>
  string(14) "#EXTINF:4.992,"
  [66]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804541.aac"
  [67]=>
  string(14) "#EXTINF:4.992,"
  [68]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804542.aac"
  [69]=>
  string(14) "#EXTINF:4.992,"
  [70]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804543.aac"
  [71]=>
  string(14) "#EXTINF:4.992,"
  [72]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804544.aac"
  [73]=>
  string(13) "#EXTINF:5.12,"
  [74]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804545.aac"
  [75]=>
  string(14) "#EXTINF:4.992,"
  [76]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804546.aac"
  [77]=>
  string(14) "#EXTINF:4.992,"
  [78]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804547.aac"
  [79]=>
  string(14) "#EXTINF:4.992,"
  [80]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804548.aac"
  [81]=>
  string(14) "#EXTINF:4.992,"
  [82]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804549.aac"
  [83]=>
  string(14) "#EXTINF:4.992,"
  [84]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804550.aac"
  [85]=>
  string(14) "#EXTINF:4.992,"
  [86]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804551.aac"
  [87]=>
  string(14) "#EXTINF:4.992,"
  [88]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804552.aac"
  [89]=>
  string(14) "#EXTINF:4.992,"
  [90]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804553.aac"
  [91]=>
  string(14) "#EXTINF:4.992,"
  [92]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804554.aac"
  [93]=>
  string(14) "#EXTINF:4.992,"
  [94]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804555.aac"
  [95]=>
  string(14) "#EXTINF:4.992,"
  [96]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804556.aac"
  [97]=>
  string(0) ""
}
```

### 果たして録音できたのか？！
![4BA8FC7C-AC7C-41C5-9AC9-3B7FCBAE263E.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740290/057c8f2c-53a3-3ea7-964d-337f694e8a14.jpeg)
ジャジャーン！
ちゃんと録音できてます。😁
一回の実行で1分間分保存されますので、10分なら1分毎に10回、GASとかでトリガー設定して動かしてください。
コロンがあればそちらでも構いません。一応、GASのコードも書いておきます。
```GAS
function main() {
  // これにトリガーを設定してください。
  var url = "https://google.com";
  var response = UrlFetchApp.fetch(url);
  Logger.log(response.getContentText());
}
```
**注意!・このスクリプトはradikoのシステムにアクセスをします。ddos攻撃的なことになりかねませんので、最低1分間、実行間隔を空けてください。**

### 欠点
ただこれ、5秒くらいの音声がわかれて1分分保存されているんです。
これじゃあいちいち開かないといけないから面倒臭い。
どうにか連続して再生しましょう。

#### javascriptのaudioオブジェクトで連続再生。
関数は以下のサイトのものをほぼそのまま使わせてもらってます。
https://gist.github.com/yoshiiz/6134482f8fd72063e7221b7b82d27e67

```html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta http-equiv="content-language" content="ja">
	<meta name="robots" content="noindex,nofollow">
	<meta charset="UTF-8">
	<title>タイトル</title>
	<style type="text/css">
		font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Hiragino Kaku Gothic ProN', 'メイリオ', meiryo, sans-serif;
	</style>
</head>
<body>
    <?php
    $result = glob('./radio/*');
    echo "<script>";
    echo "var mList = new Array();";
    foreach($result as $file){
    	echo "mList.push('".$file."');\n";
    }
    echo "</script>";
    echo "<pre>";
    var_dump($result);
    echo "</pre>";
    ?>
    <button onclick="stop()">停止</button>
    <button onclick="play()" id="play">再生</button>
    
    <script type="text/javascript">
    'use strict';
    
    var playlist = mList;
    
    var audio = document.createElement('audio');
    document.body.appendChild(audio);
    audio.style.width = '100%';
    audio.style.height = 'auto';
    audio.controls = true;
    audio.volume = 0.2;
    
    audio.src = playlist[0];
    audio.play();
    
    var index = 0;
    audio.addEventListener('ended', function(){
      index++;
      if (index < playlist.length) {
        audio.src = playlist[index];
        audio.play();
      }
      else {
        audio.src = playlist[0];
        audio.play();
        index = 0;
      }
    });
    </script>
    <audio id='audio'></audio>
</body>
</html>
```
欠点は一つ一つのファイルの間がぶつ切れになってしまうことですかね・・・
まあそこは大目にみてください。

## まとめ
 - phpのみでラジオを録音（厳密に言えば違うが...）することができた。
 - radikoのシステムはめんどくさい。

もし、コードに問題点・改善点（ありすぎると思うけど...）があればコメントとかから教えていただけると嬉しいです。