phpとPostgreSQLでGoogle Homeを音楽プレイヤー(アルバム再生版)


始めに

前作phpでgoogle homeを簡易音楽プレイヤーではphpで書く1スクリプトでGoogle homeで音楽を再生してみようというコンセプトで作ってみましたが、1曲単発再生のみという音楽プレイヤーとしては致命的な仕様でした。Google Homeの音楽再生機能にはリクエストキューの機能は無いため、アルバムの複数曲再生には、スクリプト側でリクエストを待つ機能が必要となります。phpだけで作るのは面倒なことがわかり、crontabを使用して再生コマンドを予約する方式をとることにしました。また、楽曲データがitunesから取得できることが分かったので、PostgreSQLを使ってデータを管理してみることにしました。夏休みのプログラミングで趣味でポチポチ書いたものなので、簡単なコードですので、よろしかったら読んでみてください。

参考サイト・文献

phpでgoogle homeを簡易音楽プレイヤー

Google Homeにプッシュ発話をさせる、Raspberry Pi 3へのgoogle-home-notifierの最新導入手順

プログラミング PHP 第3版 O'REILLY オライリー・ジャパン

SQL 第2版 ゼロから始めるデータベース操作

目次

  • 前提環境
  • セットアップ
  • あとがき

前提環境

  • Raspberry Pi 2,3 または 4
  • Ubuntu または Raspberry pi OS
  • Google Home
  • itunesに保存されている楽曲ファイル(DRMがないもの)

セットアップ

前作phpでgoogle homeを簡易音楽プレイヤーとほぼ同じ環境となるので、この記事のセットアップに従い、php、google home notifier、itunesの音楽ファイルの設定を行ってください。phpのファイルパスはUbuntu、Raspberry pi OS共通になります。

今回ファイル数が多いため、コードの掲載はせずに、githubに公開する方式としました。
適当な場所にcloneしてください。

$ git clone https://github.com/yoshiki9636/player.git
$ cd player

checkdb.phpにいくつか設定する項目があります。

checkdb.php
  $dbport = 5432;       // PostgreSQLのポート デフォルトでは 5432
  $dbuser = 'XXXXX';   // PostgreSQLのユーザ名
  $dbpasswd = 'XXXXX';  // PostgreSQLのパスワード  
  $dbname = 'trackdb';  // PostgreSQLのデータベース名 今回は trackdb
  $ip_address = 'XX.XX.XX.XX'; // 本機のIPアドレス
  $ghnport = 8080;        // google home notifierのポート デフォルト 8080
    :
    :

このままでは外から見えないため、/var/wwww/html/にコピーします。

$ cd ..
$ sudo cp -r player /var/www/html/

次に前回との差分であるデータベースの設定を行います。
まずPostgreSQLのインストールを行います。

$ sudo apt install postgresql

PostgreSQLの管理ユーザは'postgres'なので、ユーザをスイッチしてPostgreSQLのコンソールを起動します。

$ sudo -u postgres -i
$ psql
postgres@ubuntu:/home/pi$ psql
psql (12.2 (Ubuntu 12.2-4))
Type "help" for help.

postgres=#

通常使うユーザ名でロールを作成します。以下では、ユーザ名'pi'、パスワード'hoge'でロールを作成しています。このユーザ名、パスワードは先ほどのcheckdb.phpで設定するユーザ名およびパスワードとなります。あと、CREATEDBの権限を与えます。

postgres=# CREATE ROLE pi WITH CREATEDB login password 'hoge';
CREATE ROLE
postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 pi        | Create DB                                                  | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

次に上記ロールでデータベースを作ります。ここではロールは'pi'です。

postgres=# CREATE DATABASE trackdb WITH OWNER pi;
CREATE DATABASE
postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 |
 template0 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 trackdb   | pi       | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 |
(4 rows)

postgres=#\q
$ exit
$

ユーザpostgresで行うことは終了したので、\qで抜けて、exitで元のユーザに戻ります。
このままでは、phpからPostgreSQLにアクセスできない(認証が通らない)ので、pg_hba.confファイルを変更します。

