Raspberry Pi Zeroを試してみる(ディスクトップ環境)

Pi Zeroを試すにあたってディスプレーの発色も悪くなってきたので更新してみました。
ディスプレーはIO-DATA LCD-A15CE(ジャンクです)電源がなかなか入らない、入ってもなかなか切れない。パワーのタクトスイッチを交換して復活です。


PiはGPIOやPi3でUSBを使う際にはフロントPiのほうが使いやすいので少し工作をします。


このLCD-A15CEはフロント側にほとんどスペースが無いのでヒンジを取り外して後ろ前を逆になるように取り付けます。若干後方安定性は犠牲になりますがフロント側には大分スペースが取れました。


ディスプレー下部にケーブル通しをするため金ノコでカットします。

HDMI to VGAアダプターとディスプレーの中継ケーブルも作り直しました。

d-sub15pin(オスーオス)以下8本を接続
1 Red video signal
2 Green video signal
3 Blue video signal
6 Red video signal return
7 Green video signal return
8 Blue video signal return
13 HSYNC
14 VSYNC

MINIのHDMI to VGAアダプターは手持ちにありました。実は去年アダプタが壊れたとき間違えて購入(・・;)したものです。(380円)
映ることは映るのですが時々アダプタの設定を読み取らないことがあります。現在のraspbianはほとんどがconfig.txtを編集しなくても自動で読み込んで設定してくれますがこれは明示的に/boot/config.txtを設定する必要がありました。

/boot/config.txt
hdmi_force_hotplug=1
hdmi_group=2
hdmi_mode=16
hdmi_drive=2
config_hdmi_boost=4

キーボード、マウス
LOGICOOL ワイヤレスキーボード K270
LOGICOOL ワイヤレス 光学式 M185RD
このキーボード、マウスはドングルを差し込むのみで確実につながります。また1個のドングルで共用もできbluetoothよりも使いやすいですね。

オーディオ
IO-DATA(LCD-A15CE)のディスプレーにはスピーカーがありません。

アンプはPAM8403、ブリッジダイオードを入れて極性なしに。スピーカーは100均
電源はノイズが載るのでPIとは共用できないため不要の携帯充電器を使用、一片を金ノコでカットして力技でこじ開けます。
但しスピーカーがダメダメなのでかなり音が悪いです。
これはあとから少し考えてみましょう。

本体組立
役者も揃ったので組み立ててみます。

5V電源は2A、ディスプレーのACアダプタも貼り付けます。ACラインは纏めて1本のコードで
USBは100均4ポート+電源専用1ポート,USBラインにも5Vを加えます。

少々汚いのですがzeroの確認ということで!


当サイトで使っている100均ハブも残っているのは1個になってしまいました。zeroにはすごく使いやすいのですがもう手に入らないのが残念です。

wifi設定

$ lsusb
Bus 001 Device 003: ID 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS

wifiドングルを差し込んで1〜2分待ってるとアクセスポイントが現れてきます。

SSIDを選択してキーを打ち込みます。DHCPからIPを取得できればOKです。スマホ並ですね。


IPアドレスが169.254で始まっている場合はDHCPサーバーからIPアドレスを取得できていないと思います。
当サイトではDHCPサーバーが別なので新たに設定します。
wifiマークを右クリックして環境に合わせて値を入れ固定IPに設定しました。

# ifconfig wlan0
wlan0     Link encap:イーサネット  ハードウェアアドレス 80:1f:02:68:d4:f5 
          inetアドレス:192.168.11.13 ブロードキャスト:192.168.11.255  マスク:255.255.255.0
          inet6アドレス: 2408:213:81:b00:6324:a484:e1b2:b972/64 範囲:グローバル
          inet6アドレス: fe80::3ae7:6f84:4690:244/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:25107 エラー:0 損失:144 オーバラン:0 フレーム:0
          TXパケット:20381 エラー:0 損失:2 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:1000 
          RXバイト:3917285 (3.7 MiB)  TXバイト:9692641 (9.2 MiB)

最初に打ち込んだ暗号化キーは/etc/wpa_supplicant/wpa_supplicant.confに書き込まれます。

/etc/wpa_supplicant/wpa_supplicant.conf
network={
	ssid="Buffalo-G-3D68-1"
	psk="***************"
	key_mgmt=WPA-PSK
}

アドレスは/etc/dhcpcd.confに書かれます。アドレスを重複しないようにカードを作成する段階で書き込んでおけばネットワーク設定済みのカードで起動することができます。

/etc/dhcpcd.conf
interface wlan0
inform 192.168.11.13
static routers=192.168.11.1
static domain_name_servers=192.168.11.1
SSID Buffalo-G-3D68-1


PI3を組み込んだ時はこんな感じになります。

ネットワークの設定も済みました。
今回は新たにカードを作成して実行しています。
次回も設定やアプリケーションを少し触ってみたいと思います。

