Git Product home page Git Product logo

xiaomusic's Introduction

xiaomusic

使用小爱/红米音箱播放音乐,音乐使用 yt-dlp 下载。

运行

  • 使用 install_dependencies.sh 下载依赖
  • 使用 pdm 安装环境
  • 参考 xiaogpt 设置好环境变量
export MI_USER="xxxxx"
export MI_PASS="xxxx"
export MI_DID=00000
export XIAOMUSIC_SEARCH='bilisearch:'

然后启动即可。默认监听了端口 8090 , 使用其他端口自行修改。

pdm run xiaomusic.py

支持口令

  • 播放歌曲
  • 播放歌曲+歌名 比如:播放歌曲周杰伦晴天
  • 下一首
  • 单曲循环
  • 全部循环

隐藏玩法: 对小爱同学说播放歌曲小猪佩奇的故事,会播放小猪佩奇的故事。

已测试设备

"L07A": ("5-1", "5-5"),  # Redmi小爱音箱Play(l7a)

支持音乐格式

  • mp3
  • flac

本地音乐会搜索 mp3 和 flac 格式的文件,下载的歌曲是 mp3 格式的。

在 Docker 里使用

docker run -e MI_USER=<your-xiaomi-account> -e MI_PASS=<your-xiaomi-password> -e MI_DID=<your-xiaomi-speaker-mid> -e MI_HARDWARE='L07A' -e XIAOMUSIC_PROXY=<proxy-for-yt-dlp> -e XIAOMUSIC_HOSTNAME=192.168.2.5 -e XIAOMUSIC_SEARCH='bilisearch:' -p 8090:8090 -v ./music:/app/music hanxi/xiaomusic
  • XIAOMUSIC_SEARCH 可以配置为 'bilisearch:' 表示歌曲从哔哩哔哩下载;
    • 配置为 'ytsearch:' 表示歌曲从 youtube 下载。
  • XIAOMUSIC_PROXY 用于配置代理,默认为空;
    • 当 XIAOMUSIC_SEARCH 配置为 'ytsearch:' 时在国内需要用到。
  • MI_HARDWARE 是小米音箱的型号,默认为'L07A'
  • 注意端口必须映射为与容器内一致, XIAOMUSIC_HOSTNAME 需要设置为宿主机的 IP 地址,否则小爱无法正常播放。
  • 可以把 /app/music 目录映射到本地,用于保存下载的歌曲。

XIAOMUSIC_PROXY 参数格式参考 yt-dlp 文档说明:

Use the specified HTTP/HTTPS/SOCKS proxy. To
enable SOCKS proxy, specify a proper scheme,
e.g. socks5://user:[email protected]:1080/.
Pass in an empty string (--proxy "") for
direct connection

#2#11

本地编译Docker Image

docker build -t xiaomusic .

docker compose 示例

使用哔哩哔哩下载歌曲:

version: '3'

services:
  xiaomusic:
    image: hanxi/xiaomusic
    container_name: xiaomusic
    restart: unless-stopped
    ports:
      - 8090:8090
    volumes:
      - ./music:/app/music
    environment:
      MI_USER: '小米账号'
      MI_PASS: '小米密码'
      MI_DID: 00000
      MI_HARDWARE: 'L07A'
      XIAOMUSIC_SEARCH: 'bilisearch:'
      XIAOMUSIC_HOSTNAME: '192.168.2.5'

使用 youtobe 下载歌曲:

version: '3'

services:
  xiaomusic:
    image: hanxi/xiaomusic
    container_name: xiaomusic
    restart: unless-stopped
    ports:
      - 8090:8090
    volumes:
      - ./music:/app/music
    environment:
      MI_USER: '小米账号'
      MI_PASS: '小米密码'
      MI_DID: 00000
      MI_HARDWARE: 'L07A'
      XIAOMUSIC_SEARCH: 'ytsearch:'
      XIAOMUSIC_PROXY: 'http://192.168.2.5:8080'
      XIAOMUSIC_HOSTNAME: '192.168.2.5'

简易的控制面板

浏览器进入 http://192.168.2.5:8090

  • ip 是 XIAOMUSIC_HOSTNAME 设置的
  • 8090 是默认端口

感谢

Star History

Star History Chart

xiaomusic's People

Contributors

dzhuang avatar hanxi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

xiaomusic's Issues

请问如何刷新播放列表?

我在目录里手动导入了mp3歌曲,但是这个歌曲一直没有被播放。还有,我手动删除了本地的歌曲,他下一次播放还是会自动把歌曲下载回来,我感觉是播放列表有缓存导致的。请问怎么重刷这个播放列表呢?

歌曲名本地存储问题

歌曲名本地存储是以指令名存储的,比如我让播放歌曲许巍的歌,那么匹配到的歌曲,存储在本地就是许巍的歌,是否从解析网站获取歌曲名字存储更合适呢?

另外希望这个场景,能播放列表中的歌曲http://www.bilibili.com/video/av272714404,而不仅仅是第一首。

