Skip to content

Commit 5992b3e

Browse files
committed
Migrate music-metadata-browser to music-metadata
1 parent c35a5dd commit 5992b3e

File tree

5 files changed

+42
-34
lines changed

5 files changed

+42
-34
lines changed

docs/README.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,10 @@ And all the developers and artists, for the following resources:
6565

6666
### JavaScript libraries <!-- {docsify-ignore} -->
6767

68-
* [buffer](https://www.npmjs.com/package/buffer) - Node.js Buffer API, for the browser
6968
* [http-server](https://www.npmjs.com/package/http-server) - a simple zero-configuration command-line http server
7069
* [idb-keyval](https://www.npmjs.com/package/idb-keyval) - super-simple promise-based keyval store implemented with IndexedDB
71-
* [music-metadata-browser](https://www.npmjs.com/package/music-metadata-browser) - stream and file based music metadata parser for the browser
70+
* [music-metadata](https://www.npmjs.com/package/music-metadata) - Metadata parser for audio and video media files. Supports file and stream inputs in Node.js and browser environments, extracting format, tag, and duration information.
7271
* [notie](https://www.npmjs.com/package/notie) - clean and simple notification, input, and selection suite for javascript, with no dependencies
73-
* [process](https://www.npmjs.com/package/process) - process information for node.js and browsers
7472
* [scrollIntoViewIfNeeded 4 everyone](https://gist.github.com/hsablonniere/2581101) - polyfill for non-standard scrollIntoViewIfNeeded() method
7573
* [sortablejs](https://www.npmjs.com/package/sortablejs) - JavaScript library for reorderable drag-and-drop lists
7674
* [webpack](https://www.npmjs.com/package/webpack) - JavaScript module bundler for the browser

package.json

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,14 @@
1313
},
1414
"devDependencies": {
1515
"audiomotion-analyzer": "^4.5.1",
16-
"buffer": "^6.0.3",
1716
"css-loader": "^7.1.2",
1817
"css-minimizer-webpack-plugin": "^7.0.0",
1918
"http-server": "^14.1.1",
2019
"idb-keyval": "^6.2.1",
2120
"js-yaml": "^4.1.0",
2221
"mini-css-extract-plugin": "^2.9.0",
23-
"music-metadata-browser": "^2.5.10",
22+
"music-metadata": "^11.7.1",
2423
"notie": "^4.3.1",
25-
"process": "^0.11.10",
2624
"sortablejs": "^1.15.2",
2725
"style-loader": "^4.0.0",
2826
"webpack": "^5.91.0",

src/index.js

Lines changed: 40 additions & 20 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
import * as yaml from 'js-yaml';
@@ -1973,7 +1973,7 @@ function keyboardControls( event ) {
19731973
}
19741974

19751975
/**
1976-
* Sets (or removes) the `src` attribute of a audio element and
1976+
* Sets (or removes) the `src` attribute of an audio element and
19771977
* releases any data blob (File System API) previously in use by it
19781978
*
19791979
* @param {object} audio element
@@ -2077,7 +2077,7 @@ function loadGradientIntoCurrentGradient(gradientKey) {
20772077
/**
20782078
* Load a music file from the user's computer
20792079
*/
2080-
function loadLocalFile( obj ) {
2080+
async function loadLocalFile( obj ) {
20812081
const fileBlob = obj.files[0];
20822082

20832083
if ( fileBlob ) {
@@ -2086,11 +2086,17 @@ function loadLocalFile( obj ) {
20862086
audioEl.dataset.file = fileBlob.name;
20872087
audioEl.dataset.title = parsePath( fileBlob.name ).baseName;
20882088

2089-
// load and play
2090-
loadFileBlob( fileBlob, audioEl, true )
2091-
.then( url => mm.fetchFromUrl( url ) )
2092-
.then( metadata => addMetadata( metadata, audioEl ) )
2093-
.catch( e => {} );
2089+
try {
2090+
// Start both tasks, but only await parseBlob immediately
2091+
const loadTask = loadFileBlob(fileBlob, audioEl, true);
2092+
const metadata = await parseBlob( fileBlob );
2093+
await addMetadata(metadata, audioEl);
2094+
2095+
// Wait for loadTask to complete
2096+
await loadTask;
2097+
} catch( error ) {
2098+
consoleLog("Failed to load local file", error);
2099+
}
20942100
}
20952101
}
20962102

@@ -3279,21 +3285,35 @@ async function retrieveMetadata() {
32793285
break queryMetadata;
32803286
}
32813287
}
3282-
3283-
try {
3284-
const metadata = await mm.fetchFromUrl( uri, { skipPostHeaders: true } );
3285-
if ( metadata ) {
3286-
addMetadata( metadata, queueItem ); // add metadata to play queue item
3287-
syncMetadataToAudioElements( queueItem );
3288-
if ( ! ( metadata.common.picture && metadata.common.picture.length ) ) {
3289-
getFolderCover( queueItem ).then( cover => {
3290-
queueItem.dataset.cover = cover;
3291-
syncMetadataToAudioElements( queueItem );
3292-
});
3288+
else {
3289+
// Fetch metadata from URI
3290+
const response = await fetch(queueItem.dataset.file);
3291+
if (response.ok) {
3292+
try {
3293+
let metadata;
3294+
if (response.body?.getReader) {
3295+
const contentType = response.headers.get("Content-Type");
3296+
const contentSize = response.headers.get("Content-Length");
3297+
try {
3298+
metadata = await parseWebStream(response.body, {
3299+
mimeType: contentType,
3300+
size: contentSize ? Number.parseInt(contentSize, 10) : undefined
3301+
}, {skipPostHeaders: true});
3302+
} finally {
3303+
await response.body.cancel();
3304+
}
3305+
} else {
3306+
// Fallback to Blob, in case the HTTP Result cannot be streamed
3307+
metadata = await parseBlob(await response.blob());
3308+
}
3309+
addMetadata(metadata, queueItem); // add metadata to play queue item
3310+
} catch(e) {
3311+
consoleLog('Failed to retrieve metadata', e)
32933312
}
3313+
} else {
3314+
consoleLog(`Failed to fetch metadata http-response=${response.status} for url=${queueItem.dataset.file}`, true);
32943315
}
32953316
}
3296-
catch( e ) {}
32973317

32983318
if ( revoke )
32993319
URL.revokeObjectURL( uri );

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 => {

webpack.dev.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,6 @@ module.exports = {
3535
},
3636
plugins: [
3737
new webpack.HotModuleReplacementPlugin(),
38-
new webpack.ProvidePlugin({
39-
Buffer: ['buffer', 'Buffer'],
40-
process: 'process/browser.js',
41-
}),
4238
],
4339
output: {
4440
filename: 'audioMotion.js',

0 commit comments

Comments
 (0)