Raspberry Pi Radiko Player 更新

今回はRadiko Playerの更新です。

UIを見なおしてみました。

CDDBに問い合わせをしてみました。

中央のカラムにステーションリストを配置

アンカーを打って左カラムのメニューから目的のリストにアクセスできます。


メニューからradikoを選択するとこの位置に表示します。

ステーションはボタンに配置してコンパクトにまとめました。


SHOUTcastとCSRA.fmはプレイリストが必要です。(/var/www/html/castに配置)

以前の記事に大体まとめているので参考にしてください。
CSRA.fmはプレイリストに誤記があるサイトがあります。(修正が必要)

CDDBに問い合わせてみる
参考 いち雑記 CDDB問い合わせ
リッピングソフトのabcdeを使っているとアルバム情報をいくつも拾ってくる場合があります。以前abcdeの設定で参考にさせてもらったサイトでコマンドからfreedbに問い合わせる方法が紹介されているので実行してみました。
以下のpackageが必要です。(abcdeがインストールされていればcd-discidは依存で入っている)

# apt install cd-discid nkf

適当なCDをセットしてCDに記録されている固有のIDや曲番号を取得

$ cd-discid /dev/sr0
46091d05 5 150 49632 81692 118825 156730 2335
$ cd-discid /dev/sr0 | tr "[:blank:]" "+"
46091d05+5+150+49632+81692+118825+156730+2335

取得したディスク情報を基に問い合わせ(freedb日本語) 1回目の問い合わせ

$ wget -q -O - "http://freedbtest.dyndns.org/~cddb/cddbeuc.cgi?cmd=cddb+query+46091d05+5+150+49632+81692+118825+156730+2335&hello=raspberrypi+localhost+wget+ver1.16.1&proto=6"
200 jazz 46091d05 Cannonball Adderley / Somethin' Else

しかしディスクによっては1回目の問い合わせで違うパターンの返答をするものがあります。
しかもディスクに記録されているIDとは違うIDにアルバム情報があります。