xiaomusic    | [02/21/24 15:52:33] INFO     匹配到指令. opkey:播放歌曲         xiaomusic.py:441
xiaomusic    |                              opvalue:play oparg:许巍的歌                        
xiaomusic    |                     INFO     do_tts: 正在下载歌曲许巍的歌       xiaomusic.py:217
xiaomusic    | [BiliBiliSearch] Extracting URL: bilisearch:许巍的歌
xiaomusic    | [download] Downloading playlist: 许巍的歌
xiaomusic    | [BiliBiliSearch] 许巍的歌: Extracting results from page 1
xiaomusic    |                     INFO     正在下载中 许巍的歌                xiaomusic.py:455
xiaomusic    | [BiliBiliSearch] Playlist 许巍的歌: Downloading 1 items of 1
xiaomusic    | [download] Downloading item 1 of 1
xiaomusic    | [BiliBili] Extracting URL: http://www.bilibili.com/video/av272714404
xiaomusic    | [BiliBili] 272714404: Downloading webpage
xiaomusic    | [BiliBili] BV1pF411d7iu: Extracting videos in anthology
xiaomusic    | [BiliBili] Downloading just the video BV1pF411d7iu because of --no-playlist
xiaomusic    | [BiliBili] 272714404: Extracting chapters
xiaomusic    | [BiliBili] Format(s) 1080P 高清, 720P 高清 are missing; you have to login or become premium member to download them. Use --cookies-from-browser or --cookies for the authentication. See  https://github.com/yt-dlp/yt-dlp/wiki/FAQ#how-do-i-pass-cookies-to-yt-dlp  for how to manually pass cookies
xiaomusic    | [info] BV1pF411d7iu_p1: Downloading 1 format(s): 30280
xiaomusic    | [download] Destination: music/许巍的歌.m4a
[download] 100% of    6.99MiB in 00:00:00 at 19.07MiB/s    
xiaomusic    | [ExtractAudio] Destination: music/许巍的歌.mp3
xiaomusic    | Deleting original file music/许巍的歌.m4a (pass -k to keep)
xiaomusic    | [download] Finished downloading playlist: 许巍的歌
xiaomusic    | [02/21/24 15:52:39] INFO     播放                               xiaomusic.py:461
xiaomusic    |                              http://10.0.0.4:8090/music/%E8%AE%                 
xiaomusic    |                              B8%E5%B7%8D%E7%9A%84%E6%AD%8C.mp3                  
xiaomusic    | 10.0.0.104 - - [21/Feb/2024 15:52:39] "GET /music/许巍的歌.mp3 HTTP/1.1" 206 -
xiaomusic    | 10.0.0.104 - - [21/Feb/2024 15:52:39] "GET /music/许巍的歌.mp3 HTTP/1.1" 206 -
xiaomusic    | 10.0.0.104 - - [21/Feb/2024 15:52:39] "GET /music/许巍的歌.mp3 HTTP/1.1" 206 -
xiaomusic    |                     INFO     已经开始播放了                     xiaomusic.py:464
xiaomusic    |                     INFO     歌曲music/许巍的歌.mp3的时长270秒  xiaomusic.py:371
xiaomusic    |                     INFO     定时器已取消                       xiaomusic.py:374
xiaomusic    |                     INFO     270秒后将会播放下一首              xiaomusic.py:385
xiaomusic    | [02/21/24 15:57:09] INFO     下一首                             xiaomusic.py:470
xiaomusic    |                     INFO     随机到歌曲许巍的歌.mp3             xiaomusic.py:357
xiaomusic    |                     INFO     播放                               xiaomusic.py:461
xiaomusic    |                              http://10.0.0.4:8090/music/%E8%AE%                 
xiaomusic    |                              B8%E5%B7%8D%E7%9A%84%E6%AD%8C.mp3                  
xiaomusic    | 10.0.0.104 - - [21/Feb/2024 15:57:10] "GET /music/许巍的歌.mp3 HTTP/1.1" 206 -
xiaomusic    | [02/21/24 15:57:10] INFO     已经开始播放了                     xiaomusic.py:464
xiaomusic    |                     INFO     歌曲music/许巍的歌.mp3的时长270秒  xiaomusic.py:371

播放期间设置的音量

在播放其中一首歌时设置的音量,使用"下一首"指令后,音量会重置到设置前的水平。

请允许proxy为空

proxy写入了一个默认值,所以下面的validate_proxy一定会运行.

proxy: str = os.getenv("XIAOMUSIC_PROXY", "http://192.168.2.5:8080")
def __post_init__(self) -> None:
if self.proxy:
validate_proxy(self.proxy)

支持多个音箱

能否将MI_DID和MI_HARDWARE类型为list,这样可以多个音箱一起使用

登陆失败Login failed

