开放API 添加歌词翻译字段

pull/1869/head
lyswhut 2024-04-16 16:18:07 +08:00
parent c54b38a068
commit 32f47aaa34
8 changed files with 44 additions and 23 deletions

View File

@ -5,3 +5,11 @@
### 变更
- 设置-播放设置-优先播放320k音质选项改为“优先播放的音质”允许选择更高优先播放的音质如果歌曲及音源支持的话#1839
### 开放API变更
- `/status` 的入参现在与 `/subscribe-player-status` 保持一致
- `/status` 新增 `filter` 入参用于过滤返回的字段,并内置了默认值,与之前相比默认不再返回 `picUrl`
- `/status``/subscribe-player-status` 的可用字段名添加了 `lyricLineAllText`,它对应的值是当前句歌词及扩展歌词文本(扩展歌词包含翻译、罗马音等,按换行符分割)
详情看开放API接入文档

View File

@ -26,6 +26,7 @@ declare namespace LX {
duration: number
playbackRate: number
lyricLineText: string
lyricLineAllText: string
lyric: string
collect: boolean
}

View File

@ -244,6 +244,7 @@ export const initAppSetting = async() => {
duration: 0,
playbackRate: 1,
lyricLineText: '',
lyricLineAllText: '',
lyric: '',
collect: false,
},

View File

@ -14,13 +14,32 @@ type SubscribeKeys = keyof LX.Player.Status
let httpServer: http.Server
let sockets = new Set<Socket>()
let responses = new Map<http.ServerResponse<http.IncomingMessage>, 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<http.IncomingMessage>, query?: string) => {
const keys = parseFilter(querystring.parse(query ?? '').filter)
const resp: Partial<Record<SubscribeKeys, any>> = {}
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<http.IncomingMessage>, 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<void>((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')

View File

@ -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

View File

@ -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) => {

View File

@ -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)
}
// 我的列表改变事件

View File

@ -1,6 +1,6 @@
import { reactive } from '@common/utils/vueTools'
interface Line {
export interface Line {
text: string
time: number
extendedLyrics: string[]