diff --git a/public/manifest.json b/public/manifest.json index 2b4e0bc..c1f9fed 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -6,7 +6,6 @@ "scope": "/", "display": "standalone", "background_color": "#000000", - "theme_color": "#000000", "apple-mobile-web-app-capable": "yes", "apple-mobile-web-app-status-bar-style": "black", "icons": [ diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 378f4c3..563f64b 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -11,7 +11,6 @@ export const metadata: Metadata = { title: 'MoonTV', description: '影视聚合', manifest: '/manifest.json', - themeColor: '#0f172a', }; export default function RootLayout({ @@ -21,6 +20,9 @@ export default function RootLayout({ }) { return ( + + + {children} diff --git a/src/app/play/page.tsx b/src/app/play/page.tsx index dbb2e44..0f03ef7 100644 --- a/src/app/play/page.tsx +++ b/src/app/play/page.tsx @@ -8,6 +8,7 @@ import { DefaultVideoLayout, } from '@vidstack/react/player/layouts/default'; import { Heart } from 'lucide-react'; +import Head from 'next/head'; import { useSearchParams } from 'next/navigation'; import { Suspense } from 'react'; import { useCallback, useEffect, useRef, useState } from 'react'; @@ -1125,149 +1126,227 @@ function PlayPageClient() { }; return ( -
- {/* 竖屏提示蒙层 */} - {showOrientationTip && ( -
- - - - 请横屏观看 -
- )} - - {/* 强制横屏按钮:仅在移动端竖屏时显示 */} - {isPortrait && ( - - )} - - {/* 换源加载遮罩 */} - {sourceChanging && ( -
-
-
-
换源中...
-
-
- )} - - {/* 播放器容器 */} - + + + +
- - - 1 ? ( - // 下一集按钮放在时间显示前 - - ) : null, - beforeFullscreenButton: ( - <> - {totalEpisodes > 1 && ( + {/* 竖屏提示蒙层 */} + {showOrientationTip && ( +
+ + + + 请横屏观看 +
+ )} + + {/* 强制横屏按钮:仅在移动端竖屏时显示 */} + {isPortrait && ( + + )} + + {/* 换源加载遮罩 */} + {sourceChanging && ( +
+
+
+
换源中...
+
+
+ )} + + {/* 播放器容器 */} + + + + 1 ? ( + // 下一集按钮放在时间显示前 - )} - - - ), - }} - /> + ) : null, + beforeFullscreenButton: ( + <> + {totalEpisodes > 1 && ( + + )} + + + ), + }} + /> - {/* 选集侧拉面板 */} - {totalEpisodes > 1 && ( -
+ {/* 选集侧拉面板 */} + {totalEpisodes > 1 && ( +
+ {/* 遮罩层 */} + {showEpisodePanel && ( +
{ + setShowEpisodePanel(false); + playerContainerRef.current?.focus(); + }} + /> + )} + + {/* 侧拉面板 */} +
+
+
+

+ 选集列表 +

+ +
+ +
+ 当前: 第 {currentEpisodeIndex + 1} 集 / 共 {totalEpisodes}{' '} + 集 +
+ +
+
+ {Array.from({ length: totalEpisodes }, (_, idx) => ( + + ))} +
+
+
+
+
+ )} + + {/* 换源侧拉面板 */} +
{/* 遮罩层 */} - {showEpisodePanel && ( + {showSourcePanel && (
{ - setShowEpisodePanel(false); + setShowSourcePanel(false); playerContainerRef.current?.focus(); }} /> @@ -1275,16 +1354,16 @@ function PlayPageClient() { {/* 侧拉面板 */}
-

选集列表

+

播放源

-
- 当前: 第 {currentEpisodeIndex + 1} 集 / 共 {totalEpisodes} 集 -
- + {/* 搜索结果 */}
-
- {Array.from({ length: totalEpisodes }, (_, idx) => ( - - ))} -
-
-
-
-
- )} - - {/* 换源侧拉面板 */} -
- {/* 遮罩层 */} - {showSourcePanel && ( -
{ - setShowSourcePanel(false); - playerContainerRef.current?.focus(); - }} - /> - )} - - {/* 侧拉面板 */} -
-
-
-

播放源

- -
- - {/* 搜索结果 */} -
- {searchLoading && ( -
-
- 搜索中... -
- )} - - {searchError && ( -
- {searchError} -
- )} - - {!searchLoading && - !searchError && - searchResults.length === 0 && ( -
- 未找到相关视频源 + {searchLoading && ( +
+
+ 搜索中...
)} - {!searchLoading && !searchError && searchResults.length > 0 && ( -
- {[ - ...searchResults.filter( - (r) => - r.source === currentSource && - String(r.id) === String(currentId) - ), - ...searchResults.filter( - (r) => - !( - r.source === currentSource && - String(r.id) === String(currentId) - ) - ), - ].map((result) => { - const isCurrentSource = - result.source === currentSource && - String(result.id) === String(currentId); - return ( -
- !isCurrentSource && - handleSourceChange( - result.source, - result.id, - result.title - ) - } - > - {/* 视频封面 */} -
- {result.title} + {searchError && ( +
+ {searchError} +
+ )} - {/* 集数圆形指示器 */} - {result.episodes && ( -
- - {result.episodes} - + {!searchLoading && + !searchError && + searchResults.length === 0 && ( +
+ 未找到相关视频源 +
+ )} + + {!searchLoading && + !searchError && + searchResults.length > 0 && ( +
+ {[ + ...searchResults.filter( + (r) => + r.source === currentSource && + String(r.id) === String(currentId) + ), + ...searchResults.filter( + (r) => + !( + r.source === currentSource && + String(r.id) === String(currentId) + ) + ), + ].map((result) => { + const isCurrentSource = + result.source === currentSource && + String(result.id) === String(currentId); + return ( +
+ !isCurrentSource && + handleSourceChange( + result.source, + result.id, + result.title + ) + } + > + {/* 视频封面 */} +
+ {result.title} + + {/* 集数圆形指示器 */} + {result.episodes && ( +
+ + {result.episodes} + +
+ )} + + {isCurrentSource && ( +
+
+ 当前播放 +
+
+ )}
- )} - {isCurrentSource && ( -
-
- 当前播放 + {/* 视频信息 */} +
+

+ {result.title} +

+
+
+ {result.source_name} +
- )} -
- - {/* 视频信息 */} -
-

- {result.title} -

-
-
- {result.source_name} -
-
-
- ); - })} -
- )} + ); + })} +
+ )} +
-
- {/* 快捷键提示 */} -
-
- - {shortcutDirection === 'left' && ( - - )} - {shortcutDirection === 'right' && ( - - )} - {shortcutDirection === 'up' && ( - - )} - {shortcutDirection === 'down' && ( - - )} - {shortcutDirection === 'play' && ( - - )} - {shortcutDirection === 'pause' && ( - - )} - {shortcutDirection === 'error' && ( - - )} - - {shortcutText} + {/* 快捷键提示 */} +
+
+ + {shortcutDirection === 'left' && ( + + )} + {shortcutDirection === 'right' && ( + + )} + {shortcutDirection === 'up' && ( + + )} + {shortcutDirection === 'down' && ( + + )} + {shortcutDirection === 'play' && ( + + )} + {shortcutDirection === 'pause' && ( + + )} + {shortcutDirection === 'error' && ( + + )} + + {shortcutText} +
-
- {/* 三倍速提示 */} -
-
- - - - 3x 倍速 + {/* 三倍速提示 */} +
+
+ + + + 3x 倍速 +
-
- -
+ +
+ ); } @@ -1642,8 +1653,13 @@ const FavoriteIcon = ({ filled }: { filled: boolean }) => { export default function PlayPage() { return ( - - - + <> + + + + + + + ); }