Raspberry Pi Zeroを試してみる(CUI)

Raspberry Pi Zeroもやっと国内で購入できるようになりました。当サイトでもひとつ購入してみました。

今回はサーバーや工作の用途を想定して有線LANで設定、確認してみたいと思います。


チップにはELPIDAのロゴが見えますがこれはメモリでBCM2835はこの下に実装されているそうです。

マイクロSDカードのソケットは基板表についたのでこれは使い勝手が良くなりました。

HDMI端子はMINIですね。


マイクロUSBはPWRINとUSBがあります。

PIカメラ用コネクタがあります。

GPIO(40P)以外にRUN(リセット)とTV(コンポジット映像信号)がみえます。

LED(ACT)は1個になりました。

インストール
今回はCUIで確認を行いますが後にディスクトップ用途でも使ってみたいと思うので2017-03-02-raspbian-jessieをインストールします。

作業はいつものとおりPI3ディスクトップ
ダウンロードしたzipファイルを展開、32GBのカードをfat32でフォーマットしています。

# dd if=2017-03-02-raspbian-jessie.img of=/dev/sda bs=1M

現在のjessieは勝手にカードの領域を拡張してしまうので当サイトでは必要な領域だけを確保します。
gpartedは危険なToolです。自分自身の領域を削除することも可能なので右上のカードの選択を間違えないように注意します。

15000MBを確保しました。
これでバックアップを容易にする他にデータを分けるメリットがあります。
バックアップはパーテーション単位でも可能です。(こちらはまたの機会で)
必要であれば以下で作成したパーテーションを削除して拡張することも可能です。


残りの領域全部を新しく作成

メニューのチェックアイコンをクリックするまでは適用されません。


できたカードはsshを有効にするためboot領域にsshのファイル名で空のファイルを作成しておきます。

リモートから接続をするのでネットワークの設定をしておきます。
固定IPを割り当てるため/media/user/uuid/etc/dhcpcd.confを編集(要root)

# /media/pi/139ca52c-d45e-44ca-8b8c-12c0af0c9cf5/etc/dhcpcd.conf
interface eth0
static ip_address=192.168.11.13/24
static routers=192.168.11.1
static domain_name_servers=192.168.11.1

取り敢えずカードの準備は出来ました。pi zeroはイーサネットを持っていないため準備する必要があります。手持ちの中から使えそうなものを探してみました。

中華製ですが3年位前に購入(500円位)したものです

カードをセットしてアクセスしてみましょう。

$ ssh pi@192.168.11.13


2度目の電源投入からカードを読み込み始めます。
無事接続できているようです。

$ lsusb
Bus 001 Device 002: ID 0b95:772a ASIX Electronics Corp. AX88772A Fast Ethernet
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$ dmesg | grep asix
[   16.275240] asix 1-1:1.0 eth0: register 'asix' at usb-20980000.usb-1, ASIX AX88772 USB 2.0 Ethernet, 00:0e:c6:f0:49:71
[   16.284916] usbcore: registered new interface driver asix
[   18.820466] asix 1-1:1.0 eth0: link up, 100Mbps, full-duplex, lpa 0xC5E1
[   18.956058] asix 1-1:1.0 eth0: link up, 100Mbps, full-duplex, lpa 0xC5E1

もうひとつ試してみました。

エレコム LD-USB/T
LINK LEDは点灯しませんが(アクセスLEDはOK)こちらもつながりました。

スイッチハブは100Mで認識していますが実際LAN内でファイル転送をしてみるとasixの半分程度の速度になります。

$  lsusb
Bus 001 Device 002: ID 056e:abc1 Elecom Co., Ltd LD-USB/TX
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$ dmesg | grep pegasus
[   10.413201] pegasus: v0.9.3 (2013/04/25), Pegasus/Pegasus II USB Ethernet driver
[   10.455196] pegasus 1-1:1.0: eth0, LANEED USB Ethernet LD-USB/T, 00:90:fe:0d:f1:79
[   10.459052] usbcore: registered new interface driver pegasus


そんな訳でもう使い途のないLD-USB/TはPi Zero専用にマイクロBの尻尾をつけて使い倒すことにしました。
サイズメリットは無くなりますがコストメリットは大です。
Pi Zeroのベース部はミンティアのケースを使いました。コネクタ部分を切り取ればケース内に収まるのではと思うくらいZeroは薄いですね。

ネットワークもつながったのでraspi-config実行

Localisation OptionsからLocaleとTimezoneを設定
# apt update
# apt upgrade


raspbian-jessieをインストールしたので作成したパーテーション(/dev/mmcblk0p3)もオートマウントされています。

ZeroにはACT LED1個しかありません。起動時カードにアクセスしてLEDも点滅しますがアイドリング時は点灯しています。更に良く観察すると大きなデータを読み書きしている時にはカードにアクセス時消灯しているようにみえます。
ちょっと確認してみました。

