Skip to content

Commit 7899d16

Browse files
committed
Migrate music-metadata-browser to music-metadata
Includes some code refactoring using `async`/`await` to simplify promise chaining.
1 parent 0f4fc18 commit 7899d16

File tree

3 files changed

+39
-44
lines changed

3 files changed

+39
-44
lines changed

package.json

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,13 @@
1111
},
1212
"devDependencies": {
1313
"audiomotion-analyzer": "^4.5.1",
14-
"buffer": "^6.0.3",
1514
"css-loader": "^7.1.2",
1615
"css-minimizer-webpack-plugin": "^7.0.0",
1716
"http-server": "^14.1.1",
1817
"idb-keyval": "^6.2.1",
1918
"mini-css-extract-plugin": "^2.9.0",
20-
"music-metadata-browser": "^2.5.10",
19+
"music-metadata": "^11.6.1",
2120
"notie": "^4.3.1",
22-
"process": "^0.11.10",
2321
"sortablejs": "^1.15.2",
2422
"webpack": "^5.91.0",
2523
"webpack-cli": "^5.1.4"

src/index.js

Lines changed: 38 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
import AudioMotionAnalyzer from 'audiomotion-analyzer';
3333
import packageJson from '../package.json';
3434
import * as fileExplorer from './file-explorer.js';
35-
import * as mm from 'music-metadata-browser';
35+
import { parseBlob, parseWebStream } from 'music-metadata';
3636
import './scrollIntoViewIfNeeded-polyfill.js';
3737
import { get, set, del } from 'idb-keyval';
3838

@@ -2072,7 +2072,8 @@ function loadGradientIntoCurrentGradient(gradientKey) {
20722072
/**
20732073
* Load a music file from the user's computer
20742074
*/
2075-
function loadLocalFile( obj ) {
2075+
async function loadLocalFile( obj ) {
2076+
20762077
const fileBlob = obj.files[0];
20772078

20782079
if ( fileBlob ) {
@@ -2081,11 +2082,14 @@ function loadLocalFile( obj ) {
20812082
audioEl.dataset.file = fileBlob.name;
20822083
audioEl.dataset.title = parsePath( fileBlob.name ).baseName;
20832084

2084-
// load and play
2085-
loadFileBlob( fileBlob, audioEl, true )
2086-
.then( url => mm.fetchFromUrl( url ) )
2087-
.then( metadata => addMetadata( metadata, audioEl ) )
2088-
.catch( e => {} );
2085+
try {
2086+
await loadFileBlob( fileBlob, audioEl, true );
2087+
// Maybe do this parallel?
2088+
const metadata = await parseBlob( fileBlob );
2089+
await addMetadata( metadata, audioEl );
2090+
} catch( error ) {
2091+
consoleLog("Failed to load local file", error);
2092+
}
20892093
}
20902094
}
20912095

@@ -3247,47 +3251,44 @@ async function retrieveMetadata() {
32473251

32483252
if ( queueItem ) {
32493253

3250-
let uri = queueItem.dataset.file,
3251-
revoke = false;
3254+
let uri = queueItem.dataset.file;
3255+
let file;
32523256

32533257
waitingMetadata++;
32543258
delete queueItem.dataset.retrieve;
3259+
let metadata;
32553260

3256-
queryMetadata: {
3257-
if ( queueItem.handle ) {
3258-
try {
3259-
if ( await queueItem.handle.requestPermission() != 'granted' )
3260-
break queryMetadata;
3261+
if ( queueItem.handle ) {
3262+
// Fetch metadata from File object
3263+
if ( await queueItem.handle.requestPermission() !== 'granted' )
3264+
return;
32613265

3262-
uri = URL.createObjectURL( await queueItem.handle.getFile() );
3263-
revoke = true;
3264-
}
3265-
catch( e ) {
3266-
break queryMetadata;
3267-
}
3266+
file = await queueItem.handle.getFile();
3267+
uri = URL.createObjectURL( file );
3268+
metadata = await parseBlob( file, { skipPostHeaders: true } );
3269+
} else {
3270+
// Fetch metadata from URI
3271+
const response = await fetch(uri);
3272+
if (response.body) {
3273+
metadata = await parseWebStream( response.body, { skipPostHeaders: true } );
3274+
} else {
3275+
throw new Error('Failed to stream response.body');
32683276
}
3277+
}
32693278

3270-
try {
3271-
const metadata = await mm.fetchFromUrl( uri, { skipPostHeaders: true } );
3272-
if ( metadata ) {
3273-
addMetadata( metadata, queueItem ); // add metadata to play queue item
3274-
syncMetadataToAudioElements( queueItem );
3275-
if ( ! ( metadata.common.picture && metadata.common.picture.length ) ) {
3276-
getFolderCover( queueItem ).then( cover => {
3277-
queueItem.dataset.cover = cover;
3278-
syncMetadataToAudioElements( queueItem );
3279-
});
3280-
}
3281-
}
3282-
}
3283-
catch( e ) {}
3279+
addMetadata( metadata, queueItem ); // add metadata to play queue item
3280+
syncMetadataToAudioElements( queueItem );
3281+
if ( ! queueItem.handle && ! ( metadata.common.picture && metadata.common.picture.length ) ) {
3282+
queueItem.dataset.cover = await getFolderCover( uri );
3283+
syncMetadataToAudioElements( queueItem );
3284+
}
32843285

3285-
if ( revoke )
3286-
URL.revokeObjectURL( uri );
3286+
if ( file ) {
3287+
URL.revokeObjectURL( uri );
32873288
}
32883289

32893290
waitingMetadata--;
3290-
retrieveMetadata(); // call again to continue processing the queue
3291+
await retrieveMetadata(); // call again to continue processing the queue
32913292
}
32923293
}
32933294

webpack.config.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,6 @@ module.exports = {
3636
new MiniCssExtractPlugin({
3737
filename: 'styles.css',
3838
}),
39-
new webpack.ProvidePlugin({
40-
Buffer: ['buffer', 'Buffer'],
41-
process: 'process/browser.js',
42-
}),
4339
],
4440
output: {
4541
filename: pathData => {

0 commit comments

Comments
 (0)