Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

求助:如何自动或口令刷新本地音乐列表? #378

Open
foxfire881 opened this issue Feb 2, 2025 · 12 comments
Open

求助:如何自动或口令刷新本地音乐列表? #378

foxfire881 opened this issue Feb 2, 2025 · 12 comments
Labels
好建议 Good for newcomers 文档 帮助文档 新功能 可能会实现的功能 求助 Extra attention is needed

Comments

@foxfire881
Copy link

docker容器部署的xiaomusic,目前是[0.3.74]最新版,音响是小米AI音箱二代。目前可以正常通过口令 “小爱同学,播放本地音乐 XXX”来 播放容器外挂载的目录 /music 中的mp3、flac等音乐歌曲。

但是,每次往 /music 里面新拷入一些音乐之后,xiaomusic 既没有自动刷新本地音乐列表,也不能通过“小爱同学,刷新列表”、“小爱同学,本地音乐 刷新列表”、“小爱同学,刷新本地列表”、“小爱同学,刷新本地音乐列表”等口令来刷新列表,必须在电脑上打开 xiaomusic 的后台管理页面并点一下那个刷新列表的按钮,然后本地音乐列表中才能刷新看见新增的音乐。

请问有没有办法做到每次往 /music 拷入音乐后自动刷新列表,或者通过口令刷新列表?谢谢~

@hanxi
Copy link
Owner

hanxi commented Feb 3, 2025

刷新列表口令默认不在唤醒口令里,你可以先说播放歌曲,在播放中再说刷新列表,或者把刷新列表口令加到唤醒口令里。

允许唤醒的命令:

@hanxi hanxi added 文档 帮助文档 求助 Extra attention is needed labels Feb 3, 2025
@foxfire881
Copy link
Author

foxfire881 commented Feb 4, 2025

刷新列表口令默认不在唤醒口令里,你可以先说播放歌曲,在播放中再说刷新列表,或者把刷新列表口令加到唤醒口令里。

允许唤醒的命令:

每次都要这样操作很麻烦欸~

注意到xiaomusic是用python写的,python有个可以监控文件系统变化的库 watchdog 使用很方便,可否增加一个自动刷新列表的功能?当监控到音乐目录发生变化时(增、删、改),自动刷新xiaomusic的音乐列表 —— 这样连口令都不用说了,xiaomusic自动实时刷新列表,更方便了!期待~~ @hanxi

@foxfire881
Copy link
Author

豆包给了个demo:

import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

class MyEventHandler(FileSystemEventHandler):
    def on_modified(self, event):
        print(f"File modified: {event.src_path}")

    def on_created(self, event):
        print(f"File created: {event.src_path}")

    def on_deleted(self, event):
        print(f"File deleted: {event.src_path}")

if __name__ == "__main__":
    event_handler = MyEventHandler()
    observer = Observer()
    path = '.'  # 要监控的目录
    observer.schedule(event_handler, path, recursive=True)
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

代码解释

  • 定义一个继承自 FileSystemEventHandler 的类 MyEventHandler,并重写 on_modified、on_created 和 on_deleted 方法,用于处理文件修改、创建和删除事件。
  • 创建一个 Observer 对象,并将事件处理程序和要监控的目录传递给它。
  • 启动观察者,并进入一个无限循环,直到用户按下 Ctrl+C 停止程序。

watchdog 库的优点是实时性好,能够及时响应文件系统的变化,并且支持多种操作系统。因此,推荐使用 watchdog 库来监控文件目录变化。

@hanxi
Copy link
Owner

hanxi commented Feb 5, 2025

@foxfire881 谢谢,有空我实现一下吧。需要做个队列延迟处理的,要不然拷贝一堆文件的时候会刷新多次。

@hanxi hanxi added 新功能 可能会实现的功能 好建议 Good for newcomers labels Feb 5, 2025
@foxfire881
Copy link
Author

刷新多次好像也影响不大,xiaomusic刷新列表挺快的,我的音乐目录有大概有100G左右近5000个mp3、flac音乐,几乎是秒刷,点一下按钮瞬间就更新了。

所以是不是也可以另外开个线程在后台定时每隔一段时间(用户可设置)自动刷新一下列表,这样实现快速、简单点。

队列方案更完美,实现也更复杂些,可以作远期目标持续优化。

@foxfire881
Copy link
Author

foxfire881 commented Feb 5, 2025

@hanxi 另外还有一个问题想请教下如何解决?

一首歌曲往往有多个版本,例如王菲、梁静茹都唱过《红豆》:

/music/王菲/红豆.mp3
/music/梁静茹/红豆.mp3
/music/张惠妹/红豆生南国.mp3
/music/其他/张学友-红豆.mp3

如果我想听梁静茹的《红豆》,应该说什么指令?
“小爱同学,播放本地歌曲 红豆” —— 这个指令好像只能定位到第一个匹配到的文件,后面的文件都忽略了。

“小爱同学,播放本地歌曲 梁静茹 红豆” —— 这个指令无效,小爱同学没有反应。

@hanxi
Copy link
Owner

hanxi commented Feb 5, 2025

@hanxi 另外还有一个问题想请教下如何解决?

一首歌曲往往有多个版本,例如王菲、梁静茹都唱过《红豆》:

/music/王菲/红豆.mp3 /music/梁静茹/红豆.mp3 /music/张惠妹/红豆生南国.mp3 /music/其他/张学友-红豆.mp3

如果我想听梁静茹的《红豆》,应该说什么指令? “小爱同学,播放本地歌曲 红豆” —— 这个指令好像只能定位到第一个匹配到的文件,后面的文件都忽略了。

“小爱同学,播放本地歌曲 梁静茹 红豆” —— 这个指令无效,小爱同学没有反应。

文件名需要唯一,像张学友-红豆一样命名。然后说张学友红豆就行。相同的文件名是会覆盖的,只有一首生效。

@foxfire881
Copy link
Author

@hanxi 另外还有一个问题想请教下如何解决?
一首歌曲往往有多个版本,例如王菲、梁静茹都唱过《红豆》:
/music/王菲/红豆.mp3 /music/梁静茹/红豆.mp3 /music/张惠妹/红豆生南国.mp3 /music/其他/张学友-红豆.mp3
如果我想听梁静茹的《红豆》,应该说什么指令? “小爱同学,播放本地歌曲 红豆” —— 这个指令好像只能定位到第一个匹配到的文件,后面的文件都忽略了。
“小爱同学,播放本地歌曲 梁静茹 红豆” —— 这个指令无效,小爱同学没有反应。

文件名需要唯一,像张学友-红豆一样命名。然后说张学友红豆就行。相同的文件名是会覆盖的,只有一首生效。

原来如此。改文件名有点麻烦,能否做到把关键字搜出来的结果作为一个播放列表顺序播放?例如 “小爱同学,播放本地音乐 红豆”,然后 xiaomusic 把上述所有包含 “红豆” 关键字的歌曲全部搜索出来,作为一个临时播放列表顺序播放?

@hanxi
Copy link
Owner

hanxi commented Feb 6, 2025

可以用 music tag web 工具自动改名。不能同名是最早的基础设定,改动比较大,现在不好改了。

@foxfire881
Copy link
Author

可以用 music tag web 工具自动改名。不能同名是最早的基础设定,改动比较大,现在不好改了。

关键是网上下载的很多mp3、flac文件没有 tag 或者 tag 不规范,要重命名得先把 tag 整理一遍,那个工程量就太太太大了

没关系,先这样用着吧,不着急。以后有空了还是希望可以重构一下,解决同名文件的问题。

或者也可以考虑下不一定要严格按照文件名去匹配,可以把文件路径、目录名也包含在模糊匹配规则里面,这样也可以大大提高命中准确率。

@AisukaYuki
Copy link
Contributor

AisukaYuki commented Feb 7, 2025

其实你可以用定时任务定时刷新列表。暂时先实现一下,隔几分钟刷新一下。

[  
    {
        "expression": "*/10 * * * *",
        "name": "refresh_music_list"
    }
]

@newmanfung
Copy link

可以用 music tag web 工具自动改名。不能同名是最早的基础设定,改动比较大,现在不好改了。

关键是网上下载的很多mp3、flac文件没有 tag 或者 tag 不规范,要重命名得先把 tag 整理一遍,那个工程量就太太太大了

没关系,先这样用着吧,不着急。以后有空了还是希望可以重构一下,解决同名文件的问题。

或者也可以考虑下不一定要严格按照文件名去匹配,可以把文件路径、目录名也包含在模糊匹配规则里面,这样也可以大大提高命中准确率。

用mp3tag,通过网上的的歌曲meta数据自动更改tag的,之前几十张专辑的时候大概3个小时就搞定了。现在我都弄了几百张专辑了。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
好建议 Good for newcomers 文档 帮助文档 新功能 可能会实现的功能 求助 Extra attention is needed
Projects
None yet
Development

No branches or pull requests

4 participants