root@raspberrypi:~ # cat /sys/class/leds/led0/trigger
none kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock [mmc0] timer oneshot heartbeat backlight gpio cpu0 default-on input

led0はmmc0に割り当ててあります。ここはPi3も同様です。

# echo none > /sys/class/leds/led0/trigger
# echo 1 > /sys/class/leds/led0/brightness

Pi3はここで点灯しますがZeroは消灯します。Zeroはこのロジックをハード側で実装して電源ONモニターとして兼用していると思います

元のmmc0に設定を戻すには下記を実行するか再起動するとデフォルトの設定になります。

# echo mmc0 > /sys/class/leds/led0/trigger


次回はディスクトップ環境で試してみたいと思います。

Raspberry Pi Radiko Player(with CD-Player version)

前回のRadiko Playerラジオバージョンに暫定的(永遠に暫定的)ですがCD Playerを搭載してみました。

現状は実行中のMplayerからは再生中のトラックや終了の情報をを得ることができない(わからない)という課題がありますがそれ以外はほぼ快適に使えるかなと思っています。

Raspberry pi 3(raspbian jessie)ディスクトップの設定
パッケージのインストール

# apt install cd-discid nkf

CD-ROMドライブをwww-dataから読めるようアクセス権の変更
/etc/udev/rules.d/99-cd.rulesの新規作成
idVendorとidProductはドライブによって違うのでlsusbで調べる

/etc/udev/rules.d/99-cd.rules
ATTRS{idVendor}=="04bb", ATTRS{idProduct}=="022b", GROUP="pi",MODE="0666"

空ファイル作成

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

index.phpの編集

/var/www/html/index.php

ここで一旦再起動します。

Radiko Playerにアクセス

http://localhost/


動作確認は以下の環境で確認しています
Pi3(jessie) 内蔵(bcm2835 ALSA) IO-DATA DVRP-U8N
Pi1B(moode3.1) USB-DAC IO-DATA DVRP-U8N

アルバムのトラック数はcd-discidから取得出来ました。これでラストのトラックも指定可能になりました。

$ cd-discid /dev/sr0
550a3707 7 150 26531 49333 81025 111350 136975 160148 2617

ディスクを入れていない状態でeject以外のCD関連のボタンを押すとNo medium foundを表示します。
<>ボタンは1トラックステップ
&ボタンは3トラックステップ
>>ボタンはラストトラック
<<ボタンはトラック1に移動


CDをセットしていきなりCD PLAYを押しても再生と同時にFreeDBに問い合わせてCDDB情報を取得します。
その他のボタンを押しても同様にCDDB情報を表示します。
一度取得したCDDB情報はセッションに記憶され再利用します。
セッション情報はイジェクトするまで有効です。


トラック5を選択してトラックボタンを押すとシングルプレイモードに入ります。

曲をスキップしたい時は送りボタンでトラックを選択プレイボタンを押すという流れになります。


ここで再度プレイボタンを押すとトラック5〜ラストのモードになります。
トラック1から連続再生する時はストップボタンでトラック番号はクリアします。
テキストエリアはなにかPHP実行のボタンを押すとデフォルトの大きさに戻ります。(仕様です)


再生しないでCDDB情報をみる時はFreeDBボタンを押します。

このときセッション情報がなければ問い合わせに行きあればそれを再利用します。


CD再生中にステーション情報をみる時は上段のRadio Stationのリンクをクリックします。

戻る時はFreeDBボタンで戻ります。

以上のように現状の課題は再生中のトラックを表示できない、再生終了しても現在の表示が残っているいうことになります。

表示についてもラジオ再生中は音量ボタンを押してもステーション情報をCD再生中はCDDB情報を表示できるように苦心したつもりです。多少の不具合はあるかもしれません。


環境によってはボタンがはみ出すかもしれません。その場合はカラムを調整するといいと思います。
現在は3−6−3の構成をとっています。3−7−2とすると中央のカラムはずっと広くなります。
あとは寄せたり上げたりするといいかもしれません。(簡単なhtmlの知識が必要)

<div class="col md-7 float-center">
<div class="col md-2 float-right">

当サイトのジャンクなUSB-DACでもCDはなかなかいい音がしています。取り敢えず試すなら内臓のALSAでも問題ないと思います。mplayerなら盛大なポップノイズも出ません。

index.phpファイルは少し長くなってしまいますが動作としてはなんら問題ないと思います。(ラジオサイトの追加編集が少し面倒になるくらいです)
当サイトとしては基本index.phpのみで構成したいと思っています。

# OS起動直後Station欄に”Raspberry Pi Radiko Player”を表示させているとテキストエリアが切り替わらない不具合がありました。取り敢えず表示なしに変更
参考 index.php.pi.cd-ver2

