diff --git a/publish/changeLog.md b/publish/changeLog.md index 587583c1..d8837a5a 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -5,3 +5,11 @@ ### 变更 - 设置-播放设置-优先播放320k音质选项改为“优先播放的音质”,允许选择更高优先播放的音质,如果歌曲及音源支持的话(#1839) + +### 开放API变更 + +- `/status` 的入参现在与 `/subscribe-player-status` 保持一致 +- `/status` 新增 `filter` 入参用于过滤返回的字段,并内置了默认值,与之前相比默认不再返回 `picUrl` +- `/status` 及 `/subscribe-player-status` 的可用字段名添加了 `lyricLineAllText`,它对应的值是当前句歌词及扩展歌词文本(扩展歌词包含翻译、罗马音等,按换行符分割) + +详情看开放API接入文档 diff --git a/src/common/types/player.d.ts b/src/common/types/player.d.ts index f4817916..4a67248f 100644 --- a/src/common/types/player.d.ts +++ b/src/common/types/player.d.ts @@ -26,6 +26,7 @@ declare namespace LX { duration: number playbackRate: number lyricLineText: string + lyricLineAllText: string lyric: string collect: boolean } diff --git a/src/main/app.ts b/src/main/app.ts index 7a485ecf..512e7b4a 100644 --- a/src/main/app.ts +++ b/src/main/app.ts @@ -244,6 +244,7 @@ export const initAppSetting = async() => { duration: 0, playbackRate: 1, lyricLineText: '', + lyricLineAllText: '', lyric: '', collect: false, }, diff --git a/src/main/modules/openApi/index.ts b/src/main/modules/openApi/index.ts index ee668ddd..4cd136d2 100644 --- a/src/main/modules/openApi/index.ts +++ b/src/main/modules/openApi/index.ts @@ -14,13 +14,32 @@ type SubscribeKeys = keyof LX.Player.Status let httpServer: http.Server let sockets = new Set() let responses = new Map, SubscribeKeys[]>() +let playerStatusKeys: SubscribeKeys[] + +const defaultFilter = [ + 'status', + 'name', + 'singer', + 'albumName', + 'lyricLineText', + 'duration', + 'progress', + 'playbackRate', +] satisfies SubscribeKeys[] const parseFilter = (filter: any) => { - const keys = Object.keys(global.lx.player_status) as SubscribeKeys[] - if (typeof filter != 'string') return keys + if (typeof filter != 'string') return defaultFilter filter = filter.split(',') - const subKeys = keys.filter(k => filter.includes(k)) - return subKeys.length ? subKeys : keys + const subKeys = playerStatusKeys.filter(k => filter.includes(k)) + return subKeys.length ? subKeys : defaultFilter +} +const handleSendStatus = (res: http.ServerResponse, query?: string) => { + const keys = parseFilter(querystring.parse(query ?? '').filter) + const resp: Partial> = {} + for (const k of keys) resp[k] = global.lx.player_status[k] + res.setHeader('Content-Type', 'application/json; charset=utf-8') + res.writeHead(200) + res.end(JSON.stringify(resp)) } const handleSubscribePlayerStatus = (req: http.IncomingMessage, res: http.ServerResponse, query?: string) => { res.writeHead(200, { @@ -43,26 +62,15 @@ const handleSubscribePlayerStatus = (req: http.IncomingMessage, res: http.Server } const handleStartServer = async(port: number, ip: string) => new Promise((resolve, reject) => { + playerStatusKeys = Object.keys(global.lx.player_status) as SubscribeKeys[] httpServer = http.createServer((req, res): void => { const [endUrl, query] = `/${req.url?.split('/').at(-1) ?? ''}`.split('?') let code let msg switch (endUrl) { case '/status': - code = 200 - res.setHeader('Content-Type', 'application/json; charset=utf-8') - msg = JSON.stringify({ - status: global.lx.player_status.status, - name: global.lx.player_status.name, - singer: global.lx.player_status.singer, - albumName: global.lx.player_status.albumName, - duration: global.lx.player_status.duration, - progress: global.lx.player_status.progress, - picUrl: global.lx.player_status.picUrl, - playbackRate: global.lx.player_status.playbackRate, - lyricLineText: global.lx.player_status.lyricLineText, - }) - break + handleSendStatus(res, query) + return // case '/test': // code = 200 // res.setHeader('Content-Type', 'text/html; charset=utf-8') diff --git a/src/renderer/core/lyric.ts b/src/renderer/core/lyric.ts index bcc05895..dad92a46 100644 --- a/src/renderer/core/lyric.ts +++ b/src/renderer/core/lyric.ts @@ -87,7 +87,7 @@ export const init = () => { onPlay(line, text) { setText(text, Math.max(line, 0)) setStatusText(text) - window.app_event.lyricLinePlay(text) + window.app_event.lyricLinePlay(text, line) // console.log(line, text) }, onSetLyric(lines, offset) { // listening lyrics seting event diff --git a/src/renderer/core/useApp/usePlayer/usePlayStatus.ts b/src/renderer/core/useApp/usePlayer/usePlayStatus.ts index 08062f75..07b39b88 100644 --- a/src/renderer/core/useApp/usePlayer/usePlayStatus.ts +++ b/src/renderer/core/useApp/usePlayer/usePlayStatus.ts @@ -9,6 +9,7 @@ import { throttle } from '@common/utils' import { pause, play, playNext, playPrev } from '@renderer/core/player' import { playProgress } from '@renderer/store/player/playProgress' import { appSetting } from '@renderer/store/setting' +import { lyric } from '@renderer/store/player/lyric' export default () => { // const setVisibleDesktopLyric = useCommit('setVisibleDesktopLyric') @@ -58,9 +59,11 @@ export default () => { picUrl: musicInfo.pic ?? '', }) } - const handleSetLyricLine = (text: string) => { + const handleSetLyricLine = (text: string, line: number) => { + let curLine = lyric.lines[line]?.extendedLyrics.join('\n') ?? '' sendPlayerStatus({ lyricLineText: text, + lyricLineAllText: curLine ? text + '\n' + curLine : text, }) } // const handleSetTaskbarThumbnailClip = (clip) => { diff --git a/src/renderer/event/appEvent.ts b/src/renderer/event/appEvent.ts index d79105c7..cca2696c 100644 --- a/src/renderer/event/appEvent.ts +++ b/src/renderer/event/appEvent.ts @@ -145,8 +145,8 @@ export class AppEvent extends Event { } // 歌词行播放 - lyricLinePlay(text: string) { - this.emit('lyricLinePlay', text) + lyricLinePlay(text: string, line: number) { + this.emit('lyricLinePlay', text, line) } // 我的列表改变事件 diff --git a/src/renderer/store/player/lyric.ts b/src/renderer/store/player/lyric.ts index 46c97388..9a213571 100644 --- a/src/renderer/store/player/lyric.ts +++ b/src/renderer/store/player/lyric.ts @@ -1,6 +1,6 @@ import { reactive } from '@common/utils/vueTools' -interface Line { +export interface Line { text: string time: number extendedLyrics: string[]