$ sudo vi /etc/postgresql/12/main/pg_hba.conf

'local'の値が'peer'になっているところを'md5'に変更します。

pg_hba.conf(Before)
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
pg_hba.conf(After)
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     md5

ここでリブートしてください。

次にテーブルの作成をします。
まずご自分のitunesから'ライブラリ.xml'ファイルを作成します。
itunesの、
ファイル->ライブラリ->ライブラリを書き出す
を選択すると、xmlファイルを書き出すダイアログになるので、適当な名称で書き出してください。Raspberry piに持っていくので、半角英数にしておくとよいです。SSHなどでRaspberry piに転送します。ここでは、lib.xmlとします。これをplayer/plist_tools/ に配置します。そしてツールでCSVファイルに変換します。

$ python3 plist2csv.py lib.xml
track_id integer,
name integer,
artist integer,
album integer,
genre integer,
size integer,
total_time integer,
track_number integer,
track_count integer,
year integer,
bit_rate integer,
normalization integer,
persistent_id integer,
compilation integer,
['Track ID', 'Name', 'Artist', 'Album', 'Genre', 'Size', 'Total Time', 'Track Number', 'Track Count', 'Year', 'Bit Rate', 'Normalization', 'Persistent ID', 'Compilation']
$ 

出てくるメッセージは無視してください。これでtrack_data.csv ができます。
次にデータのテーブルを取り込みます。先ほど作ったtrackdbに接続し、テーブルを作り、csvファイルをインポートします。trackdbの接続をする際にはパスワードを聞かれます。入ったら、CREATE TABLEコマンドを実行しますが、コマンドのテキストがplayer/plist_tools/head.txtにあるので、コピーペーストしてください。あとは\copyコマンドで作ったtrack_tableにcsvを読み込みます。

head.txt
CREATE TABLE track_table (
track_id integer,
name varchar,
artist varchar,
album varchar,
genre varchar,
size integer,
total_time integer,
track_number integer,
track_count integer,
year integer,
bit_rate integer,
normalization integer,
persistent_id char(16),
compilation boolean,
PRIMARY KEY (track_id));
$ psql -d trackdb
Password for user pi:
psql (12.2 (Ubuntu 12.2-4))
Type "help" for help.

trackdb=> CREATE TABLE track_table (
trackdb(> track_id integer,
trackdb(> name varchar,
trackdb(> artist varchar,
trackdb(> album varchar,
trackdb(> genre varchar,
trackdb(> size integer,
trackdb(> total_time integer,
trackdb(> track_number integer,
trackdb(> track_count integer,
trackdb(> year integer,
trackdb(> bit_rate integer,
trackdb(> normalization integer,
trackdb(> persistent_id char(16),
trackdb(> compilation boolean,
trackdb(> PRIMARY KEY (track_id));
CREATE TABLE
trackdb=> \dt
          List of relations
 Schema |    Name     | Type  | Owner
--------+-------------+-------+-------
 public | track_table | table | pi
(1 row)

trackdb=> \copy track_table FROM 'track_data.csv' with csv
COPY 7868
trackdb=> \q
$

データベーステーブルができているかテストをします。

$ sudo su
$ cd /var/www/html/player/
$ php test.php

アーティストのリストが出ればOKです。エラーになる場合はメッセージに従ってください。認証エラーなどが起きます。

お疲れさまでした。以上で、設定は終わりです。
ブラウザから以下のURLをたたいてください。

http://<Raspberry Piのアドレス>/player/

[artist] のボタンが出るので、ボタンを押すとartsit->album->trackの順に指定していき、trackを指定することで音楽がスタートするはずです。

あとがき

曲ごとに開始音がするのがイマイチなのですが、BGM用途には使えると思います。
自分用途にささっと作ったので、非常に味気ないものになっています。HTML部分は超絶シンプルにしているので、いろいろ改造してください。
データ管理をPostgreSQLに任せたため、phpでの処理内容をかなりシンプルにできたと思います。プレイリスト再生とかランダム再生とかにも挑戦していきたいと思います。