使用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的处理内容。我还想尝试播放列表和随机播放之类的功能。

bannerAds