小爱音箱播放局域网NAS上的音乐(httpRandomMusic)

小爱音箱播放局域网NAS上的音乐(httpRandomMusic)

      手上有一个小爱音箱Pro,拿来给小朋友玩,顺带查下天气,控制下家里电视、空调等家电,一直使用挺方便的。老早以前听歌都是百度一首首下载,然后放在电脑上用千千静听播放,后来版权的重视及在线音乐流行,用网易云音乐、QQ音乐等播放器在线听歌逐渐流行起来,原来下载的歌一直放在电脑上也没播放过。随着小爱音箱搭配的QQ音乐能听的歌越来越少,听歌就只能开着电脑用蓝牙播放,每次播放都得开电脑是个挺麻烦的事情。家里有个群晖NAS一直待机,一直期待小爱官方能够开放播放本地音乐这个功能。期待了很久,官方论坛也翻了不少,发现很多人期待这个功能,官方也没有迹象表达要实现这个功能的意思。近期看到github上有个项目让小爱音箱播放局域网NAS上的音乐,项目是用python写的,博主应该是对相关配置比较熟悉,README说明写的相对简略,折腾了几天才算简单实现,略做记录,有相同需求的朋友可以参考。

作者github项目地址:GitHub - zanjie1999/httpRandomMusic: 让小爱音箱播放局域网NAS上的音乐

无法访问github,移动云盘下载链接:https://caiyun.139.com/m/i?0O5CrOaRKuBVK

提取码:7vTa

基本配置:1、群晖NAS    2、小爱音箱

实现目标:小爱音箱播放局域网NAS上的音乐

原理:在NAS上实现http服务,op.lan解析为NAS的局域网地址,语音操作小爱同学去访问音乐。具体为何是op.lan这个域名,原理不详。原作者写的比较简略,讲讲我遇到的问题及解决办法。

1、nas上安装Python3

 群晖的套件中心有python3,套件中心搜索python3直接安装即可。

2、下载并打开`httpRandomMusic.py`,编辑`fileDir`变量,填写你存放音乐的文件夹的完整路径。群晖NAS打开SMB功能后,在文件夹路径直接访问\\192.168.0.101\Files 即可访问文件夹,或者如下图PC访问共享文件夹地址来访问。一直以为程序中fileDir用这个地址可以直接访问,实际在python文件中fileDir为  /volume1/Files  这种格式。

3、修改路由器的hosts,加入这样一行,或者直接将服务器主机名改成`op`

修改路由器hosts 可以用软路由直接配置。我用的是TL-WDR5620千兆版,查找了很多资料没找到普通路由器修改hosts的方法。搜到了一个网页:使用群晖的DNS Server应用搭建内网DNS服务器,可以实现内网DNS解析,解析不了的再用公网DNS就可以了。

参考链接: 使用群晖的DNS Server应用搭建内网DNS服务器|日新博客

进入套件中心安装DNS Server应用

安装完成后,打开DNS Server

左侧菜单选择区域 然后选择新增master区域

在创建Master区域内填写想要解析的域名,op.lan,主DNS服务器填写群晖的IP地址。在路由器DHCP选项设置IP地址绑定,让自己的群晖都设置一个固定的IP地址方便管理,以后可以通过自己设定的域名访问群晖。

4、设置成功后,修改电脑DNS用nslookup 测试是否能够正常解析

上图所示为正常解析。

测试过程中出现如上图所示直接用nslookup op.lan解析失败,但是用nslookup op.lan 192.168.0.104可以正常解析为群晖DNS地址。这种问题,我这解决方案是把IPV6关掉就可以了。

5、群晖控制面板启用ssh或者telnet功能,连接NAS后,用管理员账户密码登陆终端提示符为$符,然后用sudo -i同样的账户密码切换到管理员模式,终端提示符为#符。

6、修改NAS本机resolv.conf文件,屏蔽第一行nameserver那一行,新增op.lan 192.168.0.104

root@chen-synology:~# vi /etc/resolv.conf

#nameserver 192.168.1.1

op.lan 192.168.0.104

~                                                                                                                                                                                                                                                                                                                 

"/etc/resolv.conf" 2L, 45C written                  

root@chen-synology:~# nslookup op.lan

Server:         127.0.0.1

Address:        127.0.0.1#53

Name:   op.lan

Address: 192.168.0.104

默认NAS的解析地址为192.168.1.1  修改为192.168.0.104

     7、运行httpRandomMusic脚本,注意脚本是python3语言。我的NAS装了Python3后,python2和python3都有,指令要使用python3。使用python2会提示报错。如果执行正常,会输出提示文件夹内有xxfiles。在电脑上用浏览器访问http://op.lan:65533 ,可以看到一个播放器界面,能够正常播放出fileDir设置的那个目录里的音乐。确保小爱音箱重新获取ip地址后DNS设置为NAS的地址。我登陆不了小爱的shell,直接把路由器DHCP的DNS设置为NAS的IP地址,小爱断电重主启。

root@chen-synology:/volume1/Files# python3 httpRandomMusic.py

Server:         127.0.0.1

Address:        127.0.0.1#53

Name:   op.lan

Address: 192.168.0.104

12 files

/

192.168.0.110 - - [20/Jul/2023 20:57:35] "GET / HTTP/1.1" 302 -

/Walkin%20in%20the%20Air.mp3

/volume1/music/Oceanborn/Walkin in the Air.mp3

192.168.0.110 - - [20/Jul/2023 20:57:35] "GET /Walkin%20in%20the%20Air.mp3 HTTP/1.1" 200 -

----------------------------------------

Exception happened during processing of request from ('192.168.0.110', 39748)

Traceback (most recent call last):

  File "/var/packages/py3k/target/usr/local/lib/python3.8/socketserver.py", line 316, in _handle_request_noblock

    self.process_request(request, client_address)

  File "/var/packages/py3k/target/usr/local/lib/python3.8/socketserver.py", line 347, in process_request

    self.finish_request(request, client_address)

  File "/var/packages/py3k/target/usr/local/lib/python3.8/socketserver.py", line 360, in finish_request

    self.RequestHandlerClass(request, client_address, self)

  File "/var/packages/py3k/target/usr/local/lib/python3.8/socketserver.py", line 720, in __init__

    self.handle()

  File "/var/packages/py3k/target/usr/local/lib/python3.8/http/server.py", line 427, in handle

    self.handle_one_request()

  File "/var/packages/py3k/target/usr/local/lib/python3.8/http/server.py", line 415, in handle_one_request

    method()

  File "httpRandomMusic.py", line 108, in do_GET

    shutil.copyfileobj(f, self.wfile)

  File "/var/packages/py3k/target/usr/local/lib/python3.8/shutil.py", line 205, in copyfileobj

    fdst_write(buf)

  File "/var/packages/py3k/target/usr/local/lib/python3.8/socketserver.py", line 799, in write

    self._sock.sendall(b)

BrokenPipeError: [Errno 32] Broken pipe

8、如何使用

小爱同学
打开小怪

然后以下三条指令三选一

指令

功能

播放服务器的音乐

按着上次的进度继续播放(没有进度就是从头放)

从头播放服务器的音乐

按修改时间倒序播放(先放最后放进文件夹的文件)

随机播放服务器的音乐

随机播放(播放列表打乱,不会重复随机到同一首)

查看了作者的说明,需要注意指令的准确性。

Enjoy!

本文链接:https://my.lmcjl.com/post/14621.html

展开阅读全文

4 评论

留下您的评论.