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

news2024/11/15 7:42:01

小爱音箱播放局域网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!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/802118.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Psim 2022仿真软件的安装--Psim电力仿真实战教程

文章目录 Psim 2022 仿真软件安装及使用教程软件介绍1.下载psim 2022安装软件,有需要的亲请联系作者。2.点击安装文件3.点击进行安装:4.安装完成,打开软件,开始仿真5.仿真模型介绍5.1.单相全控整流电路仿真5.2 三相PFC可控整流电路…

【大虾送书第四期】《Python之光:Python编程入门与实战》

目录 ✨写在前面 ✨本书亮点 ✨强力推荐 ✨文末福利 🦐博客主页:大虾好吃吗的博客 🦐专栏地址:免费送书活动专栏地址 写在前面 作为一种极其流行的编程语言,Python已经成为了当今最为重要的生产力工具之一。无论小学生…

【电网异物检测硕士论文摘抄记录】电力巡检图像中基于深度学习的异物检测方法研究

根据国家电力行业发展报告统计,截止到 2018 年,全国电网 35 千伏及以上的输电线路回路长度达到 189 万千米,220 千伏及以上输电线路回路长度达73 万千米。截止到 2015年,根据国家电网公司的统计 330 千伏及以上输电线路故障跳闸总…

Linux内存文件系统tmpfs的使用方法

1、tmpfs理论 默认的Linux发行版中的内核配置都会开启tmpfs,映射到了/dev/下的shm目录。可以通过df 命令查看结果. /dev/shm/是linux下一个非常有用的目录,因为这个目录不在硬盘上,而是在内存里。因此在linux下,就不需要大费周折…

python的web学习(一)-初识django

文章目录 软件创建项目默认项目文件说明App的概念(应用)apps.py编写URL和视图函数对应关系【urls.py】编写视图函数【views.py】启动服务 软件 python下载 django下载 创建项目 django-admin startproject 文件名默认项目文件说明 项目名 manage.py(项目管理,启…

打造完美直播体验:美颜技术与美型SDK的融合

随着直播行业的蓬勃发展,主播们对于直播体验的要求也日益提高。其中,美颜技术和美型SDK的融合为主播们带来了前所未有的完美直播体验。本文将深入探讨美颜技术和美型SDK的原理与应用,以及这两者如何协同工作,为直播行业带来更具吸…

记录egg官方初始化项目失败解决方案

快速初始化 我们推荐直接使用脚手架,只需几条简单指令,即可快速生成项目(npm >6.1.0): $ mkdir egg-example && cd egg-example $ npm init egg --typesimple $ npm i 但是在某些情况下,会安装失败&…

Qt —— Vs2017编译hiredis源码并测试调用(附调用hiredis库源码)

下载hiredis源码 编译hiredis源码 1、解压下载的hiredis源码包,如图使用Vs2017打开hiredis_win.sln 2、如下两图,Vs2017打开.sln后点击升级。 分别对两个工程的debug、release进行配置。Debug配置为多线程调试DLL(MDd)、Release配置为多线程DLL(/MD),这样做是为了配合被调用…

Android开发:通过Tesseract第三方库实现OCR

一、引言 什么是OCR?OCR(Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程。简单地说&#…

YAML+PyYAML笔记 6 | PyYAML源码之yaml.scan(),yaml.parse(),yaml.compose()

6 | PyYAML源码之yaml.scan,yaml.parse, yaml.compose 0 yaml文档1 yaml.scan()2 yaml.parse()3 yaml.compose() 0 yaml文档 以下示例来源于网络,便于后续学习用, 文档为config_yaml.yaml。 {name: John Doe,age: 28,hobbies: [hiking, cooking, fishi…

生信分析案例 Python简明教程 | 视频15

开源生信 Python教程 生信专用简明 Python 文字和视频教程 源码在:https://github.com/Tong-Chen/Bioinfo_course_python 目录 背景介绍 编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Python基本语法 数…

怎样修改LED显示屏的显示内容

每个LED显示屏通常都附带配套的控制卡和相应的管理软件。安装完LED显示屏后,只需连接控制卡和电源,并通过运行管理软件,便能轻松地更换LED显示屏的显示内容。 更改LED显示屏内容非常便捷,我们可以使用电脑、手机或者U盘等设备进行…

html实现蜂窝菜单

效果图 CSS样式 keyframes _fade-in_mkmxd_1 {0% {filter: blur(20px);opacity: 0}to {filter: none;opacity: 1} } keyframes _drop-in_mkmxd_1 {0% {transform: var(--transform) translateY(-100px) translateZ(400px)}to {transform: var(--transform)} } ._examples_mkmx…

layui各种事件无效(例如表格重载或 分页插件按钮失效)的解决方法

下图是我一个系统的操作日志,在分页插件右下角嵌入了一个导出所有数据的按钮 ,代码没有任何问题,点击导出按钮却失效 排查之后,发现表格标签table定义了ID又定义了lay-filter,因我使用的layui从2.7.6升级到2.8.11&…

JMeter接口测试:BeanShell实现接口的加密和解密

前些天用JMeter写了一个接口的自动化脚本,请求参数加密和响应数据解密都覆盖到了,中间涉及了BeanShell脚本编写和导入jar包的一些方法,想着挺有代表性的,分享给大家,希望对大家的接口自动化测试有所启发。 这是一个注册…

简化Java单元测试数据

用EasyModeling简化Java单元测试 EasyModeling 是我在2021年圣诞假期期间开发的一个 Java 注解处理器,采用 Apache-2.0 开源协议。它可以帮助 Java 单元测试的编写者快速构造用于测试的数据模型实例,简化 Java 项目在单元测试中准备测试数据的工作&…

半路杀出个“程咬金”,谁在吹响智能化供应链重构号角

汽车智能化的竞争,不再是平行模式(车企与车企、Tier1与Tier1),也不再是一边倒的车企自研模式,更不是纯粹的B2C模式。 随着昨天大众集团对外官宣与小鹏、上汽的深度合作启动,围绕电动化、智能化的竞争无疑进…

PHP注册、登陆、6套主页-带Thinkphp目录解析-【白嫖项目】

强撸项目系列总目录在000集 PHP要怎么学–【思维导图知识范围】 文章目录 本系列校训本项目使用技术 上效果图主页注册,登陆 phpStudy 设置导数据库项目目录如图:代码部分:控制器前台的首页 其它配套页面展示直接给第二套方案的页面吧第三套…

Talk | 南洋理工大学博士后研究员李祥泰:基于Transformer的视觉分割模型总结、回顾与展望

​ 本期为TechBeat人工智能社区第517期线上Talk! 北京时间7月27日(周四)20:00,南洋理工大学博士后研究员—李祥泰的Talk已经准时在TechBeat人工智能社区开播了! 他与大家分享的主题是: “基于Transformer的视觉分割模型总结、回顾与展望”&am…

无涯教程-jQuery - animate()方法函数

animate()方法执行一组CSS属性的自定义动画。 animate( params, [duration, easing, callback] ) - 语法 selector.animate( params, [duration, easing, callback] ); 这是此方法使用的所有参数的说明 params - 动画将朝其移动的CSS属性图。duration - 这是可选…