@@ -162,7 +162,13 @@ export default function MeetingDetailPage() {
162162 // Include recordings that have audio media files, whether completed or in_progress
163163 // (in_progress recordings may have snapshot uploads available for playback)
164164 const availableRecordings = recordings
165- . filter ( r => ( r . status === "completed" || r . status === "in_progress" ) && r . media_files ?. some ( mf => mf . type === "audio" ) )
165+ . filter ( r =>
166+ ( r . status === "completed" || r . status === "in_progress" ) &&
167+ r . media_files ?. some ( mf => mf . type === "audio" ) &&
168+ // Exclude recordings that also have video (those are cloud recordings;
169+ // their audio content is the same as the video and is shown there instead)
170+ ! r . media_files ?. some ( mf => mf . type === "video" )
171+ )
166172 . sort ( ( a , b ) => a . created_at . localeCompare ( b . created_at ) ) ;
167173
168174 return availableRecordings . map ( rec => {
@@ -650,9 +656,16 @@ export default function MeetingDetailPage() {
650656 // absolute timestamp so the transcript viewer can match against absolute_start_time.
651657 const playbackAbsoluteTime = useMemo ( ( ) : string | null => {
652658 if ( playbackTime == null || ! isPlaybackActive ) return null ;
653- // Video mode: currentTime is relative to video recording's createdAt
659+ // Video mode: currentTime is relative to meeting start (same as live audio recording).
660+ // videoRecording.createdAt is the upload time, not the meeting start — use the
661+ // first audio fragment's createdAt, or fall back to the meeting's start_time.
654662 if ( videoRecording && ! preferAudio ) {
655- const fragStart = new Date ( videoRecording . createdAt ) . getTime ( ) ;
663+ const base =
664+ recordingFragments [ 0 ] ?. createdAt ??
665+ currentMeeting ?. start_time ??
666+ null ;
667+ if ( ! base ) return null ;
668+ const fragStart = new Date ( base ) . getTime ( ) ;
656669 return new Date ( fragStart + playbackTime * 1000 ) . toISOString ( ) ;
657670 }
658671 if ( recordingFragments . length === 0 ) return null ;
@@ -672,7 +685,7 @@ export default function MeetingDetailPage() {
672685 remaining -= fragDur ;
673686 }
674687 return null ;
675- } , [ playbackTime , isPlaybackActive , recordingFragments , videoRecording , preferAudio ] ) ;
688+ } , [ playbackTime , isPlaybackActive , recordingFragments , videoRecording , preferAudio , currentMeeting ] ) ;
676689
677690 if ( error ) {
678691 return (
0 commit comments