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
- )
- }
- >
- {/* 视频封面 */}
-
-

+ {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.episodes && (
+
+
+ {result.episodes}
+
+
+ )}
+
+ {isCurrentSource && (
+
+ )}
- )}
- {isCurrentSource && (
-
-
- 当前播放
+ {/* 视频信息 */}
+
+
+ {result.title}
+
+
+
+ {result.source_name}
+
- )}
-
-
- {/* 视频信息 */}
-
-
- {result.title}
-
-
-
- {result.source_name}
-
-
-
- );
- })}
-
- )}
+ );
+ })}
+
+ )}
+
-
- {/* 快捷键提示 */}
-
-
-
-
{shortcutText}
+ {/* 快捷键提示 */}
+
+
+
+
{shortcutText}
+
-
- {/* 三倍速提示 */}
-
-
-
-
3x 倍速
+ {/* 三倍速提示 */}
+
-
-
-
+
+
+ >
);
}
@@ -1642,8 +1653,13 @@ const FavoriteIcon = ({ filled }: { filled: boolean }) => {
export default function PlayPage() {
return (
-
-
-
+ <>
+
+
+
+
+
+
+ >
);
}