Raspberry Pi Radiko Player(simple)

当サイトのRadiko Playerですが気が向いた時に適当に機能を追加していることもあって使い勝手が悪くなってきました。ここで一旦シンプルなRadiko Playerとして見直してみることにしました。

今回はディスクトップのPi3(jessie)にインストールしてみます。
サウンドデバイスも内蔵の(bcm2835 ALSA)を使用。
Piの設定からAudio Device Settingsで設定できます。
インストール
radiko関連

# apt install mplayer swftools libxml2-utils libav-tools rtmpdump

コマンドラインからradikoスクリプトを実行して正常に聴取できることを確認
/var/tmp/player.swf is not a valid SWF file or contains errors.
[stop] failed get keydata (/var/tmp/authkey.png)
こんなエラーが出る時はradikoの仕様変更に対策済みのスクリプトかまたは
$ rm /var/tmp/player.swfを実行
1分で停止する時は
$ /path/to/radiko.sh -t 120 -p *** とかして連続再生を確認
スクリプトは/var/www/htmlへ
web server

# apt install lighttpd php5-cgi
# lighty-enable-mod cgi
# lighty-enable-mod userdir
/etc/lighttpd/conf-available/10-cgi.conf
cgi.assign      = (
    ".pl"  => "/usr/bin/perl",
    ".py"  => "/usr/bin/python",
    ".php" => "/usr/bin/php-cgi",
)
# gpasswd -a www-data audio

SkyBlue CSS Framework
https://github.com/Stanko/skyblue/archive/gh-pages.zipをダウンロード、展開して/var/www/htmlにおきます。
Radiko Playerのindex.phpも/var/www/htmlに配置します。
以上で再起動します。

Radiko Playerの実行

http://localhost/


シンプルといってもラジオだけで今までと何も変わらないのですが今回は音量値を取得、表示してみました。
音量のデフォルト設定ボタンに現在の値を表示しています。ボタンの機能はそのままなのでこのボタンを押すことによってデフォルト値を設定、表示します。
音量値は以下のコマンドから取得しています。

$ amixer -R
Simple mixer control 'PCM',0
  Capabilities: pvolume pvolume-joined pswitch pswitch-joined
  Playback channels: Mono
  Limits: Playback -10239 - 400
  Mono: Playback -1312 [84%] [-13.12dB] [on]

音量値は-10239〜400の10640ステップあります。
現在の音量値は84%を表示しています。
“R”オプションはデフォルトですがもうひとつ”M”オプションがあります。

$ amixer -M
Simple mixer control 'PCM',0
  Capabilities: pvolume pvolume-joined pswitch pswitch-joined
  Playback channels: Mono
  Limits: Playback -10239 - 400
  Mono: Playback -1312 [52%] [-13.12dB] [on]

“M”オプションで表示すると実際の値は同じですが%表示[52%]が違っています。
こちらは人の聴感に合わせたような表示ですね。最終的には同じ100%になります。
各音量ボタンを押すとケース文を実行後ここに飛びます。

// goto vol
        vol:
            $vol = shell_exec("amixer -c 0 -R 2>&1");
            $vol_a = explode(' ',$vol,30);
            $vol_s = $vol_a[29];
            $vol_x = substr($vol_s,1,3);
            $vol_y = str_replace('%', '', $vol_x);
            $volume = str_replace(']', '', $vol_y);
            $_SESSION['volume']=$volume;
            $select = 'station';
        break;

無駄に行がある感じですが”R”オプションのコマンドから数値のみを取り出しています。
この”R”を”M”に変更するとによって”M”オプションの表示になります。
またOS起動後はこの値は空になっているので空の時のみ同じく読み取るよう先頭に別に記載しています。

テキストエリア

テキストエリアはある程度自由に記載、使い分けできるようにしてみました。

大きいボタンはTOKYO FMを仮に割り当てています。
大きいボタンを押すとphpのcase “default”を実行し末尾の変数$selectに’default’を入れます。
htmlに戻ってくるとphpのswitch文$selectのcase defaultの項を実行します。

 php
case "default";
exec("nohup killall mplayer > /dev/null 2>&1");
exec("nohup /bin/bash radiko.sh -p FMT > /dev/null &");
$_SESSION['broad']= "TOKYO FM";
$select = 'default';

html
/*
Display
}*/
switch ($select) {
case "default";
    print_r($radiko);
    print_r(PHP_EOL); print_r(PHP_EOL);
    print_r('Have a nice day');
break;

参考 index.php.pi.sample1
USBスピーカーなどを使っている場合は
amixer -c 0 –> amixer -c 1に変更する必要があります。
radikoスクリプト内も同様です。

これでベースの部分がある程度整理がついたので次回はまたCDプレーヤーを組み込んでみたいと思います。

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から始まっていた不具合を修正しました。

Top