clear lot of tickets
This commit is contained in:
@@ -221,6 +221,38 @@ const MusicDetails = ({ route }) => {
|
||||
}
|
||||
}, [project?.musicTimestamps, project?.songIndex]);
|
||||
|
||||
const estimatedDurationMs = useMemo(() => {
|
||||
const toMs = (value) => {
|
||||
const num = Number(value);
|
||||
if (!Number.isFinite(num) || num <= 0) return 0;
|
||||
return num > 1000 ? Math.round(num) : Math.round(num * 1000);
|
||||
};
|
||||
const idx = Number(project?.songIndex);
|
||||
const normalizedIdx = Number.isFinite(idx) && idx >= 0 ? idx : 0;
|
||||
const tsEntry = project?.musicTimestamps?.[normalizedIdx];
|
||||
if (tsEntry && typeof tsEntry === "object") {
|
||||
const fromMetadata =
|
||||
toMs(tsEntry.durationMs) ||
|
||||
toMs(tsEntry.duration) ||
|
||||
toMs(tsEntry.durationS) ||
|
||||
toMs(tsEntry.durationSeconds) ||
|
||||
toMs(tsEntry.audioDuration) ||
|
||||
toMs(tsEntry.audioLength);
|
||||
if (fromMetadata > 0) return fromMetadata;
|
||||
}
|
||||
let maxEndS = 0;
|
||||
for (let i = 0; i < alignedWords.length; i++) {
|
||||
const word = alignedWords[i];
|
||||
const end = Number(word?.endS ?? word?.startS ?? 0);
|
||||
if (Number.isFinite(end) && end > maxEndS) {
|
||||
maxEndS = end;
|
||||
}
|
||||
}
|
||||
return maxEndS > 0 ? Math.round(maxEndS * 1000) : 0;
|
||||
}, [alignedWords, project?.musicTimestamps, project?.songIndex]);
|
||||
|
||||
const sliderDurationMs = durationMs > 0 ? durationMs : estimatedDurationMs;
|
||||
|
||||
// Reset counters when the track changes
|
||||
useEffect(() => {
|
||||
listenedMsRef.current = 0;
|
||||
@@ -320,7 +352,7 @@ const MusicDetails = ({ route }) => {
|
||||
|
||||
const handleSliderSeek = useCallback(
|
||||
async (ratio) => {
|
||||
const dur = durationMs || 0;
|
||||
const dur = sliderDurationMs || 0;
|
||||
if (!trackDescriptor || dur <= 0) return;
|
||||
const targetMs = Math.max(0, Math.floor(dur * ratio));
|
||||
try {
|
||||
@@ -333,7 +365,7 @@ const MusicDetails = ({ route }) => {
|
||||
console.log("MusicDetails seek error", e?.message);
|
||||
}
|
||||
},
|
||||
[durationMs, trackDescriptor, isCurrentTrack, ensureLoaded, seekTrackTo]
|
||||
[sliderDurationMs, trackDescriptor, isCurrentTrack, ensureLoaded, seekTrackTo]
|
||||
);
|
||||
|
||||
const handleToggleLoop = useCallback(async () => {
|
||||
@@ -839,10 +871,10 @@ const MusicDetails = ({ route }) => {
|
||||
<View style={{ paddingTop: 22 }}>
|
||||
<Slider
|
||||
value={fmt(positionMs)}
|
||||
maxValue={fmt(durationMs)}
|
||||
maxValue={fmt(sliderDurationMs)}
|
||||
progress={
|
||||
durationMs
|
||||
? Math.min(1, Math.max(0, (positionMs || 0) / durationMs))
|
||||
sliderDurationMs
|
||||
? Math.min(1, Math.max(0, (positionMs || 0) / sliderDurationMs))
|
||||
: 0
|
||||
}
|
||||
seekEnabled={!!songUrl}
|
||||
|
||||
Reference in New Issue
Block a user