修复台号浮层优先级,修复默认音量为0,增加更多菜单键映射
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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 ? (
|
||||||
|
|||||||
Reference in New Issue
Block a user