@@ -17,17 +17,49 @@ export default function TakesImportModal({ show, onHide, takes = [] }) {
1717 useEffect ( ( ) => {
1818 if ( ! show || takes . length === 0 ) return ;
1919
20+ const audioElements = [ ] ;
21+
2022 takes . forEach ( ( take ) => {
2123 if ( take . duration > 0 || ! take . audioURL || resolvedDurations [ take . id ] != null ) return ;
24+
25+ // For proxy / HTTP URLs, resolve duration via fetch + AudioContext decode
26+ // since <audio> preload='metadata' needs range-request support
27+ if ( take . audioURL . startsWith ( '/api/' ) || take . audioURL . startsWith ( 'http' ) ) {
28+ fetch ( take . audioURL )
29+ . then ( ( r ) => {
30+ if ( ! r . ok ) throw new Error ( `${ r . status } ` ) ;
31+ return r . arrayBuffer ( ) ;
32+ } )
33+ . then ( ( buf ) => new AudioContext ( ) . decodeAudioData ( buf ) )
34+ . then ( ( decoded ) => {
35+ if ( decoded . duration && isFinite ( decoded . duration ) ) {
36+ setResolvedDurations ( ( prev ) => ( { ...prev , [ take . id ] : decoded . duration } ) ) ;
37+ }
38+ } )
39+ . catch ( ( err ) =>
40+ console . warn ( `TakesImportModal: duration resolve failed for ${ take . id } :` , err . message ) ,
41+ ) ;
42+ return ;
43+ }
44+
45+ // Blob URLs work fine with the Audio element approach
2246 const audio = new Audio ( ) ;
2347 audio . preload = 'metadata' ;
2448 audio . onloadedmetadata = ( ) => {
2549 if ( audio . duration && isFinite ( audio . duration ) ) {
2650 setResolvedDurations ( ( prev ) => ( { ...prev , [ take . id ] : audio . duration } ) ) ;
2751 }
2852 } ;
53+ audio . onerror = ( ) => {
54+ console . warn ( `TakesImportModal: Audio metadata load failed for ${ take . id } ` ) ;
55+ } ;
2956 audio . src = take . audioURL ;
57+ audioElements . push ( audio ) ;
3058 } ) ;
59+
60+ return ( ) => {
61+ audioElements . forEach ( ( a ) => { a . src = '' ; } ) ;
62+ } ;
3163 } , [ show , takes ] ) ;
3264
3365 // Update track name when take is selected
@@ -213,17 +245,8 @@ export default function TakesImportModal({ show, onHide, takes = [] }) {
213245 return date . toLocaleDateString ( ) + ' ' + date . toLocaleTimeString ( ) ;
214246 } ;
215247
216- // Mock data for testing if no takes provided
217248 const displayTakes = takes . length > 0 ? takes : [ ] ;
218249
219- console . log ( '🎹 TakesImportModal: Received takes:' , takes ) ;
220- console . log ( '🎹 TakesImportModal: Display takes:' , displayTakes ) ;
221-
222- // Show helpful message if no takes
223- if ( displayTakes . length === 0 && takes . length === 0 ) {
224- console . log ( 'No takes available in TakesImportModal' ) ;
225- }
226-
227250 return (
228251 < Modal show = { show } onHide = { onHide } size = "lg" className = "takes-import-modal" >
229252 < Modal . Header closeButton className = "bg-dark text-white" >
0 commit comments