From 0195e7b01ab1c9bbcec53ef39ce248d47f162c50 Mon Sep 17 00:00:00 2001 From: Megghy Date: Mon, 7 Apr 2025 19:14:39 +0800 Subject: [PATCH] feat: Add Tauri support and enhance client functionality - Introduced Tauri as a new EventFetcherType in api-models. - Enhanced ClientFetcher.vue to support forced mode switching for Danmaku client. - Updated ClientLayout.vue to restrict usage outside Tauri environment with appropriate alerts. - Improved ClientSettings.vue to fetch and display the current version of the application. - Modified initialization logic in initialize.ts to handle minimized startup for Tauri. - Updated QueryBiliAPI function to conditionally use cookies based on a new parameter. - Added bootAsMinimized setting to useSettings store for better user experience. - Refactored logging in useWebFetcher to use console instead of logError/logInfo for clarity. - Created a new LabelItem component for better label handling in forms. - Enhanced EventFetcherStatusCard.vue to display version information based on EventFetcherType. --- bun.lockb | Bin 597100 -> 597848 bytes package.json | 1 + src/Utils.ts | 215 +++++++++------- src/api/api-models.ts | 1 + src/client/ClientFetcher.vue | 41 ++- src/client/ClientLayout.vue | 296 +++++++++++----------- src/client/ClientSettings.vue | 77 +++++- src/client/data/initialize.ts | 23 +- src/client/data/utils.ts | 5 +- src/client/store/useSettings.ts | 2 + src/components.d.ts | 1 + src/components/EventFetcherStatusCard.vue | 18 +- src/components/LabelItem.vue | 24 ++ src/store/useWebFetcher.ts | 160 ++++++++---- 14 files changed, 536 insertions(+), 328 deletions(-) create mode 100644 src/components/LabelItem.vue diff --git a/bun.lockb b/bun.lockb index 57090dac7f7b0fde7352645e5a60d93770b0615c..60ea595dc33bd18011a30072db599232047c88b8 100644 GIT binary patch delta 97282 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 delta 95846 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 { if (themeType.value == ThemeType.Auto) { - var osThemeRef = useOsTheme() //获取当前系统主题 - return osThemeRef.value === 'dark' ? darkTheme : null + var osThemeRef = useOsTheme(); //获取当前系统主题 + return osThemeRef.value === 'dark' ? darkTheme : null; } else { - return themeType.value == ThemeType.Dark ? darkTheme : null + return themeType.value == ThemeType.Dark ? darkTheme : null; } -}) +}); export const configProviderPropsRef = computed(() => ({ theme: theme.value, locale: zhCN, dateLocale: dateZhCN, -})) +})); export function createNaiveUIApi(types: DiscreteApiType[]) { return createDiscreteApi(types, { configProviderProps: configProviderPropsRef - }) + }); } export function NavigateToNewTab(url: string) { - window.open(url, '_blank') + window.open(url, '_blank'); } export const isDarkMode = computed(() => { - if (themeType.value == ThemeType.Auto) return osThemeRef.value === 'dark' - else return themeType.value == ThemeType.Dark -}) + if (themeType.value == ThemeType.Auto) return osThemeRef.value === 'dark'; + else return themeType.value == ThemeType.Dark; +}); export function copyToClipboard(text: string) { if (navigator.clipboard) { - navigator.clipboard.writeText(text) - message.success('已复制到剪切板') + navigator.clipboard.writeText(text); + message.success('已复制到剪切板'); } else { - message.warning('当前环境不支持自动复制, 请手动选择并复制') + message.warning('当前环境不支持自动复制, 请手动选择并复制'); } } export function objectsToCSV(arr: any[]) { - const array = [Object.keys(arr[0])].concat(arr) + const array = [Object.keys(arr[0])].concat(arr); return array .map((row) => { return Object.values(row) .map((value) => { - return typeof value === 'string' ? JSON.stringify(value) : value + return typeof value === 'string' ? JSON.stringify(value) : value; }) - .toString() + .toString(); }) - .join('\n') + .join('\n'); } export function GetGuardColor(level: number | null | undefined): string { if (level) { switch (level) { case 1: { - return 'rgb(122, 4, 35)' + return 'rgb(122, 4, 35)'; } case 2: { - return 'rgb(157, 155, 255)' + return 'rgb(157, 155, 255)'; } case 3: { - return 'rgb(104, 136, 241)' + return 'rgb(104, 136, 241)'; } } } - return '' + return ''; } export function downloadImage(imageSrc: string, filename: string) { - const image = new Image() - image.crossOrigin = 'Anonymous' // This might be needed depending on the image's server + const image = new Image(); + image.crossOrigin = 'Anonymous'; // This might be needed depending on the image's server image.onload = () => { - const canvas = document.createElement('canvas') - canvas.width = image.width - canvas.height = image.height - const ctx = canvas.getContext('2d') - ctx!.drawImage(image, 0, 0) + const canvas = document.createElement('canvas'); + canvas.width = image.width; + canvas.height = image.height; + const ctx = canvas.getContext('2d'); + ctx!.drawImage(image, 0, 0); canvas.toBlob((blob) => { if (blob) { - const link = document.createElement('a') - link.href = URL.createObjectURL(blob) - link.download = filename - document.body.appendChild(link) - link.click() - document.body.removeChild(link) + const link = document.createElement('a'); + link.href = URL.createObjectURL(blob); + link.download = filename; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); } - }) // Omitted the 'image/jpeg' to use the original image format - } - image.src = imageSrc + }); // Omitted the 'image/jpeg' to use the original image format + }; + image.src = imageSrc; } export function getBase64( file: File | undefined | null ): Promise { - if (!file) return new Promise((resolve) => resolve(undefined)) + if (!file) return new Promise((resolve) => resolve(undefined)); return new Promise((resolve, reject) => { - const reader = new FileReader() - reader.readAsDataURL(file) + const reader = new FileReader(); + reader.readAsDataURL(file); reader.onload = () => - resolve(reader.result?.toString().split(',')[1] || undefined) - reader.onerror = (error) => reject(error) - }) + resolve(reader.result?.toString().split(',')[1] || undefined); + reader.onerror = (error) => reject(error); + }); } export async function getImageUploadModel( files: UploadFileInfo[] | undefined | null, @@ -126,83 +126,83 @@ export async function getImageUploadModel( const result = { existImages: [], newImagesBase64: [] - } as { existImages: string[]; newImagesBase64: string[] } - if (!files) return result + } as { existImages: string[]; newImagesBase64: string[]; }; + if (!files) return result; for (let i = 0; i < files.length; i++) { - const file = files[i] + const file = files[i]; if ((file.file?.size ?? 0) > maxSize) { - message.error('文件大小不能超过 ' + maxSize / 1024 / 1024 + 'MB') - return result + message.error('文件大小不能超过 ' + maxSize / 1024 / 1024 + 'MB'); + return result; } if (!file.file) { - result.existImages.push(file.id) //用id绝对路径当的文件名 + result.existImages.push(file.id); //用id绝对路径当的文件名 } else { - const base64 = await getBase64(file.file) + const base64 = await getBase64(file.file); if (base64) { - result.newImagesBase64.push(base64) + result.newImagesBase64.push(base64); } } } - return result + return result; } export function getUserAvatarUrl(userId: number | undefined | null) { - if (!userId) return '' - return VTSURU_API_URL + 'user-face/' + userId + if (!userId) return ''; + return VTSURU_API_URL + 'user-face/' + userId; } export function getOUIdAvatarUrl(ouid: string) { - return VTSURU_API_URL + 'face/' + ouid + return VTSURU_API_URL + 'face/' + ouid; } export class GuidUtils { // 将数字转换为GUID public static numToGuid(value: number): string { - const buffer = new ArrayBuffer(16) - const view = new DataView(buffer) - view.setBigUint64(8, BigInt(value)) // 将数字写入后8个字节 - return GuidUtils.bufferToGuid(buffer) + const buffer = new ArrayBuffer(16); + const view = new DataView(buffer); + view.setBigUint64(8, BigInt(value)); // 将数字写入后8个字节 + return GuidUtils.bufferToGuid(buffer); } // 检查GUID是否由数字生成 public static isGuidFromUserId(guid: string): boolean { - const buffer = GuidUtils.guidToBuffer(guid) - const view = new DataView(buffer) + const buffer = GuidUtils.guidToBuffer(guid); + const view = new DataView(buffer); for (let i = 0; i < 8; i++) { - if (view.getUint8(i) !== 0) return false // 检查前8个字节是否为0 + if (view.getUint8(i) !== 0) return false; // 检查前8个字节是否为0 } - return true + return true; } // 将GUID转换为数字 public static guidToLong(guid: string): number { - const buffer = GuidUtils.guidToBuffer(guid) - const view = new DataView(buffer) - return Number(view.getBigUint64(8)) + const buffer = GuidUtils.guidToBuffer(guid); + const view = new DataView(buffer); + return Number(view.getBigUint64(8)); } // 辅助方法:将ArrayBuffer转换为GUID字符串 private static bufferToGuid(buffer: ArrayBuffer): string { - const bytes = new Uint8Array(buffer) + const bytes = new Uint8Array(buffer); const guid = bytes.reduce((str, byte, idx) => { - const pair = byte.toString(16).padStart(2, '0') + const pair = byte.toString(16).padStart(2, '0'); return ( str + pair + (idx === 3 || idx === 5 || idx === 7 || idx === 9 ? '-' : '') - ) - }, '') - return guid + ); + }, ''); + return guid; } // 辅助方法:将GUID字符串转换为ArrayBuffer private static guidToBuffer(guid: string): ArrayBuffer { - const hex = guid.replace(/-/g, '') - if (hex.length !== 32) throw new Error('Invalid GUID format.') - const buffer = new ArrayBuffer(16) - const view = new DataView(buffer) + const hex = guid.replace(/-/g, ''); + if (hex.length !== 32) throw new Error('Invalid GUID format.'); + const buffer = new ArrayBuffer(16); + const view = new DataView(buffer); for (let i = 0; i < 16; i++) { - view.setUint8(i, parseInt(hex.substr(i * 2, 2), 16)) + view.setUint8(i, parseInt(hex.substr(i * 2, 2), 16)); } - return buffer + return buffer; } } export function GetPlayButton(song: SongsInfo) { @@ -218,7 +218,7 @@ export function GetPlayButton(song: SongsInfo) { color: '#00BBB3', ghost: true, onClick: () => { - window.open(`http://5sing.kugou.com/bz/${song.id}.html`) + window.open(`http://5sing.kugou.com/bz/${song.id}.html`); }, }, { @@ -227,7 +227,7 @@ export function GetPlayButton(song: SongsInfo) { ), ), default: () => '在5sing打开', - }) + }); } case SongFrom.Netease: return h(NTooltip, null, { @@ -239,7 +239,7 @@ export function GetPlayButton(song: SongsInfo) { color: '#C20C0C', ghost: true, onClick: () => { - window.open(`https://music.163.com/#/song?id=${song.id}`) + window.open(`https://music.163.com/#/song?id=${song.id}`); }, }, { @@ -247,7 +247,7 @@ export function GetPlayButton(song: SongsInfo) { }, ), default: () => '在网易云打开', - }) + }); case SongFrom.Custom: return song.url ? h(NTooltip, null, { @@ -259,7 +259,7 @@ export function GetPlayButton(song: SongsInfo) { color: '#6b95bd', ghost: true, onClick: () => { - window.open(song.url) + window.open(song.url); }, }, { @@ -268,6 +268,33 @@ export function GetPlayButton(song: SongsInfo) { ), default: () => '打开链接', }) - : null + : null; + } +} +export function getBrowserName() { + var userAgent = navigator.userAgent; + if (userAgent.indexOf("Opera") > -1 || userAgent.indexOf("OPR") > -1) { + return 'Opera'; + } + else if (userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1) { + return 'IE'; + } + else if (userAgent.indexOf("Edge") > -1) { + return 'Edge'; + } + else if (userAgent.indexOf("Firefox") > -1) { + return 'Firefox'; + } + else if (userAgent.indexOf("Safari") > -1 && userAgent.indexOf("Chrome") == -1) { + return 'Safari'; + } + else if (userAgent.indexOf("Chrome") > -1 && userAgent.indexOf("Safari") > -1) { + return 'Chrome'; + } + else if (!!window.ActiveXObject || "ActiveXObject" in window) { + return 'IE>=11'; + } + else { + return 'Unkonwn'; } } \ No newline at end of file diff --git a/src/api/api-models.ts b/src/api/api-models.ts index 8cee2e4..65a79d8 100644 --- a/src/api/api-models.ts +++ b/src/api/api-models.ts @@ -54,6 +54,7 @@ export interface EventFetcherStateModel { export enum EventFetcherType { Application, OBS, + Tauri, Server } export interface AccountInfo extends UserInfo { diff --git a/src/client/ClientFetcher.vue b/src/client/ClientFetcher.vue index 338b49a..a589d73 100644 --- a/src/client/ClientFetcher.vue +++ b/src/client/ClientFetcher.vue @@ -357,8 +357,8 @@ const minutes = duration.minutes || 0; const seconds = duration.seconds || 0; return `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`; } - async function onSwitchDanmakuClientMode(type: 'openlive' | 'direct') { - if (webfetcher.webfetcherType === type) { + async function onSwitchDanmakuClientMode(type: 'openlive' | 'direct', force: boolean = false) { + if (webfetcher.webfetcherType === type && !force) { message.info('当前已是该模式'); return; } const noticeRef = window.$notification.info({ @@ -494,8 +494,7 @@ embedded style="width: 100%; max-width: 800px;" > - - 模式: + + + + + @@ -789,6 +809,7 @@ bordered :columns="2" size="small" + style="overflow-x: auto;" > {{ formattedStartedAt }} @@ -800,6 +821,7 @@ {{ signalRStateText }} - - {{ webfetcher.signalRClient?.connectionId ?? 'N/A' }} + + {{ webfetcher.signalRId ?? 'N/A' }} @@ -816,6 +838,7 @@ {{ danmakuClientStateText }} - + {{ webfetcher.danmakuServerUrl ?? 'N/A' }} @@ -968,10 +991,6 @@ {{ webfetcher.sessionEventCount?.toLocaleString() ?? 0 }} - - 成功: {{ webfetcher.successfulUploads ?? 0 }} / 失败: - {{ webfetcher.failedUploads ?? 0 }} - {{ ((webfetcher.bytesSentSession ?? 0) / 1024).toFixed(2) }} KB diff --git a/src/client/ClientLayout.vue b/src/client/ClientLayout.vue index 4ed3a20..3df7e95 100644 --- a/src/client/ClientLayout.vue +++ b/src/client/ClientLayout.vue @@ -17,6 +17,7 @@ import WindowBar from './WindowBar.vue'; import { initAll, OnClientUnmounted } from './data/initialize'; import { CloudArchive24Filled, Settings24Filled } from '@vicons/fluent'; +import { isTauri } from '@/data/constants'; // --- 响应式状态 --- @@ -68,7 +69,7 @@ import { CloudArchive24Filled, Settings24Filled } from '@vicons/fluent'; window.$message.success('登陆成功'); ACCOUNT.value = result; // 更新全局账户信息 // isLoadingAccount.value = false; // 状态在 finally 中统一处理 - initAll(); // 初始化 WebFetcher + //initAll(false); // 初始化 WebFetcher } } } catch (error) { @@ -116,160 +117,169 @@ import { CloudArchive24Filled, Settings24Filled } from '@vicons/fluent'; diff --git a/src/store/useWebFetcher.ts b/src/store/useWebFetcher.ts index d2b6792..4f7e103 100644 --- a/src/store/useWebFetcher.ts +++ b/src/store/useWebFetcher.ts @@ -1,19 +1,21 @@ -import { defineStore } from 'pinia'; -import { ref, computed, shallowRef } from 'vue'; // shallowRef 用于非深度响应对象 -import { useLocalStorage } from '@vueuse/core'; -import { useRoute } from 'vue-router'; -import { compress } from 'brotli-compress'; -import { format } from 'date-fns'; +import { cookie, useAccount } from '@/api/account'; +import { getEventType, recordEvent, streamingInfo } from '@/client/data/info'; +import { BASE_HUB_URL, isDev, isTauri } from '@/data/constants'; +import BaseDanmakuClient from '@/data/DanmakuClients/BaseDanmakuClient'; +import DirectClient, { DirectClientAuthInfo } from '@/data/DanmakuClients/DirectClient'; +import OpenLiveClient from '@/data/DanmakuClients/OpenLiveClient'; import * as signalR from '@microsoft/signalr'; import * as msgpack from '@microsoft/signalr-protocol-msgpack'; -import { cookie, useAccount } from '@/api/account'; // 假设账户信息路径 -import { BASE_HUB_URL, isDev } from '@/data/constants'; // 假设常量路径 -import BaseDanmakuClient from '@/data/DanmakuClients/BaseDanmakuClient'; // 假设弹幕客户端基类路径 -import DirectClient, { DirectClientAuthInfo } from '@/data/DanmakuClients/DirectClient'; // 假设直连客户端路径 -import OpenLiveClient from '@/data/DanmakuClients/OpenLiveClient'; // 假设开放平台客户端路径 -import { error as logError, info as logInfo } from '@tauri-apps/plugin-log'; // 使用日志插件 -import { getEventType, recordEvent, streamingInfo } from '@/client/data/info'; +import { defineStore } from 'pinia'; +import { computed, ref, shallowRef } from 'vue'; // shallowRef 用于非深度响应对象 +import { useRoute } from 'vue-router'; import { useWebRTC } from './useRTC'; +import { QueryBiliAPI } from '@/client/data/utils'; +import { platform, type, version } from '@tauri-apps/plugin-os'; +import { ZstdCodec, ZstdInit } from '@oneidentity/zstd-js/wasm'; + +import { encode } from "@msgpack/msgpack"; +import { getVersion } from '@tauri-apps/api/app'; export const useWebFetcher = defineStore('WebFetcher', () => { const route = useRoute(); @@ -24,11 +26,14 @@ export const useWebFetcher = defineStore('WebFetcher', () => { const state = ref<'disconnected' | 'connecting' | 'connected'>('disconnected'); // SignalR 连接状态 const startedAt = ref(); // 本次启动时间 const signalRClient = shallowRef(); // SignalR 客户端实例 (浅响应) + const signalRId = ref(); // SignalR 连接 ID const client = shallowRef(); // 弹幕客户端实例 (浅响应) let timer: any; // 事件发送定时器 let disconnectedByServer = false; let isFromClient = false; // 是否由Tauri客户端启动 + + // --- 新增: 详细状态与信息 --- /** 弹幕客户端内部状态 */ const danmakuClientState = ref<'stopped' | 'connecting' | 'connected'>('stopped'); // 更详细的弹幕客户端状态 @@ -52,6 +57,7 @@ export const useWebFetcher = defineStore('WebFetcher', () => { const failedUploads = ref(0); /** 本次会话发送的总字节数 (压缩后) */ const bytesSentSession = ref(0); + let zstd: ZstdCodec | undefined = undefined; // Zstd 编码器实例 (如果需要压缩) const prefix = computed(() => isFromClient ? '[web-fetcher-iframe] ' : '[web-fetcher] '); @@ -64,9 +70,15 @@ export const useWebFetcher = defineStore('WebFetcher', () => { _isFromClient: boolean = false ): Promise<{ success: boolean; message: string; }> { if (state.value === 'connected' || state.value === 'connecting') { - logInfo(prefix.value + '已经启动,无需重复启动'); + console.log(prefix.value + '已经启动,无需重复启动'); return { success: true, message: '已启动' }; } + try { + zstd ??= await ZstdInit(); + + } catch (error) { + console.error(prefix.value + '当前浏览器不支持zstd压缩, 回退到原始数据传输'); + } webfetcherType.value = type; // 设置弹幕客户端类型 // 重置会话统计数据 resetSessionStats(); @@ -76,9 +88,9 @@ export const useWebFetcher = defineStore('WebFetcher', () => { // 使用 navigator.locks 确保同一时间只有一个 Start 操作执行 const result = await navigator.locks.request('webFetcherStartLock', async () => { - logInfo(prefix.value + '开始启动...'); + console.log(prefix.value + '开始启动...'); while (!(await connectSignalR())) { - logInfo(prefix.value + '连接 SignalR 失败, 5秒后重试'); + console.log(prefix.value + '连接 SignalR 失败, 5秒后重试'); await new Promise((resolve) => setTimeout(resolve, 5000)); // 如果用户手动停止,则退出重试循环 if (state.value === 'disconnected') return { success: false, message: '用户手动停止' }; @@ -86,7 +98,7 @@ export const useWebFetcher = defineStore('WebFetcher', () => { let danmakuResult = await connectDanmakuClient(type, directAuthInfo); while (!danmakuResult?.success) { - logInfo(prefix.value + '弹幕客户端启动失败, 5秒后重试'); + console.log(prefix.value + '弹幕客户端启动失败, 5秒后重试'); await new Promise((resolve) => setTimeout(resolve, 5000)); // 如果用户手动停止,则退出重试循环 if (state.value === 'disconnected') return { success: false, message: '用户手动停止' }; @@ -96,7 +108,7 @@ export const useWebFetcher = defineStore('WebFetcher', () => { // 只有在两个连接都成功后才设置为 connected state.value = 'connected'; disconnectedByServer = false; - logInfo(prefix.value + '启动成功'); + console.log(prefix.value + '启动成功'); return { success: true, message: '启动成功' }; }); @@ -115,7 +127,7 @@ export const useWebFetcher = defineStore('WebFetcher', () => { function Stop() { if (state.value === 'disconnected') return; - logInfo(prefix.value + '正在停止...'); + console.log(prefix.value + '正在停止...'); state.value = 'disconnected'; // 立即设置状态,防止重连逻辑触发 // 清理定时器 @@ -137,7 +149,7 @@ export const useWebFetcher = defineStore('WebFetcher', () => { events.length = 0; // 清空事件队列 // resetSessionStats(); // 会话统计在下次 Start 时重置 - logInfo(prefix.value + '已停止'); + console.log(prefix.value + '已停止'); } /** 重置会话统计数据 */ @@ -157,11 +169,11 @@ export const useWebFetcher = defineStore('WebFetcher', () => { directConnectInfo?: DirectClientAuthInfo ) { if (client.value?.state === 'connected' || client.value?.state === 'connecting') { - logInfo(prefix.value + '弹幕客户端已连接或正在连接'); + console.log(prefix.value + '弹幕客户端已连接或正在连接'); return { success: true, message: '弹幕客户端已启动' }; } - logInfo(prefix.value + '正在连接弹幕客户端...'); + console.log(prefix.value + '正在连接弹幕客户端...'); danmakuClientState.value = 'connecting'; // 如果实例存在但已停止,先清理 @@ -176,7 +188,7 @@ export const useWebFetcher = defineStore('WebFetcher', () => { } else { if (!directConnectInfo) { danmakuClientState.value = 'stopped'; - logError(prefix.value + '未提供直连弹幕客户端认证信息'); + console.error(prefix.value + '未提供直连弹幕客户端认证信息'); return { success: false, message: '未提供弹幕客户端认证信息' }; } client.value = new DirectClient(directConnectInfo); @@ -193,13 +205,13 @@ export const useWebFetcher = defineStore('WebFetcher', () => { const result = await client.value?.Start(); if (result?.success) { - logInfo(prefix.value + '弹幕客户端连接成功, 开始监听弹幕'); + console.log(prefix.value + '弹幕客户端连接成功, 开始监听弹幕'); danmakuClientState.value = 'connected'; // 明确设置状态 danmakuServerUrl.value = client.value.serverUrl; // 获取服务器地址 // 启动事件发送定时器 (如果之前没有启动) timer ??= setInterval(sendEvents, 1500); // 每 1.5 秒尝试发送一次事件 } else { - logError(prefix.value + '弹幕客户端启动失败: ' + result?.message); + console.error(prefix.value + '弹幕客户端启动失败: ' + result?.message); danmakuClientState.value = 'stopped'; danmakuServerUrl.value = undefined; client.value = undefined; // 启动失败,清理实例,下次会重建 @@ -212,11 +224,11 @@ export const useWebFetcher = defineStore('WebFetcher', () => { */ async function connectSignalR() { if (signalRClient.value && signalRClient.value.state !== signalR.HubConnectionState.Disconnected) { - logInfo(prefix.value + "SignalR 已连接或正在连接"); + console.log(prefix.value + "SignalR 已连接或正在连接"); return true; } - logInfo(prefix.value + '正在连接到 vtsuru 服务器...'); + console.log(prefix.value + '正在连接到 vtsuru 服务器...'); const connection = new signalR.HubConnectionBuilder() .withUrl(BASE_HUB_URL + 'web-fetcher?token=' + (route.query.token ?? account.value.token), { // 使用 account.token headers: { Authorization: `Bearer ${cookie.value?.cookie}` }, @@ -229,71 +241,98 @@ export const useWebFetcher = defineStore('WebFetcher', () => { // --- SignalR 事件监听 --- connection.onreconnecting(error => { - logInfo(prefix.value + `与服务器断开,正在尝试重连... ${error?.message || ''}`); + console.log(prefix.value + `与服务器断开,正在尝试重连... ${error?.message || ''}`); state.value = 'connecting'; // 更新状态为连接中 signalRConnectionId.value = undefined; // 连接断开,ID失效 }); - connection.onreconnected(connectionId => { - logInfo(prefix.value + `与服务器重新连接成功! ConnectionId: ${connectionId}`); + connection.onreconnected(async connectionId => { + console.log(prefix.value + `与服务器重新连接成功! ConnectionId: ${connectionId}`); signalRConnectionId.value = connectionId ?? undefined; state.value = 'connected'; // 更新状态为已连接 - // 重连成功后可能需要重新发送标识 - if (isFromClient) { - connection.send('SetAsVTsuruClient').catch(err => logError(prefix.value + "Send SetAsVTsuruClient failed: " + err)); - } - connection.send('Reconnected').catch(err => logError(prefix.value + "Send Reconnected failed: " + err)); + signalRId.value = connectionId ?? await sendSelfInfo(connection); // 更新连接ID + connection.send('Reconnected').catch(err => console.error(prefix.value + "Send Reconnected failed: " + err)); }); connection.onclose(async (error) => { // 只有在不是由 Stop() 或服务器明确要求断开时才记录错误并尝试独立重连(虽然 withAutomaticReconnect 应该处理) if (state.value !== 'disconnected' && !disconnectedByServer) { - logError(prefix.value + `与服务器连接关闭: ${error?.message || '未知原因'}. 自动重连将处理.`); + console.error(prefix.value + `与服务器连接关闭: ${error?.message || '未知原因'}. 自动重连将处理.`); state.value = 'connecting'; // 标记为连接中,等待自动重连 signalRConnectionId.value = undefined; // withAutomaticReconnect 会处理重连,这里不需要手动调用 reconnect } else if (disconnectedByServer) { - logInfo(prefix.value + `连接已被服务器关闭.`); + console.log(prefix.value + `连接已被服务器关闭.`); Stop(); // 服务器要求断开,则彻底停止 } else { - logInfo(prefix.value + `连接已手动关闭.`); + console.log(prefix.value + `连接已手动关闭.`); } }); connection.on('Disconnect', (reason: unknown) => { - logInfo(prefix.value + '被服务器断开连接: ' + reason); + console.log(prefix.value + '被服务器断开连接: ' + reason); disconnectedByServer = true; // 标记是服务器主动断开 Stop(); // 服务器要求断开,调用 Stop 清理所有资源 }); + connection.on('Request', async (url: string, method: string, body: string, useCookie: boolean) => onRequest(url, method, body, useCookie)); // --- 尝试启动连接 --- try { await connection.start(); - logInfo(prefix.value + '已连接到 vtsuru 服务器, ConnectionId: ' + connection.connectionId); console.log(prefix.value + '已连接到 vtsuru 服务器, ConnectionId: ' + connection.connectionId); // 调试输出连接状态 signalRConnectionId.value = connection.connectionId ?? undefined; // 保存连接ID + signalRId.value = await sendSelfInfo(connection); // 发送客户端信息 await connection.send('Finished'); // 通知服务器已准备好 - if (isFromClient) { - await connection.send('SetAsVTsuruClient'); // 如果是客户端,发送标识 - } signalRClient.value = connection; // 保存实例 // state.value = 'connected'; // 状态将在 Start 函数末尾统一设置 return true; } catch (e) { - logError(prefix.value + '无法连接到 vtsuru 服务器: ' + e); + console.error(prefix.value + '无法连接到 vtsuru 服务器: ' + e); signalRConnectionId.value = undefined; signalRClient.value = undefined; // state.value = 'disconnected'; // 保持 connecting 或由 Start 控制 return false; } } + async function sendSelfInfo(client: signalR.HubConnection) { + return client.invoke('SetSelfInfo', + isTauri ? `tauri ${platform()} ${version()}` : navigator.userAgent, + isTauri ? 'tauri' : 'web', + isTauri ? await getVersion() : '1.0.0', + webfetcherType.value === 'direct'); + } + type ResponseFetchRequestData = { + Message: string; + Success: boolean; + Data: string; + }; + async function onRequest(url: string, method: string, body: string, useCookie: boolean) { + if (!isTauri) { + console.error(prefix.value + '非Tauri环境下无法处理请求: ' + url); + return { + Message: '非Tauri环境', + Success: false, + Data: '' + }; + } + const result = await QueryBiliAPI(url, method, body, useCookie); + console.log(`${prefix.value}请求 (${method})${url}: `, result.statusText); + if (result.ok) { + const data = await result.text(); + return { + Message: '请求成功', + Success: true, + Data: data + } as ResponseFetchRequestData; + } + } // async function reconnect() { // withAutomaticReconnect 存在时,此函数通常不需要手动调用 // if (disconnectedByServer || state.value === 'disconnected') return; - // logInfo(prefix.value + '尝试手动重连...'); + // console.log(prefix.value + '尝试手动重连...'); // try { // await signalRClient.value?.start(); - // logInfo(prefix.value + '手动重连成功'); + // console.log(prefix.value + '手动重连成功'); // signalRConnectionId.value = signalRClient.value?.connectionId ?? null; // state.value = 'connected'; // if (isFromClient) { @@ -301,7 +340,7 @@ export const useWebFetcher = defineStore('WebFetcher', () => { // } // await signalRClient.value?.send('Reconnected'); // } catch (err) { - // logError(prefix.value + '手动重连失败: ' + err); + // console.error(prefix.value + '手动重连失败: ' + err); // setTimeout(reconnect, 10000); // 失败后10秒再次尝试 // } // } @@ -351,20 +390,34 @@ export const useWebFetcher = defineStore('WebFetcher', () => { try { - const result = await signalRClient.value.invoke<{ Success: boolean; Message: string; }>( - 'UploadEvents', batch, webfetcherType.value === 'direct'? true : false - ); + let result: { Success: boolean; Message: string; } = { Success: false, Message: '' }; + let length = 0; + let eventCharLength = batch.map(event => event.length).reduce((a, b) => a + b, 0); // 计算字符长度 + if (zstd && eventCharLength > 100) { + const data = zstd.ZstdSimple.compress(encode(batch), 11); + length = data.length; + result = await signalRClient.value.invoke<{ Success: boolean; Message: string; }>( + 'UploadEventsCompressedV2', data + ); + } + else { + length = new TextEncoder().encode(batch.join()).length; + result = await signalRClient.value.invoke<{ Success: boolean; Message: string; }>( + 'UploadEvents', batch, webfetcherType.value === 'direct' ? true : false + ); + } + if (result?.Success) { events.splice(0, batch.length); // 从队列中移除已成功发送的事件 successfulUploads.value++; - bytesSentSession.value += new TextEncoder().encode(batch.join()).length; + bytesSentSession.value += length; } else { failedUploads.value++; - logError(prefix.value + '上传弹幕失败: ' + result?.Message); + console.error(prefix.value + '上传弹幕失败: ' + result?.Message); } } catch (err) { failedUploads.value++; - logError(prefix.value + '发送事件时出错: ' + err); + console.error(prefix.value + '发送事件时出错: ' + err); } } @@ -379,6 +432,7 @@ export const useWebFetcher = defineStore('WebFetcher', () => { startedAt, isStreaming: computed(() => streamingInfo.value?.status === 'streaming'), // 从 statistics 模块获取 webfetcherType, + signalRId, // 连接详情 danmakuClientState,