networkwm-js 0.1.2 → 0.2.0
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/dist/cli/encrypt-oma.d.ts +2 -0
- package/dist/cli/encrypt-oma.d.ts.map +1 -0
- package/dist/cli/encrypt-oma.js +83 -0
- package/dist/cli.js +5 -0
- package/dist/database-abstraction.d.ts.map +1 -1
- package/dist/database-abstraction.js +28 -25
- package/dist/devices.d.ts +2 -0
- package/dist/devices.d.ts.map +1 -1
- package/dist/devices.js +34 -0
- package/dist/filesystem/usb-mass-storage-webusb-filesystem.d.ts +2 -1
- package/dist/filesystem/usb-mass-storage-webusb-filesystem.d.ts.map +1 -1
- package/dist/filesystem/usb-mass-storage-webusb-filesystem.js +3 -2
- package/dist/helpers.js +1 -1
- package/dist/mp3.d.ts +1 -1
- package/dist/mp3.d.ts.map +1 -1
- package/dist/mp3.js +12 -7
- package/dist/tagged-oma.d.ts +10 -5
- package/dist/tagged-oma.d.ts.map +1 -1
- package/dist/tagged-oma.js +19 -1
- package/dist/utils.d.ts +1 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +21 -1
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encrypt-oma.d.ts","sourceRoot":"","sources":["../../src/cli/encrypt-oma.ts"],"names":[],"mappings":"AAQA,wBAAsB,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,iBAgE5D"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.main = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const tagged_oma_1 = require("../tagged-oma");
|
|
9
|
+
const himd_js_1 = require("himd-js");
|
|
10
|
+
const utils_1 = require("../utils");
|
|
11
|
+
const encryption_1 = require("../encryption");
|
|
12
|
+
const path_1 = require("path");
|
|
13
|
+
async function main(invocation, args) {
|
|
14
|
+
if (args.length < 2) {
|
|
15
|
+
console.log(`Usage: ${invocation} <source WAV> <codec:kbps> [--title <title> --artist <artist> --album <album>] <destination OMA>`);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const [source, codec, ...rest] = args;
|
|
19
|
+
let codecSplit = codec.split(':');
|
|
20
|
+
if (codecSplit.length != 2) {
|
|
21
|
+
console.log("Invalid codec format!");
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
let [codecNameStr, codecBitrateStr] = codecSplit;
|
|
25
|
+
let codecBitrate = parseInt(codecBitrateStr);
|
|
26
|
+
if (isNaN(codecBitrate)) {
|
|
27
|
+
console.log("Invalid bitrate provided!");
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
let codecInfo;
|
|
31
|
+
if (codecNameStr == "A3+") {
|
|
32
|
+
codecInfo = (0, himd_js_1.generateCodecInfo)("A3+", himd_js_1.HiMDKBPSToFrameSize.atrac3plus[codecBitrate]);
|
|
33
|
+
}
|
|
34
|
+
else if (codecNameStr == "AT3") {
|
|
35
|
+
codecInfo = (0, himd_js_1.generateCodecInfo)("AT3", himd_js_1.HiMDKBPSToFrameSize.atrac3[codecBitrate]);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
console.log("Invalid codec name provided!");
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
let metadata = {
|
|
42
|
+
album: "",
|
|
43
|
+
artist: "",
|
|
44
|
+
genre: "",
|
|
45
|
+
title: "",
|
|
46
|
+
};
|
|
47
|
+
let dest = "";
|
|
48
|
+
let i = 0;
|
|
49
|
+
for (i; i < rest.length; i++) {
|
|
50
|
+
let arg = rest[i];
|
|
51
|
+
if (arg == "--title") {
|
|
52
|
+
metadata.title = rest[++i];
|
|
53
|
+
}
|
|
54
|
+
else if (arg == "--album") {
|
|
55
|
+
metadata.album = rest[++i];
|
|
56
|
+
}
|
|
57
|
+
else if (arg == "--artist") {
|
|
58
|
+
metadata.artist = rest[++i];
|
|
59
|
+
}
|
|
60
|
+
else if (arg == "--genre") {
|
|
61
|
+
metadata.genre = rest[++i];
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
dest = arg;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (!fs_1.default.existsSync(source)) {
|
|
68
|
+
console.log("Source does not exist!");
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (fs_1.default.existsSync(dest)) {
|
|
72
|
+
console.log("Destination file exists!");
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
await (0, encryption_1.initCrypto)();
|
|
76
|
+
(0, encryption_1.importKeys)(new Uint8Array(fs_1.default.readFileSync((0, path_1.join)(__dirname, "..", "..", "EKBROOTS.DES"))));
|
|
77
|
+
let rawAudioStream = (0, utils_1.getAudioDataFromWave)(new Uint8Array(fs_1.default.readFileSync(source)));
|
|
78
|
+
let encrypted = (0, tagged_oma_1.createTaggedEncryptedOMA)(rawAudioStream, metadata, codecInfo);
|
|
79
|
+
console.log("MACList value for the encrypted file is: ", Array.from(encrypted.maclistValue).map(e => e.toString(16).padStart(2, '0')).join(''));
|
|
80
|
+
console.log("Duration is: ", encrypted.duration, " seconds");
|
|
81
|
+
fs_1.default.writeFileSync(dest, encrypted.data);
|
|
82
|
+
}
|
|
83
|
+
exports.main = main;
|
package/dist/cli.js
CHANGED
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
4
4
|
const table_file_info_1 = require("./cli/table-file-info");
|
|
5
5
|
const tagged_oma_info_1 = require("./cli/tagged-oma-info");
|
|
6
6
|
const decrypt_oma_1 = require("./cli/decrypt-oma");
|
|
7
|
+
const encrypt_oma_1 = require("./cli/encrypt-oma");
|
|
7
8
|
const decrypt_mp3_1 = require("./cli/decrypt-mp3");
|
|
8
9
|
const decrypt_mp3_2 = require("./cli/decrypt-mp3");
|
|
9
10
|
const sign_device_1 = require("./cli/sign-device");
|
|
@@ -21,6 +22,10 @@ const commands = [
|
|
|
21
22
|
name: 'decrypt-oma',
|
|
22
23
|
root: decrypt_oma_1.main,
|
|
23
24
|
},
|
|
25
|
+
{
|
|
26
|
+
name: 'encrypt-oma',
|
|
27
|
+
root: encrypt_oma_1.main,
|
|
28
|
+
},
|
|
24
29
|
{
|
|
25
30
|
name: 'derive-mp3-key',
|
|
26
31
|
root: decrypt_mp3_1.mainDeriveKey,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database-abstraction.d.ts","sourceRoot":"","sources":["../src/database-abstraction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,eAAe,EAAc,oBAAoB,EAAE,aAAa,EAAY,MAAM,aAAa,CAAC;AAGzG,OAAO,EAAsB,eAAe,EAAE,MAAM,cAAc,CAAC;AAGnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAyB,MAAM,UAAU,CAAC;AAK9D,oBAAY,eAAe,GAAG,aAAa,GAAG;IAC1C,eAAe,EAAE,UAAU,CAAC;IAC5B,SAAS,EAAE,UAAU,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IAEpB,SAAS,EAAE,aAAa,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,qBAAa,mBAAmB;IAOR,OAAO,CAAC,UAAU;IAAyB,UAAU,EAAE,gBAAgB;IAN3F,OAAO,CAAC,wBAAwB,CAAC,CAAyB;IAC1D,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,aAAa,CAAgB;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,eAAe,CAAC;IACjC,OAAO;WAIa,MAAM,CAAC,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,gBAAgB;
|
|
1
|
+
{"version":3,"file":"database-abstraction.d.ts","sourceRoot":"","sources":["../src/database-abstraction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,eAAe,EAAc,oBAAoB,EAAE,aAAa,EAAY,MAAM,aAAa,CAAC;AAGzG,OAAO,EAAsB,eAAe,EAAE,MAAM,cAAc,CAAC;AAGnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAyB,MAAM,UAAU,CAAC;AAK9D,oBAAY,eAAe,GAAG,aAAa,GAAG;IAC1C,eAAe,EAAE,UAAU,CAAC;IAC5B,SAAS,EAAE,UAAU,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IAEpB,SAAS,EAAE,aAAa,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,qBAAa,mBAAmB;IAOR,OAAO,CAAC,UAAU;IAAyB,UAAU,EAAE,gBAAgB;IAN3F,OAAO,CAAC,wBAAwB,CAAC,CAAyB;IAC1D,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,aAAa,CAAgB;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,eAAe,CAAC;IACjC,OAAO;WAIa,MAAM,CAAC,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,gBAAgB;IAiCnF,OAAO,CAAC,OAAO;IAkCR,WAAW,CAAC,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM;IAyB5F,OAAO,CAAC,mBAAmB;YAWb,gBAAgB;IAsBxB,cAAc,CAChB,SAAS,EAAE,oBAAoB,EAC/B,OAAO,EAAE,UAAU,EACnB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI;IAe9C,WAAW,CACb,SAAS,EAAE,oBAAoB,EAC/B,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,UAAU,EACnB,OAAO,CAAC,EAAE,eAAe,EACzB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI;IAmB9C,YAAY;IAMZ,WAAW,CAAC,WAAW,EAAE,MAAM;IAcrC,mBAAmB;IA6EnB,0BAA0B,IAAK;QAC3B,0BAA0B,EAAE,CAAC,CAAC;QAC9B,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE;YACN,0BAA0B,EAAE,CAAC,CAAC;YAC9B,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,EAAE,eAAe,EAAE,CAAA;SAC9B,EAAE,CAAA;KACN,EAAE;IAIG,QAAQ;IA6BR,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa;CAoBjE"}
|
|
@@ -26,24 +26,26 @@ class DatabaseAbstraction {
|
|
|
26
26
|
db._create();
|
|
27
27
|
// Get the MP3 device key (device ID)
|
|
28
28
|
let deviceId = null;
|
|
29
|
-
if (
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
29
|
+
if (!deviceInfo.disableDRM) {
|
|
30
|
+
if (filesystem instanceof filesystem_1.UMSCNWJSFilesystem) {
|
|
31
|
+
deviceId = await filesystem.driver.getDiscID();
|
|
32
|
+
// Cache, if this file doesn't exist already
|
|
33
|
+
if ((await filesystem.getSize(DEVICE_ID_CACHE_FILE)) === null) {
|
|
34
|
+
// Not cached. Create it.
|
|
35
|
+
const handle = await filesystem.open(DEVICE_ID_CACHE_FILE, 'rw');
|
|
36
|
+
await handle.write(deviceId);
|
|
37
|
+
await handle.close();
|
|
38
|
+
}
|
|
37
39
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
40
|
+
else {
|
|
41
|
+
// Cannot retrieve directly.
|
|
42
|
+
// Check if there is a cache file.
|
|
43
|
+
const rawDeviceIDFile = await filesystem.open(DEVICE_ID_CACHE_FILE, 'ro');
|
|
44
|
+
if (rawDeviceIDFile) {
|
|
45
|
+
// Yes, it's been cached.
|
|
46
|
+
deviceId = await rawDeviceIDFile.read();
|
|
47
|
+
await rawDeviceIDFile.close();
|
|
48
|
+
}
|
|
47
49
|
}
|
|
48
50
|
}
|
|
49
51
|
if (deviceId) {
|
|
@@ -137,7 +139,7 @@ class DatabaseAbstraction {
|
|
|
137
139
|
await fh.close();
|
|
138
140
|
}
|
|
139
141
|
async uploadMP3Track(trackInfo, rawData, callback) {
|
|
140
|
-
if (this.mp3DeviceKey === undefined)
|
|
142
|
+
if (this.mp3DeviceKey === undefined && !this.deviceInfo.disableDRM)
|
|
141
143
|
throw new Error("Please load the device key first!");
|
|
142
144
|
const { codec, duration } = (0, mp3_1.generateMP3CodecField)(rawData);
|
|
143
145
|
const trackNumber = trackInfo.trackNumber = this.reassignTrackNumber(trackInfo);
|
|
@@ -145,24 +147,25 @@ class DatabaseAbstraction {
|
|
|
145
147
|
...trackInfo,
|
|
146
148
|
trackDuration: duration,
|
|
147
149
|
trackNumber,
|
|
148
|
-
}, codec, 0xFFFE);
|
|
149
|
-
const mp3Data = (0, mp3_1.createMP3OMAFile)(globalTrackIndex, trackInfo, rawData, this.mp3DeviceKey, codec);
|
|
150
|
+
}, codec, this.deviceInfo.disableDRM ? 0xFFFF : 0xFFFE);
|
|
151
|
+
const mp3Data = (0, mp3_1.createMP3OMAFile)(globalTrackIndex, trackInfo, rawData, this.deviceInfo.disableDRM ? null : this.mp3DeviceKey, codec);
|
|
150
152
|
await this.copyToFilesystem(mp3Data, globalTrackIndex, callback);
|
|
151
153
|
}
|
|
152
154
|
async uploadTrack(trackInfo, codec, rawData, session, callback) {
|
|
153
155
|
const trackNumber = this.reassignTrackNumber(trackInfo);
|
|
154
156
|
// Step 1 - Create the encrypted OMA which will later be written to the device's storage
|
|
155
|
-
const
|
|
157
|
+
const omaFile = (this.deviceInfo.disableDRM ? tagged_oma_1.createTaggedOMA : tagged_oma_1.createTaggedEncryptedOMA)(rawData, trackInfo, codec);
|
|
156
158
|
// Step 2 - write track to the database
|
|
157
159
|
const globalTrackIndex = this.addNewTrack({
|
|
158
160
|
...trackInfo,
|
|
159
|
-
trackDuration:
|
|
161
|
+
trackDuration: omaFile.duration,
|
|
160
162
|
trackNumber,
|
|
161
|
-
}, codec, 0x0001);
|
|
163
|
+
}, codec, this.deviceInfo.disableDRM ? 0xFFFF : 0x0001);
|
|
162
164
|
// Step 3 - write track to the filesystem
|
|
163
|
-
await this.copyToFilesystem(
|
|
165
|
+
await this.copyToFilesystem(omaFile.data, globalTrackIndex, callback);
|
|
164
166
|
// Step 4 - write MAC
|
|
165
|
-
|
|
167
|
+
if (!this.deviceInfo.disableDRM)
|
|
168
|
+
session === null || session === void 0 ? void 0 : session.writeTrackMac(globalTrackIndex - 1, omaFile.maclistValue);
|
|
166
169
|
}
|
|
167
170
|
async flushUpdates() {
|
|
168
171
|
this.reserializeDatabase();
|
package/dist/devices.d.ts
CHANGED
|
@@ -7,6 +7,8 @@ export interface DeviceDefinition {
|
|
|
7
7
|
productId: number;
|
|
8
8
|
name: string;
|
|
9
9
|
databaseParameters?: DatabaseParameters;
|
|
10
|
+
disableDRM?: boolean;
|
|
11
|
+
unparitioned?: boolean;
|
|
10
12
|
}
|
|
11
13
|
export declare const DeviceIds: DeviceDefinition[];
|
|
12
14
|
export declare function findDevice(vid: number, pid: number): DeviceDefinition | null;
|
package/dist/devices.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devices.d.ts","sourceRoot":"","sources":["../src/devices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,kBAAkB;IAC/B,UAAU,EAAE,CAAC,MAAM,OAAO,MAAM,CAAC,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"devices.d.ts","sourceRoot":"","sources":["../src/devices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,kBAAkB;IAC/B,UAAU,EAAE,CAAC,MAAM,OAAO,MAAM,CAAC,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,eAAO,MAAM,SAAS,EAAE,gBAAgB,EA8GvC,CAAC;AAEF,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAE5E"}
|
package/dist/devices.js
CHANGED
|
@@ -5,6 +5,14 @@ exports.DeviceIds = [
|
|
|
5
5
|
{ vendorId: 0x054c, productId: 0x01ad, name: 'Sony NW-HD1 / NW-HD2' },
|
|
6
6
|
{ vendorId: 0x054c, productId: 0x0210, name: 'Sony NW-HD3' },
|
|
7
7
|
{ vendorId: 0x054c, productId: 0x0233, name: 'Sony NW-HD5' },
|
|
8
|
+
{
|
|
9
|
+
vendorId: 0x054c,
|
|
10
|
+
productId: 0x026a,
|
|
11
|
+
name: 'Sony NW-A1000',
|
|
12
|
+
databaseParameters: {
|
|
13
|
+
initLayers: ['needs_cid'],
|
|
14
|
+
}
|
|
15
|
+
},
|
|
8
16
|
{
|
|
9
17
|
vendorId: 0x054c,
|
|
10
18
|
productId: 0x0269,
|
|
@@ -77,6 +85,32 @@ exports.DeviceIds = [
|
|
|
77
85
|
initLayers: ['stick_gtrlst'],
|
|
78
86
|
}
|
|
79
87
|
},
|
|
88
|
+
{
|
|
89
|
+
vendorId: 0x054c,
|
|
90
|
+
productId: 0x02ED,
|
|
91
|
+
name: 'Sony NW-A808',
|
|
92
|
+
databaseParameters: {
|
|
93
|
+
initLayers: ['stick_gtrlst'],
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
vendorId: 0x054c,
|
|
98
|
+
productId: 0x04c8,
|
|
99
|
+
name: 'Sony NW-S754',
|
|
100
|
+
databaseParameters: {
|
|
101
|
+
initLayers: ['stick_gtrlst'],
|
|
102
|
+
},
|
|
103
|
+
disableDRM: true,
|
|
104
|
+
unparitioned: true,
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
vendorId: 0x054c,
|
|
108
|
+
productId: 0x00E8,
|
|
109
|
+
name: 'Sony NW-MS70D',
|
|
110
|
+
databaseParameters: {
|
|
111
|
+
initLayers: [],
|
|
112
|
+
}
|
|
113
|
+
}
|
|
80
114
|
];
|
|
81
115
|
function findDevice(vid, pid) {
|
|
82
116
|
var _a;
|
|
@@ -39,8 +39,9 @@ export declare class UMSCNWJSSession {
|
|
|
39
39
|
writeTrackMac(trackNumber: number, mac: Uint8Array): void;
|
|
40
40
|
}
|
|
41
41
|
export declare class UMSCNWJSFilesystem extends UMSCHiMDFilesystem {
|
|
42
|
+
private partition;
|
|
42
43
|
driver: SonyVendorNWJSUSMCDriver;
|
|
43
|
-
constructor(webUSB: WebUSBDevice);
|
|
44
|
+
constructor(webUSB: WebUSBDevice, partition?: number | null);
|
|
44
45
|
protected initFS(bypassCoherencyChecks?: boolean | undefined): Promise<void>;
|
|
45
46
|
}
|
|
46
47
|
//# sourceMappingURL=usb-mass-storage-webusb-filesystem.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usb-mass-storage-webusb-filesystem.d.ts","sourceRoot":"","sources":["../../src/filesystem/usb-mass-storage-webusb-filesystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAI7F,OAAO,EAAE,YAAY,EAAE,MAAM,KAAK,CAAC;AAKnC,qBAAa,wBAAyB,SAAQ,oBAAoB;gBAClD,MAAM,EAAE,YAAY;cAIhB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;cAuBrC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU;IA2BlD,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC;IAIhC,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU;IASzD,2BAA2B;;;;;;IAoB3B,6BAA6B,CAAC,OAAO,EAAE,UAAU;IAyBjD,aAAa;;;;IAWb,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU;CAuBhH;AAED,qBAAa,eAAe;IAgBZ,SAAS,CAAC,MAAM,EAAE,wBAAwB;IAAE,SAAS,CAAC,EAAE,EAAE,cAAc;IAfpF,SAAS,aAAuB;IAChC,UAAU,aAAoE;IAE9E,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,YAAY,CAAC,EAAE,UAAU,CAAC;IAC1B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,gBAAgB,CAAC,EAAE,UAAU,CAAC;IAC9B,UAAU,CAAC,EAAE,UAAU,CAAC;IAExB,YAAY,CAAC,EAAE,QAAQ,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,OAAO,CAAC,EAAE,UAAU,CAAC;gBAEC,MAAM,EAAE,wBAAwB,EAAY,EAAE,EAAE,cAAc;IAEvE,oBAAoB;IAkBpB,eAAe;IAYrB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU;CAG5D;AAED,qBAAa,kBAAmB,SAAQ,kBAAkB;
|
|
1
|
+
{"version":3,"file":"usb-mass-storage-webusb-filesystem.d.ts","sourceRoot":"","sources":["../../src/filesystem/usb-mass-storage-webusb-filesystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAI7F,OAAO,EAAE,YAAY,EAAE,MAAM,KAAK,CAAC;AAKnC,qBAAa,wBAAyB,SAAQ,oBAAoB;gBAClD,MAAM,EAAE,YAAY;cAIhB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;cAuBrC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU;IA2BlD,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC;IAIhC,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU;IASzD,2BAA2B;;;;;;IAoB3B,6BAA6B,CAAC,OAAO,EAAE,UAAU;IAyBjD,aAAa;;;;IAWb,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU;CAuBhH;AAED,qBAAa,eAAe;IAgBZ,SAAS,CAAC,MAAM,EAAE,wBAAwB;IAAE,SAAS,CAAC,EAAE,EAAE,cAAc;IAfpF,SAAS,aAAuB;IAChC,UAAU,aAAoE;IAE9E,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,YAAY,CAAC,EAAE,UAAU,CAAC;IAC1B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,gBAAgB,CAAC,EAAE,UAAU,CAAC;IAC9B,UAAU,CAAC,EAAE,UAAU,CAAC;IAExB,YAAY,CAAC,EAAE,QAAQ,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,OAAO,CAAC,EAAE,UAAU,CAAC;gBAEC,MAAM,EAAE,wBAAwB,EAAY,EAAE,EAAE,cAAc;IAEvE,oBAAoB;IAkBpB,eAAe;IAYrB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU;CAG5D;AAED,qBAAa,kBAAmB,SAAQ,kBAAkB;IAEpB,OAAO,CAAC,SAAS;IADnD,MAAM,EAAE,wBAAwB,CAAC;gBACrB,MAAM,EAAE,YAAY,EAAU,SAAS,GAAE,MAAM,GAAG,IAAQ;cAKtD,MAAM,CAAC,qBAAqB,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CAYrF"}
|
|
@@ -176,8 +176,9 @@ class UMSCNWJSSession {
|
|
|
176
176
|
}
|
|
177
177
|
exports.UMSCNWJSSession = UMSCNWJSSession;
|
|
178
178
|
class UMSCNWJSFilesystem extends himd_js_1.UMSCHiMDFilesystem {
|
|
179
|
-
constructor(webUSB) {
|
|
179
|
+
constructor(webUSB, partition = 0) {
|
|
180
180
|
super(webUSB);
|
|
181
|
+
this.partition = partition;
|
|
181
182
|
this.driver = new SonyVendorNWJSUSMCDriver(webUSB);
|
|
182
183
|
}
|
|
183
184
|
async initFS(bypassCoherencyChecks) {
|
|
@@ -185,7 +186,7 @@ class UMSCNWJSFilesystem extends himd_js_1.UMSCHiMDFilesystem {
|
|
|
185
186
|
await this.driver.testUnitReady();
|
|
186
187
|
const partInfo = await this.driver.getCapacity();
|
|
187
188
|
console.log(partInfo);
|
|
188
|
-
const baseDriver = await this.driver.createNUFatFSVolumeDriverFromMBRPart(
|
|
189
|
+
const baseDriver = await this.driver.createNUFatFSVolumeDriverFromMBRPart(this.partition, true);
|
|
189
190
|
this.fsUncachedDriver = this.fsDriver = (0, nufatfs_1.createChunkingDriver)(baseDriver, 240, partInfo.blockSize);
|
|
190
191
|
this.fatfs = await nufatfs_1.FatFilesystem.create(this.fsDriver, bypassCoherencyChecks);
|
|
191
192
|
this.volumeSize = partInfo.deviceSize;
|
package/dist/helpers.js
CHANGED
|
@@ -13,7 +13,7 @@ exports.resolvePathFromGlobalIndex = resolvePathFromGlobalIndex;
|
|
|
13
13
|
async function createNWJSFS(device) {
|
|
14
14
|
var _a, _b;
|
|
15
15
|
// Connect into the HiMD codebase
|
|
16
|
-
const fs = new filesystem_1.UMSCNWJSFilesystem(device.dev);
|
|
16
|
+
const fs = new filesystem_1.UMSCNWJSFilesystem(device.dev, device.definition.unparitioned ? null : 0);
|
|
17
17
|
await fs.init();
|
|
18
18
|
await (0, initialization_1.initializeIfNeeded)(fs, (_b = (_a = device.definition.databaseParameters) === null || _a === void 0 ? void 0 : _a.initLayers) !== null && _b !== void 0 ? _b : []);
|
|
19
19
|
return fs;
|
package/dist/mp3.d.ts
CHANGED
|
@@ -6,6 +6,6 @@ export declare function generateMP3CodecField(mp3Data: Uint8Array): {
|
|
|
6
6
|
duration: number;
|
|
7
7
|
frames: number;
|
|
8
8
|
};
|
|
9
|
-
export declare function createMP3OMAFile(index: number, metadata: InboundTrackMetadata, rawFile: Uint8Array, deviceKey: number, codec: NWCodecInfo): Uint8Array;
|
|
9
|
+
export declare function createMP3OMAFile(index: number, metadata: InboundTrackMetadata, rawFile: Uint8Array, deviceKey: number | null, codec: NWCodecInfo): Uint8Array;
|
|
10
10
|
export declare function updateMP3Metadata(file: HiMDFile, titleInfo: TrackMetadata): Promise<void>;
|
|
11
11
|
//# sourceMappingURL=mp3.d.ts.map
|
package/dist/mp3.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mp3.d.ts","sourceRoot":"","sources":["../src/mp3.ts"],"names":[],"mappings":"AAEA,OAAO,EAA4B,WAAW,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGlE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAiBnC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,UAAU,GAAG;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAsFnH;AAID,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"mp3.d.ts","sourceRoot":"","sources":["../src/mp3.ts"],"names":[],"mappings":"AAEA,OAAO,EAA4B,WAAW,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGlE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAiBnC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,UAAU,GAAG;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAsFnH;AAID,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,WAAW,GAAG,UAAU,CAyC7J;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,iBAmB/E"}
|
package/dist/mp3.js
CHANGED
|
@@ -123,16 +123,21 @@ function createMP3OMAFile(index, metadata, rawFile, deviceKey, codec) {
|
|
|
123
123
|
{ id: 'TXXX', flags: 0, contents: (0, id3_1.encodeSonyWeirdString)("OMG_TRLDA", "1982/01/01 00:00:00") },
|
|
124
124
|
],
|
|
125
125
|
}, METADATA_BLOCK_SIZE);
|
|
126
|
-
const formatHeader = (0, codecs_1.createEA3Header)(codec, 0xFFFE, 2);
|
|
126
|
+
const formatHeader = (0, codecs_1.createEA3Header)(codec, deviceKey === null ? 0xFFFF : 0xFFFE, 2);
|
|
127
127
|
const finalFileBuffer = new Uint8Array(rootID3.length + formatHeader.length + rawFile.length - cursor);
|
|
128
128
|
finalFileBuffer.set(rootID3, 0);
|
|
129
129
|
finalFileBuffer.set(formatHeader, rootID3.length);
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
130
|
+
if (deviceKey != null) {
|
|
131
|
+
const finalDataView = new DataView(finalFileBuffer.buffer);
|
|
132
|
+
const key = (0, encryption_1.getMP3EncryptionKey)(deviceKey, index);
|
|
133
|
+
let finalBufferCursor = rootID3.length + formatHeader.length;
|
|
134
|
+
for (; cursor < rawFile.length - 7; cursor += 8, finalBufferCursor += 8) {
|
|
135
|
+
finalDataView.setUint32(finalBufferCursor, rawDataView.getUint32(cursor) ^ key);
|
|
136
|
+
finalDataView.setUint32(finalBufferCursor + 4, rawDataView.getUint32(cursor + 4) ^ key);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
finalFileBuffer.set(rawFile.subarray(cursor), rootID3.length + formatHeader.length);
|
|
136
141
|
}
|
|
137
142
|
return finalFileBuffer;
|
|
138
143
|
}
|
package/dist/tagged-oma.d.ts
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
import { HiMDCodec, HiMDFile } from "himd-js";
|
|
2
2
|
import { InboundTrackMetadata, TrackMetadata } from './databases';
|
|
3
|
+
export interface OmaFile {
|
|
4
|
+
data: Uint8Array;
|
|
5
|
+
duration: number;
|
|
6
|
+
maclistValue?: Uint8Array;
|
|
7
|
+
}
|
|
3
8
|
export declare function createTaggedEncryptedOMA(rawData: Uint8Array, titleInfo: InboundTrackMetadata, codec: {
|
|
4
9
|
codecId: HiMDCodec;
|
|
5
10
|
codecInfo: Uint8Array;
|
|
6
|
-
}):
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
};
|
|
11
|
+
}): OmaFile;
|
|
12
|
+
export declare function createTaggedOMA(rawData: Uint8Array, titleInfo: InboundTrackMetadata, codec: {
|
|
13
|
+
codecId: HiMDCodec;
|
|
14
|
+
codecInfo: Uint8Array;
|
|
15
|
+
}): OmaFile;
|
|
11
16
|
export declare function updateMetadata(file: HiMDFile, titleInfo: TrackMetadata): Promise<void>;
|
|
12
17
|
export declare function decryptOMA(omaFile: Uint8Array): Uint8Array;
|
|
13
18
|
//# sourceMappingURL=tagged-oma.d.ts.map
|
package/dist/tagged-oma.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tagged-oma.d.ts","sourceRoot":"","sources":["../src/tagged-oma.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgC,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAI5E,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"tagged-oma.d.ts","sourceRoot":"","sources":["../src/tagged-oma.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgC,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAI5E,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAkHlE,MAAM,WAAW,OAAO;IACpB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,UAAU,CAAC;CAC7B;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,oBAAoB,EAAE,KAAK,EAAE;IAAC,OAAO,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,UAAU,CAAA;CAAC,GAAG,OAAO,CAc1J;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,oBAAoB,EAAE,KAAK,EAAE;IAAC,OAAO,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,UAAU,CAAA;CAAC,GAAG,OAAO,CAKjJ;AAeD,wBAAsB,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,iBA+B5E;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,UAAU,CAyD1D"}
|
package/dist/tagged-oma.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.decryptOMA = exports.updateMetadata = exports.createTaggedEncryptedOMA = void 0;
|
|
6
|
+
exports.decryptOMA = exports.updateMetadata = exports.createTaggedOMA = exports.createTaggedEncryptedOMA = void 0;
|
|
7
7
|
const crypto_js_wasm_1 = __importDefault(require("@originjs/crypto-js-wasm"));
|
|
8
8
|
const himd_js_1 = require("himd-js");
|
|
9
9
|
const utils_1 = require("./utils");
|
|
@@ -36,6 +36,17 @@ function createSonyGEOB(geobName, header, kvmap) {
|
|
|
36
36
|
}
|
|
37
37
|
return (0, utils_1.concatUint8Arrays)(dataSlices);
|
|
38
38
|
}
|
|
39
|
+
function createPrimaryHeader(titleInfo, milliseconds) {
|
|
40
|
+
const id3Info = {
|
|
41
|
+
flags: 0,
|
|
42
|
+
version: { major: 3, minor: 0 },
|
|
43
|
+
tags: [
|
|
44
|
+
...(0, id3_1.createCommonID3Tags)(titleInfo),
|
|
45
|
+
{ id: "TLEN", contents: (0, id3_1.encodeUTF16BEStringEA3)(milliseconds.toString()), flags: 0 },
|
|
46
|
+
]
|
|
47
|
+
};
|
|
48
|
+
return (0, id3_1.serialize)(id3Info);
|
|
49
|
+
}
|
|
39
50
|
function createEncryptionHeader(titleInfo, milliseconds) {
|
|
40
51
|
const verificationKey = (0, utils_1.createRandomBytes)(8);
|
|
41
52
|
const actualTrackKey = (0, utils_1.createRandomBytes)(8);
|
|
@@ -104,6 +115,13 @@ function createTaggedEncryptedOMA(rawData, titleInfo, codec) {
|
|
|
104
115
|
return { data: (0, utils_1.concatUint8Arrays)([encHeader, formatHeader, rawData]), maclistValue, duration: milliseconds };
|
|
105
116
|
}
|
|
106
117
|
exports.createTaggedEncryptedOMA = createTaggedEncryptedOMA;
|
|
118
|
+
function createTaggedOMA(rawData, titleInfo, codec) {
|
|
119
|
+
const milliseconds = Math.floor(1000 * (0, himd_js_1.getSeconds)(codec, Math.ceil(rawData.length / (0, himd_js_1.getBytesPerFrame)(codec))));
|
|
120
|
+
const primaryHeader = createPrimaryHeader(titleInfo, milliseconds);
|
|
121
|
+
const formatHeader = (0, codecs_1.createEA3Header)(codec, 0xFFFF);
|
|
122
|
+
return { data: (0, utils_1.concatUint8Arrays)([primaryHeader, formatHeader, rawData]), duration: milliseconds };
|
|
123
|
+
}
|
|
124
|
+
exports.createTaggedOMA = createTaggedOMA;
|
|
107
125
|
function findInMetadata(metadata, id, asGeob) {
|
|
108
126
|
if (!asGeob)
|
|
109
127
|
return metadata.tags.find(e => e.id === id);
|
package/dist/utils.d.ts
CHANGED
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAIA,wBAAgB,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,QAM1D;AAED,wBAAgB,IAAI,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,UAEtC;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,cAcnD;AAmBD,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,GAAE,MAA2B,cAavF;AAED,wBAAgB,iBAAiB,CAAC,MAAM,SAAI,cAM3C;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,WAM1D;AAGD,wBAAgB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,UAAO,QAarF;AAED,qBAAa,MAAM;IACf,OAAO,SAAM;IACb,UAAU,CAAC,CAAC,EAAE,MAAM;IAQpB,GAAG,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE;CAGxB"}
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAIA,wBAAgB,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,QAM1D;AAED,wBAAgB,IAAI,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,UAEtC;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,cAcnD;AAmBD,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,GAAE,MAA2B,cAavF;AAED,wBAAgB,iBAAiB,CAAC,MAAM,SAAI,cAM3C;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,WAM1D;AAGD,wBAAgB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,UAAO,QAarF;AAED,qBAAa,MAAM;IACf,OAAO,SAAM;IACb,UAAU,CAAC,CAAC,EAAE,MAAM;IAQpB,GAAG,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE;CAGxB;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,UAAU,qBAgBxD"}
|
package/dist/utils.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Logger = exports.hexDump = exports.arrayEq = exports.createRandomBytes = exports.wordArrayToByteArray = exports.concatUint8Arrays = exports.join = exports.assert = void 0;
|
|
3
|
+
exports.getAudioDataFromWave = exports.Logger = exports.hexDump = exports.arrayEq = exports.createRandomBytes = exports.wordArrayToByteArray = exports.concatUint8Arrays = exports.join = exports.assert = void 0;
|
|
4
4
|
function assert(condition, message) {
|
|
5
5
|
if (condition) {
|
|
6
6
|
return;
|
|
@@ -111,3 +111,23 @@ class Logger {
|
|
|
111
111
|
}
|
|
112
112
|
}
|
|
113
113
|
exports.Logger = Logger;
|
|
114
|
+
function getAudioDataFromWave(waveFile) {
|
|
115
|
+
const dv = new DataView(waveFile.buffer);
|
|
116
|
+
const magic = textDecoder.decode(waveFile.slice(0, 4));
|
|
117
|
+
if (magic != 'RIFF')
|
|
118
|
+
throw new Error("Not a valid RIFF wave file!");
|
|
119
|
+
let cursor = 0x0c;
|
|
120
|
+
while (cursor < waveFile.length) {
|
|
121
|
+
let name = textDecoder.decode(waveFile.slice(cursor, cursor + 4));
|
|
122
|
+
cursor += 4;
|
|
123
|
+
let size = dv.getUint32(cursor, true);
|
|
124
|
+
cursor += 4;
|
|
125
|
+
if (name != 'data')
|
|
126
|
+
cursor += size;
|
|
127
|
+
else {
|
|
128
|
+
return waveFile.slice(cursor, cursor + size);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
exports.getAudioDataFromWave = getAudioDataFromWave;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "networkwm-js",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "A library which lets you manage tracks and metadata on Sony Network Walkmen.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"himd-js": "^0.2.7",
|
|
41
41
|
"mp3-parser": "^0.3.0",
|
|
42
42
|
"node-id3": "^0.2.5",
|
|
43
|
-
"node-mass-storage": "^0.2.
|
|
43
|
+
"node-mass-storage": "^0.2.4",
|
|
44
44
|
"nufatfs": "^0.1.10",
|
|
45
45
|
"usb": "^2.4.1"
|
|
46
46
|
}
|