LXMusic 中文文档 下载 App

SSE 实时订阅——比轮询更优雅的播放器状态获取

为什么不用轮询

如果每 1 秒向 /status 接口发一次 HTTP GET 请求来获取播放器状态,这种方式叫「轮询(Polling)」。轮询有几个问题:

洛雪音乐提供了 SSE(Server-Sent Events,服务器推送事件)接口来解决这个问题。

SSE 是什么

SSE 是 HTTP 协议上的一种单向推送机制:

  1. 客户端发起一个普通的 HTTP GET 请求。
  2. 服务器不立即返回响应,而是保持连接。
  3. 每当播放器状态发生变化时,服务器主动推送新的状态数据到这个连接。
  4. 数据格式是简单的纯文本事件流。

相比 WebSocket,SSE 更轻量,用起来更简单——普通的 curl 命令就能测试。

订阅接口

GET /subscribe-player-status

地址完整形式:

http://127.0.0.1:23330/subscribe-player-status

可以带 filter 参数只订阅关心的字段:

GET /subscribe-player-status?filter=status,name,lyricLineText

事件格式

服务器推送的数据是纯文本,格式如下:

event: status
data: "playing"

event: name
data: "交换余生"

event: singer
data: "林俊杰"

event: lyricLineText
data: "阴天的空气里"

每条推送由 event: 行和 data: 行组成。不同事件对应播放器的不同字段。

推送的事件类型

event 名称说明
status播放器状态变化(playing / paused / error / stoped)
name当前歌曲名
singer艺术家
albumName专辑名
duration歌曲总时长
progress播放进度
playbackRate播放速率
picUrl封面图片 URL
lyricLineText当前播放歌词文本
lyricLineAllText包含翻译、罗马音等扩展歌词的完整文本
lyric当前歌曲 LRC 歌词
collect收藏状态变化
volume音量变化
mute静音状态变化

使用示例

curl 测试

# -N 参数禁用缓冲,实时看到推送内容
curl -N http://127.0.0.1:23330/subscribe-player-status

打开这条命令后,终端会一直输出。每次播放器状态变化时(切歌、暂停、歌词滚动),都会推送新的事件到终端。

Python 脚本

import requests

def handle_sse():
    url = "http://127.0.0.1:23330/subscribe-player-status"
    resp = requests.get(url, stream=True)
    current_event = None
    for line in resp.iter_lines(decode_unicode=True):
        if line.startswith("event:"):
            current_event = line[6:].strip()
        elif line.startswith("data:"):
            data = line[5:].strip()
            if current_event == "lyricLineText":
                print(f"当前歌词:{data}")
            elif current_event == "status":
                print(f"播放器状态:{data}")

handle_sse()

JavaScript 浏览器端

const source = new EventSource("http://127.0.0.1:23330/subscribe-player-status");

source.onmessage = (event) => {
    // event.data 是 JSON 字符串或纯文本
    console.log(event.data);
};

source.addEventListener("lyricLineText", (event) => {
    console.log("当前歌词:", event.data);
});

source.close(); // 停止订阅

典型应用场景

注意事项

相关阅读