feat: refactor playerStore to improve loadVideo and _savePlayRecord methods with enhanced options and throttling logic

This commit is contained in:
zimplexing
2025-07-18 11:26:06 +08:00
parent 3fdd1fc587
commit cab3e2ed12

View File

@@ -27,7 +27,13 @@ interface PlayerState {
introEndTime?: number; introEndTime?: number;
outroStartTime?: number; outroStartTime?: number;
setVideoRef: (ref: RefObject<Video>) => void; setVideoRef: (ref: RefObject<Video>) => void;
loadVideo: (options: {source: string, id: string, title: string; episodeIndex: number, position?: number}) => Promise<void>; loadVideo: (options: {
source: string;
id: string;
title: string;
episodeIndex: number;
position?: number;
}) => Promise<void>;
playEpisode: (index: number) => void; playEpisode: (index: number) => void;
togglePlayPause: () => void; togglePlayPause: () => void;
seek: (duration: number) => void; seek: (duration: number) => void;
@@ -41,8 +47,9 @@ interface PlayerState {
setOutroStartTime: () => void; setOutroStartTime: () => void;
reset: () => void; reset: () => void;
_seekTimeout?: NodeJS.Timeout; _seekTimeout?: NodeJS.Timeout;
_isRecordSaveThrottled: boolean;
// Internal helper // Internal helper
_savePlayRecord: (updates?: Partial<PlayRecord>) => void; _savePlayRecord: (updates?: Partial<PlayRecord>, options?: { immediate?: boolean }) => void;
} }
const usePlayerStore = create<PlayerState>((set, get) => ({ const usePlayerStore = create<PlayerState>((set, get) => ({
@@ -62,6 +69,7 @@ const usePlayerStore = create<PlayerState>((set, get) => ({
introEndTime: undefined, introEndTime: undefined,
outroStartTime: undefined, outroStartTime: undefined,
_seekTimeout: undefined, _seekTimeout: undefined,
_isRecordSaveThrottled: false,
setVideoRef: (ref) => set({ videoRef: ref }), setVideoRef: (ref) => set({ videoRef: ref }),
@@ -81,7 +89,7 @@ const usePlayerStore = create<PlayerState>((set, get) => ({
console.info("Detail not found after initialization"); console.info("Detail not found after initialization");
return; return;
} }
}; }
try { try {
const playRecord = await PlayRecordManager.get(detail.source, detail.id.toString()); const playRecord = await PlayRecordManager.get(detail.source, detail.id.toString());
@@ -170,7 +178,7 @@ const usePlayerStore = create<PlayerState>((set, get) => ({
if (existingIntroEndTime) { if (existingIntroEndTime) {
// Clear the time // Clear the time
set({ introEndTime: undefined }); set({ introEndTime: undefined });
get()._savePlayRecord({ introEndTime: undefined }); get()._savePlayRecord({ introEndTime: undefined }, { immediate: true });
Toast.show({ Toast.show({
type: "info", type: "info",
text1: "已清除片头时间", text1: "已清除片头时间",
@@ -179,7 +187,7 @@ const usePlayerStore = create<PlayerState>((set, get) => ({
// Set the time // Set the time
const newIntroEndTime = status.positionMillis; const newIntroEndTime = status.positionMillis;
set({ introEndTime: newIntroEndTime }); set({ introEndTime: newIntroEndTime });
get()._savePlayRecord({ introEndTime: newIntroEndTime }); get()._savePlayRecord({ introEndTime: newIntroEndTime }, { immediate: true });
Toast.show({ Toast.show({
type: "success", type: "success",
text1: "设置成功", text1: "设置成功",
@@ -196,7 +204,7 @@ const usePlayerStore = create<PlayerState>((set, get) => ({
if (existingOutroStartTime) { if (existingOutroStartTime) {
// Clear the time // Clear the time
set({ outroStartTime: undefined }); set({ outroStartTime: undefined });
get()._savePlayRecord({ outroStartTime: undefined }); get()._savePlayRecord({ outroStartTime: undefined }, { immediate: true });
Toast.show({ Toast.show({
type: "info", type: "info",
text1: "已清除片尾时间", text1: "已清除片尾时间",
@@ -206,7 +214,7 @@ const usePlayerStore = create<PlayerState>((set, get) => ({
if (!status.durationMillis) return; if (!status.durationMillis) return;
const newOutroStartTime = status.durationMillis - status.positionMillis; const newOutroStartTime = status.durationMillis - status.positionMillis;
set({ outroStartTime: newOutroStartTime }); set({ outroStartTime: newOutroStartTime });
get()._savePlayRecord({ outroStartTime: newOutroStartTime }); get()._savePlayRecord({ outroStartTime: newOutroStartTime }, { immediate: true });
Toast.show({ Toast.show({
type: "success", type: "success",
text1: "设置成功", text1: "设置成功",
@@ -215,7 +223,18 @@ const usePlayerStore = create<PlayerState>((set, get) => ({
} }
}, },
_savePlayRecord: (updates = {}) => { _savePlayRecord: (updates = {}, options = {}) => {
const { immediate = false } = options;
if (!immediate) {
if (get()._isRecordSaveThrottled) {
return;
}
set({ _isRecordSaveThrottled: true });
setTimeout(() => {
set({ _isRecordSaveThrottled: false });
}, 10000); // 10 seconds
}
const { detail } = useDetailStore.getState(); const { detail } = useDetailStore.getState();
const { currentEpisodeIndex, episodes, status, introEndTime, outroStartTime } = get(); const { currentEpisodeIndex, episodes, status, introEndTime, outroStartTime } = get();
if (detail && status?.isLoaded) { if (detail && status?.isLoaded) {