Skip to content

Commit e043a1b

Browse files
committed
Try upgrading to music-metadata from music-metadata-browser
1 parent 366e795 commit e043a1b

File tree

8 files changed

+134
-22
lines changed

8 files changed

+134
-22
lines changed

packages/webamp/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
### Improvements
88

9+
- Switched id3/metadata parsing from using a very old version of `music-metadata-browser` to the latest version of `music-metadata`. `music-metadata-browser` is still supported for users of `webamp/lazy` for backwards compatibility, but it is no longer the default.
910
- Added new `Webamp` instance methods:
1011
- `webamp.toggleShuffle`
1112
- `webamp.toggleRepeat`
@@ -15,6 +16,7 @@
1516

1617
### Bug Fixes
1718

19+
- Fixed broken ID3 tag and bitrate parsing.
1820
- Fix bug where scrolling the main window or playlist window would change the volume but also (incorrectly) scroll the page.
1921
- Fix bug where resizing the window such that the current layout cannot fit on the page, while also scrolled down the page, would cause the layout to be recentered out of view.
2022
- Avoid a console log from Redux Dev Tools.

packages/webamp/demo/js/webampConfig.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,7 @@ export async function getWebampConfig(
128128
// @ts-ignore
129129
import(/* webpackChunkName: "jszip" */ "jszip/dist/jszip"),
130130
requireMusicMetadata: () =>
131-
import(
132-
/* webpackChunkName: "music-metadata-browser" */ "music-metadata-browser/dist/index"
133-
),
131+
import(/* webpackChunkName: "music-metadata" */ "music-metadata"),
134132
__initialState: screenshot ? screenshotInitialState : initialState,
135133
__butterchurnOptions,
136134
__customMiddlewares: [sentryMiddleware, loggerMiddleware],

packages/webamp/js/fileUtils.ts

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import invariant from "invariant";
2-
import { IMusicMetadataBrowserApi } from "./types";
2+
import { IMusicMetadataApi, IMusicMetadataBrowserApi } from "./types";
33
import { IAudioMetadata } from "music-metadata-browser"; // Import music-metadata type definitions
44
import * as Utils from "./utils";
55

66
type MediaDataType = string | ArrayBuffer | Blob;
77

8-
export function genMediaTags(
8+
export async function genMediaTags(
99
file: MediaDataType,
10-
musicMetadata: IMusicMetadataBrowserApi
10+
musicMetadata: IMusicMetadataBrowserApi | IMusicMetadataApi
1111
): Promise<IAudioMetadata> {
1212
invariant(
1313
file != null,
@@ -20,7 +20,29 @@ export function genMediaTags(
2020
};
2121

2222
if (typeof file === "string") {
23-
return musicMetadata.fetchFromUrl(file, options);
23+
if (
24+
"parseWebStream" in musicMetadata &&
25+
typeof musicMetadata.parseWebStream === "function"
26+
) {
27+
const response = await fetch(file);
28+
if (!response.ok) {
29+
throw new Error(
30+
`Failed to fetch URL: ${file}, status: ${response.status}`
31+
);
32+
}
33+
const webStream = response.body;
34+
if (webStream == null) {
35+
throw new Error("Response body is null, cannot parse metadata.");
36+
}
37+
return musicMetadata.parseWebStream(webStream, undefined, options);
38+
}
39+
if (
40+
"fetchFromUrl" in musicMetadata &&
41+
typeof musicMetadata.fetchFromUrl === "function"
42+
) {
43+
return musicMetadata.fetchFromUrl(file, options);
44+
}
45+
throw new Error("No suitable method available to parse URL");
2446
}
2547
// Assume Blob
2648
return musicMetadata.parseBlob(file as Blob, options);

packages/webamp/js/types.ts

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { AnyWebByteStream, IFileInfo } from "strtok3";
12
import { PlaylistState } from "./reducers/playlist";
23
import { SettingsState } from "./reducers/settings";
34
import { UserInputState } from "./reducers/userInput";
@@ -864,19 +865,32 @@ export interface IMusicMetadataBrowserApi {
864865
audioTrackUrl: string,
865866
options?: IOptions
866867
): Promise<IAudioMetadata>;
868+
}
867869

870+
/**
871+
* Type definition of the portion of the music-metadata module we use in Webamp.
872+
*/
873+
export interface IMusicMetadataApi {
868874
/**
869-
* Parse audio from Node Buffer
870-
* @param {Stream.Readable} stream Audio input stream
871-
* @param {string} mimeType <string> Content specification MIME-type, e.g.: 'audio/mpeg'
872-
* @param {IOptions} options Parsing options
873-
* @returns {Promise<IAudioMetadata>}
875+
* Parse audio from Node Stream.Readable
876+
* @param stream - Stream to read the audio track from
877+
* @param fileInfo - File information object or MIME-type, e.g.: 'audio/mpeg'
878+
* @param options - Parsing options
879+
* @returns Metadata
874880
*/
875-
parseBuffer(
876-
buf: Buffer,
877-
mimeType?: string,
881+
parseWebStream(
882+
webStream: AnyWebByteStream,
883+
fileInfo?: IFileInfo | string,
878884
options?: IOptions
879885
): Promise<IAudioMetadata>;
886+
887+
/**
888+
* Parse Web API File
889+
* @param {Blob} blob
890+
* @param {IOptions} options Parsing options
891+
* @returns {Promise<IAudioMetadata>}
892+
*/
893+
parseBlob(blob: Blob, options?: IOptions): Promise<IAudioMetadata>;
880894
}
881895

882896
export interface Extras {

packages/webamp/js/webamp.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import JSZip from "jszip";
2-
import * as musicMetadataBrowser from "music-metadata-browser";
2+
import * as musicMetadata from "music-metadata";
33
import { Options } from "./types";
44
import WebampLazy, { PrivateOptions } from "./webampLazy";
55

@@ -28,7 +28,7 @@ export default class Webamp extends WebampLazy {
2828
super({
2929
...options,
3030
requireJSZip: async () => JSZip,
31-
requireMusicMetadata: async () => musicMetadataBrowser,
31+
requireMusicMetadata: async () => musicMetadata,
3232
});
3333
}
3434
}

packages/webamp/js/webampLazy.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ export interface PrivateOptions {
5151
}
5252

5353
export interface InjectableDependencies {
54-
requireJSZip: () => Promise<any>; // TODO: Type JSZip
55-
requireMusicMetadata: () => Promise<any>; // TODO: Type music-metadata-browser
54+
requireJSZip: () => Promise<typeof import("jszip")>;
55+
requireMusicMetadata: () => Promise<typeof import("music-metadata")>;
5656
}
5757

5858
class Webamp {

packages/webamp/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@
134134
"jszip": "^3.10.1",
135135
"lodash": "^4.17.21",
136136
"milkdrop-preset-converter-aws": "^0.1.6",
137+
"music-metadata": "^11.6.0",
137138
"music-metadata-browser": "^0.6.1",
138139
"react": "^19.1.0",
139140
"react-dom": "^19.1.0",

yarn.lock

Lines changed: 78 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5779,6 +5779,20 @@
57795779
dependencies:
57805780
defer-to-connect "^2.0.1"
57815781

5782+
"@tokenizer/inflate@^0.2.7":
5783+
version "0.2.7"
5784+
resolved "https://registry.yarnpkg.com/@tokenizer/inflate/-/inflate-0.2.7.tgz#32dd9dfc9abe457c89b3d9b760fc0690c85a103b"
5785+
integrity sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==
5786+
dependencies:
5787+
debug "^4.4.0"
5788+
fflate "^0.8.2"
5789+
token-types "^6.0.0"
5790+
5791+
"@tokenizer/token@^0.3.0":
5792+
version "0.3.0"
5793+
resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.3.0.tgz#fe98a93fe789247e998c75e74e9c7c63217aa276"
5794+
integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==
5795+
57825796
"@tootallnate/once@1":
57835797
version "1.1.2"
57845798
resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz"
@@ -9344,7 +9358,7 @@ content-disposition@0.5.4, content-disposition@^0.5.2:
93449358
dependencies:
93459359
safe-buffer "5.2.1"
93469360

9347-
content-type@~1.0.4, content-type@~1.0.5:
9361+
content-type@^1.0.5, content-type@~1.0.4, content-type@~1.0.5:
93489362
version "1.0.5"
93499363
resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz"
93509364
integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==
@@ -9999,6 +10013,13 @@ debug@^3.2.7:
999910013
dependencies:
1000010014
ms "^2.1.1"
1000110015

10016+
debug@^4.4.0, debug@^4.4.1:
10017+
version "4.4.1"
10018+
resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b"
10019+
integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==
10020+
dependencies:
10021+
ms "^2.1.3"
10022+
1000210023
debuglog@^1.0.1:
1000310024
version "1.0.1"
1000410025
resolved "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz"
@@ -12239,6 +12260,11 @@ fflate@^0.7.3:
1223912260
resolved "https://registry.npmjs.org/fflate/-/fflate-0.7.4.tgz"
1224012261
integrity sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==
1224112262

12263+
fflate@^0.8.2:
12264+
version "0.8.2"
12265+
resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea"
12266+
integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==
12267+
1224212268
figures@^1.3.5:
1224312269
version "1.7.0"
1224412270
resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
@@ -12304,6 +12330,16 @@ file-type@^12.0.0:
1230412330
resolved "https://registry.npmjs.org/file-type/-/file-type-12.4.2.tgz"
1230512331
integrity sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==
1230612332

12333+
file-type@^21.0.0:
12334+
version "21.0.0"
12335+
resolved "https://registry.yarnpkg.com/file-type/-/file-type-21.0.0.tgz#b6c5990064bc4b704f8e5c9b6010c59064d268bc"
12336+
integrity sha512-ek5xNX2YBYlXhiUXui3D/BXa3LdqPmoLJ7rqEx2bKJ7EAUEfmXgW0Das7Dc6Nr9MvqaOnIqiPV0mZk/r/UpNAg==
12337+
dependencies:
12338+
"@tokenizer/inflate" "^0.2.7"
12339+
strtok3 "^10.2.2"
12340+
token-types "^6.0.0"
12341+
uint8array-extras "^1.4.0"
12342+
1230712343
file-type@^3.8.0:
1230812344
version "3.9.0"
1230912345
resolved "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz"
@@ -14045,7 +14081,7 @@ ieee754@1.1.13:
1404514081
resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz"
1404614082
integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==
1404714083

14048-
ieee754@^1.1.13, ieee754@^1.1.4:
14084+
ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1:
1404914085
version "1.2.1"
1405014086
resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz"
1405114087
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
@@ -17606,6 +17642,11 @@ media-typer@0.3.0:
1760617642
resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz"
1760717643
integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==
1760817644

17645+
media-typer@^1.1.0:
17646+
version "1.1.0"
17647+
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-1.1.0.tgz#6ab74b8f2d3320f2064b2a87a38e7931ff3a5561"
17648+
integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==
17649+
1760917650
memfs@^3.4.3:
1761017651
version "3.6.0"
1761117652
resolved "https://registry.npmjs.org/memfs/-/memfs-3.6.0.tgz"
@@ -18648,7 +18689,7 @@ ms@2.1.2:
1864818689
resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
1864918690
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
1865018691

18651-
ms@2.1.3, ms@^2.0.0, ms@^2.1.1:
18692+
ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.3:
1865218693
version "2.1.3"
1865318694
resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
1865418695
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
@@ -18702,6 +18743,20 @@ music-metadata-browser@^0.6.1:
1870218743
remove "^0.1.5"
1870318744
typedarray-to-buffer "^3.1.5"
1870418745

18746+
music-metadata@^11.6.0:
18747+
version "11.6.0"
18748+
resolved "https://registry.yarnpkg.com/music-metadata/-/music-metadata-11.6.0.tgz#edc6c136c9ada31ee7ce9ed0c7a7c47546e9a54b"
18749+
integrity sha512-l7MbWpuGM5GK8gol22L9tou8d/IoFyS8dnsfLbO6cocjlyMwgyLaCIqdwhp4sN1Nzz/Ql/K9kRLvRJDCVKjO3g==
18750+
dependencies:
18751+
"@tokenizer/token" "^0.3.0"
18752+
content-type "^1.0.5"
18753+
debug "^4.4.1"
18754+
file-type "^21.0.0"
18755+
media-typer "^1.1.0"
18756+
strtok3 "^10.3.1"
18757+
token-types "^6.0.3"
18758+
uint8array-extras "^1.4.0"
18759+
1870518760
music-metadata@^3.4.0:
1870618761
version "3.8.0"
1870718762
resolved "https://registry.npmjs.org/music-metadata/-/music-metadata-3.8.0.tgz"
@@ -23846,6 +23901,13 @@ strnum@^1.0.5:
2384623901
resolved "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz"
2384723902
integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==
2384823903

23904+
strtok3@^10.2.2, strtok3@^10.3.1:
23905+
version "10.3.1"
23906+
resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-10.3.1.tgz#80fe431a4ee652de4e33f14e11e15fd5170a627d"
23907+
integrity sha512-3JWEZM6mfix/GCJBBUrkA8p2Id2pBkyTkVCJKto55w080QBKZ+8R171fGrbiSp+yMO/u6F8/yUh7K4V9K+YCnw==
23908+
dependencies:
23909+
"@tokenizer/token" "^0.3.0"
23910+
2384923911
strtok3@^2.3.0:
2385023912
version "2.3.0"
2385123913
resolved "https://registry.npmjs.org/strtok3/-/strtok3-2.3.0.tgz"
@@ -24340,6 +24402,14 @@ token-types@^1.0.1:
2434024402
dependencies:
2434124403
ieee754 "^1.1.13"
2434224404

24405+
token-types@^6.0.0, token-types@^6.0.3:
24406+
version "6.0.3"
24407+
resolved "https://registry.yarnpkg.com/token-types/-/token-types-6.0.3.tgz#684f4f40e0750078ec644c826207a2c160b827a8"
24408+
integrity sha512-IKJ6EzuPPWtKtEIEPpIdXv9j5j2LGJEYk0CKY2efgKoYKLBiZdh6iQkLVBow/CB3phyWAWCyk+bZeaimJn6uRQ==
24409+
dependencies:
24410+
"@tokenizer/token" "^0.3.0"
24411+
ieee754 "^1.2.1"
24412+
2434324413
toml@^3.0.0:
2434424414
version "3.0.0"
2434524415
resolved "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz"
@@ -24728,6 +24798,11 @@ ufo@^1.3.2:
2472824798
resolved "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz"
2472924799
integrity sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==
2473024800

24801+
uint8array-extras@^1.4.0:
24802+
version "1.4.0"
24803+
resolved "https://registry.yarnpkg.com/uint8array-extras/-/uint8array-extras-1.4.0.tgz#e42a678a6dd335ec2d21661333ed42f44ae7cc74"
24804+
integrity sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==
24805+
2473124806
unbox-primitive@^1.0.2:
2473224807
version "1.0.2"
2473324808
resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz"

0 commit comments

Comments
 (0)