taglib-wasm 2.2.1 → 2.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +5 -3
- package/dist/disc-folder.d.ts +3 -1
- package/dist/disc-folder.d.ts.map +1 -1
- package/dist/disc-folder.js +187 -152
- package/dist/index.browser.js +17 -10
- package/dist/index.d.ts +1 -1
- package/dist/simple.browser.js +13 -8
- package/dist/src/constants/properties.d.ts +2 -2
- package/dist/src/constants/specialized-properties.d.ts +2 -2
- package/dist/src/constants/specialized-properties.js +2 -2
- package/dist/src/folder-api/album-corroborate.d.ts +13 -0
- package/dist/src/folder-api/album-corroborate.d.ts.map +1 -0
- package/dist/src/folder-api/album-corroborate.js +36 -0
- package/dist/src/folder-api/album-discs.d.ts +13 -0
- package/dist/src/folder-api/album-discs.d.ts.map +1 -0
- package/dist/src/folder-api/album-discs.js +122 -0
- package/dist/src/folder-api/album-grouping.d.ts +24 -0
- package/dist/src/folder-api/album-grouping.d.ts.map +1 -0
- package/dist/src/folder-api/album-grouping.js +118 -0
- package/dist/src/folder-api/album-identity.d.ts +27 -0
- package/dist/src/folder-api/album-identity.d.ts.map +1 -0
- package/dist/src/folder-api/album-identity.js +151 -0
- package/dist/src/folder-api/{group-albums.d.ts → album-types.d.ts} +55 -26
- package/dist/src/folder-api/album-types.d.ts.map +1 -0
- package/dist/src/folder-api/album-types.js +0 -0
- package/dist/src/folder-api/folder-disc.d.ts +24 -0
- package/dist/src/folder-api/folder-disc.d.ts.map +1 -0
- package/dist/src/folder-api/folder-disc.js +169 -0
- package/dist/src/folder-api/index.d.ts +3 -1
- package/dist/src/folder-api/index.d.ts.map +1 -1
- package/dist/src/folder-api/index.js +2 -4
- package/dist/src/folder-api/scan-for-albums.d.ts +1 -1
- package/dist/src/folder-api/scan-for-albums.d.ts.map +1 -1
- package/dist/src/folder-api/scan-for-albums.js +1 -3
- package/dist/src/runtime/detector.d.ts +16 -1
- package/dist/src/runtime/detector.d.ts.map +1 -1
- package/dist/src/runtime/detector.js +58 -52
- package/dist/src/runtime/platform-io.d.ts +8 -0
- package/dist/src/runtime/platform-io.d.ts.map +1 -1
- package/dist/src/runtime/platform-io.js +11 -11
- package/dist/src/runtime/unified-loader/module-selection.d.ts +2 -2
- package/dist/src/runtime/unified-loader/module-selection.d.ts.map +1 -1
- package/dist/src/runtime/unified-loader/module-selection.js +3 -5
- package/dist/src/runtime/wasi-adapter/audio-properties.d.ts +20 -0
- package/dist/src/runtime/wasi-adapter/audio-properties.d.ts.map +1 -0
- package/dist/src/runtime/wasi-adapter/audio-properties.js +85 -0
- package/dist/src/runtime/wasi-adapter/file-handle.d.ts +5 -19
- package/dist/src/runtime/wasi-adapter/file-handle.d.ts.map +1 -1
- package/dist/src/runtime/wasi-adapter/file-handle.js +67 -389
- package/dist/src/runtime/wasi-adapter/handle-state.d.ts +28 -0
- package/dist/src/runtime/wasi-adapter/handle-state.d.ts.map +1 -0
- package/dist/src/runtime/wasi-adapter/handle-state.js +58 -0
- package/dist/src/runtime/wasi-adapter/mp4-items.d.ts +34 -0
- package/dist/src/runtime/wasi-adapter/mp4-items.d.ts.map +1 -0
- package/dist/src/runtime/wasi-adapter/mp4-items.js +80 -0
- package/dist/src/runtime/wasi-adapter/property-surface.d.ts +25 -0
- package/dist/src/runtime/wasi-adapter/property-surface.d.ts.map +1 -0
- package/dist/src/runtime/wasi-adapter/property-surface.js +104 -0
- package/dist/src/runtime/wasi-adapter/structured-fields.d.ts +44 -0
- package/dist/src/runtime/wasi-adapter/structured-fields.d.ts.map +1 -0
- package/dist/src/runtime/wasi-adapter/structured-fields.js +139 -0
- package/dist/src/runtime/wasi-adapter/tag-keys.d.ts +28 -0
- package/dist/src/runtime/wasi-adapter/tag-keys.d.ts.map +1 -0
- package/dist/src/runtime/wasi-adapter/tag-keys.js +46 -0
- package/dist/src/taglib/audio-file-impl.d.ts.map +1 -1
- package/dist/src/taglib/audio-file-impl.js +2 -2
- package/dist/src/taglib/embind-adapter.d.ts.map +1 -1
- package/dist/src/taglib/embind-adapter.js +4 -1
- package/dist/src/taglib/id3v2-frames.d.ts.map +1 -1
- package/dist/src/taglib/id3v2-frames.js +2 -2
- package/dist/src/types/audio-formats.d.ts +5 -5
- package/dist/src/types/audio-formats.d.ts.map +1 -1
- package/dist/src/types/format-property-keys.d.ts +1 -1
- package/dist/src/types/format-property-keys.d.ts.map +1 -1
- package/dist/src/types/tags.d.ts +8 -1
- package/dist/src/types/tags.d.ts.map +1 -1
- package/dist/src/utils/tag-mapping.d.ts.map +1 -1
- package/dist/src/utils/tag-mapping.js +2 -0
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/web-utils/data-url.d.ts.map +1 -1
- package/dist/src/web-utils/data-url.js +4 -2
- package/dist/taglib-wasi.wasm +0 -0
- package/dist/taglib-web.wasm +0 -0
- package/package.json +8 -13
- package/dist/src/folder-api/group-albums.d.ts.map +0 -1
- package/dist/src/folder-api/group-albums.js +0 -544
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
const CONTAINER_TO_FORMAT = {
|
|
2
|
+
MP3: "MP3",
|
|
3
|
+
ADTS: "AAC",
|
|
4
|
+
MP4: "MP4",
|
|
5
|
+
FLAC: "FLAC",
|
|
6
|
+
OGG: "OGG",
|
|
7
|
+
WAV: "WAV",
|
|
8
|
+
AIFF: "AIFF",
|
|
9
|
+
WavPack: "WV",
|
|
10
|
+
TTA: "TTA",
|
|
11
|
+
ASF: "ASF",
|
|
12
|
+
Matroska: "MATROSKA"
|
|
13
|
+
};
|
|
14
|
+
function getAudioProperties(tagData) {
|
|
15
|
+
if (!tagData || !("sampleRate" in tagData)) return null;
|
|
16
|
+
const d = tagData;
|
|
17
|
+
const containerFormat = d.containerFormat || "unknown";
|
|
18
|
+
const mpegVersion = d.mpegVersion ?? 0;
|
|
19
|
+
const formatVersion = d.formatVersion ?? 0;
|
|
20
|
+
return {
|
|
21
|
+
duration: d.length ?? 0,
|
|
22
|
+
durationMs: d.lengthMs ?? 0,
|
|
23
|
+
bitrate: d.bitrate ?? 0,
|
|
24
|
+
sampleRate: d.sampleRate ?? 0,
|
|
25
|
+
channels: d.channels ?? 0,
|
|
26
|
+
bitsPerSample: d.bitsPerSample ?? 0,
|
|
27
|
+
codec: d.codec || "unknown",
|
|
28
|
+
containerFormat,
|
|
29
|
+
isLossless: d.isLossless ?? false,
|
|
30
|
+
...mpegVersion > 0 ? { mpegVersion, mpegLayer: d.mpegLayer ?? 0 } : {},
|
|
31
|
+
...containerFormat === "MP4" || containerFormat === "ASF" ? { isEncrypted: d.isEncrypted ?? false } : {},
|
|
32
|
+
...formatVersion > 0 ? { formatVersion } : {},
|
|
33
|
+
...d.outputGainDb !== void 0 ? { outputGainDb: d.outputGainDb } : {}
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function detectOggCodec(fileData) {
|
|
37
|
+
if (fileData.length < 37) return "OGG";
|
|
38
|
+
const segCount = fileData[26];
|
|
39
|
+
if (segCount === void 0) return "OGG";
|
|
40
|
+
const payloadStart = 27 + segCount;
|
|
41
|
+
if (fileData.length < payloadStart + 8) return "OGG";
|
|
42
|
+
const sig = String.fromCharCode(
|
|
43
|
+
...fileData.slice(payloadStart, payloadStart + 8)
|
|
44
|
+
);
|
|
45
|
+
if (sig === "OpusHead") return "OPUS";
|
|
46
|
+
return "OGG";
|
|
47
|
+
}
|
|
48
|
+
function getFormat(tagData, fileData) {
|
|
49
|
+
const container = tagData?.containerFormat;
|
|
50
|
+
if (container) {
|
|
51
|
+
const codec = tagData?.codec;
|
|
52
|
+
if (container === "OGG" && codec === "Opus") return "OPUS";
|
|
53
|
+
if (CONTAINER_TO_FORMAT[container]) return CONTAINER_TO_FORMAT[container];
|
|
54
|
+
}
|
|
55
|
+
if (!fileData || fileData.length < 8) return "unknown";
|
|
56
|
+
const magic = fileData.slice(0, 4);
|
|
57
|
+
if (magic[0] === 255 && (magic[1] & 224) === 224) return "MP3";
|
|
58
|
+
if (magic[0] === 73 && magic[1] === 68 && magic[2] === 51) {
|
|
59
|
+
return "MP3";
|
|
60
|
+
}
|
|
61
|
+
if (magic[0] === 102 && magic[1] === 76 && magic[2] === 97 && magic[3] === 67) return "FLAC";
|
|
62
|
+
if (magic[0] === 79 && magic[1] === 103 && magic[2] === 103 && magic[3] === 83) return detectOggCodec(fileData);
|
|
63
|
+
if (magic[0] === 82 && magic[1] === 73 && magic[2] === 70 && magic[3] === 70) return "WAV";
|
|
64
|
+
if (magic[0] === 119 && magic[1] === 118 && magic[2] === 112 && magic[3] === 107) return "WV";
|
|
65
|
+
if (magic[0] === 84 && magic[1] === 84 && magic[2] === 65 && magic[3] === 49) return "TTA";
|
|
66
|
+
if (fileData.length >= 16 && magic[0] === 48 && magic[1] === 38 && magic[2] === 178 && magic[3] === 117) return "ASF";
|
|
67
|
+
if (magic[0] === 26 && magic[1] === 69 && magic[2] === 223 && magic[3] === 163) return "MATROSKA";
|
|
68
|
+
const ftyp = fileData.slice(4, 8);
|
|
69
|
+
if (ftyp[0] === 102 && ftyp[1] === 116 && ftyp[2] === 121 && ftyp[3] === 112) return "MP4";
|
|
70
|
+
return "unknown";
|
|
71
|
+
}
|
|
72
|
+
function isMP4(tagData, fileData) {
|
|
73
|
+
if (!fileData) {
|
|
74
|
+
return tagData?.containerFormat === "MP4";
|
|
75
|
+
}
|
|
76
|
+
if (fileData.length < 8) return false;
|
|
77
|
+
const magic = fileData.slice(4, 8);
|
|
78
|
+
return magic[0] === 102 && magic[1] === 116 && magic[2] === 121 && magic[3] === 112;
|
|
79
|
+
}
|
|
80
|
+
export {
|
|
81
|
+
detectOggCodec,
|
|
82
|
+
getAudioProperties,
|
|
83
|
+
getFormat,
|
|
84
|
+
isMP4
|
|
85
|
+
};
|
|
@@ -1,15 +1,10 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview WASI-based FileHandle implementation
|
|
3
|
-
*/
|
|
1
|
+
/** WASI-based FileHandle implementation (taglib-1dfc split). */
|
|
4
2
|
import type { FileHandle, RawChapter, RawId3v2Frame, RawLyrics, RawPicture } from "../../wasm.js";
|
|
5
3
|
import type { BasicTagData } from "../../types/tags.js";
|
|
6
4
|
import type { AudioProperties } from "../../types.js";
|
|
7
5
|
import type { WasiModule } from "../wasmer-sdk-loader/types.js";
|
|
8
6
|
export declare class WasiFileHandle implements FileHandle {
|
|
9
|
-
private readonly
|
|
10
|
-
private fileData;
|
|
11
|
-
private filePath;
|
|
12
|
-
private tagData;
|
|
7
|
+
private readonly state;
|
|
13
8
|
private destroyed;
|
|
14
9
|
constructor(wasiModule: WasiModule);
|
|
15
10
|
private checkNotDestroyed;
|
|
@@ -17,27 +12,18 @@ export declare class WasiFileHandle implements FileHandle {
|
|
|
17
12
|
loadFromPath(path: string): boolean;
|
|
18
13
|
isValid(): boolean;
|
|
19
14
|
save(): boolean;
|
|
15
|
+
getBuffer(): Uint8Array;
|
|
20
16
|
getTagData(): BasicTagData;
|
|
21
17
|
setTagData(data: Partial<BasicTagData>): void;
|
|
22
18
|
getAudioProperties(): AudioProperties | null;
|
|
23
19
|
getFormat(): string;
|
|
24
|
-
|
|
25
|
-
getBuffer(): Uint8Array;
|
|
20
|
+
isMP4(): boolean;
|
|
26
21
|
getProperties(): Record<string, string[]>;
|
|
27
|
-
setProperties(
|
|
22
|
+
setProperties(properties: Record<string, string[]>): void;
|
|
28
23
|
getProperty(key: string): string;
|
|
29
24
|
setProperty(key: string, value: string): void;
|
|
30
|
-
isMP4(): boolean;
|
|
31
25
|
getMP4Item(key: string): string;
|
|
32
26
|
setMP4Item(key: string, value: string): void;
|
|
33
|
-
/** Record an exact atom name to be repaired after the PropertyMap write. */
|
|
34
|
-
private registerMp4ItemName;
|
|
35
|
-
/**
|
|
36
|
-
* Record a foreign-mean freeform atom for deletion at save (taglib-65nm).
|
|
37
|
-
* The PropertyMap erase pass cannot express foreign atoms, so the C++ shim
|
|
38
|
-
* consumes this list and calls removeItem on each exact atom name.
|
|
39
|
-
*/
|
|
40
|
-
private registerMp4ItemRemoval;
|
|
41
27
|
getMp4ItemRemovals(): string[] | undefined;
|
|
42
28
|
setMp4ItemRemovals(removals: string[]): void;
|
|
43
29
|
removeMP4Item(key: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-handle.d.ts","sourceRoot":"","sources":["../../../../src/runtime/wasi-adapter/file-handle.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"file-handle.d.ts","sourceRoot":"","sources":["../../../../src/runtime/wasi-adapter/file-handle.ts"],"names":[],"mappings":"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"}
|