$ wget -q -O - "http://freedbtest.dyndns.org/~cddb/cddbeuc.cgi?cmd=cddb+query+3608d104+4+150+42467+88930+126387+2259+&hello=raspberrypi+localhost+wget+ver1.16.1&proto=6" | nkf
211 Found inexact matches, list follows (until terminating `.')
jazz 3808d104 1588 Sonny Clark / Cool Struttin'
jazz 3a08d204 Sonny Clark / Cool Struttin'
data 3608d104 Sonny Clark / Cool Struttin' 
reggae 3608d104 Sonny Clark / COOL STRUTTIN' (ジャズの100枚) 
soundtrack 3608d104 ソニー・クラーク / クール・ストラッティン 
newage 3608d104 Sonny Clark / Cool Struttin' 
country 3608d104 Sonny Clark / The Essential Jazz Collection: Cool Struttin' 
blues 3608d104 Sonny Clark / The Essential Jazz Collection: Cool Struttin' 
classical 3608d104 Sonny Clark / Cool Struttin' 
folk 3608d104 Sonny Clark / Cool Strutin 
jazz 3608d104 Sonny Clark / Blue Minor

次に必要なものはジャンルとディスクID 2回目の問い合わせ

$ wget -q -O - "http://freedbtest.dyndns.org/~cddb/cddbeuc.cgi?cmd=cddb+read+ jazz+3808d104+&hello=raspberrypi+localhost+wget+ver1.16.1&proto=6" | nkf

210 jazz 3808d104 CD database entry follows (until terminating `.')
# xmcd CD database file
#
# Track frame offsets:
#	150
#	42487
#	89002
#	126477
#
# Disc length: 2259 seconds
#
# Revision: 1
# Processed by: cddbd v1.4PL0 Copyright (c) Steve Scherf et al.
# Submitted via: Rip!AudiCO v4.10
#
DISCID=3808d104
DTITLE=1588 Sonny Clark / Cool Struttin'
DYEAR=
DGENRE=jazz
TTITLE0=Cool Struttin'
TTITLE1=Blue Minor
TTITLE2=Sippin' At Bells
TTITLE3=Deep Night
EXTD=
EXTT0=
EXTT1=
EXTT2=
EXTT3=
PLAYORDER=
.

取得できましたね。以上のようなパターンでも上位のIDに音楽情報が記載されていると期待してジャンル+ディスクIDを指定してやればRadiko Player(php)からでも取得できるだろうということでやってみました。

urlを書き出すためのファイルを準備します。

# touch /var/www/html/freedb.txt
# chown www-data:www-data /var/www/html/freedb.txt

index.phpの編集
ドライブにディスクがセットされていない状態で問い合わせ実行した場合No medium foundを返します。

$cddb = shell_exec('cd-discid /dev/sr0 2>&1');
if (preg_match("/No/", $cddb)) {
     if (stristr($cddb, 'No')) {
         $cddb = (stristr($cddb, 'No'));
         $_SESSION['cddb'] = $cddb;
         break;
     }
}

CDのディスクIDを取得(改行コード削除)

$command = ('cd-discid /dev/sr0 | tr "[:blank:]" "+"');
$diskid = shell_exec("{$command}");
$diskid = str_replace(PHP_EOL, '', $diskid);

1回目の問い合わせのurlを作成、実行
作成したurlは一旦ファイルに書き出し、wgetはそれを読み込んで実行します。

$url = "http://freedbtest.dyndns.org/~cddb/cddbeuc.cgi?cmd=cddb+query+";
$url .= $diskid;
$url .= "&hello=raspberrypi+localhost+wget+ver1.16.1&proto=6";
$fp = fopen("freedb.txt", "w");
fwrite($fp, $url);
fclose($fp);
$command = ('wget -q -O - -i freedb.txt');
$disktitle = shell_exec("{$command}");

2回目の問い合わせ
1回目で得られた結果から’inexact’の文字を検索してヒットしたら1行目に相当する箇所を制御コードを含めて削除、それ以外は最初の4文字を削除します。そこから配列にしてジャンルとディスクIDを抜き出します。
2回目の問い合わせのurlを作成、wgetで得られた結果をnkfで文字コード変換、egerepで必要な項目を抽出して出力します。

$str = $disktitle;
if(preg_match('/inexact/',$str)){
    $cut = 65;
    }else{
    $cut = 4;
}
$replace = substr( $str , $cut , strlen($str)-$cut );
$disktitle = $replace;
$disk = explode(' ',$disktitle,3);
$janru = $disk[0];
$id = $disk[1];
$url = "http://freedbtest.dyndns.org/~cddb/cddbeuc.cgi?cmd=cddb+read+";
$url .= $janru;
$url .= "+";
$url .= $id;
$url .= "+&hello=raspberrypi+localhost+wget+ver1.16.1&proto=6";
$fp = fopen("freedb.txt", "w");
fwrite($fp, $url);
fclose($fp);
$command = ('wget -q -O - -i freedb.txt | nkf | grep -i -e DTITLE -e DYEAR -e DGENRE -e TTITLE');
$cddb = shell_exec("{$command}");

freedb(日本語)で取得できなかったディスクは出力が空になっているので本家(freedb.freedb.org)に問い合わせます。url以外は上記と同じコマンドを発行することになり少々冗長になりますがループするよりも簡単になります。

if ($cddb === NULL) {
--------- snip ----------
$url = "http://freedb.freedb.org/~cddb/cddb.cgi?cmd=cddb+query+";
--------- snip ----------
$url = "http://freedb.freedb.org/~cddb/cddb.cgi?cmd=cddb+read+";
--------- snip ----------


以上でCDDBを実行するとアルバム情報が取得出来ました。

但し曲順がTTITLE0から始まっていますね。

こちらもビューティーなコードをかけませんが取り敢えず修正してみました。

$str = $cddb;
if(preg_match('/DTITLE=/',$str)){
    $cut = 7;
    $str = str_replace('DYEAR=', 'Year ', $str);
    $str = str_replace('DGENRE=', 'Genre ', $str);
    $str = str_replace('TTITLE0=', '01  ', $str);
    $str = str_replace('TTITLE1=', '02  ', $str);
    --------- snip ----------
    $str = str_replace('TTITLE13=', '14  ', $str);
    $str = str_replace('TTITLE14=', '15  ', $str);
}
$replace = substr( $str , $cut , strlen($str)-$cut );
$cddb = $replace;


少しは見やすくなったと思います。
日本語もOKです。

すべてのジャンルで取得できるかは不明ですが取り敢えず手元のアルバム50枚位で試した限りではすべて取得できました。


参考 index.php.sample2
もし試用する場合は現在のindex.phpのバックアップを取ってください。
なにかphp実行のボタンを押すとテキストウィンドウはデフォルトの大きさに戻ります。(仕様です)
デフォルトの状態からCDプレーヤーのシングルプレイをいきなり押すとPLAY0から始まっていた不具合を修正しました。