Fix: Specials-Rätsel spielen jetzt korrekt vom markierten Ausschnitt
- AudioPlayer setzt currentTime jetzt korrekt auf startTime beim Start - Behebt Bug, bei dem Specials-Rätsel immer vom Anfang des Titels starteten - Berücksichtigt startTime in togglePlay(), play() und autoPlay
This commit is contained in:
@@ -72,22 +72,30 @@ const AudioPlayer = forwardRef<AudioPlayerRef, AudioPlayerProps>(({ src, unlocke
|
|||||||
if (autoPlay) {
|
if (autoPlay) {
|
||||||
// Delay play slightly to ensure currentTime sticks
|
// Delay play slightly to ensure currentTime sticks
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
const playPromise = audioRef.current?.play();
|
if (audioRef.current) {
|
||||||
if (playPromise !== undefined) {
|
// Ensure currentTime is set before playing
|
||||||
playPromise
|
audioRef.current.currentTime = startTime;
|
||||||
.then(() => {
|
const playPromise = audioRef.current.play();
|
||||||
setIsPlaying(true);
|
if (playPromise !== undefined) {
|
||||||
onPlay?.();
|
playPromise
|
||||||
setHasPlayedOnce(true);
|
.then(() => {
|
||||||
onHasPlayedChange?.(true); // Notify parent
|
setIsPlaying(true);
|
||||||
})
|
onPlay?.();
|
||||||
.catch(error => {
|
setHasPlayedOnce(true);
|
||||||
console.log("Autoplay prevented:", error);
|
onHasPlayedChange?.(true); // Notify parent
|
||||||
setIsPlaying(false);
|
})
|
||||||
});
|
.catch(error => {
|
||||||
|
console.log("Autoplay prevented:", error);
|
||||||
|
setIsPlaying(false);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}, 150);
|
}, 150);
|
||||||
}
|
}
|
||||||
|
} else if (startTime !== undefined && audioRef.current.currentTime < startTime) {
|
||||||
|
// If startTime is set and currentTime is before it, reset to startTime
|
||||||
|
// This handles the case where the audio element was reset or reloaded
|
||||||
|
audioRef.current.currentTime = startTime;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, [src, unlockedSeconds, startTime, autoPlay, processedSrc, processedUnlockedSeconds]);
|
}, [src, unlockedSeconds, startTime, autoPlay, processedSrc, processedUnlockedSeconds]);
|
||||||
@@ -97,6 +105,16 @@ const AudioPlayer = forwardRef<AudioPlayerRef, AudioPlayerProps>(({ src, unlocke
|
|||||||
play: () => {
|
play: () => {
|
||||||
if (!audioRef.current) return;
|
if (!audioRef.current) return;
|
||||||
|
|
||||||
|
// Check if we need to reset to startTime
|
||||||
|
const current = audioRef.current.currentTime;
|
||||||
|
const elapsed = current - startTime;
|
||||||
|
|
||||||
|
// Reset if: never played before, current position is before startTime, or we've exceeded the unlocked segment
|
||||||
|
if (!hasPlayedOnce || current < startTime || elapsed >= unlockedSeconds) {
|
||||||
|
// Reset to start of segment
|
||||||
|
audioRef.current.currentTime = startTime;
|
||||||
|
}
|
||||||
|
|
||||||
const playPromise = audioRef.current.play();
|
const playPromise = audioRef.current.play();
|
||||||
if (playPromise !== undefined) {
|
if (playPromise !== undefined) {
|
||||||
playPromise
|
playPromise
|
||||||
@@ -121,8 +139,20 @@ const AudioPlayer = forwardRef<AudioPlayerRef, AudioPlayerProps>(({ src, unlocke
|
|||||||
|
|
||||||
if (isPlaying) {
|
if (isPlaying) {
|
||||||
audioRef.current.pause();
|
audioRef.current.pause();
|
||||||
|
setIsPlaying(false);
|
||||||
} else {
|
} else {
|
||||||
|
// Check if we need to reset to startTime
|
||||||
|
const current = audioRef.current.currentTime;
|
||||||
|
const elapsed = current - startTime;
|
||||||
|
|
||||||
|
// Reset if: never played before, current position is before startTime, or we've exceeded the unlocked segment
|
||||||
|
if (!hasPlayedOnce || current < startTime || elapsed >= unlockedSeconds) {
|
||||||
|
// Reset to start of segment
|
||||||
|
audioRef.current.currentTime = startTime;
|
||||||
|
}
|
||||||
|
|
||||||
audioRef.current.play();
|
audioRef.current.play();
|
||||||
|
setIsPlaying(true);
|
||||||
onPlay?.();
|
onPlay?.();
|
||||||
|
|
||||||
if (hasPlayedOnce) {
|
if (hasPlayedOnce) {
|
||||||
@@ -132,7 +162,6 @@ const AudioPlayer = forwardRef<AudioPlayerRef, AudioPlayerProps>(({ src, unlocke
|
|||||||
onHasPlayedChange?.(true); // Notify parent
|
onHasPlayedChange?.(true); // Notify parent
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setIsPlaying(!isPlaying);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleTimeUpdate = () => {
|
const handleTimeUpdate = () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user