From 9691704da5e8d8eeda0765d8bfe377ad46f402a0 Mon Sep 17 00:00:00 2001 From: Megghy Date: Mon, 17 Nov 2025 18:27:14 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E5=8D=87=E7=BA=A7=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=E5=8C=85=E7=89=88=E6=9C=AC=E5=B9=B6=E6=B7=BB=E5=8A=A0=20EventF?= =?UTF-8?q?etcher=20=E5=8A=9F=E8=83=BD=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 升级核心依赖:@hyperdx/browser、@microsoft/signalr、@tauri-apps 系列插件、@vueuse 系列、vue、vue-router 等至最新版本 - 新增 obs-websocket-js 依赖用于 OBS 集成 - 添加 EventFetcher 功能总开关,支持完全禁用事件收集功能 - 优化弹幕客户端配置界面,增加功能说明和状态提示 - 改进首页布局,添加快速入口导航 - 在客户端布局中新增直播管理菜单项 --- bun.lockb | Bin 421051 -> 456990 bytes package.json | 69 +- src/auto-imports.d.ts | 2 + src/client/ClientFetcher.vue | 151 ++- src/client/ClientIndex.vue | 60 +- src/client/ClientLayout.vue | 8 +- src/client/ClientLiveManage.vue | 1636 +++++++++++++++++++++++++++++++ src/client/ClientSettings.vue | 42 + src/client/api/live-manage.ts | 582 +++++++++++ src/client/data/initialize.ts | 76 +- src/client/data/utils.ts | 20 +- src/client/store/useOBSStore.ts | 551 +++++++++++ src/client/store/useSettings.ts | 8 + src/components.d.ts | 94 +- src/data/UpdateNote.ts | 23 + src/data/obsConstants.ts | 2 +- src/router/client.ts | 9 + src/views/ManageLayout.vue | 4 + 18 files changed, 3260 insertions(+), 77 deletions(-) create mode 100644 src/client/ClientLiveManage.vue create mode 100644 src/client/api/live-manage.ts create mode 100644 src/client/store/useOBSStore.ts diff --git a/bun.lockb b/bun.lockb index af3dc6dda51b3ceb71e19c75d3761d51a14f5fa9..c245fb78b8dce7d45a6e4816da3fedf11b656cdc 100644 GIT binary patch delta 121489 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μE~ZOJL=g@jYq4 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 diff --git a/package.json b/package.json index a4bfbc5..5ad9497 100644 --- a/package.json +++ b/package.json @@ -11,29 +11,29 @@ "knip": "knip" }, "dependencies": { - "@hyperdx/browser": "^0.21.2", + "@hyperdx/browser": "^0.22.0", "@hyperdx/cli": "^0.1.0", - "@microsoft/signalr": "^9.0.6", - "@microsoft/signalr-protocol-msgpack": "^9.0.6", + "@microsoft/signalr": "^10.0.0", + "@microsoft/signalr-protocol-msgpack": "^10.0.0", "@mixer/postmessage-rpc": "^1.1.4", "@oneidentity/zstd-js": "^1.0.3", - "@tauri-apps/api": "^2.8.0", - "@tauri-apps/plugin-autostart": "^2.5.0", - "@tauri-apps/plugin-http": "^2.5.2", - "@tauri-apps/plugin-log": "^2.7.0", - "@tauri-apps/plugin-notification": "^2.3.1", - "@tauri-apps/plugin-opener": "^2.5.0", - "@tauri-apps/plugin-os": "^2.3.1", - "@tauri-apps/plugin-process": "^2.3.0", - "@tauri-apps/plugin-store": "^2.4.0", + "@tauri-apps/api": "^2.9.0", + "@tauri-apps/plugin-autostart": "^2.5.1", + "@tauri-apps/plugin-http": "^2.5.4", + "@tauri-apps/plugin-log": "^2.7.1", + "@tauri-apps/plugin-notification": "^2.3.3", + "@tauri-apps/plugin-opener": "^2.5.2", + "@tauri-apps/plugin-os": "^2.3.2", + "@tauri-apps/plugin-process": "^2.3.1", + "@tauri-apps/plugin-store": "^2.4.1", "@tauri-apps/plugin-updater": "^2.9.0", "@types/crypto-js": "^4.2.2", - "@types/md5": "^2.3.5", + "@types/md5": "^2.3.6", "@vicons/fluent": "^0.13.0", "@vitejs/plugin-vue": "^6.0.1", - "@vueuse/core": "^13.9.0", - "@vueuse/integrations": "^13.9.0", - "@vueuse/router": "^13.9.0", + "@vueuse/core": "^14.0.0", + "@vueuse/integrations": "^14.0.0", + "@vueuse/router": "^14.0.0", "@wangeditor/editor": "^5.1.23", "@wangeditor/editor-for-vue": "^5.1.12", "bilibili-live-danmaku": "^0.7.14", @@ -41,7 +41,7 @@ "date-fns": "^4.1.0", "easy-speech": "^2.4.0", "echarts": "^6.0.0", - "fast-xml-parser": "^5.2.5", + "fast-xml-parser": "^5.3.2", "file-saver": "^2.0.5", "grapheme-splitter": "^1.0.4", "html2canvas": "^1.4.1", @@ -52,24 +52,25 @@ "lodash-es": "^4.17.21", "md5": "^2.3.0", "mitt": "^3.0.1", - "monaco-editor": "^0.53.0", - "naive-ui": "2.42.0", + "monaco-editor": "^0.54.0", + "naive-ui": "2.43.2", "nanoid": "^5.1.6", + "obs-websocket-js": "^5.0.7", "peerjs": "^1.5.5", - "pinia": "^3.0.3", + "pinia": "^3.0.4", "qrcode.vue": "^3.6.0", "unplugin-auto-import": "^20.2.0", - "unplugin-vue-components": "^29.1.0", + "unplugin-vue-components": "^30.0.0", "unplugin-vue-markdown": "^29.2.0", "uuid": "^13.0.0", - "vite": "npm:rolldown-vite@latest", + "vite": "npm:rolldown-vite@7.2.5", "vite-plugin-monaco-editor-nls": "^3.0.1", "vite-svg-loader": "^5.1.0", - "vue": "3.5.22", - "vue-echarts": "^8.0.0", + "vue": "3.5.24", + "vue-echarts": "^8.0.1", "vue-img-cutter": "^3.0.7", "vue-request": "^2.0.4", - "vue-router": "^4.5.1", + "vue-router": "^4.6.3", "vue-toastification": "^1.7.14", "vue-turnstile": "^1.0.11", "vue3-aplayer": "^1.7.3", @@ -79,22 +80,22 @@ "xlsx": "^0.18.5" }, "devDependencies": { - "@antfu/eslint-config": "^5.4.1", - "@types/bun": "^1.2.23", + "@antfu/eslint-config": "^6.2.0", + "@types/bun": "^1.3.2", "@types/file-saver": "^2.0.7", "@types/jszip": "^3.4.1", "@types/uuid": "^11.0.0", "@vicons/ionicons5": "^0.13.0", "@vitejs/plugin-vue-jsx": "^5.1.1", - "@vue-vine/eslint-config": "^1.1.9", - "eslint": "^9.36.0", - "eslint-plugin-oxlint": "^1.19.0", - "oxlint": "^1.19.0", - "rollup-plugin-visualizer": "^6.0.4", + "@vue-vine/eslint-config": "^1.1.11", + "eslint": "^9.39.1", + "eslint-plugin-oxlint": "^1.28.0", + "oxlint": "^1.28.0", + "rollup-plugin-visualizer": "^6.0.5", "stylus": "^0.64.0", - "typescript": "^5.9.2", + "typescript": "^5.9.3", "vite-plugin-cdn-import": "^1.0.1", "vscode-loc": "git+https://github.com/microsoft/vscode-loc.git", - "vue-vine": "^1.7.6" + "vue-vine": "^1.7.23" } } diff --git a/src/auto-imports.d.ts b/src/auto-imports.d.ts index 9ff7970..d753e08 100644 --- a/src/auto-imports.d.ts +++ b/src/auto-imports.d.ts @@ -208,6 +208,7 @@ declare global { const lastDayOfYear: typeof import('date-fns')['lastDayOfYear'] const lightFormat: typeof import('date-fns')['lightFormat'] const makeDestructurable: typeof import('@vueuse/core')['makeDestructurable'] + const manualResetRef: typeof import('@vueuse/core')['manualResetRef'] const mapActions: typeof import('pinia')['mapActions'] const mapGetters: typeof import('pinia')['mapGetters'] const mapState: typeof import('pinia')['mapState'] @@ -282,6 +283,7 @@ declare global { const refAutoReset: typeof import('@vueuse/core')['refAutoReset'] const refDebounced: typeof import('@vueuse/core')['refDebounced'] const refDefault: typeof import('@vueuse/core')['refDefault'] + const refManualReset: typeof import('@vueuse/core')['refManualReset'] const refThrottled: typeof import('@vueuse/core')['refThrottled'] const refWithControl: typeof import('@vueuse/core')['refWithControl'] const resolveComponent: typeof import('vue')['resolveComponent'] diff --git a/src/client/ClientFetcher.vue b/src/client/ClientFetcher.vue index 71f5a6f..1be6df7 100644 --- a/src/client/ClientFetcher.vue +++ b/src/client/ClientFetcher.vue @@ -71,6 +71,7 @@ import { NRadioGroup, NSpin, NStatistic, + NSwitch, NTabPane, NTabs, NTag, @@ -85,7 +86,7 @@ import { useAccount } from '@/api/account' import { useWebFetcher } from '@/store/useWebFetcher' import { getLoginInfoAsync, getLoginUrlDataAsync } from './data/biliLogin' import { currentStatistic, getHistoricalStatistics, streamingInfo } from './data/info' -import { callStartDanmakuClient } from './data/initialize' +import { callStartDanmakuClient, resetDanmakuClientInitState } from './data/initialize' import { COOKIE_CLOUD_KEY, useBiliCookie } from './store/useBiliCookie' import { useSettings } from './store/useSettings' import { useTauriStore } from './store/useTauriStore' @@ -607,6 +608,30 @@ async function logout() { message.info('已退出登录') } +// 处理 EventFetcher 开关切换 +async function handleToggleEventFetcher(enabled: boolean) { + await settings.save() + + if (enabled) { + // 启用 EventFetcher + message.info('正在启动 EventFetcher...') + const result = await callStartDanmakuClient() + if (result.success) { + message.success('EventFetcher 已启动') + } else { + message.error(`EventFetcher 启动失败: ${result.message}`) + } + } else { + // 禁用 EventFetcher + if (webfetcher.state !== 'disconnected') { + webfetcher.Stop() + message.info('EventFetcher 已停止') + } + // 重置弹幕客户端初始化状态,确保重新启用时能正确连接 + resetDanmakuClientInitState() + } +} + // --- Watchers --- watch(() => webfetcher.state, (newState) => { if (newState === 'connected') { @@ -727,33 +752,101 @@ onUnmounted(() => { embedded style="width: 100%; max-width: 800px;" > - - - - 开放平台 - - + +
+ - -
diff --git a/src/client/api/live-manage.ts b/src/client/api/live-manage.ts new file mode 100644 index 0000000..a94d55a --- /dev/null +++ b/src/client/api/live-manage.ts @@ -0,0 +1,582 @@ +import { QueryBiliAPI } from '../data/utils' +import { useBiliCookie } from '../store/useBiliCookie' +import CryptoJS from 'crypto-js' +import { fetch as tauriFetch } from '@tauri-apps/plugin-http' + +/** + * 直播姬版本信息 + */ +export interface LiveVersionInfo { + curr_version: string // 直播姬最新版本号 + build: number // 直播姬构建号 + instruction: string // 更新说明(简要) + file_size: string // 文件大小(字节) + file_md5: string // 安装包文件MD5 + content: string // HTML格式的更新内容 + download_url: string // 安装包下载链接 + hdiffpatch_switch: number // 增量更新开关 +} + +/** + * MD5 哈希实现 - 使用 crypto-js + */ +function md5(str: string): string { + return CryptoJS.MD5(str).toString() +} + +/** + * APP签名函数 - 用于B站API签名 + * @param params 已包含appkey的参数字典 + * @param appsec app secret密钥 + */ +function appSign(params: Record, appsec: string): Record { + // 按 key 排序参数 + const sortedKeys = Object.keys(params).sort() + const sortedParams: Record = {} + sortedKeys.forEach(key => { + sortedParams[key] = params[key] + }) + + // 序列化参数为 key=value&key=value 格式 + const queryString = sortedKeys.map(key => `${key}=${params[key]}`).join('&') + + // 计算 MD5 签名 + const signString = queryString + appsec + const sign = md5(signString) + + console.log('签名字符串:', signString) + console.log('签名结果:', sign) + + // 添加签名 + sortedParams.sign = sign + + return sortedParams +} + +/** + * 获取当前时间戳 + */ +async function getTimestamp(): Promise { + try { + const resp = await QueryBiliAPI( + 'https://api.bilibili.com/x/report/click/now', + 'GET', + '', + false, + ) + const json = await resp.json() + if (json.code === 0 && json.data?.now) { + return json.data.now + } + } + catch (err) { + console.error('获取服务器时间戳失败,使用本地时间:', err) + } + return Math.floor(Date.now() / 1000) +} + +/** + * 获取直播姬版本号 + */ +export async function getLiveVersion(): Promise { + try { + console.log('正在获取直播姬版本号') + const appkey = 'aae92bc66f3edfab' + const appsec = 'af125a0d5279fd576c1b4418a3e8276d' + + const ts = await getTimestamp() + + // 准备参数并签名 + const params = appSign({ + appkey: appkey, + system_version: 2, + ts, + }, appsec) + + const query = new URLSearchParams() + Object.entries(params).forEach(([key, value]) => { + query.append(key, String(value)) + }) + + const resp = await QueryBiliAPI( + `https://api.live.bilibili.com/xlive/app-blink/v1/liveVersionInfo/getHomePageLiveVersion?${query.toString()}`, + 'GET', + '', + false, + ) + const json = await resp.json() + + if (json.code === 0 && json.data) { + console.log('获取直播姬版本成功:', json.data.curr_version, 'build:', json.data.build) + return json.data + } + + return null + } + catch (err) { + console.error('获取直播姬版本失败:', err) + return null + } +} + +/** + * 直播间管理API + */ + +/** + * 开始直播 + * @param roomId 直播间ID + * @param areaV2 直播分区ID(子分区ID) + * @param platform 直播平台 pc | pc_link | android_link + * @param version 直播姬版本号(可选) + * @param build 直播姬构建号(可选) + */ +export interface StartLiveParams { + roomId: number + areaV2: number + platform?: 'pc' | 'pc_link' | 'android_link' + version?: string + build?: number +} + +export interface StartLiveResponse { + code: number + msg: string + message: string + data?: { + change: number + status: string + room_type: number + rtmp: { + addr: string // RTMP推流地址 + code: string // RTMP推流参数(密钥) + new_link: string + provider: string + } + protocols: Array<{ + protocol: string + addr: string + code: string + new_link: string + provider: string + }> + try_time: string + live_key: string + sub_session_key: string + notice: any + qr?: string // 人脸认证二维码 + need_face_auth: boolean + service_source: string + rtmp_backup: any + up_stream_extra: { + isp: string + } + } +} + +// 开播错误码 +export enum StartLiveErrorCode { + SUCCESS = 0, + NEED_FACE_AUTH = 60024, // 需要人脸认证 +} + +/** + * 开始直播 + */ +export async function startLive(params: StartLiveParams): Promise { + const biliCookieStore = useBiliCookie() + const cookie = await biliCookieStore.getBiliCookie() + + console.log('正在开始直播: ', params) + + if (!cookie) { + throw new Error('未登录或Cookie无效') + } + + // 从cookie中提取bili_jct作为csrf + const csrfMatch = cookie.match(/bili_jct=([^;]+)/) + const csrf = csrfMatch ? csrfMatch[1] : '' + + if (!csrf) { + throw new Error('无法获取CSRF令牌') + } + + // 准备参数 + const appkey = 'aae92bc66f3edfab' + const appsec = 'af125a0d5279fd576c1b4418a3e8276d' + + // 获取时间戳 + const ts = await getTimestamp() + + const requestParams: Record = { + access_key: '', // 留空 + appkey: appkey, + platform: params.platform || 'pc_link', + room_id: params.roomId, + area_v2: params.areaV2, + build: params.build?.toString() || '9343', + backup_stream: 0, + csrf: csrf, + csrf_token: csrf, + ts: ts.toString(), + } + + // 对参数按字典序排序并签名 + const signedParams = appSign(requestParams, appsec) + + console.log('已对参数进行签名') + console.log('开播请求参数:', signedParams) + + // 将参数作为URL查询字符串,而不是POST body + const query = new URLSearchParams() + Object.entries(signedParams).forEach(([key, value]) => { + query.append(key, String(value)) + }) + + const resp = await QueryBiliAPI( + `https://api.live.bilibili.com/room/v1/Room/startLive?${query.toString()}`, + 'POST', + cookie, + true, + ) + + const json = await resp.json() + console.log('开播响应:', json) + return json as StartLiveResponse +} + +/** + * 关闭直播 + */ +export interface StopLiveParams { + roomId: number + platform?: 'pc' | 'pc_link' | 'android_link' +} + +export interface StopLiveResponse { + code: number + msg: string + message: string + data?: { + change: number + status: string + } +} + +/** + * 关闭直播 + */ +export async function stopLive(params: StopLiveParams): Promise { + const biliCookieStore = useBiliCookie() + const cookie = await biliCookieStore.getBiliCookie() + + if (!cookie) { + throw new Error('未登录或Cookie无效') + } + + const csrfMatch = cookie.match(/bili_jct=([^;]+)/) + const csrf = csrfMatch ? csrfMatch[1] : '' + + if (!csrf) { + throw new Error('无法获取CSRF令牌') + } + + const formData = new URLSearchParams() + formData.append('platform', params.platform || 'pc_link') + formData.append('room_id', params.roomId.toString()) + formData.append('csrf', csrf) + + const resp = await QueryBiliAPI( + 'https://api.live.bilibili.com/room/v1/Room/stopLive', + 'POST', + cookie, + true, + formData, + ) + + const json = await resp.json() + return json as StopLiveResponse +} + +/** + * 更新直播间信息 + */ +export interface UpdateRoomParams { + roomId: number + title?: string + areaId?: number + addTag?: string + delTag?: string +} + +export interface UpdateRoomResponse { + code: number + msg: string + message: string + data?: { + sub_session_key: string + audit_info: { + audit_title_reason: string + audit_title_status: number + audit_title?: string + update_title: string + } + } +} + +/** + * 更新直播间信息 + */ +export async function updateRoom(params: UpdateRoomParams): Promise { + const biliCookieStore = useBiliCookie() + const cookie = await biliCookieStore.getBiliCookie() + + if (!cookie) { + throw new Error('未登录或Cookie无效') + } + + const csrfMatch = cookie.match(/bili_jct=([^;]+)/) + const csrf = csrfMatch ? csrfMatch[1] : '' + + if (!csrf) { + throw new Error('无法获取CSRF令牌') + } + + const formData = new URLSearchParams() + formData.append('room_id', params.roomId.toString()) + formData.append('csrf', csrf) + formData.append('csrf_token', csrf) + + if (params.title !== undefined) { + formData.append('title', params.title) + } + if (params.areaId !== undefined) { + formData.append('area_id', params.areaId.toString()) + } + if (params.addTag !== undefined) { + formData.append('add_tag', params.addTag) + } + if (params.delTag !== undefined) { + formData.append('del_tag', params.delTag) + } + + const resp = await QueryBiliAPI( + 'https://api.live.bilibili.com/room/v1/Room/update', + 'POST', + cookie, + true, + formData, + ) + + const json = await resp.json() + return json as UpdateRoomResponse +} + +/** + * 获取直播分区列表 + */ +export interface LiveArea { + id: number + name: string + parent_id: number + parent_name: string +} + +export async function getLiveAreas(): Promise { + const resp = await QueryBiliAPI('https://api.live.bilibili.com/room/v1/Area/getList', 'GET', '', false) + const json = await resp.json() + + if (json.code === 0 && json.data) { + const areas: LiveArea[] = [] + for (const parent of json.data) { + for (const child of parent.list) { + areas.push({ + id: child.id, + name: child.name, + parent_id: parent.id, + parent_name: parent.name, + }) + } + } + return areas + } + + throw new Error('获取直播分区失败') +} + +export interface UpdateRoomNewsParams { + roomId: number + content: string +} + +export interface UpdateRoomNewsResponse { + code: number + message: string + data: any + ttl?: number +} + +export async function updateRoomNews(params: UpdateRoomNewsParams): Promise { + const biliCookieStore = useBiliCookie() + const cookie = await biliCookieStore.getBiliCookie() + + if (!cookie) { + throw new Error('未登录或Cookie无效') + } + + const csrfMatch = cookie.match(/bili_jct=([^;]+)/) + const csrf = csrfMatch ? csrfMatch[1] : '' + + const uidMatch = cookie.match(/DedeUserID=([^;]+)/) + const uid = uidMatch ? uidMatch[1] : '' + + if (!csrf || !uid) { + throw new Error('无法获取CSRF令牌或用户ID') + } + + const formData = new URLSearchParams() + formData.append('room_id', params.roomId.toString()) + formData.append('uid', uid) + formData.append('content', params.content ?? '') + formData.append('csrf', csrf) + formData.append('csrf_token', csrf) + + const resp = await QueryBiliAPI( + 'https://api.live.bilibili.com/xlive/app-blink/v1/index/updateRoomNews', + 'POST', + cookie, + true, + formData, + ) + + const json = await resp.json() + return json as UpdateRoomNewsResponse +} + +export interface UploadCoverResult { + location: string + etag?: string + image_url?: string +} + +export interface UploadCoverResponse { + code: number + message: string + data?: UploadCoverResult +} + +export async function uploadCover(file: File): Promise { + const biliCookieStore = useBiliCookie() + const cookie = await biliCookieStore.getBiliCookie() + + if (!cookie) { + throw new Error('未登录或Cookie无效') + } + + const csrfMatch = cookie.match(/bili_jct=([^;]+)/) + const csrf = csrfMatch ? csrfMatch[1] : '' + + if (!csrf) { + throw new Error('无法获取CSRF令牌') + } + + const apiUrl = 'https://api.bilibili.com/x/upload/web/image' + const boundary = '----WebKitFormBoundary' + Math.random().toString(16).slice(2) + + const encoder = new TextEncoder() + + const parts: string[] = [] + parts.push( + `--${boundary}\r\n` + + 'Content-Disposition: form-data; name="bucket"\r\n\r\n' + + 'live\r\n', + ) + parts.push( + `--${boundary}\r\n` + + 'Content-Disposition: form-data; name="dir"\r\n\r\n' + + 'new_room_cover\r\n', + ) + parts.push( + `--${boundary}\r\n` + + 'Content-Disposition: form-data; name="csrf"\r\n\r\n' + + `${csrf}\r\n`, + ) + parts.push( + `--${boundary}\r\n` + + `Content-Disposition: form-data; name="file"; filename="${file.name || 'blob'}"\r\n` + + `Content-Type: ${file.type || 'image/jpeg'}\r\n\r\n`, + ) + + const headBytes = encoder.encode(parts.join('')) + const fileBytes = new Uint8Array(await file.arrayBuffer()) + const tailBytes = encoder.encode(`\r\n--${boundary}--\r\n`) + + const body = new Uint8Array(headBytes.length + fileBytes.length + tailBytes.length) + body.set(headBytes, 0) + body.set(fileBytes, headBytes.length) + body.set(tailBytes, headBytes.length + fileBytes.length) + + const headers: Record = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0', + 'Origin': 'https://www.bilibili.com', + 'Referer': 'https://live.bilibili.com/', + 'Cookie': cookie, + 'Content-Type': `multipart/form-data; boundary=${boundary}`, + } + + const resp = await tauriFetch(apiUrl, { + method: 'POST', + headers, + body, + }) + + if (!resp.ok) { + throw new Error(`上传封面失败: HTTP ${resp.status} ${resp.statusText}`) + } + + const json = await resp.json() + return json as UploadCoverResponse +} + +export interface UpdateCoverResponse { + code: number + message: string + data?: any +} + +export async function updateCover(coverUrl: string): Promise { + const biliCookieStore = useBiliCookie() + const cookie = await biliCookieStore.getBiliCookie() + + if (!cookie) { + throw new Error('未登录或Cookie无效') + } + + const csrfMatch = cookie.match(/bili_jct=([^;]+)/) + const csrf = csrfMatch ? csrfMatch[1] : '' + + if (!csrf) { + throw new Error('无法获取CSRF令牌') + } + + const formData = new URLSearchParams() + formData.append('platform', 'web') + formData.append('mobi_app', 'web') + formData.append('build', '1') + formData.append('cover', coverUrl) + formData.append('coverVertical', '') + formData.append('liveDirectionType', '1') + formData.append('csrf', csrf) + formData.append('csrf_token', csrf) + + const resp = await QueryBiliAPI( + 'https://api.live.bilibili.com/xlive/app-blink/v1/preLive/UpdatePreLiveInfo', + 'POST', + cookie, + true, + formData, + ) + + const json = await resp.json() + return json as UpdateCoverResponse +} diff --git a/src/client/data/initialize.ts b/src/client/data/initialize.ts index c054e24..c894d75 100644 --- a/src/client/data/initialize.ts +++ b/src/client/data/initialize.ts @@ -14,7 +14,7 @@ import { import { openUrl } from '@tauri-apps/plugin-opener' import { relaunch } from '@tauri-apps/plugin-process' import { check } from '@tauri-apps/plugin-updater' -import { h, ref } from 'vue' +import { h, ref, watch } from 'vue' import { isLoggedIn, useAccount } from '@/api/account' import { CN_HOST, isDev } from '@/data/constants' import { useWebFetcher } from '@/store/useWebFetcher' @@ -23,8 +23,9 @@ import { useBiliCookie } from '../store/useBiliCookie' import { useBiliFunction } from '../store/useBiliFunction' import { useDanmakuWindow } from '../store/useDanmakuWindow' import { useSettings } from '../store/useSettings' -import { initInfo } from './info' +import { initInfo, roomInfo } from './info' import { getBuvid, getRoomKey } from './utils' +import { useTauriStore } from '../store/useTauriStore' const accountInfo = useAccount() @@ -35,6 +36,14 @@ let heartbeatTimer: number | null = null let updateCheckTimer: number | null = null let updateNotificationRef: any = null +// interface RtmpRelayState { +// roomId: number +// targetRtmpUrl: string +// } + +// const RTMP_RELAY_STATE_KEY = 'webfetcher.rtmpRelay' +// let hasTriedAutoResumeRtmp = false + async function sendHeartbeat() { try { await invoke('heartbeat', undefined, { @@ -45,6 +54,49 @@ async function sendHeartbeat() { } } +// async function tryAutoResumeRtmpRelay() { +// if (hasTriedAutoResumeRtmp) return +// +// const store = useTauriStore() +// const saved = await store.get(RTMP_RELAY_STATE_KEY) +// if (!saved || !saved.roomId || !saved.targetRtmpUrl) { +// hasTriedAutoResumeRtmp = true +// return +// } +// +// const room = roomInfo.value +// if (!room || room.live_status !== 1) { +// return +// } +// +// if (room.room_id !== saved.roomId) { +// hasTriedAutoResumeRtmp = true +// return +// } +// +// try { +// // 如果已经在进行 RTMP 转发,则不再重复启动 +// try { +// const status = await invoke<{ is_relaying: boolean }>('get_rtmp_relay_status') +// if (status?.is_relaying) { +// info('[RTMP] 已在转发中,跳过自动恢复') +// hasTriedAutoResumeRtmp = true +// return +// } +// } +// catch (error) { +// warn(`[RTMP] 获取 RTMP 转发状态失败: ${error}`) +// } +// +// await invoke('start_rtmp_relay', { targetUrl: saved.targetRtmpUrl }) +// info('[RTMP] 检测到正在开播,已自动恢复 RTMP 转发') +// } catch (error) { +// warn(`[RTMP] 自动恢复 RTMP 转发失败: ${error}`) +// } finally { +// hasTriedAutoResumeRtmp = true +// } +// } + export function startHeartbeat() { // 立即发送一次,确保后端在加载后快速收到心跳 void sendHeartbeat() @@ -379,6 +431,12 @@ export async function initAll(isOnBoot: boolean) { startUpdateCheck() } + // void tryAutoResumeRtmpRelay() + + // watch(roomInfo, () => { + // void tryAutoResumeRtmpRelay() + // }) + clientInited.value = true clientInitStage.value = '启动完成' } @@ -400,6 +458,13 @@ export async function checkUpdate() { export const isInitedDanmakuClient = ref(false) export const isInitingDanmakuClient = ref(false) + +// 重置弹幕客户端初始化状态 +export function resetDanmakuClientInitState() { + isInitedDanmakuClient.value = false + isInitingDanmakuClient.value = false + info('弹幕客户端初始化状态已重置') +} export async function initDanmakuClient() { const biliCookie = useBiliCookie() const settings = useSettings() @@ -407,6 +472,13 @@ export async function initDanmakuClient() { info('弹幕客户端已初始化, 跳过初始化') return { success: true, message: '' } } + + // 检查是否启用 EventFetcher + if (!settings.settings.enableEventFetcher) { + info('EventFetcher 功能已禁用, 跳过弹幕客户端初始化') + return { success: true, message: 'EventFetcher 已禁用' } + } + isInitingDanmakuClient.value = true console.log(settings.settings) let result = { success: false, message: '' } diff --git a/src/client/data/utils.ts b/src/client/data/utils.ts index 636d91b..5d63280 100644 --- a/src/client/data/utils.ts +++ b/src/client/data/utils.ts @@ -5,7 +5,7 @@ import { OPEN_LIVE_API_URL } from '@/data/constants' import { useBiliCookie } from '../store/useBiliCookie' import { useBiliFunction } from '../store/useBiliFunction' -export async function QueryBiliAPI(url: string, method: string = 'GET', cookie: string = '', useCookie: boolean = true) { +export async function QueryBiliAPI(url: string, method: string = 'GET', cookie: string = '', useCookie: boolean = true, body?: string | URLSearchParams) { const u = new URL(url) console.log(`调用bilibili api: ${url}`) const userAgents = [ @@ -17,13 +17,21 @@ export async function QueryBiliAPI(url: string, method: string = 'GET', cookie: ] const randomUserAgent = userAgents[Math.floor(Math.random() * userAgents.length)] + const headers: Record = { + 'User-Agent': randomUserAgent, + 'Origin': 'https://www.bilibili.com', + 'Referer': 'https://live.bilibili.com/', + 'Cookie': useCookie ? (cookie || (await useBiliCookie().getBiliCookie()) || '') : '', + } + + if (body) { + headers['Content-Type'] = 'application/x-www-form-urlencoded' + } + return fetch(url, { method, - headers: { - 'User-Agent': randomUserAgent, - 'Origin': 'https://www.bilibili.com', - 'Cookie': useCookie ? (cookie || (await useBiliCookie().getBiliCookie()) || '') : '', - }, + headers, + body: body instanceof URLSearchParams ? body.toString() : body, }) } diff --git a/src/client/store/useOBSStore.ts b/src/client/store/useOBSStore.ts new file mode 100644 index 0000000..050742b --- /dev/null +++ b/src/client/store/useOBSStore.ts @@ -0,0 +1,551 @@ +import { acceptHMRUpdate, defineStore } from 'pinia' +import { ref } from 'vue' +import OBSWebSocket from 'obs-websocket-js' +import { useTauriStore } from './useTauriStore' + +// OBS配置接口 +export interface ObsConfigState { + address: string + password?: string +} + +// 场景配置接口 +export interface ObsSceneConfig { + startScene?: string // 开播场景 + stopScene?: string // 下播场景 + waitingScene?: string // 等待场景 + autoSwitchEnabled: boolean // 是否启用自动切换 + autoToggleStream: boolean // 是否在开播下播后自动切换OBS推流状态 +} + +// OBS统计信息接口 +export interface ObsStats { + cpuUsage: number | null + memoryUsage: number | null + fps: number | null + averageRenderTimeMs: number | null + renderSkippedFrames: number | null + renderTotalFrames: number | null + outputSkippedFrames: number | null + outputTotalFrames: number | null + bitrateKbps: number | null +} + +export const useOBSStore = defineStore('obs', () => { + // 基础配置 + const OBS_CONFIG_KEY = 'webfetcher.obsConfig' + const OBS_SCENE_CONFIG_KEY = 'webfetcher.obsSceneConfig' + const tauriStore = useTauriStore() + + // 连接状态 + const obsAddress = ref('ws://127.0.0.1:4455') + const obsPassword = ref('') + const obsConnected = ref(false) + const obsConnecting = ref(false) + const obsError = ref('') + const obsAutoReconnect = ref(false) + + // 推流状态 + const obsStreamActive = ref(false) + const obsStreamReconnecting = ref(false) + const isTogglingObsStream = ref(false) + + // 统计信息 + const obsStats = ref({ + cpuUsage: null, + memoryUsage: null, + fps: null, + averageRenderTimeMs: null, + renderSkippedFrames: null, + renderTotalFrames: null, + outputSkippedFrames: null, + outputTotalFrames: null, + bitrateKbps: null, + }) + + // 场景控制 + const obsScenes = ref([]) + const currentObsScene = ref('') + const isSwitchingScene = ref(false) + const obsSceneError = ref('') + const obsSceneConfig = ref({ + autoSwitchEnabled: false, + autoToggleStream: true // 默认开启 + }) + + // OBS实例和定时器 + let obs: OBSWebSocket | null = null + let obsStatsTimer: number | null = null + let obsReconnectTimer: number | null = null + let lastObsBytes = 0 + let lastObsBytesTimestamp = 0 + + // 初始化OBS实例 + function ensureObsInstance() { + if (!obs) { + obs = new OBSWebSocket() + obs.on('ConnectionClosed', () => { + obsConnected.value = false + obsStreamActive.value = false + stopObsStatsLoop() + }) + } + } + + // 更新OBS统计信息 + async function updateObsStats() { + if (!obs || !obsConnected.value) return + + try { + const stats: any = await obs.call('GetStats') + obsStats.value.cpuUsage = typeof stats.cpuUsage === 'number' ? stats.cpuUsage : null + obsStats.value.memoryUsage = typeof stats.memoryUsage === 'number' ? stats.memoryUsage : null + obsStats.value.fps = typeof stats.activeFps === 'number' ? stats.activeFps : null + obsStats.value.averageRenderTimeMs = typeof stats.averageFrameRenderTime === 'number' ? stats.averageFrameRenderTime : null + obsStats.value.renderSkippedFrames = typeof stats.renderSkippedFrames === 'number' ? stats.renderSkippedFrames : null + obsStats.value.renderTotalFrames = typeof stats.renderTotalFrames === 'number' ? stats.renderTotalFrames : null + obsStats.value.outputSkippedFrames = typeof stats.outputSkippedFrames === 'number' ? stats.outputSkippedFrames : null + obsStats.value.outputTotalFrames = typeof stats.outputTotalFrames === 'number' ? stats.outputTotalFrames : null + + const streamStatus: any = await obs.call('GetStreamStatus') + obsStreamActive.value = !!streamStatus.outputActive + obsStreamReconnecting.value = !!streamStatus.outputReconnecting + + // 计算码率 + const now = Date.now() + const bytes = typeof streamStatus.outputBytes === 'number' ? streamStatus.outputBytes : 0 + if (lastObsBytesTimestamp && now > lastObsBytesTimestamp && bytes >= lastObsBytes) { + const deltaBytes = bytes - lastObsBytes + const deltaSeconds = (now - lastObsBytesTimestamp) / 1000 + if (deltaSeconds > 0) { + const kbps = (deltaBytes * 8) / 1000 / deltaSeconds + obsStats.value.bitrateKbps = Number.isFinite(kbps) ? kbps : null + } + } + lastObsBytes = bytes + lastObsBytesTimestamp = now + + // 获取当前场景 + await updateCurrentScene() + } + catch (err) { + console.error('获取 OBS 统计失败:', err) + } + } + + // 启动统计循环 + function startObsStatsLoop() { + if (obsStatsTimer !== null) return + obsStatsTimer = window.setInterval(() => { + void updateObsStats() + }, 1000) + } + + // 停止统计循环 + function stopObsStatsLoop() { + if (obsStatsTimer !== null) { + clearInterval(obsStatsTimer) + obsStatsTimer = null + } + } + + // 启动自动重连循环 + function startObsAutoReconnectLoop() { + if (obsReconnectTimer !== null) return + + // 如果当前条件满足,立即尝试连接一次 + if (obsAutoReconnect.value && + obsAddress.value && + obsPassword.value && + !obsConnected.value && + !obsConnecting.value) { + void handleObsConnect() + } + + // 启动定时重连循环 + obsReconnectTimer = window.setInterval(() => { + if (!obsAutoReconnect.value) return + if (!obsAddress.value) return + if (obsConnected.value || obsConnecting.value) return + // 确保地址和密码都已设置才尝试连接 + if (!obsPassword.value) return + void handleObsConnect() + }, 10000) + } + + // 停止自动重连循环 + function stopObsAutoReconnectLoop() { + if (obsReconnectTimer !== null) { + clearInterval(obsReconnectTimer) + obsReconnectTimer = null + } + } + + // 连接OBS + async function handleObsConnect() { + console.log('handleObsConnect called') + console.log('obsConnected:', obsConnected.value, 'obsConnecting:', obsConnecting.value) + + if (obsConnected.value || obsConnecting.value) { + console.log('Early return: already connected or connecting') + return + } + + console.log('Starting OBS connection process...') + obsError.value = '' + obsConnecting.value = true + + try { + ensureObsInstance() + if (!obs) { + throw new Error('OBS 实例未初始化') + } + + const address = obsAddress.value || 'ws://127.0.0.1:4455' + const password = obsPassword.value || undefined + + await obs.connect(address, password, { + rpcVersion: 1, + }) + + obsConnected.value = true + obsConnecting.value = false + obsAutoReconnect.value = true + startObsAutoReconnectLoop() + + // 保存配置 + try { + await tauriStore.set(OBS_CONFIG_KEY, { + address, + password: obsPassword.value || undefined, + } as ObsConfigState) + } + catch (err) { + console.error('保存 OBS 配置失败:', err) + } + + startObsStatsLoop() + void updateObsStats() + + // 连接成功后获取场景列表 + void fetchObsScenes() + } + catch (err: any) { + console.error('连接 OBS 失败:', err) + obsError.value = err?.message || String(err) + obsConnected.value = false + obsConnecting.value = false + } + } + + // 断开OBS连接 + async function handleObsDisconnect() { + obsError.value = '' + obsAutoReconnect.value = false + stopObsStatsLoop() + stopObsAutoReconnectLoop() + + try { + if (obs) { + await obs.disconnect() + } + } + catch (err) { + console.error('断开 OBS 失败:', err) + } + finally { + obsConnected.value = false + obsStreamActive.value = false + } + } + + // 切换推流状态 + async function handleObsToggleStream() { + if (!obs || !obsConnected.value) { + window.$message.error('请先连接 OBS') + return + } + + try { + isTogglingObsStream.value = true + const result: any = await obs.call('ToggleStream') + if (typeof result?.outputActive === 'boolean') { + obsStreamActive.value = result.outputActive + } + window.$message.success(obsStreamActive.value ? '已开始 OBS 推流' : '已停止 OBS 推流') + void updateObsStats() + } + catch (err: any) { + console.error('切换 OBS 推流状态失败:', err) + window.$message.error(`切换 OBS 推流状态失败: ${err?.message || err}`) + } + finally { + isTogglingObsStream.value = false + } + } + + // 开始推流 + async function startObsStream() { + if (!obs || !obsConnected.value) { + console.warn('OBS 未连接,无法开始推流') + return false + } + + if (obsStreamActive.value) { + console.log('OBS 已在推流中') + return true + } + + try { + isTogglingObsStream.value = true + await obs.call('StartStream') + obsStreamActive.value = true + window.$message.success('已开始 OBS 推流') + void updateObsStats() + return true + } + catch (err: any) { + console.error('开始 OBS 推流失败:', err) + window.$message.error(`开始 OBS 推流失败: ${err?.message || err}`) + return false + } + finally { + isTogglingObsStream.value = false + } + } + + // 停止推流 + async function stopObsStream() { + if (!obs || !obsConnected.value) { + console.warn('OBS 未连接,无法停止推流') + return false + } + + if (!obsStreamActive.value) { + console.log('OBS 未在推流中') + return true + } + + try { + isTogglingObsStream.value = true + await obs.call('StopStream') + obsStreamActive.value = false + window.$message.success('已停止 OBS 推流') + void updateObsStats() + return true + } + catch (err: any) { + console.error('停止 OBS 推流失败:', err) + window.$message.error(`停止 OBS 推流失败: ${err?.message || err}`) + return false + } + finally { + isTogglingObsStream.value = false + } + } + + // 同步推流码到 OBS + async function syncStreamKeyToObs(server: string, key: string) { + if (!obs || !obsConnected.value) { + window.$message.error('请先连接 OBS') + return false + } + + try { + // 获取当前的流设置 + const streamSettings: any = await obs.call('GetStreamServiceSettings') + + // 更新服务器和推流码 + await obs.call('SetStreamServiceSettings', { + streamServiceType: streamSettings.streamServiceType || 'rtmp_custom', + streamServiceSettings: { + ...streamSettings.streamServiceSettings, + server: server, + key: key + } + }) + + window.$message.success('推流码已同步到 OBS') + return true + } + catch (err: any) { + console.error('同步推流码到 OBS 失败:', err) + window.$message.error(`同步推流码失败: ${err?.message || err}`) + return false + } + } + + // 获取OBS场景列表 + async function fetchObsScenes() { + if (!obs || !obsConnected.value) return + + try { + const sceneList: any = await obs.call('GetSceneList') + obsScenes.value = sceneList.scenes.map((scene: any) => scene.sceneName as string) + console.log('获取到OBS场景列表:', obsScenes.value) + } + catch (err: any) { + console.error('获取OBS场景列表失败:', err) + obsSceneError.value = err?.message || '获取场景列表失败' + } + } + + // 更新当前场景 + async function updateCurrentScene() { + if (!obs || !obsConnected.value) return + + try { + const currentScene: any = await obs.call('GetCurrentProgramScene') + currentObsScene.value = currentScene.currentProgramSceneName || '' + } + catch (err: any) { + console.error('获取当前场景失败:', err) + } + } + + // 切换到指定场景 + async function switchToScene(sceneName: string): Promise { + if (!obs || !obsConnected.value) { + window.$message.error('OBS未连接') + return false + } + + if (!sceneName || !obsScenes.value.includes(sceneName)) { + window.$message.error('无效的场景名称') + return false + } + + // 防止重复切换到相同场景 + if (currentObsScene.value === sceneName) { + console.log(`已在场景: ${sceneName},无需切换`) + return true + } + + try { + isSwitchingScene.value = true + obsSceneError.value = '' + + await obs.call('SetCurrentProgramScene', { + sceneName: sceneName + }) + + currentObsScene.value = sceneName + console.log(`已切换到场景: ${sceneName}`) + window.$message.success(`已切换到场景: ${sceneName}`) + return true + } + catch (err: any) { + console.error('切换场景失败:', err) + obsSceneError.value = err?.message || '切换场景失败' + window.$message.error(`切换场景失败: ${err?.message || err}`) + return false + } + finally { + isSwitchingScene.value = false + } + } + + // 保存场景配置 + async function saveSceneConfig() { + try { + await tauriStore.set(OBS_SCENE_CONFIG_KEY, obsSceneConfig.value) + console.log('场景配置已保存') + } + catch (err) { + console.error('保存场景配置失败:', err) + } + } + + // 加载场景配置 + async function loadSceneConfig() { + try { + const saved = await tauriStore.get(OBS_SCENE_CONFIG_KEY) + if (saved) { + obsSceneConfig.value = saved + console.log('已加载场景配置:', saved) + } + } + catch (err) { + console.error('加载场景配置失败:', err) + } + } + + // 加载OBS配置 + async function loadObsConfig() { + try { + const saved = await tauriStore.get(OBS_CONFIG_KEY) + if (saved?.address) { + obsAddress.value = saved.address + // 只有在设置了地址和密码时才启用自动重连 + if (saved?.password !== undefined) { + obsPassword.value = saved.password || '' + obsAutoReconnect.value = true + } + } + } + catch (err) { + console.error('加载OBS配置失败:', err) + } + } + + // 初始化 + async function init() { + await loadObsConfig() + await loadSceneConfig() + + // 只有在设置了地址和密码后才启动自动重连 + if (obsAutoReconnect.value && obsAddress.value) { + startObsAutoReconnectLoop() + } + } + + // 清理资源 + function cleanup() { + stopObsAutoReconnectLoop() + stopObsStatsLoop() + if (obs) { + void obs.disconnect().catch(() => {}) + obs = null + } + } + + return { + // 状态 + obsAddress, + obsPassword, + obsConnected, + obsConnecting, + obsError, + obsAutoReconnect, + obsStreamActive, + obsStreamReconnecting, + isTogglingObsStream, + obsStats, + obsScenes, + currentObsScene, + isSwitchingScene, + obsSceneError, + obsSceneConfig, + + // 方法 + handleObsConnect, + handleObsDisconnect, + handleObsToggleStream, + startObsStream, + stopObsStream, + syncStreamKeyToObs, + fetchObsScenes, + updateCurrentScene, + switchToScene, + saveSceneConfig, + loadSceneConfig, + loadObsConfig, + init, + cleanup, + } +}) + +// 热模块替换支持 +if (import.meta.hot) { + import.meta.hot.accept(acceptHMRUpdate(useOBSStore, import.meta.hot)) +} diff --git a/src/client/store/useSettings.ts b/src/client/store/useSettings.ts index 2d8fd40..70629a5 100644 --- a/src/client/store/useSettings.ts +++ b/src/client/store/useSettings.ts @@ -19,6 +19,9 @@ export interface VTsuruClientSettings { danmakuInterval: number pmInterval: number + // EventFetcher 功能开关 + enableEventFetcher: boolean + dev_disableDanmakuClient: boolean } @@ -40,6 +43,9 @@ export const useSettings = defineStore('settings', () => { danmakuInterval: 2000, pmInterval: 2000, + // 默认启用 EventFetcher + enableEventFetcher: true, + dev_disableDanmakuClient: false, } const settings = ref(Object.assign({}, defaultSettings)) @@ -51,6 +57,8 @@ export const useSettings = defineStore('settings', () => { // 初始化消息队列间隔设置 settings.value.danmakuInterval ??= defaultSettings.danmakuInterval settings.value.pmInterval ??= defaultSettings.pmInterval + // 初始化 EventFetcher 开关 + settings.value.enableEventFetcher ??= defaultSettings.enableEventFetcher } async function save() { await store.set(settings.value) diff --git a/src/components.d.ts b/src/components.d.ts index aa98134..95ca6f9 100644 --- a/src/components.d.ts +++ b/src/components.d.ts @@ -1,8 +1,12 @@ /* eslint-disable */ // @ts-nocheck +// biome-ignore lint: disable +// oxlint-disable +// ------ // Generated by unplugin-vue-components // Read more: https://github.com/vuejs/core/pull/3399 -// biome-ignore lint: disable +import { GlobalComponents } from 'vue' + export {} /* prettier-ignore */ @@ -19,11 +23,35 @@ declare module 'vue' { LabelItem: typeof import('./components/LabelItem.vue')['default'] LiveInfoContainer: typeof import('./components/LiveInfoContainer.vue')['default'] MonacoEditorComponent: typeof import('./components/MonacoEditorComponent.vue')['default'] + NAlert: typeof import('naive-ui')['NAlert'] + NAvatar: typeof import('naive-ui')['NAvatar'] + NButton: typeof import('naive-ui')['NButton'] + NCard: typeof import('naive-ui')['NCard'] + NCascader: typeof import('naive-ui')['NCascader'] + NDivider: typeof import('naive-ui')['NDivider'] + NEllipsis: typeof import('naive-ui')['NEllipsis'] + NEmpty: typeof import('naive-ui')['NEmpty'] NFlex: typeof import('naive-ui')['NFlex'] NFormItemGi: typeof import('naive-ui')['NFormItemGi'] + NGi: typeof import('naive-ui')['NGi'] + NGrid: typeof import('naive-ui')['NGrid'] NGridItem: typeof import('naive-ui')['NGridItem'] + NIcon: typeof import('naive-ui')['NIcon'] + NImage: typeof import('naive-ui')['NImage'] + NInput: typeof import('naive-ui')['NInput'] + NInputGroup: typeof import('naive-ui')['NInputGroup'] + NModal: typeof import('naive-ui')['NModal'] + NPopconfirm: typeof import('naive-ui')['NPopconfirm'] NScrollbar: typeof import('naive-ui')['NScrollbar'] + NSelect: typeof import('naive-ui')['NSelect'] + NSpace: typeof import('naive-ui')['NSpace'] + NStatistic: typeof import('naive-ui')['NStatistic'] + NSwitch: typeof import('naive-ui')['NSwitch'] NTag: typeof import('naive-ui')['NTag'] + NText: typeof import('naive-ui')['NText'] + NTime: typeof import('naive-ui')['NTime'] + NTooltip: typeof import('naive-ui')['NTooltip'] + NUpload: typeof import('naive-ui')['NUpload'] PointGoodsItem: typeof import('./components/manage/PointGoodsItem.vue')['default'] PointHistoryCard: typeof import('./components/manage/PointHistoryCard.vue')['default'] PointOrderCard: typeof import('./components/manage/PointOrderCard.vue')['default'] @@ -46,3 +74,67 @@ declare module 'vue' { VideoCollectInfoCard: typeof import('./components/VideoCollectInfoCard.vue')['default'] } } + +// For TSX support +declare global { + const AddressDisplay: typeof import('./components/manage/AddressDisplay.vue')['default'] + const BiliUserSelector: typeof import('./components/common/BiliUserSelector.vue')['default'] + const DanmakuContainer: typeof import('./components/DanmakuContainer.vue')['default'] + const DanmakuItem: typeof import('./components/DanmakuItem.vue')['default'] + const DynamicForm: typeof import('./components/DynamicForm.vue')['default'] + const EventFetcherAlert: typeof import('./components/EventFetcherAlert.vue')['default'] + const EventFetcherStatusCard: typeof import('./components/EventFetcherStatusCard.vue')['default'] + const FeedbackItem: typeof import('./components/FeedbackItem.vue')['default'] + const LabelItem: typeof import('./components/LabelItem.vue')['default'] + const LiveInfoContainer: typeof import('./components/LiveInfoContainer.vue')['default'] + const MonacoEditorComponent: typeof import('./components/MonacoEditorComponent.vue')['default'] + const NAlert: typeof import('naive-ui')['NAlert'] + const NAvatar: typeof import('naive-ui')['NAvatar'] + const NButton: typeof import('naive-ui')['NButton'] + const NCard: typeof import('naive-ui')['NCard'] + const NCascader: typeof import('naive-ui')['NCascader'] + const NDivider: typeof import('naive-ui')['NDivider'] + const NEllipsis: typeof import('naive-ui')['NEllipsis'] + const NEmpty: typeof import('naive-ui')['NEmpty'] + const NFlex: typeof import('naive-ui')['NFlex'] + const NFormItemGi: typeof import('naive-ui')['NFormItemGi'] + const NGi: typeof import('naive-ui')['NGi'] + const NGrid: typeof import('naive-ui')['NGrid'] + const NGridItem: typeof import('naive-ui')['NGridItem'] + const NIcon: typeof import('naive-ui')['NIcon'] + const NImage: typeof import('naive-ui')['NImage'] + const NInput: typeof import('naive-ui')['NInput'] + const NInputGroup: typeof import('naive-ui')['NInputGroup'] + const NModal: typeof import('naive-ui')['NModal'] + const NPopconfirm: typeof import('naive-ui')['NPopconfirm'] + const NScrollbar: typeof import('naive-ui')['NScrollbar'] + const NSelect: typeof import('naive-ui')['NSelect'] + const NSpace: typeof import('naive-ui')['NSpace'] + const NStatistic: typeof import('naive-ui')['NStatistic'] + const NSwitch: typeof import('naive-ui')['NSwitch'] + const NTag: typeof import('naive-ui')['NTag'] + const NText: typeof import('naive-ui')['NText'] + const NTime: typeof import('naive-ui')['NTime'] + const NTooltip: typeof import('naive-ui')['NTooltip'] + const NUpload: typeof import('naive-ui')['NUpload'] + const PointGoodsItem: typeof import('./components/manage/PointGoodsItem.vue')['default'] + const PointHistoryCard: typeof import('./components/manage/PointHistoryCard.vue')['default'] + const PointOrderCard: typeof import('./components/manage/PointOrderCard.vue')['default'] + const QuestionItem: typeof import('./components/QuestionItem.vue')['default'] + const QuestionItems: typeof import('./components/QuestionItems.vue')['default'] + const RegisterAndLogin: typeof import('./components/RegisterAndLogin.vue')['default'] + const RouterLink: typeof import('vue-router')['RouterLink'] + const RouterView: typeof import('vue-router')['RouterView'] + const SaveCompoent: typeof import('./components/SaveCompoent.vue')['default'] + const ScheduleList: typeof import('./components/ScheduleList.vue')['default'] + const SimpleVideoCard: typeof import('./components/SimpleVideoCard.vue')['default'] + const SimpleVirtualList: typeof import('./components/SimpleVirtualList.vue')['default'] + const SongList: typeof import('./components/SongList.vue')['default'] + const SongPlayer: typeof import('./components/SongPlayer.vue')['default'] + const TempComponent: typeof import('./components/TempComponent.vue')['default'] + const TurnstileVerify: typeof import('./components/TurnstileVerify.vue')['default'] + const UpdateNoteContainer: typeof import('./components/UpdateNoteContainer.vue')['default'] + const UserBasicInfoCard: typeof import('./components/UserBasicInfoCard.vue')['default'] + const VEditor: typeof import('./components/VEditor.vue')['default'] + const VideoCollectInfoCard: typeof import('./components/VideoCollectInfoCard.vue')['default'] +} \ No newline at end of file diff --git a/src/data/UpdateNote.ts b/src/data/UpdateNote.ts index d9afec5..22e82f7 100644 --- a/src/data/UpdateNote.ts +++ b/src/data/UpdateNote.ts @@ -3,6 +3,29 @@ import { NButton, NImage } from 'naive-ui' import UpdateNoteContainer from '@/components/UpdateNoteContainer.vue' export const updateNotes: updateNoteType[] = [ + { + ver: 9, + date: '2025.11.17', + items: [ + { + type: 'new', + title: 'VTsuru Client 新增直播管理功能', + content: [ + [ + () => h(NButton, { + text: true, + tag: 'a', + href: 'https://www.wolai.com/carN6qvUm3FErze9Xo53ii', + target: '_blank', + type: 'info', + }, () => 'VTsuru Client '), + ' 新增直播管理功能, 允许直接开播下播并使用OBS推流, 不再依赖直播姬\r\n', + () => h(NImage, { src: 'https://files.vtsuru.suki.club/updatelog/QQ20251117-182002.png', width: 300 }), + ], + ], + }, + ], + }, { ver: 8, date: '2025.10.16', diff --git a/src/data/obsConstants.ts b/src/data/obsConstants.ts index 8650a1b..4648c3d 100644 --- a/src/data/obsConstants.ts +++ b/src/data/obsConstants.ts @@ -1,4 +1,4 @@ -import type { Component, DefineComponent } from 'vue' +import { defineAsyncComponent, type Component, DefineComponent } from 'vue' /** * OBS 组件定义接口 diff --git a/src/router/client.ts b/src/router/client.ts index 02de324..3997d5f 100644 --- a/src/router/client.ts +++ b/src/router/client.ts @@ -59,6 +59,15 @@ export default { forceReload: true, }, }, + { + path: 'live-manage', + name: 'client-live-manage', + component: async () => import('@/client/ClientLiveManage.vue'), + meta: { + title: '直播管理', + forceReload: true, + }, + }, { path: 'danmaku-window', name: 'client-danmaku-window-redirect', diff --git a/src/views/ManageLayout.vue b/src/views/ManageLayout.vue index 97d1e38..df72a08 100644 --- a/src/views/ManageLayout.vue +++ b/src/views/ManageLayout.vue @@ -655,6 +655,10 @@ onMounted(() => { canResendEmail.value = true } } + + if (selectedAPIKey.value != 'main') { + message.warning('你当前使用的是备用API节点, 可能会速度比较慢') + } }) onUnmounted(() => {