ui: fix audioplayer file length calculation and checks

This commit is contained in:
nick-delirium 2024-09-24 12:11:15 +02:00
parent 9e0b292ddb
commit 5d05a9d102
No known key found for this signature in database
GPG key ID: 93ABD695DF5FDBA0

View file

@ -40,6 +40,7 @@ function DropdownAudioPlayer({
React.useEffect(() => {
Object.entries(audioRefs.current).forEach(([url, audio]) => {
if (audio) {
audio.loop = false;
audio.addEventListener('loadedmetadata', () => {
fileLengths.current[url] = audio.duration;
})
@ -100,10 +101,14 @@ function DropdownAudioPlayer({
if (audio) {
const file = files.find((f) => f.url === key);
if (file) {
audio.currentTime = Math.max(
(timeMs + delta * 1000 - file.start) / 1000,
0
);
const targetTime = (timeMs + delta * 1000 - file.start) / 1000;
const fileLength = fileLengths.current[key];
if (targetTime < 0 || (fileLength && targetTime > fileLength)) {
audio.pause();
return;
} else {
audio.currentTime = targetTime;
}
}
}
});
@ -126,10 +131,12 @@ function DropdownAudioPlayer({
Object.entries(audioRefs.current).forEach(([url, audio]) => {
if (audio) {
const file = files.find((f) => f.url === url);
if (audio.ended && fileLengths.current[url] < time) {
const fileLength = fileLengths.current[url];
if (file) {
if (fileLength && (fileLength*1000)+file.start < time) {
return;
}
if (file && time >= file.start) {
if (time >= file.start) {
if (audio.paused && playing) {
audio.play();
}
@ -137,6 +144,7 @@ function DropdownAudioPlayer({
audio.pause();
}
}
}
});
lastPlayerTime.current = time + deltaMs;
}, [time, delta]);
@ -157,12 +165,19 @@ function DropdownAudioPlayer({
Object.entries(audioRefs.current).forEach(([url, audio]) => {
if (audio) {
const file = files.find((f) => f.url === url);
if (file && playing && time >= file.start) {
const fileLength = fileLengths.current[url];
if (file) {
if (fileLength && (fileLength*1000)+file.start < time) {
audio.pause();
return;
}
if (playing && time >= file.start) {
audio.play();
} else {
audio.pause();
}
}
}
});
setVolume(isMuted ? 0 : volume);
}, [playing]);