Exception on login 2444649108: 'userId'
Traceback (most recent call last):
File "/app/.venv/lib/python3.10/site-packages/miservice/miaccount.py", line 71, in login
self.token["userId"] = resp["userId"]
KeyError: 'userId'
Exception on login 2444649108: 'userId'
Traceback (most recent call last):
File "/app/.venv/lib/python3.10/site-packages/miservice/miaccount.py", line 71, in login
self.token["userId"] = resp["userId"]
KeyError: 'userId'
Traceback (most recent call last):
File "/app/xiaomusic.py", line 5, in
main()
File "/app/xiaomusic/cli.py", line 62, in main
loop.run_until_complete(xiaomusic.run_forever())
File "/usr/local/lib/python3.10/asyncio/base_events.py", line 649, in run_until_complete
return future.result()
File "/app/xiaomusic/xiaomusic.py", line 390, in run_forever
await self.init_all_data(session)
File "/app/xiaomusic/xiaomusic.py", line 97, in init_all_data
await self._init_data_hardware()
File "/app/xiaomusic/xiaomusic.py", line 117, in _init_data_hardware
hardware_data = await self.mina_service.device_list()
File "/app/.venv/lib/python3.10/site-packages/miservice/minaservice.py", line 43, in device_list
result = await self.mina_request("/admin/v2/device_list?master=" + str(master))
File "/app/.venv/lib/python3.10/site-packages/miservice/minaservice.py", line 38, in mina_request
return await self.account.mi_request(
File "/app/.venv/lib/python3.10/site-packages/miservice/miaccount.py", line 150, in mi_request
raise Exception(f"Error {url}: {resp}")
Exception: Error https://api2.mina.mi.com/admin/v2/device_list?master=0&requestId=app_ios_1KDWZ2hBMgvOnLRSbzFXs0wukeE38V: Login failed

小米sound(L16A) “播放歌曲“的口令无效

对小爱说“播放歌曲周杰伦晴天”, 依然是自带的付费音源,后台也不会下载,
但其他一切正常,网页输入歌曲名字点播放,小爱会说“下载XXX”,然后播放
型号L16A

播放失败的问题

环境是黑裙7.2,使用docker部署。
按照教程操作

HOST_NAME 配置为192.168.0.39 (小爱音箱的IP)
`

2024/03/09 09:02:19 | stdout |   -- | -- | --
  • 2024/03/09 09:02:19 | stdout | such file or directory: ''
  • 2024/03/09 09:02:19 | stdout | mutagen.MutagenError: [Errno 2] No
  • 2024/03/09 09:02:19 | stdout | raise MutagenError(e)
  • 2024/03/09 09:02:19 | stdout | 272, in _openfile
  • 2024/03/09 09:02:19 | stdout | ckages/mutagen/_util.py", line
  • 2024/03/09 09:02:19 | stdout | "/app/.venv/lib/python3.10/site-pa
  • 2024/03/09 09:02:19 | stdout | File
  • 2024/03/09 09:02:19 | stdout | return next(self.gen)
  • 2024/03/09 09:02:19 | stdout | lib.py", line 135, in enter
  • 2024/03/09 09:02:19 | stdout | "/usr/local/lib/python3.10/context
  • 2024/03/09 09:02:19 | stdout | File
  • 2024/03/09 09:02:19 | stdout | filething, filename, fileobj,
  • 2024/03/09 09:02:19 | stdout | with _openfile(None,
  • 2024/03/09 09:02:19 | stdout | 162, in wrapper_func
  • 2024/03/09 09:02:19 | stdout | ckages/mutagen/_util.py", line
  • 2024/03/09 09:02:19 | stdout | "/app/.venv/lib/python3.10/site-pa
  • 2024/03/09 09:02:19 | stdout | File
  • 2024/03/09 09:02:19 | stdout | audio = mutagen.File(filename)
  • 2024/03/09 09:02:19 | stdout | line 402, in get_file_duration
  • 2024/03/09 09:02:19 | stdout | "/app/xiaomusic/xiaomusic.py",
  • 2024/03/09 09:02:19 | stdout | File
  • 2024/03/09 09:02:19 | stdout | e))
  • 2024/03/09 09:02:19 | stdout | int(self.get_file_duration(filenam
  • 2024/03/09 09:02:19 | stdout | sec =
  • 2024/03/09 09:02:19 | stdout | set_next_music_timeout
  • 2024/03/09 09:02:19 | stdout | line 410, in
  • 2024/03/09 09:02:19 | stdout | "/app/xiaomusic/xiaomusic.py",
  • 2024/03/09 09:02:19 | stdout | File
  • 2024/03/09 09:02:19 | stdout | self.set_next_music_timeout()
  • 2024/03/09 09:02:19 | stdout | line 508, in play
  • 2024/03/09 09:02:19 | stdout | "/app/xiaomusic/xiaomusic.py",
  • 2024/03/09 09:02:19 | stdout | File
  • 2024/03/09 09:02:19 | stdout | await func(arg1=oparg)
  • 2024/03/09 09:02:19 | stdout | line 455, in run_forever
  • 2024/03/09 09:02:19 | stdout | "/app/xiaomusic/xiaomusic.py",
  • 2024/03/09 09:02:19 | stdout | File
  • 2024/03/09 09:02:19 | stdout | Traceback (most recent call last):
  • 2024/03/09 09:02:19 | stdout |  
  • 2024/03/09 09:02:19 | stdout | occurred:
  • 2024/03/09 09:02:19 | stdout | exception, another exception
  • 2024/03/09 09:02:19 | stdout | During handling of the above
  • 2024/03/09 09:02:19 | stdout |  
  • 2024/03/09 09:02:19 | stdout | such file or directory: ''
  • 2024/03/09 09:02:19 | stdout | FileNotFoundError: [Errno 2] No
  • 2024/03/09 09:02:19 | stdout | if writable else "rb")
  • 2024/03/09 09:02:19 | stdout | fileobj = open(filename, "rb+"
  • 2024/03/09 09:02:19 | stdout | 251, in _openfile
  • 2024/03/09 09:02:19 | stdout | ckages/mutagen/_util.py", line
  • 2024/03/09 09:02:19 | stdout | "/app/.venv/lib/python3.10/site-pa
  • 2024/03/09 09:02:19 | stdout | File
  • 2024/03/09 09:02:19 | stdout | Traceback (most recent call last):
  • 2024/03/09 09:02:19 | stdout | directory: ''
  • 2024/03/09 09:02:19 | stdout | WARNING  执行出错 [Errno 2] No such file or xiaomusic.py:457
  • 2024/03/09 09:02:19 | stdout | INFO     已经开始播放了                     xiaomusic.py:506
  • 2024/03/09 09:02:19 | stdout | INFO     播放 http://192.168.0.39:8090/     xiaomusic.py:503
  • 2024/03/09 09:02:19 | stdout | [03/09/24 01:02:19] INFO     cur_music 奥特曼                   xiaomusic.py:501
  • 2024/03/09 09:02:19 | stdout | [download] Finished downloading playlist: 奥特曼
  • 2024/03/09 09:02:19 | stdout | [BiliBili] 745273948: Downloading webpage
    - 2024/03/09 09:02:19 | stderr | ERROR: Failed to parse: http://192.168.0.1:80index.asp/
  • 2024/03/09 09:02:19 | stdout | [BiliBili] Extracting URL: http://www.bilibili.com/video/av745273948
  • 2024/03/09 09:02:19 | stdout | [download] Downloading item 1 of 1
  • 2024/03/09 09:02:19 | stdout | [BiliBiliSearch] Playlist 奥特曼: Downloading 1 items of 1
  • 2024/03/09 09:02:18 | stdout | [BiliBiliSearch] 奥特曼: Extracting results from page 1
  • 2024/03/09 09:02:18 | stdout | [download] Downloading playlist: 奥特曼
  • 2024/03/09 09:02:18 | stdout | [BiliBiliSearch] Extracting URL: bilisearch:奥特曼
  • 2024/03/09 09:02:18 | stdout | INFO     正在下载中 奥特曼                  xiaomusic.py:495
  • 2024/03/09 09:02:18 | stdout | INFO     do_tts: 正在下载歌曲奥特曼         xiaomusic.py:225
  • 2024/03/09 09:02:18 | stdout | opvalue:play oparg:奥特曼
  • 2024/03/09 09:02:18 | stdout | [03/09/24 01:02:18] INFO     匹配到指令. opkey:播放歌曲         xiaomusic.py:481
`

音箱有反应但是马上就中止了, ERROR: Failed to parse: http://192.168.0.1:80index.asp/ 这个ERROR 是什么导致的,我没有配置这个地址 (192.168.0.1为路由器)

无法播放下载的音乐

家里一个L05B可以正常播放,一个L09A无法播放。后台日志显示歌曲已下载,但好像L09A不去播放歌曲的URL。

docker-compose logs -f
Attaching to xiaomusic-pp
xiaomusic-pp    | [11/04/23 06:06:27] INFO     Serving on 192.168.99.188:8090     xiaomusic.py:261
xiaomusic-pp    |                     INFO     Running xiaomusic now,             xiaomusic.py:375
xiaomusic-pp    |                              用`播放歌曲/放歌曲/下一首/单曲循环
xiaomusic-pp    |                              /全部循环/关机/停止播放`开头来控制
xiaomusic-pp    | [11/04/23 06:07:04] INFO     收到指令:播放歌曲 骄傲的少年       xiaomusic.py:400
xiaomusic-pp    |                     INFO     do_tts: 即将播放骄傲的少年         xiaomusic.py:229
xiaomusic-pp    | [11/04/23 06:07:05] INFO     播放                               xiaomusic.py:423
xiaomusic-pp    |                              http://192.168.99.188:8090/%E9%AA%
xiaomusic-pp    |                              84%E5%82%B2%E7%9A%84%E5%B0%91%E5%B
xiaomusic-pp    |                              9%B4.mp3
xiaomusic-pp    |                     INFO     已经开始播放了                     xiaomusic.py:426
xiaomusic-pp    |                     INFO     歌曲骄傲的少年的时长261秒          xiaomusic.py:353
xiaomusic-pp    |                     INFO     261秒后将会播放下一首              xiaomusic.py:367
xiaomusic-pp    | [11/04/23 06:07:26] INFO     收到指令:下一首                    xiaomusic.py:400
xiaomusic-pp    |                     INFO     下一首                             xiaomusic.py:432
xiaomusic-pp    |                     INFO     do_tts: 即将播放骄傲的少年         xiaomusic.py:229
xiaomusic-pp    |                     INFO     播放                               xiaomusic.py:423
xiaomusic-pp    |                              http://192.168.99.188:8090/%E9%AA%
xiaomusic-pp    |                              84%E5%82%B2%E7%9A%84%E5%B0%91%E5%B
xiaomusic-pp    |                              9%B4.mp3
xiaomusic-pp    | [11/04/23 06:07:27] INFO     已经开始播放了                     xiaomusic.py:426
xiaomusic-pp    |                     INFO     歌曲骄傲的少年的时长261秒          xiaomusic.py:353
xiaomusic-pp    |                     INFO     定时器已取消                       xiaomusic.py:356
xiaomusic-pp    |                     INFO     261秒后将会播放下一首              xiaomusic.py:367
xiaomusic-pp    | [11/04/23 06:07:38] INFO     收到指令:停止播放                  xiaomusic.py:400
xiaomusic-pp    |                     INFO     定时器已取消                       xiaomusic.py:454

执行出错 ROM端未响应

好几天不用了,今天使用突然报错,重新安装也还是一样,请问我该怎么解决

                             https://api2.mina.mi.com/remote/ub                 
                             us: {'code': 101, 'message': 'ubus                 
                             server or device returned invalid                  
                             result', 'data': {'device_data':                   
                             '{"msg":"ROM端未响应","code":3012}                 
                             ', 'reqID':                                        
                             'app_ios_cBh2Hebnm8g7                 
                             QFsxM'}}                                           
                             Traceback (most recent call last):                 
                               File                                             
                             "/app/xiaomusic/xiaomusic.py",                     
                             line 455, in run_forever                           
                                 await func(arg1=oparg)                         
                               File                                             
                             "/app/xiaomusic/xiaomusic.py",                     
                             line 491, in play                                  
                                 await self.play_next()                         
                               File                                             
                             "/app/xiaomusic/xiaomusic.py",                     
                             line 522, in play_next                             
                                 await self.play(arg1=name)                     
                               File                                             
                             "/app/xiaomusic/xiaomusic.py",                     
                             line 506, in play                                  
                                 await                                          
                             self.stop_if_xiaoai_is_playing()                   
                               File                                             
                             "/app/xiaomusic/xiaomusic.py",                     
                             line 281, in                                       
                             stop_if_xiaoai_is_playing                          
                                 is_playing = await                             
                             self.get_if_xiaoai_is_playing()                    
                               File                                             
                             "/app/xiaomusic/xiaomusic.py",                     
                             line 272, in                                       
                             get_if_xiaoai_is_playing                           
                                 playing_info = await                           
                             self.mina_service.player_get_statu                 
                             s(self.device_id)                                  
                               File                                             
                             "/app/.venv/lib/python3.10/site-pa                 
                             ckages/miservice/minaservice.py",                  
                             line 84, in player_get_status                      
                                 return await                                   
                             self.ubus_request(                                 
                               File                                             
                             "/app/.venv/lib/python3.10/site-pa                 
                             ckages/miservice/minaservice.py",                  
                             line 48, in ubus_request                           
                                 result = await                                 
                             self.mina_request(                                 
                               File                                             
                             "/app/.venv/lib/python3.10/site-pa                 
                             ckages/miservice/minaservice.py",                  
                             line 38, in mina_request                           
                                 return await                                   
                             self.account.mi_request(                           
                               File                                             
                             "/app/.venv/lib/python3.10/site-pa                 
                             ckages/miservice/miaccount.py",                    
                             line 150, in mi_request                            
                                 raise Exception(f"Error {url}:                 
                             {resp}")                                           
                             Exception: Error                                   
                             https://api2.mina.mi.com/remote/ub                 
                             us: {'code': 101, 'message': 'ubus                 
                             server or device returned invalid                  
                             result', 'data': {'device_data':                   
                             '{"msg":"ROM端未响应","code":3012}                 
                             ', 'reqID':                                        
                             'app_ios_cBh2anm8g7                 
                             QFsxM'}}       

播放时间是否能优化?

# 设置下一首歌曲的播放定时器
self.set_next_music_timeout()

在网络速度不行的情况下(比如音箱的接收wifi信号不太好时),读取音乐文件的时间会比较长,那么真正播放音乐的时间并没有达到mp3文件的长度时就结束了。

docker-compose 修改映射端口会播放失败

docker-compose 修改映射端口会播放失败

ports:
      - 80:8090

从日志看继续调用了 http://10.0.0.4:8090 而不是修改映射的80,还原成

ports:
      - 8090:8090

则一切正常

xiaomusic    | [BiliBiliSearch] Playlist 安河桥北: Downloading 1 items of 1
xiaomusic    | [download] Downloading item 1 of 1
xiaomusic    | [BiliBili] Extracting URL: http://www.bilibili.com/video/av319943893
xiaomusic    | [BiliBili] 319943893: Downloading webpage
xiaomusic    | 10.0.0.118 - - [21/Feb/2024 15:29:24] "POST /cmd HTTP/1.1" 200 -
xiaomusic    | 10.0.0.118 - - [21/Feb/2024 15:29:24] "POST /cmd HTTP/1.1" 200 -
xiaomusic    | 10.0.0.118 - - [21/Feb/2024 15:29:24] "POST /cmd HTTP/1.1" 200 -
xiaomusic    | 10.0.0.118 - - [21/Feb/2024 15:29:24] "POST /cmd HTTP/1.1" 200 -
xiaomusic    | [BiliBili] BV1tw411X7Rr: Extracting videos in anthology
xiaomusic    | 10.0.0.118 - - [21/Feb/2024 15:29:24] "POST /cmd HTTP/1.1" 200 -
xiaomusic    | [BiliBili] 319943893: Extracting chapters
xiaomusic    | 10.0.0.118 - - [21/Feb/2024 15:29:24] "POST /cmd HTTP/1.1" 200 -
xiaomusic    | 10.0.0.118 - - [21/Feb/2024 15:29:24] "POST /cmd HTTP/1.1" 200 -
xiaomusic    | [BiliBili] Format(s) 1080P 高码率, 1080P 高清, 720P 高清, 4K 超清 are missing; you have to login or become premium member to download them. Use --cookies-from-browser or --cookies for the authentication. See  https://github.com/yt-dlp/yt-dlp/wiki/FAQ#how-do-i-pass-cookies-to-yt-dlp  for how to manually pass cookies
xiaomusic    | [info] BV1tw411X7Rr: Downloading 1 format(s): 30280
xiaomusic    | 10.0.0.118 - - [21/Feb/2024 15:29:24] "POST /cmd HTTP/1.1" 200 -
xiaomusic    | 10.0.0.118 - - [21/Feb/2024 15:29:24] "POST /cmd HTTP/1.1" 200 -
xiaomusic    | [download] Destination: music/安河桥北.m4a
[download]   0.3% of    5.61MiB at    6.24MiB/s ETA 00:0010.0.0.118 - - [21/Feb/2024 15:29:24] "POST /cmd HTTP/1.1" 200 -
[download]   0.5% of    5.61MiB at    2.42MiB/s ETA 00:0210.0.0.118 - - [21/Feb/2024 15:29:24] "POST /cmd HTTP/1.1" 200 -
[download]   1.1% of    5.61MiB at    1.50MiB/s ETA 00:0310.0.0.118 - - [21/Feb/2024 15:29:24] "POST /cmd HTTP/1.1" 200 -
[download]   4.4% of    5.61MiB at    2.35MiB/s ETA 00:0210.0.0.118 - - [21/Feb/2024 15:29:24] "POST /cmd HTTP/1.1" 200 -
[download]   8.9% of    5.61MiB at    3.59MiB/s ETA 00:0110.0.0.118 - - [21/Feb/2024 15:29:24] "POST /cmd HTTP/1.1" 200 -
[download] 100% of    5.61MiB in 00:00:00 at 10.83MiB/s  
xiaomusic    | [ExtractAudio] Destination: music/安河桥北.mp3
xiaomusic    | Deleting original file music/安河桥北.m4a (pass -k to keep)
xiaomusic    | [download] Finished downloading playlist: 安河桥北
xiaomusic    | [02/21/24 15:29:29] INFO     播放                               xiaomusic.py:461
xiaomusic    |                              http://10.0.0.4:8090/music/%E5%AE%                 
xiaomusic    |                              89%E6%B2%B3%E6%A1%A5%E5%8C%97.mp3                  
xiaomusic    |                     INFO     已经开始播放了                     xiaomusic.py:464
xiaomusic    |                     INFO     歌曲music/安河桥北.mp3的时长251秒  xiaomusic.py:371
xiaomusic    |                     INFO     251秒后将会播放下一首              xiaomusic.py:385
xiaomusic    |                     INFO     匹配到指令. opkey:set_volume#      xiaomusic.py:441
xiaomusic    |                              opvalue:set_volume oparg:24  

下载的webm找不到ffmpeg进行转换

[download] music/左手指月.webm has already been downloaded
[download] 100% of    6.94MiB
ERROR: Postprocessing: ffprobe and ffmpeg not found. Please install or provide the path using --ffmpeg-location

用的是python virtualenv的虚拟环境。也安装了ffmpeg。

$ which ffmpeg
/usr/local/bin/ffmpeg
$ tree
.
├── Dockerfile
├── ffmpeg
│   ├── bin
│   │   ├── ffmpeg
│   │   ├── ffplay
│   │   └── ffprobe
│   ├── doc
│   │   ├── bootstrap.min.css
│   │   ├── community.html
│   │   ├── default.css
│   │   ├── developer.html
│   │   ├── faq.html
│   │   ├── fate.html
│   │   ├── ffmpeg-all.html
│   │   ├── ffmpeg-bitstream-filters.html
│   │   ├── ffmpeg-codecs.html
│   │   ├── ffmpeg-devices.html
│   │   ├── ffmpeg-filters.html
│   │   ├── ffmpeg-formats.html
│   │   ├── ffmpeg.html
│   │   ├── ffmpeg-protocols.html
│   │   ├── ffmpeg-resampler.html
│   │   ├── ffmpeg-scaler.html
│   │   ├── ffmpeg-utils.html
│   │   ├── ffplay-all.html
│   │   ├── ffplay.html
│   │   ├── ffprobe-all.html
│   │   ├── ffprobe.html
│   │   ├── general.html
│   │   ├── git-howto.html
│   │   ├── libavcodec.html
│   │   ├── libavdevice.html
│   │   ├── libavfilter.html
│   │   ├── libavformat.html
│   │   ├── libavutil.html
│   │   ├── libswresample.html
│   │   ├── libswscale.html
│   │   ├── mailing-list-faq.html
│   │   ├── nut.html
│   │   ├── platform.html
│   │   └── style.min.css
│   ├── LICENSE.txt
│   └── man
│       ├── man1
│       │   ├── ffmpeg.1
│       │   ├── ffmpeg-all.1
│       │   ├── ffmpeg-bitstream-filters.1
│       │   ├── ffmpeg-codecs.1
│       │   ├── ffmpeg-devices.1
│       │   ├── ffmpeg-filters.1
│       │   ├── ffmpeg-formats.1
│       │   ├── ffmpeg-protocols.1
│       │   ├── ffmpeg-resampler.1
│       │   ├── ffmpeg-scaler.1
│       │   ├── ffmpeg-utils.1
│       │   ├── ffplay.1
│       │   ├── ffplay-all.1
│       │   ├── ffprobe.1
│       │   └── ffprobe-all.1
│       └── man3
│           ├── libavcodec.3
│           ├── libavdevice.3
│           ├── libavfilter.3
│           ├── libavformat.3
│           ├── libavutil.3
│           ├── libswresample.3
│           └── libswscale.3
├── ffmpeg-master-latest-linux64-gpl.tar.xz
├── install_dependencies.sh
├── LICENSE
├── music
│   └── 左手指月.webm
├── newversion.sh
├── pdm.lock
├── pyproject.toml
├── README.md
├── requirements.txt
├── update-requirements.sh
├── xiaomusic
│   ├── cli.py
│   ├── config.py
│   ├── httpserver.py
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── cli.cpython-311.pyc
│   │   ├── config.cpython-311.pyc
│   │   ├── httpserver.cpython-311.pyc
│   │   ├── __init__.cpython-311.pyc
│   │   ├── utils.cpython-311.pyc
│   │   └── xiaomusic.cpython-311.pyc
│   ├── static
│   │   ├── app.js
│   │   ├── index.html
│   │   └── jquery-3.7.1.min.js
│   ├── utils.py
│   └── xiaomusic.py
└── xiaomusic.py

是必须用python3.10才行吗?

我这个nas刚好只有3.7和3.11。3.7太老了,依赖直接装不了。
3.11可以装,不过一运行就报错。
nas还装不了docker,也无法编译安装python3.10。

Traceback (most recent call last):
  File "/volume1/home/admin/venvs/xiaomi-py311/lib/python3.11/site-packages/aiohttp/client_reqrep.py", line 905, in start
    message, payload = await protocol.read()  # type: ignore[union-attr]
                       ^^^^^^^^^^^^^^^^^^^^^
  File "/volume1/home/admin/venvs/xiaomi-py311/lib/python3.11/site-packages/aiohttp/streams.py", line 616, in read
    await self._waiter
  File "/volume1/home/admin/venvs/xiaomi-py311/lib/python3.11/site-packages/aiohttp/client_proto.py", line 213, in data_received
    messages, upgraded, tail = self._parser.feed_data(data)
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/volume1/home/admin/venvs/xiaomi-py311/lib/python3.11/site-packages/aiohttp/http_parser.py", line 661, in feed_data
    return super().feed_data(data, SEP, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/volume1/home/admin/venvs/xiaomi-py311/lib/python3.11/site-packages/aiohttp/http_parser.py", line 339, in feed_data
    msg: _MsgT = self.parse_message(self._lines)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/volume1/home/admin/venvs/xiaomi-py311/lib/python3.11/site-packages/aiohttp/http_parser.py", line 688, in parse_message
    raise BadStatusLine(line)
aiohttp.http_exceptions.BadStatusLine: 400, message:
  Bad status line 'HTTP/1.1 200 '

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/volume1/home/admin/xiaoai/xiaomusic/xiaomusic.py", line 5, in <module>
    main()
  File "/volume1/home/admin/xiaoai/xiaomusic/xiaomusic/cli.py", line 62, in main
    loop.run_until_complete(xiaomusic.run_forever())
  File "/opt/lib/python3.11/asyncio/base_events.py", line 653, in run_until_complete
  File "/volume1/home/admin/xiaoai/xiaomusic/xiaomusic/xiaomusic.py", line 387, in run_forever
    await self.init_all_data(session)
  File "/volume1/home/admin/xiaoai/xiaomusic/xiaomusic/xiaomusic.py", line 95, in init_all_data
    await self._init_data_hardware()
  File "/volume1/home/admin/xiaoai/xiaomusic/xiaomusic/xiaomusic.py", line 115, in _init_data_hardware
    hardware_data = await self.mina_service.device_list()
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/volume1/home/admin/venvs/xiaomi-py311/lib/python3.11/site-packages/miservice/minaservice.py", line 27, in device_list
    result = await self.mina_request("/admin/v2/device_list?master=" + str(master))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/volume1/home/admin/venvs/xiaomi-py311/lib/python3.11/site-packages/miservice/minaservice.py", line 22, in mina_request
    return await self.account.mi_request(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/volume1/home/admin/venvs/xiaomi-py311/lib/python3.11/site-packages/miservice/miaccount.py", line 131, in mi_request
    async with self.session.request(
  File "/volume1/home/admin/venvs/xiaomi-py311/lib/python3.11/site-packages/aiohttp/client.py", line 1167, in __aenter__
    self._resp = await self._coro
                 ^^^^^^^^^^^^^^^^
  File "/volume1/home/admin/venvs/xiaomi-py311/lib/python3.11/site-packages/aiohttp/client.py", line 586, in _request
    await resp.start(conn)
  File "/volume1/home/admin/venvs/xiaomi-py311/lib/python3.11/site-packages/aiohttp/client_reqrep.py", line 907, in start
    raise ClientResponseError(
aiohttp.client_exceptions.ClientResponseError: 400, message="Bad status line 'HTTP/1.1 200 '", url=URL('https://api2.mina.mi.com/admin/v2/device_list?master=0&requestId=app_ios_209R5SJmUgjfOrogY7cClAkPFLxu3X')

小米AI音箱播放没有声音

docker部署的,使用小米AI音箱一代,能成功下载音乐,但播放没有声音
wizardly_dijkstra-1 | [ExtractAudio] Destination: music/爱你1万年.mp3 wizardly_dijkstra-1 | Deleting original file music/爱你1万年.m4a (pass -k to keep) wizardly_dijkstra-1 | [download] Finished downloading playlist: 爱你1万年 wizardly_dijkstra-1 | [03/07/24 01:56:29] INFO cur_music 爱你1万年 xiaomusic.py:501 wizardly_dijkstra-1 | INFO 播放 xiaomusic.py:503 wizardly_dijkstra-1 | http://192.168.2.174:8090/music/%E wizardly_dijkstra-1 | 7%88%B1%E4%BD%A01%E4%B8%87%E5%B9%B wizardly_dijkstra-1 | 4.mp3 wizardly_dijkstra-1 | [03/07/24 01:56:30] INFO 已经开始播放了 xiaomusic.py:506 wizardly_dijkstra-1 | INFO 歌曲 爱你1万年 : xiaomusic.py:411 wizardly_dijkstra-1 | music/爱你1万年.mp3 的时长 484 秒 wizardly_dijkstra-1 | INFO 定时器已取消 xiaomusic.py:414 wizardly_dijkstra-1 | INFO 484秒后将会播放下一首 xiaomusic.py:425

下一首指令、播放歌曲指令报错

[04/09/24 03:53:59] INFO 匹配到指令. opkey:下一首 xiaomusic.py:481
opvalue:play_next oparg:
INFO 下一首 xiaomusic.py:515
WARNING 执行出错 not enough values to xiaomusic.py:457
unpack (expected 2, got 1)
Traceback (most recent call last):
File
"/app/xiaomusic/xiaomusic.py",
line 455, in run_forever
await func(arg1=oparg)
File
"/app/xiaomusic/xiaomusic.py",
line 523, in play_next
await self.play(arg1=name)
File
"/app/xiaomusic/xiaomusic.py",
line 487, in play
search_key,name =
kwargs["arg1"].split('|')
ValueError: not enough values to
unpack (expected 2, got 1)

[04/09/24 03:55:08] INFO 匹配到指令. opkey:播放歌曲 xiaomusic.py:481
opvalue:play oparg:
WARNING 执行出错 not enough values to xiaomusic.py:457
unpack (expected 2, got 1)
Traceback (most recent call last):
File
"/app/xiaomusic/xiaomusic.py",
line 455, in run_forever
await func(arg1=oparg)
File
"/app/xiaomusic/xiaomusic.py",
line 487, in play
search_key,name =
kwargs["arg1"].split('|')
ValueError: not enough values to
unpack (expected 2, got 1)

连续下载两个音乐时报错

[10/16/23 21:51:46] INFO     Serving on 192.168.31.2:8090       xiaomusic.py:261
                    INFO     Running xiaomusic now,             xiaomusic.py:369
                             用`播放歌曲/放歌曲/下一首/单曲循环                 
                             /全部循环/关机/停止播放`开头来控制                 
[10/16/23 21:51:55] INFO     收到指令:播放歌曲 寄明月           xiaomusic.py:394
                    INFO     do_tts: 即将播放寄明月             xiaomusic.py:229
                    INFO     do_tts: 正在下载歌曲寄明月         xiaomusic.py:229
                    INFO     正在下载中 寄明月                  xiaomusic.py:412
[youtube:search] Extracting URL: ytsearch:寄明月
[download] Downloading playlist: 寄明月
[youtube:search] query "寄明月": Downloading web client config
[youtube:search] query "寄明月" page 1: Downloading API JSON
[youtube:search] Playlist 寄明月: Downloading 1 items of 1
[download] Downloading item 1 of 1
[youtube] Extracting URL: https://www.youtube.com/watch?v=49d95ni5J9Y
[youtube] 49d95ni5J9Y: Downloading webpage
[youtube] 49d95ni5J9Y: Downloading ios player API JSON
[youtube] 49d95ni5J9Y: Downloading android player API JSON
[youtube] 49d95ni5J9Y: Downloading m3u8 information
[info] 49d95ni5J9Y: Downloading 1 format(s): 251
[download] Destination: music/寄明月.webm
[download] 100% of    3.62MiB in 00:00:01 at 2.38MiB/s   
[ExtractAudio] Destination: music/寄明月.mp3
Deleting original file music/寄明月.webm (pass -k to keep)
[download] Finished downloading playlist: 寄明月
[10/16/23 21:52:08] INFO     播放                               xiaomusic.py:417
                             http://192.168.31.2:8090/%E5%AF%84                 
                             %E6%98%8E%E6%9C%88.mp3                             
[10/16/23 21:52:09] INFO     已经开始播放了                     xiaomusic.py:420
                    INFO     歌曲寄明月的时长227秒              xiaomusic.py:350
                    INFO     227秒后将会播放下一首              xiaomusic.py:361
[10/16/23 21:52:21] INFO     收到指令:播放歌曲 最伟大的作品     xiaomusic.py:394
                    INFO     do_tts: 即将播放最伟大的作品       xiaomusic.py:229
                    WARNING  执行出错                           xiaomusic.py:400
                             Traceback (most recent call last):                 
                               File                                             
                             "/app/xiaomusic/xiaomusic.py",                     
                             line 398, in run_forever                           
                                 await func(name = oparg)                       
                               File                                             
                             "/app/xiaomusic/xiaomusic.py",                     
                             line 411, in play                                  
                                 await self.download(name)                      
                               File                                             
                             "/app/xiaomusic/xiaomusic.py",                     
                             line 297, in download                              
                                 self.download_proc.kill()                      
                               File                                             
                             "/usr/local/lib/python3.10/asyncio                 
                             /subprocess.py", line 143, in kill                 
                                 self._transport.kill()                         
                               File                                             
                             "/usr/local/lib/python3.10/asyncio                 
                             /base_subprocess.py", line 153, in                 
                             kill                                               
                                 self._check_proc()                             
                               File                                             
                             "/usr/local/lib/python3.10/asyncio                 
                             /base_subprocess.py", line 142, in                 
                             _check_proc                                        
                                 raise ProcessLookupError()                     
                             ProcessLookupError    

关机后过段时间继续播放

群辉ds audio播放列表有多首歌曲的情况下,通过语音命令或者控制界面关机后,会继续播放下一首。

play增强版果然是残废

部署正常,play增强版无法使用。包括homeassistant中的音乐play增强版都没法用。型号代码 L05C
微信截图_20240307211727

微信截图_20240307211124

feat: 用暂停按钮结束?

目前必须用语音命令才能停止run_forever,按暂时键只是mute,当前歌曲结束后,又会开始播放下一首。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.