1. iOS自动切歌问题(2处):

- isNearEnd:阈值 0.15s → 0.5s
    - updateTime:移除 iOS 限制
  2. 时长显示负值问题(2处):
    - formatTime:增加异常值保护
    - resolveDurationSeconds:防止返回负数
This commit is contained in:
史悦
2026-01-13 17:47:46 +08:00
parent 79595dc9ed
commit c9fac4b7fe

View File

@@ -159,7 +159,8 @@
// --- Utility Functions --- // --- Utility Functions ---
const formatTime = (seconds) => { const formatTime = (seconds) => {
if (!seconds) return "0:00"; // 增加保护处理负数、Infinity、NaN等异常值
if (!Number.isFinite(seconds) || seconds < 0) return "0:00";
const mins = Math.floor(seconds / 60); const mins = Math.floor(seconds / 60);
const secs = Math.floor(seconds % 60); const secs = Math.floor(seconds % 60);
return `${mins}:${secs < 10 ? '0' : ''}${secs}`; return `${mins}:${secs < 10 ? '0' : ''}${secs}`;
@@ -232,11 +233,14 @@
if (audio.seekable && audio.seekable.length) { if (audio.seekable && audio.seekable.length) {
try { try {
const end = audio.seekable.end(audio.seekable.length - 1); const end = audio.seekable.end(audio.seekable.length - 1);
// 增加负数检查iOS锁屏时可能返回负数
if (Number.isFinite(end) && end > 0) return end; if (Number.isFinite(end) && end > 0) return end;
} catch (e) {} } catch (e) {}
} }
} }
return getSongDurationSeconds(song); const fallbackDuration = getSongDurationSeconds(song);
// 再次确保不会返回负数或异常值
return Number.isFinite(fallbackDuration) && fallbackDuration > 0 ? fallbackDuration : 0;
}; };
// --- ID Normalization --- // --- ID Normalization ---
@@ -1231,14 +1235,16 @@
const isNearEnd = () => { const isNearEnd = () => {
const durationSeconds = resolveDurationSeconds(audio, currentSongRef.current); const durationSeconds = resolveDurationSeconds(audio, currentSongRef.current);
if (!Number.isFinite(durationSeconds) || durationSeconds <= 0) return false; if (!Number.isFinite(durationSeconds) || durationSeconds <= 0) return false;
const threshold = IS_IOS ? 0.15 : 0.35; // iOS锁屏时timeupdate频率降低需要更大的提前量
const threshold = IS_IOS ? 0.5 : 0.35;
return audio.currentTime >= durationSeconds - threshold; return audio.currentTime >= durationSeconds - threshold;
}; };
const updateTime = () => { const updateTime = () => {
setCurrentTime(audio.currentTime); setCurrentTime(audio.currentTime);
if (autoAdvanceLockRef.current) return; if (autoAdvanceLockRef.current) return;
if (!IS_IOS && isNearEnd()) triggerAutoNext(); // 移除iOS限制所有平台都使用timeupdate检查解决iOS锁屏时ended事件不触发的问题
if (isNearEnd()) triggerAutoNext();
}; };
const updateDuration = () => setDuration(resolveDurationSeconds(audio, currentSongRef.current)); const updateDuration = () => setDuration(resolveDurationSeconds(audio, currentSongRef.current));
const onEnded = () => triggerAutoNext(); const onEnded = () => triggerAutoNext();