fix: WebM/Opus audio duration shows zero - add durationchange listener and preload=auto

This commit is contained in:
ajaysi
2026-04-22 06:10:15 +05:30
parent b1ca29f7f7
commit 6e9c11744c
2 changed files with 14 additions and 5 deletions

View File

@@ -383,7 +383,7 @@ export const VoiceAvatarPlaceholder: React.FC<{ domainName?: string; onVoiceSet?
} }
setAudioFile(file); setAudioFile(file);
const url = URL.createObjectURL(blob); const url = URL.createObjectURL(blob);
console.log('[VoiceClone] Created audio preview URL:', url, 'size:', file.size, 'type:', blob.type); if (process.env.NODE_ENV === 'development') console.log('[VoiceClone] Created audio preview URL:', url.split('?')[0], 'size:', file.size, 'type:', blob.type);
setAudioPreviewUrl(url); setAudioPreviewUrl(url);
} catch (err) { } catch (err) {
console.error('[VoiceClone] Error creating audio blob:', err); console.error('[VoiceClone] Error creating audio blob:', err);
@@ -813,7 +813,8 @@ export const VoiceAvatarPlaceholder: React.FC<{ domainName?: string; onVoiceSet?
<audio <audio
key={audioPreviewUrl} key={audioPreviewUrl}
controls controls
src={audioPreviewUrl} src={audioPreviewUrl}
preload="auto"
style={{ height: '30px', width: '100%' }} style={{ height: '30px', width: '100%' }}
onError={(e) => { onError={(e) => {
console.error('[VoiceClone] Audio playback error:', e); console.error('[VoiceClone] Audio playback error:', e);
@@ -1075,7 +1076,8 @@ export const VoiceAvatarPlaceholder: React.FC<{ domainName?: string; onVoiceSet?
<audio <audio
key={audioPreviewUrl} key={audioPreviewUrl}
controls controls
src={audioPreviewUrl} src={audioPreviewUrl}
preload="auto"
style={{ width: '100%', height: '28px' }} style={{ width: '100%', height: '28px' }}
onError={(e) => { onError={(e) => {
console.error('[VoiceClone] Source audio playback error:', e); console.error('[VoiceClone] Source audio playback error:', e);

View File

@@ -105,7 +105,12 @@ export const InlineAudioPlayer: React.FC<InlineAudioPlayerProps> = ({ audioUrl,
if (!audio || !blobUrl) return; if (!audio || !blobUrl) return;
const updateTime = () => setCurrentTime(audio.currentTime); const updateTime = () => setCurrentTime(audio.currentTime);
const updateDuration = () => setDuration(audio.duration); const updateDuration = () => {
const d = audio.duration;
if (d && isFinite(d) && d > 0) {
setDuration(d);
}
};
const handleEnd = () => setPlaying(false); const handleEnd = () => setPlaying(false);
const handleError = () => { const handleError = () => {
setError('Audio playback error. Please try again.'); setError('Audio playback error. Please try again.');
@@ -114,12 +119,14 @@ export const InlineAudioPlayer: React.FC<InlineAudioPlayerProps> = ({ audioUrl,
audio.addEventListener("timeupdate", updateTime); audio.addEventListener("timeupdate", updateTime);
audio.addEventListener("loadedmetadata", updateDuration); audio.addEventListener("loadedmetadata", updateDuration);
audio.addEventListener("durationchange", updateDuration);
audio.addEventListener("ended", handleEnd); audio.addEventListener("ended", handleEnd);
audio.addEventListener("error", handleError); audio.addEventListener("error", handleError);
return () => { return () => {
audio.removeEventListener("timeupdate", updateTime); audio.removeEventListener("timeupdate", updateTime);
audio.removeEventListener("loadedmetadata", updateDuration); audio.removeEventListener("loadedmetadata", updateDuration);
audio.removeEventListener("durationchange", updateDuration);
audio.removeEventListener("ended", handleEnd); audio.removeEventListener("ended", handleEnd);
audio.removeEventListener("error", handleError); audio.removeEventListener("error", handleError);
}; };
@@ -239,7 +246,7 @@ export const InlineAudioPlayer: React.FC<InlineAudioPlayerProps> = ({ audioUrl,
</Tooltip> </Tooltip>
</Stack> </Stack>
{effectiveAudioUrl && ( {effectiveAudioUrl && (
<audio ref={audioRef} src={effectiveAudioUrl} preload="metadata" /> <audio ref={audioRef} src={effectiveAudioUrl} preload="auto" />
)} )}
</Stack> </Stack>
</Paper> </Paper>