使用PHP和PostgreSQL将Google Home转变为音乐播放器(专辑播放版本)
首先
之前我用php写了一个简易音乐播放器的脚本,用来试试在Google Home上播放音乐的概念。但是作为一个音乐播放器,它只支持播放一首歌,这是一个致命的问题。由于Google Home的音乐播放功能没有请求队列的功能,所以在播放多首歌曲的时候,需要在脚本中等待请求的功能。我发现只用php来构建这个功能太麻烦了,所以决定采用使用crontab来预约播放指令的方式。此外,我发现可以从iTunes获取音乐数据,所以决定使用PostgreSQL来管理数据。这只是我在暑假编程中通过爱好写出来的东西,所以是简单的代码,请如果可以的话请读一下。
追加装饰2023/10/9的PHP安装组件
由于久违地重新构建,我在安装PHP时遇到了问题,因此补充如下。
请添加以下库。
udo apt install php-pgsql
sudo apt install php-mbstring
由于参考信息非常陈旧,故将Google TTS API的版本从0.0.4更改为0.0.6。
应该可以正常运行了。
参考网站和文献
使用php将Google Home变成简易音乐播放器。
让Google Home通过最新的google-home-notifier方法与树莓派3进行推送发声步骤。
《PHP编程 第3版 O’REILLY O’Reilly Japan》
从零开始学习数据库操作的SQL第2版
#目录
-
- 前提環境
-
- セットアップ
- あとがき
前提条件
-
- Raspberry Pi 2,3 または 4
-
- Ubuntu または Raspberry pi OS
-
- Google Home
- itunesに保存されている楽曲ファイル(DRMがないもの)
安装
由于之前的作品是用PHP创建了与Google Home 几乎相同的音乐播放环境,因此请根据本文的设置指南,进行PHP、Google Home通知器、iTunes音乐文件的配置。PHP文件路径适用于Ubuntu和树莓派操作系统。
由于本次文件数量较多,所以我们决定不将代码附上,而是选择将其公开在GitHub上。请在适当的位置进行克隆。
$ git clone https://github.com/yoshiki9636/player.git
$ cd player
在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/www/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”的值更改为“md5”,而不是“peer”。
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all md5
请在这里重新启动。
首先我们要创建表格。
首先从您自己的iTunes中创建’Library.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 命令将 csv 文件加载到创建的 track_table 中。
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
只要艺术家列表能够显示出来就可以了。如果出现错误,请按照消息的指示进行操作。可能会出现认证错误等问题。
辛苦了。以上就是所有的设置了。
请在浏览器中输入以下URL。
http://<树莓派地址>/播放器/
当[艺术家]的按钮出现时,按下按钮会按照艺术家->专辑->曲目的顺序进行指定,通过指定曲目将会开始播放音乐。
「あとがき」的中文译文:
尾声
每首曲子的开头音效都不太好,但我认为可以用于背景音乐的用途。
我只是为了自己的用途匆匆制作,所以变得非常无聊。HTML部分非常简单,所以请随意修改。
由于将数据管理交给了PostgreSQL,我认为可以大大简化php的处理内容。我还想尝试播放列表和随机播放之类的功能。