mirror of
https://github.com/zimplexing/OrionTV.git
synced 2026-05-14 03:37:29 +08:00
feat: refactor playerStore to improve loadVideo and _savePlayRecord methods with enhanced options and throttling logic
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user