diff --git a/package.json b/package.json
index 9143317..4527951 100644
--- a/package.json
+++ b/package.json
@@ -41,6 +41,7 @@
"hls.js": "^1.6.10",
"lucide-react": "^0.438.0",
"media-icons": "^1.1.5",
+ "mux.js": "^6.3.0",
"next": "^14.2.33",
"next-pwa": "^5.6.0",
"next-themes": "^0.4.6",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 36ff96b..7de938d 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -71,6 +71,9 @@ importers:
media-icons:
specifier: ^1.1.5
version: 1.1.5
+ mux.js:
+ specifier: ^6.3.0
+ version: 6.3.0
next:
specifier: ^14.2.33
version: 14.2.33(@babel/core@7.27.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -2604,6 +2607,9 @@ packages:
dom-serializer@2.0.0:
resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
+ dom-walk@0.1.2:
+ resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==}
+
domelementtype@2.3.0:
resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
@@ -3109,6 +3115,9 @@ packages:
resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==}
engines: {node: '>=4'}
+ global@4.4.0:
+ resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==}
+
globals@11.12.0:
resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
engines: {node: '>=4'}
@@ -3936,6 +3945,9 @@ packages:
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
engines: {node: '>=6'}
+ min-document@2.19.2:
+ resolution: {integrity: sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A==}
+
min-indent@1.0.1:
resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
engines: {node: '>=4'}
@@ -3987,6 +3999,11 @@ packages:
resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==}
engines: {node: '>=10'}
+ mux.js@6.3.0:
+ resolution: {integrity: sha512-/QTkbSAP2+w1nxV+qTcumSDN5PA98P0tjrADijIzQHe85oBK3Akhy9AHlH0ne/GombLMz1rLyvVsmrgRxoPDrQ==}
+ engines: {node: '>=8', npm: '>=5'}
+ hasBin: true
+
mz@2.7.0:
resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
@@ -8277,6 +8294,8 @@ snapshots:
domhandler: 5.0.3
entities: 4.5.0
+ dom-walk@0.1.2: {}
+
domelementtype@2.3.0: {}
domexception@2.0.1:
@@ -8968,6 +8987,11 @@ snapshots:
dependencies:
ini: 1.3.8
+ global@4.4.0:
+ dependencies:
+ min-document: 2.19.2
+ process: 0.11.10
+
globals@11.12.0: {}
globals@13.24.0:
@@ -10066,6 +10090,10 @@ snapshots:
mimic-fn@2.1.0: {}
+ min-document@2.19.2:
+ dependencies:
+ dom-walk: 0.1.2
+
min-indent@1.0.1: {}
mini-svg-data-uri@1.4.4: {}
@@ -10114,6 +10142,11 @@ snapshots:
arrify: 2.0.1
minimatch: 3.1.2
+ mux.js@6.3.0:
+ dependencies:
+ '@babel/runtime': 7.27.6
+ global: 4.4.0
+
mz@2.7.0:
dependencies:
any-promise: 1.3.0
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 02e76cc..0f0968c 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -12,6 +12,9 @@ import { SiteProvider } from '../components/SiteProvider';
import { ThemeProvider } from '../components/ThemeProvider';
import { WatchRoomProvider } from '../components/WatchRoomProvider';
import ChatFloatingWindow from '../components/watch-room/ChatFloatingWindow';
+import { DownloadProvider } from '../contexts/DownloadContext';
+import { DownloadBubble } from '../components/DownloadBubble';
+import { DownloadPanel } from '../components/DownloadPanel';
const inter = Inter({ subsets: ['latin'] });
export const dynamic = 'force-dynamic';
@@ -124,9 +127,13 @@ export default async function RootLayout({
>
- {children}
-
-
+
+ {children}
+
+
+
+
+
diff --git a/src/app/play/page.tsx b/src/app/play/page.tsx
index f3816e5..1ab7890 100644
--- a/src/app/play/page.tsx
+++ b/src/app/play/page.tsx
@@ -8,6 +8,7 @@ import { Suspense, useEffect, useRef, useState } from 'react';
import { usePlaySync } from '@/hooks/usePlaySync';
import { getDoubanDetail } from '@/lib/douban.client';
+import { useDownload } from '@/contexts/DownloadContext';
import {
deleteFavorite,
@@ -64,6 +65,7 @@ function PlayPageClient() {
const router = useRouter();
const searchParams = useSearchParams();
const enableComments = useEnableComments();
+ const { addDownloadTask } = useDownload();
// 获取 Proxy M3U8 Token
const proxyToken = typeof window !== 'undefined' ? process.env.NEXT_PUBLIC_PROXY_M3U8_TOKEN || '' : '';
@@ -3577,7 +3579,7 @@ function PlayPageClient() {
{/* 下载按钮 */}
+ {/* IDM 下载按钮 */}
+
+
{/* PotPlayer */}