From e61515414949d30a941bbf1471459d6b6f7be21e Mon Sep 17 00:00:00 2001 From: Megghy Date: Sun, 24 Dec 2023 17:57:23 +0800 Subject: [PATCH] add music request --- src/api/account.ts | 22 +- src/api/api-models.ts | 1 + src/data/constants.ts | 2 +- src/router/index.ts | 44 +- src/views/AboutView.vue | 1 + src/views/IndexView.vue | 9 +- src/views/ManageLayout.vue | 45 +- src/views/obs/MusicRequestOBS.vue | 308 +++++++++++++ src/views/open_live/MusicRequest.vue | 629 ++++++++++++++++++++++++++- src/views/open_live/SongRequest.vue | 4 +- 10 files changed, 1019 insertions(+), 46 deletions(-) create mode 100644 src/views/obs/MusicRequestOBS.vue diff --git a/src/api/account.ts b/src/api/account.ts index e11df27..3d03d03 100644 --- a/src/api/account.ts +++ b/src/api/account.ts @@ -98,25 +98,39 @@ export function downloadConfigDirect(name: string) { name: name, }) } -export async function downloadConfig(name: string) { +export async function DownloadConfig(name: string) { try { const resp = await QueryGetAPI(VTSURU_API_URL + 'get-config', { name: name, }) if (resp.code == 200) { console.log('已获取配置文件: ' + name) - return JSON.parse(resp.data) as T + return { + msg: undefined, + data: JSON.parse(resp.data) as T, + } } else if (resp.code == 404) { console.error(`未找到名为 ${name} 的配置文件`) + return { + msg: `未找到名为 ${name} 的配置文件, 需要先上传`, + data: undefined, + } } else { console.error(`无法获取配置文件 [${name}]: ` + resp.message) + return { + msg: `无法获取配置文件 [${name}]: ` + resp.message, + data: undefined, + } } } catch (err) { console.error(`无法获取配置文件 [${name}]: ` + err) + return { + msg: `无法获取配置文件 [${name}]: ` + err, + data: undefined, + } } - return null } -export async function uploadConfig(name: string, data: unknown) { +export async function UploadConfig(name: string, data: unknown) { try { const resp = await QueryPostAPI(VTSURU_API_URL + 'set-config', { name: name, diff --git a/src/api/api-models.ts b/src/api/api-models.ts index 7e90d88..7807dad 100644 --- a/src/api/api-models.ts +++ b/src/api/api-models.ts @@ -178,6 +178,7 @@ export enum SongFrom { Custom, Netease, FiveSing, + Kugou } export interface SongsInfo { id: number diff --git a/src/data/constants.ts b/src/data/constants.ts index 465f5c9..e5c5446 100644 --- a/src/data/constants.ts +++ b/src/data/constants.ts @@ -31,7 +31,7 @@ export const QUEUE_API_URL = { toString: () => `${BASE_API()}queue/` } export const EVENT_API_URL = { toString: () => `${BASE_API()}event/` } export const LIVE_API_URL = { toString: () => `${BASE_API()}live/` } export const FEEDBACK_API_URL = { toString: () => `${BASE_API()}feedback/` } -export const MUSIC_REQUEST_API_URL = { toString: () => `${BASE_API()}vtsuru/` } +export const MUSIC_REQUEST_API_URL = { toString: () => `${BASE_API()}music-request/` } export const VTSURU_API_URL = { toString: () => `${BASE_API()}vtsuru/` } export const ScheduleTemplateMap = { diff --git a/src/router/index.ts b/src/router/index.ts index 0a24a70..398a8ab 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -190,22 +190,12 @@ const routes: Array = [ danmaku: true, }, }, - { - path: 'song-request', - name: 'manage-songRequest', - component: () => import('@/views/open_live/MusicRequest.vue'), - meta: { - title: '弹幕点歌', - keepAlive: true, - danmaku: true, - }, - }, { path: 'queue', name: 'manage-liveQueue', component: () => import('@/views/open_live/OpenQueue.vue'), meta: { - title: '弹幕排队', + title: '排队', keepAlive: true, danmaku: true, }, @@ -220,6 +210,26 @@ const routes: Array = [ danmaku: true, }, }, + { + path: 'song-request', + name: 'manage-songRequest', + component: () => import('@/views/open_live/SongRequest.vue'), + meta: { + title: '点歌 (歌势', + keepAlive: true, + danmaku: true, + }, + }, + { + path: 'music-request', + name: 'manage-musicRequest', + component: () => import('@/views/open_live/MusicRequest.vue'), + meta: { + title: '点歌 (放歌', + keepAlive: true, + danmaku: true, + }, + }, { path: 'live', name: 'manage-live', @@ -270,7 +280,7 @@ const routes: Array = [ { path: 'song-request', name: 'open-live-song-request', - component: () => import('@/views/open_live/MusicRequest.vue'), + component: () => import('@/views/open_live/SongRequest.vue'), meta: { title: '点歌', }, @@ -310,7 +320,7 @@ const routes: Array = [ name: 'obs-song-request', component: () => import('@/views/obs/SongRequestOBS.vue'), meta: { - title: '弹幕点歌', + title: '弹幕点歌 (歌势', }, }, { @@ -321,6 +331,14 @@ const routes: Array = [ title: '弹幕排队', }, }, + { + path: 'music-request', + name: 'obs-music-request', + component: () => import('@/views/obs/MusicRequestOBS.vue'), + meta: { + title: '弹幕排队 (播放', + }, + }, ], }, { diff --git a/src/views/AboutView.vue b/src/views/AboutView.vue index 2c6e866..45a8801 100644 --- a/src/views/AboutView.vue +++ b/src/views/AboutView.vue @@ -35,6 +35,7 @@ import { NButton, NCard, NDivider, NLayoutContent, NSpace, NText, NTimeline, NTi 更新日志 + diff --git a/src/views/IndexView.vue b/src/views/IndexView.vue index 93ae333..0b949a2 100644 --- a/src/views/IndexView.vue +++ b/src/views/IndexView.vue @@ -44,8 +44,13 @@ const functions = [ icon: Lottery24Filled, }, { - name: '弹幕点歌', - desc: '可以让弹幕进行点歌!', + name: '弹幕点歌 (歌势)', + desc: '可以让弹幕进行点歌, 然后自己唱', + icon: ListCircle, + }, + { + name: '弹幕点歌 (点播)', + desc: '可以让弹幕进行点歌, 进行搜索后直接播放', icon: ListCircle, }, { diff --git a/src/views/ManageLayout.vue b/src/views/ManageLayout.vue index cb31641..295ca2c 100644 --- a/src/views/ManageLayout.vue +++ b/src/views/ManageLayout.vue @@ -294,18 +294,53 @@ const menuOptions = [ { label: () => h( - RouterLink, + NTooltip, + {}, { - to: { - name: 'manage-songRequest', - }, + trigger: () => + h( + RouterLink, + { + to: { + name: 'manage-songRequest', + }, + }, + { + default: () => '点歌(歌势', + }, + ), + default: () => '歌势用的, 观众点歌之后需要自己唱', }, - { default: () => '点歌' }, ), key: 'manage-songRequest', icon: renderIcon(MusicalNote), //disabled: accountInfo.value?.isEmailVerified == false, }, + { + label: () => + h( + NTooltip, + {}, + { + trigger: () => + h( + RouterLink, + { + to: { + name: 'manage-musicRequest', + }, + }, + { + default: () => '点歌(点播', + }, + ), + default: () => '就是传统的点歌机, 发弹幕后播放指定的歌曲', + }, + ), + key: 'manage-musicRequest', + icon: renderIcon(MusicalNote), + //disabled: accountInfo.value?.isEmailVerified == false, + }, { label: () => h( diff --git a/src/views/obs/MusicRequestOBS.vue b/src/views/obs/MusicRequestOBS.vue new file mode 100644 index 0000000..fdf1b76 --- /dev/null +++ b/src/views/obs/MusicRequestOBS.vue @@ -0,0 +1,308 @@ + + + + + diff --git a/src/views/open_live/MusicRequest.vue b/src/views/open_live/MusicRequest.vue index 888f8aa..cc163df 100644 --- a/src/views/open_live/MusicRequest.vue +++ b/src/views/open_live/MusicRequest.vue @@ -1,26 +1,91 @@ + + diff --git a/src/views/open_live/SongRequest.vue b/src/views/open_live/SongRequest.vue index 79e359f..7d300d5 100644 --- a/src/views/open_live/SongRequest.vue +++ b/src/views/open_live/SongRequest.vue @@ -320,7 +320,6 @@ async function updateSongStatus(song: SongRequestInfo, status: SongRequestStatus } function onGetDanmaku(danmaku: DanmakuInfo) { - console.log(danmaku) if (checkMessage(danmaku.msg)) { addSong({ msg: danmaku.msg, @@ -357,6 +356,9 @@ function onGetSC(danmaku: SCInfo) { } } function checkMessage(msg: string) { + if (accountInfo.value?.settings.enableFunctions.includes(FunctionTypes.SongRequest) != true) { + return false + } return msg .trim() .toLowerCase()