-
Notifications
You must be signed in to change notification settings - Fork 6k
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
[Feature]: 作者大佬,落雪linux桌面端有暴漏LRC歌词API吗? #1824
Comments
目前没有此类API,你说的通过http服务提供API,具体是怎么样的呢?那第三方软件怎么知道歌曲、歌词、进度等信息的更新?通过SSE?还是websocket? |
对,是http接口,websocket非必需, 实现逻辑如下: 具体实现需要落雪音乐桌面app 暴漏一个http接口, 该接口需要提供当前播放歌曲的信息,具体如下:
第三方如何使用该接口流程: 第三方做一个秒级别的调用该接口,解析出实时歌词,并在状态栏展示, 为啥第三方不开发这个http接口?这个http接口需要 播放器提供,因为播放器会控制音乐的播放和切换,第三方难以嵌入逻辑到播放器内部,也难以获取播放进度和控制相关信息。 Websocket接口非必需,如果能提供后续便于扩展krc歌词通过websocket接口,歌词时效性就变成实时的了,当播放器提供krc歌词时,状态栏就会看到一个字一个字的滚动歌词。 websocket性能解释: 该种情况下,逻辑简单非计算型任务,资源消耗非常低的,且在不打开状态栏歌词时并不会调用该接口。唯一要注意的是播放器作为服务器提供websocket接口时,当连接断开后需要释放资源(有踩过坑),以免造成内存泄漏。 |
虽然是localhost,但我觉得通过轮询的方式不断调用API还是不够优雅, 这个比websocket更轻量,但是它只能单向通信,从客户端的实现来说,应该就是向服务端发起请求,然后监听请求响应的数据流(正常请求是等请求结束才处理响应的数据) 另一个方案就是用websocket 如果通过某种方式实现了播放器主动通知第三方的功能,那完全可以返回当前句歌词,而不是整个LRC文本,当然还有一种方式是直接将 Gnome桌面的状态栏歌词 功能集成进LX,但这需要编译成可以用nodejs调用的二进制文件 |
本人不是gnome插件的开发者,偶然间看到yesplaymusic有暴漏歌词相关接口,于是就捣鼓了下实时歌词的命令,然后结合现有的gnome插件(executor周期性调度)展示状态栏实时歌词。也想过开发gnome插件,但门槛有点高,也许以后会开发gnome插件。 粉丝诉求希望能接入lx歌词,为了满足粉丝期待前来叨唠下lx作者,咨询下lrc相关接口; 方案一:http可行 需要提供的接口:
方案二:sse接口,暂时不推荐
方案三:websocket先放一放, 方案四:gnome状态栏歌词插件集成进LX,也先放一放 综上,http接口的方式实现状态栏歌词是现在最快的方案,若http接口开发成本还行,也能快速上线,还望lx作者可以多考虑下。gnome插件开发这块等有精力再折腾,也许有熟悉gnome插件的大佬,可以提供支持。 |
大概了解了,那就暂时实现使用普通 HTTP 的方式,数据格式用JSON是否方便? 更新: 初步安排上了,但是有个问题, 更新: 已经在2.7.0-beta.3加上了,可以去actions下载试试,详细说明看接入文档 对于本地歌曲存在嵌入的封面图片时,封面字段将返回data url的形式,若封面太大,则可能导致响应的数据很大,又不想将封面写到硬盘上返回文件路径,我在想要不要过滤掉此类数据。 更新: 已经在2.7.0-beta.4添加了SSE,用浏览器、postman等请求看看,它只是一个普通的HTTP请求,不需要什么客户端,你可以试试,若对接不了那就用轮询吧: 可以在命令行用 |
OK,感谢 json数据可以的,解析非常简单; 关于 “播放器处于后台时歌词播放器将被暂停,所以当前句歌词没有更新” 的问题,建议展示最近一行歌词. 接口已对接,现在命令里已增加落雪歌词源, 开放API等大佬上正式版,再次感谢~ |
这个已经解决了,忘了划掉 我没用过go,对gnome也不熟悉,我大概看了下,整个流程似乎是使用go写一个命令行的程序,然后给 package main
import (
"fmt"
"log"
"net/http"
"bufio"
)
func listenSSE() {
client := http.Client{
Timeout: 0, // No timeout for SSE
}
req, err := http.NewRequest("GET", "http://localhost:23330/subscribe-player-status", nil)
if err != nil {
log.Fatal("Error creating request:", err)
}
req.Header.Set("Accept", "text/event-stream")
resp, err := client.Do(req)
if err != nil {
log.Fatal("Error sending request:", err)
}
defer resp.Body.Close()
// Read SSE events from response body
scanner := bufio.NewScanner(resp.Body)
for scanner.Scan() {
event := scanner.Text()
fmt.Println("Received event:", event)
}
if err := scanner.Err(); err != nil {
log.Fatal("Error reading response:", err)
}
}
func main() {
listenSSE()
} 上面的demo是每次处理一行数据,跳过空行后, package main
import (
"encoding/json"
"fmt"
)
func main() {
// 要解码的 JSON 字符串
jsonString := `"[offset:0]\n[00:25.156]衬托你的伤心\n[00:28.966]尴尬身份给你慰问\n[00:35.20]"` // 或者 `123`
// 创建一个变量用于存储解码后的数据
var data interface{}
// 解码 JSON 字符串
err := json.Unmarshal([]byte(jsonString), &data)
if err != nil {
fmt.Println("解码 JSON 字符串时发生错误:", err)
return
}
// 根据解码后的数据类型进行处理
switch v := data.(type) {
case string:
fmt.Println("解码后的字符串:", v)
case float64:
fmt.Println("解码后的数字:", v)
default:
fmt.Println("未知类型")
}
} 但现在SSE返回的数据似乎太多,而你现在的情况只用到歌词,所以这个接口我再加个入参指定订阅的字段吧 更新: 由于现在返回了进度,你可以加上进度的显示,例如:
等等... 更新: 不过仔细想想,长期运行的命令行程序似乎也不太适合你这个场景,用户似乎没办法控制它的停止,所以不行就算了。。。 |
并不行,executor插件不支持这种持续输出的, 一开始是想开发一个专门做lrc歌词状态栏展示的插件的,由于gnome 插件开发门槛有点高,然后资料还少,最后就放弃开发了。 有熟悉gnome插件开发的同学可以私信我,帮忙指点下,还有些插件年久失修,想升级下 |
谢谢作者,waybar上终于可以放歌词了。 2024-03-31.00-24-41.mp4 |
感谢作者开发 话说好像没有歌词翻译的提供 |
下个版本可以以换行符分割的方式提供扩展歌词, |
大佬大佬,路过问问,你这waybar咋配置的?好好看! |
感谢,我的waybar也有实时歌词显示了,太攒了👍 |
基于洛雪的SSE接口,写了个可以在 KDE Plasma 面板上实时显示歌词的插件,有同样使用 KDE 的小伙伴可以试用一下,看看哪里需要改进。 |
在waybar上显示洛雪歌词的简单代码(使用SSE接口):
waybar配置:
|
解决方案检查
问题描述
最近想开发个落雪音乐Gnome桌面的状态栏歌词,不知道落雪音乐桌面版有没有暴漏相关API?
描述你想要的解决方案
希望落雪linux桌面版也能开放LRC相关的API,
描述你考虑过的替代方案
No response
附加信息
Exp:YesPlayMusic有暴漏实时歌词的API,包含了当前播放的歌曲的LRC歌词及播放进度,因此只需要简单请求,再按照进度提取就能得到实时歌词,https://github.com/MarsSwimmer/get_lrc
The text was updated successfully, but these errors were encountered: