diff --git a/app/(tabs)/index.tsx b/app/(tabs)/index.tsx index 34c20ac..6744261 100644 --- a/app/(tabs)/index.tsx +++ b/app/(tabs)/index.tsx @@ -10,6 +10,7 @@ import { Alert, RefreshControl, Linking, + Switch, } from 'react-native' import { Picker } from '@react-native-picker/picker' import { SafeAreaView } from 'react-native-safe-area-context' @@ -23,6 +24,27 @@ import { proChannelPm2Process, } from '@/lib/youtubeConfigUtils' +function statusTintBackground(variant: string): string { + switch (variant) { + case 'online': + return 'rgba(61, 214, 140, 0.1)' + case 'stopped': + case 'error': + return 'rgba(245, 101, 101, 0.1)' + case 'warn': + return 'rgba(246, 173, 85, 0.12)' + case 'offline': + return 'rgba(139, 146, 158, 0.11)' + case 'loading': + return 'rgba(91, 157, 255, 0.12)' + case 'unknown': + case 'empty': + return 'rgba(91, 157, 255, 0.09)' + default: + return 'rgba(139, 146, 158, 0.1)' + } +} + function ctrlStyle(action: string): object { switch (action) { case 'start': @@ -183,6 +205,7 @@ export default function RecordScreen() { const [refreshing, setRefreshing] = useState(false) const statusColor = useMemo(() => variantColor[r.statusMeta.variant] ?? theme.muted, [r.statusMeta.variant]) + const statusBg = useMemo(() => statusTintBackground(r.statusMeta.variant), [r.statusMeta.variant]) const onRefresh = useCallback(async () => { if (!bind) return @@ -227,11 +250,6 @@ export default function RecordScreen() { ) : null} - {unbound && ( - - 未绑定 PC:在「远程」页扫码后,此处会加载任务与实时数据。 - - )} {bind && ( @@ -240,17 +258,61 @@ export default function RecordScreen() { )} - - + + + + + + + + + {r.statusMeta.line} + + + + + + 多频道 + + PRO + + + + { + if (unbound) return + void r.togglePro(v) + }} + trackColor={{ + false: 'rgba(255,255,255,0.12)', + true: 'rgba(91, 157, 255, 0.45)', + }} + thumbColor={r.multiChannelPro ? '#7eb6ff' : '#5c6370'} + ios_backgroundColor="rgba(255,255,255,0.1)" + /> + + + + + + {bind ? ( + r.setCurrentProcess(String(v))} style={styles.picker} dropdownIconColor={theme.text} > - {unbound || !r.entries.length ? ( - + {!r.entries.length ? ( + ) : ( r.entries.map((e) => ( @@ -258,28 +320,7 @@ export default function RecordScreen() { )} - { - if (unbound) { - Alert.alert('未绑定', '配对后可切换多频道 Pro。') - return - } - void r.togglePro(!r.multiChannelPro) - }} - > - 多频道直播(Pro) - - {r.multiChannelPro ? '开' : '关'} - - - - - - - {r.statusMeta.line} - + ) : null} {bind && r.emptyHint ? ( @@ -678,7 +719,90 @@ const styles = StyleSheet.create({ marginBottom: 14, }, bannerText: { fontSize: 13, color: theme.text, lineHeight: 20 }, - toolbar: { marginBottom: 12 }, + toolbarCard: { + marginBottom: 12, + borderRadius: 14, + borderWidth: 1, + borderColor: 'rgba(255,255,255,0.07)', + backgroundColor: theme.bgElevated, + paddingVertical: 12, + paddingHorizontal: 12, + }, + toolbarRow: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + gap: 10, + }, + toolbarLeft: { flex: 1, minWidth: 0, marginRight: 6 }, + statusChip: { + flexDirection: 'row', + alignItems: 'center', + gap: 10, + paddingVertical: 10, + paddingHorizontal: 12, + paddingLeft: 11, + borderRadius: 12, + borderLeftWidth: 3, + borderTopWidth: 1, + borderRightWidth: 1, + borderBottomWidth: 1, + borderTopColor: 'rgba(255,255,255,0.06)', + borderRightColor: 'rgba(255,255,255,0.06)', + borderBottomColor: 'rgba(255,255,255,0.06)', + }, + statusDotOuter: { + width: 14, + height: 14, + borderRadius: 7, + borderWidth: 2, + alignItems: 'center', + justifyContent: 'center', + }, + statusDotInner: { width: 6, height: 6, borderRadius: 3 }, + statusLineText: { + flex: 1, + fontSize: 15, + fontWeight: '600', + color: theme.text, + letterSpacing: 0.2, + }, + proCluster: { + flexDirection: 'row', + alignItems: 'center', + flexShrink: 0, + gap: 10, + paddingLeft: 10, + paddingVertical: 4, + paddingRight: 4, + borderRadius: 12, + backgroundColor: 'rgba(91, 157, 255, 0.06)', + borderWidth: 1, + borderColor: 'rgba(91, 157, 255, 0.18)', + }, + proClusterDisabled: { opacity: 0.45 }, + proLabelRow: { flexDirection: 'row', alignItems: 'center', gap: 6 }, + proLabelZh: { fontSize: 13, fontWeight: '600', color: theme.text }, + proBadge: { + paddingHorizontal: 7, + paddingVertical: 3, + borderRadius: 6, + backgroundColor: 'rgba(255,255,255,0.08)', + borderWidth: 1, + borderColor: 'rgba(255,255,255,0.1)', + }, + proBadgeOn: { + backgroundColor: 'rgba(91, 157, 255, 0.22)', + borderColor: 'rgba(91, 157, 255, 0.45)', + }, + proBadgeText: { + fontSize: 10, + fontWeight: '800', + color: theme.accent, + letterSpacing: 0.6, + }, + proSwitchWrap: { transform: [{ scale: 0.92 }] }, + unpairedText: { fontSize: 15, fontWeight: '600', color: theme.muted }, proGrid: { gap: 10 }, proSwitchRow: { padding: 12, @@ -712,32 +836,8 @@ const styles = StyleSheet.create({ }, pickerDisabled: { opacity: 0.65 }, picker: { color: theme.text }, - proRow: { - flexDirection: 'row', - justifyContent: 'space-between', - marginTop: 12, - paddingVertical: 10, - paddingHorizontal: 12, - backgroundColor: theme.bgCard, - borderRadius: 10, - borderWidth: 1, - borderColor: theme.border, - }, - proLabel: { color: theme.text, fontWeight: '600' }, - proVal: { color: theme.muted, fontWeight: '600' }, - pill: { - flexDirection: 'row', - alignItems: 'center', - alignSelf: 'flex-start', - gap: 8, - paddingVertical: 8, - paddingHorizontal: 12, - borderRadius: 999, - borderWidth: 1, - marginBottom: 14, - }, + pickerRowBelow: { marginTop: 0 }, dot: { width: 8, height: 8, borderRadius: 4 }, - pillText: { fontSize: 13, fontWeight: '600' }, emptyCard: { padding: 20, borderRadius: 12, diff --git a/app/(tabs)/system.tsx b/app/(tabs)/system.tsx index a6242ec..bb04fe1 100644 --- a/app/(tabs)/system.tsx +++ b/app/(tabs)/system.tsx @@ -1,7 +1,8 @@ import { useCallback, useEffect, useState } from 'react' -import { View, Text, ScrollView, StyleSheet, RefreshControl } from 'react-native' +import { View, Text, ScrollView, StyleSheet, RefreshControl, Pressable } from 'react-native' import { SafeAreaView } from 'react-native-safe-area-context' +import { UserAgreementModal } from '@/components/UserAgreementModal' import { useBind } from '@/context/BindContext' import { apiFetch } from '@/lib/api' import type { SystemMetricsPayload } from '@/lib/pcTypes' @@ -20,6 +21,7 @@ export default function SystemScreen() { const [data, setData] = useState(null) const [err, setErr] = useState(null) const [refreshing, setRefreshing] = useState(false) + const [agreementOpen, setAgreementOpen] = useState(false) const load = useCallback(async () => { if (!bind) { @@ -147,8 +149,12 @@ export default function SystemScreen() { 客户端与系统集成 开机启动、路径与 Electron 集成仅在桌面客户端可用。 + setAgreementOpen(true)} hitSlop={8}> + 用户协议 + + setAgreementOpen(false)} /> ) } @@ -205,4 +211,6 @@ const styles = StyleSheet.create({ ffSec: { marginTop: 12 }, ffLine: { fontSize: 12, color: theme.muted, marginBottom: 4, fontFamily: 'monospace' }, muted: { fontSize: 13, color: theme.muted, lineHeight: 20 }, + agreementRow: { marginTop: 10, alignSelf: 'flex-start' }, + agreementLink: { fontSize: 12, color: theme.accent, textDecorationLine: 'underline' }, }) diff --git a/components/UserAgreementModal.tsx b/components/UserAgreementModal.tsx new file mode 100644 index 0000000..9dadb2e --- /dev/null +++ b/components/UserAgreementModal.tsx @@ -0,0 +1,136 @@ +import type { ReactNode } from 'react' +import { Modal, View, Text, ScrollView, Pressable, StyleSheet } from 'react-native' + +import { USER_AGREEMENT_MARKDOWN } from '@/lib/userAgreement' +import { theme } from '@/constants/theme' + +function renderAgreementBody(md: string) { + const lines = md.split('\n') + const out: ReactNode[] = [] + lines.forEach((line, i) => { + if (line.startsWith('# ')) { + out.push( + + {line.slice(2)} + + ) + return + } + if (line.startsWith('## ')) { + out.push( + + {line.slice(3)} + + ) + return + } + if (line.startsWith('* ')) { + out.push( + + • {line.slice(2)} + + ) + return + } + if (line.trim() === '') { + out.push() + return + } + out.push( + + {line} + + ) + }) + return out +} + +type Props = { + visible: boolean + onClose: () => void +} + +const AGREEMENT_BODY = USER_AGREEMENT_MARKDOWN.replace(/^# 用户使用协议\n+/, '') + +export function UserAgreementModal({ visible, onClose }: Props) { + return ( + + + + 用户使用协议 + + {renderAgreementBody(AGREEMENT_BODY)} + + + 关闭 + + + + + ) +} + +const styles = StyleSheet.create({ + backdrop: { + flex: 1, + backgroundColor: 'rgba(0,0,0,0.55)', + justifyContent: 'center', + padding: 16, + }, + sheet: { + maxHeight: '88%', + borderRadius: 14, + backgroundColor: theme.bgCard, + borderWidth: 1, + borderColor: 'rgba(124,92,255,0.22)', + paddingTop: 14, + paddingHorizontal: 14, + paddingBottom: 12, + }, + sheetTitle: { + fontSize: 17, + fontWeight: '700', + color: theme.text, + marginBottom: 10, + textAlign: 'center', + }, + scroll: { flexGrow: 0 }, + scrollInner: { paddingBottom: 8 }, + h1: { + fontSize: 17, + fontWeight: '700', + color: theme.text, + marginBottom: 8, + }, + h2: { + fontSize: 15, + fontWeight: '600', + color: theme.text, + marginTop: 10, + marginBottom: 6, + }, + p: { + fontSize: 13, + color: theme.muted, + lineHeight: 21, + marginBottom: 4, + }, + li: { + fontSize: 13, + color: theme.muted, + lineHeight: 21, + marginBottom: 4, + paddingLeft: 4, + }, + gap: { height: 6 }, + closeBtn: { + marginTop: 10, + paddingVertical: 12, + borderRadius: 10, + backgroundColor: theme.bgElevated, + alignItems: 'center', + borderWidth: 1, + borderColor: theme.border, + }, + closeBtnText: { fontSize: 15, fontWeight: '600', color: theme.accent }, +}) diff --git a/electron/agreement.html b/electron/agreement.html new file mode 100644 index 0000000..0162116 --- /dev/null +++ b/electron/agreement.html @@ -0,0 +1,125 @@ + + + + + + 用户使用协议 + + + +
+

用户使用协议

+

欢迎使用本软件(以下简称「本软件」)。在使用本软件前,请您仔细阅读并理解本协议。

+ +

1. 软件性质说明

+

本软件为通用的视频处理与推流工具,支持用户对自有或合法授权的视频源进行处理与分发。本软件不提供任何第三方平台内容的解析、抓取或分发服务。

+ +

2. 用户责任

+

用户在使用本软件过程中,应确保:

+
    +
  • 所使用的视频源具有合法使用权或授权;
  • +
  • 不侵犯任何第三方的著作权、邻接权或其他合法权益;
  • +
  • 不违反相关法律法规及平台规则。
  • +
+

由用户上传、处理、推流的所有内容,均由用户自行承担全部法律责任。

+ +

3. 禁止行为

+

用户不得利用本软件从事以下行为:

+
    +
  • 未经授权抓取、转播、传播第三方平台内容;
  • +
  • 侵犯他人版权、肖像权、隐私权;
  • +
  • 从事违法违规内容传播。
  • +
+ +

4. 责任限制

+

本软件仅提供技术工具服务,不参与用户内容的获取、编辑或分发过程。

+

因用户行为导致的任何法律责任或纠纷,均由用户自行承担,与本软件无关。

+ +

5. 权限与服务

+

部分功能属于付费服务(如 Pro/VIP),用户购买后仅获得使用权限,不涉及软件所有权转移。

+ +

6. 协议变更

+

本软件有权根据业务发展对本协议进行调整,并通过软件或网站进行公告。

+

如您不同意本协议,请立即停止使用本软件。

+
+ + + + diff --git a/electron/main.js b/electron/main.js new file mode 100644 index 0000000..1c023b8 --- /dev/null +++ b/electron/main.js @@ -0,0 +1,91 @@ +const { app, BrowserWindow, ipcMain } = require('electron') +const path = require('path') +const fs = require('fs') + +const AGREEMENT_FILE = 'user-agreement-accepted.json' + +function agreementPath() { + return path.join(app.getPath('userData'), AGREEMENT_FILE) +} + +function hasAcceptedAgreement() { + try { + return fs.existsSync(agreementPath()) + } catch { + return false + } +} + +function markAgreementAccepted() { + fs.writeFileSync( + agreementPath(), + JSON.stringify({ v: 1, acceptedAt: Date.now() }, null, 2), + 'utf8' + ) +} + +/** 占位主窗口;合并到实际桌面端时请替换为真实 loadURL / loadFile */ +function createMainWindow() { + const win = new BrowserWindow({ + width: 960, + height: 640, + webPreferences: { + contextIsolation: true, + nodeIntegration: false, + }, + }) + win.loadURL('about:blank') + return win +} + +function showAgreementGate(onAccepted) { + const win = new BrowserWindow({ + width: 520, + height: 680, + show: false, + resizable: true, + minimizable: false, + maximizable: false, + fullscreenable: false, + webPreferences: { + preload: path.join(__dirname, 'preload.js'), + contextIsolation: true, + nodeIntegration: false, + }, + }) + + win.loadFile(path.join(__dirname, 'agreement.html')) + win.once('ready-to-show', () => win.show()) + + ipcMain.once('agreement-accept', () => { + markAgreementAccepted() + ipcMain.removeAllListeners('agreement-refuse') + win.close() + onAccepted() + }) + + ipcMain.once('agreement-refuse', () => { + ipcMain.removeAllListeners('agreement-accept') + app.quit() + }) + + win.on('closed', () => { + if (!hasAcceptedAgreement()) { + app.quit() + } + }) +} + +app.whenReady().then(() => { + if (!hasAcceptedAgreement()) { + showAgreementGate(() => createMainWindow()) + } else { + createMainWindow() + } +}) + +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') { + app.quit() + } +}) diff --git a/electron/package-lock.json b/electron/package-lock.json new file mode 100644 index 0000000..d5d3b4c --- /dev/null +++ b/electron/package-lock.json @@ -0,0 +1,913 @@ +{ + "name": "d2y-electron-shell", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "d2y-electron-shell", + "version": "1.0.0", + "dependencies": { + "mobile": "file:.." + }, + "devDependencies": { + "electron": "^33.4.1" + } + }, + "..": { + "name": "mobile", + "version": "1.0.0", + "dependencies": { + "@expo/vector-icons": "^15.1.1", + "@react-native-async-storage/async-storage": "^2.2.0", + "@react-native-picker/picker": "^2.11.1", + "@react-navigation/native": "^7.1.33", + "expo": "~55.0.8", + "expo-camera": "~17.0.9", + "expo-clipboard": "~8.0.7", + "expo-constants": "~55.0.9", + "expo-font": "~55.0.4", + "expo-linear-gradient": "~15.0.7", + "expo-linking": "~55.0.8", + "expo-modules-core": "~55.0.17", + "expo-router": "~55.0.7", + "expo-splash-screen": "~55.0.12", + "expo-status-bar": "~55.0.4", + "expo-symbols": "~55.0.5", + "expo-web-browser": "~55.0.10", + "react": "19.2.0", + "react-dom": "19.2.0", + "react-native": "0.83.2", + "react-native-reanimated": "4.2.1", + "react-native-safe-area-context": "~5.6.2", + "react-native-screens": "~4.23.0", + "react-native-web": "~0.21.0", + "react-native-worklets": "0.7.2" + }, + "devDependencies": { + "@types/react": "~19.2.2", + "typescript": "~5.9.2" + } + }, + "node_modules/@electron/get": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", + "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.19.37", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.37.tgz", + "integrity": "sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/electron": { + "version": "33.4.11", + "resolved": "https://registry.npmjs.org/electron/-/electron-33.4.11.tgz", + "integrity": "sha512-xmdAs5QWRkInC7TpXGNvzo/7exojubk+72jn1oJL7keNeIlw7xNglf8TGtJtkR4rWC5FJq0oXiIXPS9BcK2Irg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@electron/get": "^2.0.0", + "@types/node": "^20.9.0", + "extract-zip": "^2.0.1" + }, + "bin": { + "electron": "cli.js" + }, + "engines": { + "node": ">= 12.20.55" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/global-agent/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mobile": { + "resolved": "..", + "link": true + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } +} diff --git a/electron/package.json b/electron/package.json new file mode 100644 index 0000000..e128958 --- /dev/null +++ b/electron/package.json @@ -0,0 +1,15 @@ +{ + "name": "d2y-electron-shell", + "private": true, + "version": "1.0.0", + "main": "main.js", + "scripts": { + "start": "electron ." + }, + "devDependencies": { + "electron": "^33.4.1" + }, + "dependencies": { + "mobile": "file:.." + } +} diff --git a/electron/preload.js b/electron/preload.js new file mode 100644 index 0000000..3c156a7 --- /dev/null +++ b/electron/preload.js @@ -0,0 +1,6 @@ +const { contextBridge, ipcRenderer } = require('electron') + +contextBridge.exposeInMainWorld('agreementApi', { + accept: () => ipcRenderer.send('agreement-accept'), + refuse: () => ipcRenderer.send('agreement-refuse'), +}) diff --git a/lib/userAgreement.ts b/lib/userAgreement.ts new file mode 100644 index 0000000..445836d --- /dev/null +++ b/lib/userAgreement.ts @@ -0,0 +1,42 @@ +/** 用户使用协议(与 electron/agreement.html 内容保持一致) */ +export const USER_AGREEMENT_MARKDOWN = `# 用户使用协议 + +欢迎使用本软件(以下简称「本软件」)。在使用本软件前,请您仔细阅读并理解本协议。 + +## 1. 软件性质说明 + +本软件为通用的视频处理与推流工具,支持用户对自有或合法授权的视频源进行处理与分发。本软件不提供任何第三方平台内容的解析、抓取或分发服务。 + +## 2. 用户责任 + +用户在使用本软件过程中,应确保: + +* 所使用的视频源具有合法使用权或授权; +* 不侵犯任何第三方的著作权、邻接权或其他合法权益; +* 不违反相关法律法规及平台规则。 + +由用户上传、处理、推流的所有内容,均由用户自行承担全部法律责任。 + +## 3. 禁止行为 + +用户不得利用本软件从事以下行为: + +* 未经授权抓取、转播、传播第三方平台内容; +* 侵犯他人版权、肖像权、隐私权; +* 从事违法违规内容传播。 + +## 4. 责任限制 + +本软件仅提供技术工具服务,不参与用户内容的获取、编辑或分发过程。 +因用户行为导致的任何法律责任或纠纷,均由用户自行承担,与本软件无关。 + +## 5. 权限与服务 + +部分功能属于付费服务(如 Pro/VIP),用户购买后仅获得使用权限,不涉及软件所有权转移。 + +## 6. 协议变更 + +本软件有权根据业务发展对本协议进行调整,并通过软件或网站进行公告。 + +如您不同意本协议,请立即停止使用本软件。 +`