feat: playbacks

This commit is contained in:
2025-12-08 14:27:27 +01:00
parent b0cf4a20ab
commit c97fb0a856
3 changed files with 129 additions and 47 deletions
+41 -40
View File
@@ -63,8 +63,8 @@ const HIDDEN_ROUTE_NAMES = new Set([
Routes.Register,
]);
const noopAsync = async () => { };
const noop = () => { };
const noopAsync = async () => {};
const noop = () => {};
const DEFAULT_CONTEXT = {
currentTrack: null,
@@ -274,36 +274,36 @@ const PlayerProvider = ({ children }) => {
(items = [], options = {}) => {
const normalized = Array.isArray(items)
? items
.map((item) => {
if (!item) return null;
if (typeof item === "object") {
const { metadata, context, ...rest } = item;
const safeMetadata =
metadata && typeof metadata === "object"
? { ...metadata }
: undefined;
if (safeMetadata) {
delete safeMetadata.queue;
.map((item) => {
if (!item) return null;
if (typeof item === "object") {
const { metadata, context, ...rest } = item;
const safeMetadata =
metadata && typeof metadata === "object"
? { ...metadata }
: undefined;
if (safeMetadata) {
delete safeMetadata.queue;
}
const safeContext =
context && typeof context === "object"
? { ...context }
: undefined;
if (safeContext) {
delete safeContext.queue;
}
return normalizeTrack(
{
...rest,
...(safeMetadata ? { metadata: safeMetadata } : {}),
...(safeContext ? { context: safeContext } : {}),
},
{}
);
}
const safeContext =
context && typeof context === "object"
? { ...context }
: undefined;
if (safeContext) {
delete safeContext.queue;
}
return normalizeTrack(
{
...rest,
...(safeMetadata ? { metadata: safeMetadata } : {}),
...(safeContext ? { context: safeContext } : {}),
},
{}
);
}
return normalizeTrack(item, {});
})
.filter((track) => !!track?.source)
return normalizeTrack(item, {});
})
.filter((track) => !!track?.source)
: [];
queueRef.current = normalized;
@@ -450,10 +450,9 @@ const PlayerProvider = ({ children }) => {
if (!player) return;
try {
player.loop = !!isLooping;
} catch (_err) { }
} catch (_err) {}
}, [player, isLooping]);
const seekDebounceRef = useRef(null);
const pendingSeekPosRef = useRef(null);
const isSeekingRef = useRef(false);
@@ -511,9 +510,12 @@ const PlayerProvider = ({ children }) => {
const seekBy = useCallback(
async (deltaMs) => {
const currentPos = pendingSeekPosRef.current !== null
? (Platform.OS === "web" ? pendingSeekPosRef.current : pendingSeekPosRef.current * 1000)
: playback.positionMs;
const currentPos =
pendingSeekPosRef.current !== null
? Platform.OS === "web"
? pendingSeekPosRef.current
: pendingSeekPosRef.current * 1000
: playback.positionMs;
const next = Math.max(0, currentPos + Number(deltaMs || 0));
await seekTo(next);
},
@@ -548,7 +550,6 @@ const PlayerProvider = ({ children }) => {
await waitForActiveSeek();
}, [player, status?.isLoaded, waitForActiveSeek]);
const play = useCallback(
async (trackInput, options = {}) => {
const normalized = normalizeTrack(trackInput, options);
@@ -680,8 +681,6 @@ const PlayerProvider = ({ children }) => {
[currentTrack, playback.isPlaying, pause, play, resume]
);
const stop = useCallback(async () => {
try {
autoPlayRef.current = false;
@@ -720,7 +719,9 @@ const PlayerProvider = ({ children }) => {
}
return;
}
const idx = queueRef.current.findIndex((item) => item.id === currentTrack.id);
const idx = queueRef.current.findIndex(
(item) => item.id === currentTrack.id
);
if (idx !== queueIndexRef.current) {
setQueueIndexValue(idx);
}