优化,添加滚动记忆

This commit is contained in:
truewhile
2026-09-15 00:00:35 +08:00
parent 60f05129c9
commit a563ee11d6
15 changed files with 572 additions and 26 deletions
+45
View File
@@ -19,6 +19,7 @@ import { profileAPI } from '../api/profile'
import { useAuthStore } from '../stores/auth'
import type { Media, PlaybackInfo, PlaybackQuality } from '../types'
import { getSeriesKey, seriesTitleFromPath } from '../utils/groupSeries'
import { normalizePlaybackRate } from '../utils/playbackRate'
import { isRemoteEmbyID } from '../utils/remoteEmby'
import {
normalizeSubtitleChineseMode,
@@ -109,8 +110,13 @@ export function PlayerPage() {
const [playerVolume, setPlayerVolume] = useState(() =>
normalizePlayerVolume(authUser?.player_volume),
)
const [playerPlaybackRate, setPlayerPlaybackRate] = useState(() =>
normalizePlaybackRate(authUser?.player_playback_rate),
)
const persistedSubtitleChineseModeRef = useRef(subtitleChineseMode)
const playerVolumeTouchedRef = useRef(false)
const playerPlaybackRateTouchedRef = useRef(false)
const playerPlaybackRateSaveSeqRef = useRef(0)
const subtitlePreferenceTouchedRef = useRef(false)
const subtitlePreferenceSaveQueueRef = useRef<Promise<void>>(Promise.resolve())
const [hlsUnavailable, setHlsUnavailable] = useState(false)
@@ -245,6 +251,10 @@ export function PlayerPage() {
if (!playerVolumeTouchedRef.current) {
setPlayerVolume(volume)
}
const playbackRate = normalizePlaybackRate(cfg.playback_rate)
if (!playerPlaybackRateTouchedRef.current) {
setPlayerPlaybackRate(playbackRate)
}
setDanmakuEnabled(cfg.enabled)
setDanmakuOpacity(Number(cfg.opacity) || 1)
setDanmakuFontSize(Number(cfg.font_size) || 24)
@@ -255,6 +265,10 @@ export function PlayerPage() {
const current = useAuthStore.getState().user
if (current) setAuthUser({ ...current, player_volume: volume })
}
if (!playerPlaybackRateTouchedRef.current) {
const current = useAuthStore.getState().user
if (current) setAuthUser({ ...current, player_playback_rate: playbackRate })
}
})
.catch(() => {
// 配置读取失败时保持本地默认值,不影响播放。
@@ -289,6 +303,34 @@ export function PlayerPage() {
[setAuthUser],
)
const changePlayerPlaybackRate = useCallback((next: number) => {
playerPlaybackRateTouchedRef.current = true
setPlayerPlaybackRate(normalizePlaybackRate(next))
}, [])
const commitPlayerPlaybackRate = useCallback(
(next: number) => {
playerPlaybackRateTouchedRef.current = true
const playbackRate = normalizePlaybackRate(next)
setPlayerPlaybackRate(playbackRate)
const saveSeq = ++playerPlaybackRateSaveSeqRef.current
void danmakuAPI
.updateSettings({ playback_rate: playbackRate })
.then((cfg) => {
if (saveSeq !== playerPlaybackRateSaveSeqRef.current) return
const saved = normalizePlaybackRate(cfg.playback_rate)
setPlayerPlaybackRate(saved)
const current = useAuthStore.getState().user
if (current) setAuthUser({ ...current, player_playback_rate: saved })
})
.catch(() => {
if (saveSeq !== playerPlaybackRateSaveSeqRef.current) return
toast.error('倍速保存失败,请重试')
})
},
[setAuthUser],
)
const saveDanmakuAdvanced = useCallback(
async (values: { source: string; appId: string; appKey: string; clearAppKey: boolean }) => {
const patch: DanmakuSettingsPatch = {
@@ -1424,6 +1466,9 @@ export function PlayerPage() {
playerVolume={playerVolume}
onPlayerVolumeChange={changePlayerVolume}
onPlayerVolumeCommit={commitPlayerVolume}
playerPlaybackRate={playerPlaybackRate}
onPlayerPlaybackRateChange={changePlayerPlaybackRate}
onPlayerPlaybackRateCommit={commitPlayerPlaybackRate}
danmakuEnabled={danmakuEnabled}
danmakuOpacity={danmakuOpacity}
danmakuFontSize={danmakuFontSize}
+9
View File
@@ -151,6 +151,9 @@ type PlayerVideoStageProps = {
playerVolume: number
onPlayerVolumeChange: (volume: number) => void
onPlayerVolumeCommit: (volume: number) => void
playerPlaybackRate: number
onPlayerPlaybackRateChange: (rate: number) => void
onPlayerPlaybackRateCommit: (rate: number) => void
danmakuEnabled: boolean
danmakuOpacity: number
danmakuFontSize: number
@@ -205,6 +208,9 @@ export function PlayerVideoStage({
playerVolume,
onPlayerVolumeChange,
onPlayerVolumeCommit,
playerPlaybackRate,
onPlayerPlaybackRateChange,
onPlayerPlaybackRateCommit,
danmakuEnabled,
danmakuOpacity,
danmakuFontSize,
@@ -653,6 +659,9 @@ export function PlayerVideoStage({
volume={playerVolume}
onVolumeChange={onPlayerVolumeChange}
onVolumeCommit={onPlayerVolumeCommit}
playbackRate={playerPlaybackRate}
onPlaybackRateChange={onPlayerPlaybackRateChange}
onPlaybackRateCommit={onPlayerPlaybackRateCommit}
uiVisible={controlsVisible}
onUiVisibleChange={setControlsVisible}
subs={subs}