修复台号浮层优先级,修复默认音量为0,增加更多菜单键映射

This commit is contained in:
mtvpls
2026-05-31 21:43:08 +08:00
parent 1231ca2895
commit 8d712afa0d
2 changed files with 38 additions and 9 deletions
+6 -5
View File
@@ -22,9 +22,10 @@ const REMOTE_KEY_DEDUPE_MS = 350;
function loadTVVolumeState() { function loadTVVolumeState() {
if (typeof window === 'undefined') return { volume: 1, muted: false }; if (typeof window === 'undefined') return { volume: 1, muted: false };
const savedVolume = Number(localStorage.getItem(TV_VOLUME_KEY)); const savedVolume = localStorage.getItem(TV_VOLUME_KEY);
const volume = Number.isFinite(savedVolume) const parsedVolume = savedVolume === null ? NaN : Number(savedVolume);
? Math.max(0, Math.min(1, savedVolume)) const volume = Number.isFinite(parsedVolume)
? Math.max(0, Math.min(1, parsedVolume))
: 1; : 1;
const savedMuted = localStorage.getItem(TV_MUTED_KEY); const savedMuted = localStorage.getItem(TV_MUTED_KEY);
@@ -586,9 +587,9 @@ function TVLivePlayClient() {
</div> </div>
</aside> </aside>
)} )}
{digitBuffer && <div className='absolute right-10 top-32 rounded-3xl bg-black/75 px-7 py-5 text-5xl font-black text-white shadow-2xl'> {digitBuffer}</div>} {digitBuffer && <div className='absolute right-10 top-32 z-[90] rounded-3xl bg-black/75 px-7 py-5 text-5xl font-black text-white shadow-2xl'> {digitBuffer}</div>}
{channelHint && ( {channelHint && (
<div className='absolute right-20 top-24 max-w-[520px] rounded-3xl bg-black/80 px-7 py-5 text-right text-white shadow-2xl backdrop-blur'> <div className='absolute right-20 top-24 z-[70] max-w-[520px] rounded-3xl bg-black/80 px-7 py-5 text-right text-white shadow-2xl backdrop-blur'>
<div className='text-2xl font-black text-rose-200'>#{channelHint.number}</div> <div className='text-2xl font-black text-rose-200'>#{channelHint.number}</div>
<div className='mt-1 line-clamp-1 text-4xl font-black'>{channelHint.name}</div> <div className='mt-1 line-clamp-1 text-4xl font-black'>{channelHint.name}</div>
</div> </div>
+32 -4
View File
@@ -69,6 +69,7 @@ const TV_DANMAKU_MAX_ITEMS = 3000;
const TV_DANMAKU_SETTINGS_KEY = 'tv_danmaku_settings'; const TV_DANMAKU_SETTINGS_KEY = 'tv_danmaku_settings';
const TV_VOLUME_KEY = 'tv_player_volume'; const TV_VOLUME_KEY = 'tv_player_volume';
const TV_MUTED_KEY = 'tv_player_muted'; const TV_MUTED_KEY = 'tv_player_muted';
const REMOTE_KEY_DEDUPE_MS = 350;
type TVDanmakuSettings = { type TVDanmakuSettings = {
fontSize: number; fontSize: number;
@@ -85,9 +86,10 @@ const DEFAULT_TV_DANMAKU_SETTINGS: TVDanmakuSettings = {
function loadTVVolumeState() { function loadTVVolumeState() {
if (typeof window === 'undefined') return { volume: 1, muted: false }; if (typeof window === 'undefined') return { volume: 1, muted: false };
const savedVolume = Number(localStorage.getItem(TV_VOLUME_KEY)); const savedVolume = localStorage.getItem(TV_VOLUME_KEY);
const volume = Number.isFinite(savedVolume) const parsedVolume = savedVolume === null ? NaN : Number(savedVolume);
? Math.max(0, Math.min(1, savedVolume)) const volume = Number.isFinite(parsedVolume)
? Math.max(0, Math.min(1, parsedVolume))
: 1; : 1;
const savedMuted = localStorage.getItem(TV_MUTED_KEY); const savedMuted = localStorage.getItem(TV_MUTED_KEY);
@@ -292,6 +294,7 @@ function TVPlayClient() {
const idleTimerRef = useRef<number | null>(null); const idleTimerRef = useRef<number | null>(null);
const volumeHintTimerRef = useRef<number | null>(null); const volumeHintTimerRef = useRef<number | null>(null);
const seekHintTimerRef = useRef<number | null>(null); const seekHintTimerRef = useRef<number | null>(null);
const menuKeyTimeRef = useRef(0);
const spawnedDanmakuRef = useRef<Set<string>>(new Set()); const spawnedDanmakuRef = useRef<Set<string>>(new Set());
const lastDanmakuTimeRef = useRef(0); const lastDanmakuTimeRef = useRef(0);
const skippedIntroRef = useRef(''); const skippedIntroRef = useRef('');
@@ -846,9 +849,19 @@ function TVPlayClient() {
const isMenuKey = const isMenuKey =
event.key === 'ContextMenu' || event.key === 'ContextMenu' ||
event.key === 'Menu' || event.key === 'Menu' ||
event.keyCode === 93; event.key === 'BrowserContextMenu' ||
event.code === 'ContextMenu' ||
event.code === 'Menu' ||
event.keyCode === 93 ||
event.keyCode === 82 ||
event.which === 93 ||
event.which === 82;
if (isMenuKey) { if (isMenuKey) {
event.preventDefault(); event.preventDefault();
event.stopImmediatePropagation();
const now = Date.now();
if (now - menuKeyTimeRef.current < REMOTE_KEY_DEDUPE_MS) return;
menuKeyTimeRef.current = now;
if (showPanel || showEpisodes || showDanmakuSettings) { if (showPanel || showEpisodes || showDanmakuSettings) {
setShowPanel(false); setShowPanel(false);
setShowEpisodes(false); setShowEpisodes(false);
@@ -1026,6 +1039,21 @@ function TVPlayClient() {
? 'true' ? 'true'
: 'false' : 'false'
} }
onContextMenu={(event) => {
event.preventDefault();
event.stopPropagation();
const now = Date.now();
if (now - menuKeyTimeRef.current < REMOTE_KEY_DEDUPE_MS) return;
menuKeyTimeRef.current = now;
if (showPanel || showEpisodes || showDanmakuSettings) {
setShowPanel(false);
setShowEpisodes(false);
setShowDanmakuSettings(false);
blurTVPlayerControl();
} else {
revealPanel();
}
}}
className='fixed inset-0 overflow-hidden bg-black text-white' className='fixed inset-0 overflow-hidden bg-black text-white'
> >
{videoUrl ? ( {videoUrl ? (