3232import AudioMotionAnalyzer from 'audiomotion-analyzer' ;
3333import packageJson from '../package.json' ;
3434import * as fileExplorer from './file-explorer.js' ;
35- import * as mm from 'music-metadata-browser ' ;
35+ import { parseBlob , parseBuffer , parseWebStream } from 'music-metadata' ;
3636import './scrollIntoViewIfNeeded-polyfill.js' ;
3737import { get , set , del } from 'idb-keyval' ;
3838
@@ -2120,7 +2120,8 @@ function loadGradientIntoCurrentGradient(gradientKey) {
21202120/**
21212121 * Load a music file from the user's computer
21222122 */
2123- function loadLocalFile ( obj ) {
2123+ async function loadLocalFile ( obj ) {
2124+
21242125 const fileBlob = obj . files [ 0 ] ;
21252126
21262127 if ( fileBlob ) {
@@ -2129,11 +2130,14 @@ function loadLocalFile( obj ) {
21292130 audioEl . dataset . file = fileBlob . name ;
21302131 audioEl . dataset . title = parsePath ( fileBlob . name ) . baseName ;
21312132
2132- // load and play
2133- loadFileBlob ( fileBlob , audioEl , true )
2134- . then ( url => mm . fetchFromUrl ( url ) )
2135- . then ( metadata => addMetadata ( metadata , audioEl ) )
2136- . catch ( e => { } ) ;
2133+ try {
2134+ await loadFileBlob ( fileBlob , audioEl , true ) ;
2135+ // Maybe do this parallel?
2136+ const metadata = await parseBlob ( fileBlob ) ;
2137+ await addMetadata ( metadata , audioEl ) ;
2138+ } catch ( error ) {
2139+ consoleLog ( "Failed to load local file" , error ) ;
2140+ }
21372141 }
21382142}
21392143
@@ -3306,47 +3310,45 @@ async function retrieveMetadata() {
33063310
33073311 if ( queueItem ) {
33083312
3309- let uri = queueItem . dataset . file ,
3310- revoke = false ;
3313+ let uri = queueItem . dataset . file ;
3314+ let file ;
33113315
33123316 waitingMetadata ++ ;
33133317 delete queueItem . dataset . retrieve ;
3318+ let metadata ;
33143319
3315- queryMetadata: {
3316- if ( queueItem . handle ) {
3317- try {
3318- if ( await queueItem . handle . requestPermission ( ) != 'granted' )
3319- break queryMetadata;
3320+ if ( queueItem . handle ) {
3321+ // Fetch metadata from File object
3322+ if ( await queueItem . handle . requestPermission ( ) !== 'granted' )
3323+ return ;
33203324
3321- uri = URL . createObjectURL ( await queueItem . handle . getFile ( ) ) ;
3322- revoke = true ;
3323- }
3324- catch ( e ) {
3325- break queryMetadata;
3326- }
3325+ file = await queueItem . handle . getFile ( ) ;
3326+ uri = URL . createObjectURL ( file ) ;
3327+ metadata = await parseBlob ( file ) ;
3328+ } else {
3329+ // Fetch metadata from URI
3330+ const response = await fetch ( uri ) ;
3331+ if ( response . body && typeof response . body . getReader === 'function' ) {
3332+ metadata = await parseWebStream ( response . body , { skipPostHeaders : true } ) ;
3333+ } else {
3334+ // Fallback to Blob, in case the HTTP Result cannot be streamed
3335+ metadata = await parseBlob ( await response . blob ( ) ) ;
33273336 }
3337+ }
33283338
3329- try {
3330- const metadata = await mm . fetchFromUrl ( uri , { skipPostHeaders : true } ) ;
3331- if ( metadata ) {
3332- addMetadata ( metadata , queueItem ) ; // add metadata to play queue item
3333- syncMetadataToAudioElements ( queueItem ) ;
3334- if ( ! ( metadata . common . picture && metadata . common . picture . length ) ) {
3335- getFolderCover ( queueItem ) . then ( cover => {
3336- queueItem . dataset . cover = cover ;
3337- syncMetadataToAudioElements ( queueItem ) ;
3338- } ) ;
3339- }
3340- }
3341- }
3342- catch ( e ) { }
3339+ addMetadata ( metadata , queueItem ) ; // add metadata to play queue item
3340+ syncMetadataToAudioElements ( queueItem ) ;
3341+ if ( ! queueItem . handle && ! ( metadata . common . picture && metadata . common . picture . length ) ) {
3342+ queueItem . dataset . cover = await getFolderCover ( uri ) ;
3343+ syncMetadataToAudioElements ( queueItem ) ;
3344+ }
33433345
3344- if ( revoke )
3345- URL . revokeObjectURL ( uri ) ;
3346+ if ( file ) {
3347+ URL . revokeObjectURL ( uri ) ;
33463348 }
33473349
33483350 waitingMetadata -- ;
3349- retrieveMetadata ( ) ; // call again to continue processing the queue
3351+ await retrieveMetadata ( ) ; // call again to continue processing the queue
33503352 }
33513353}
33523354
0 commit comments