networkwm-js 0.1.2 → 0.2.1

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.
@@ -0,0 +1,2 @@
1
+ export declare function main(invocation: string, args: string[]): Promise<void>;
2
+ //# sourceMappingURL=encrypt-oma.d.ts.map
@@ -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;IA+BnF,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"}
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 (filesystem instanceof filesystem_1.UMSCNWJSFilesystem) {
30
- deviceId = await filesystem.driver.getDiscID();
31
- // Cache, if this file doesn't exist already
32
- if ((await filesystem.getSize(DEVICE_ID_CACHE_FILE)) === null) {
33
- // Not cached. Create it.
34
- const handle = await filesystem.open(DEVICE_ID_CACHE_FILE, 'rw');
35
- await handle.write(deviceId);
36
- await handle.close();
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
- else {
40
- // Cannot retrieve directly.
41
- // Check if there is a cache file.
42
- const rawDeviceIDFile = await filesystem.open(DEVICE_ID_CACHE_FILE, 'ro');
43
- if (rawDeviceIDFile) {
44
- // Yes, it's been cached.
45
- deviceId = await rawDeviceIDFile.read();
46
- await rawDeviceIDFile.close();
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 encryptedOMA = (0, tagged_oma_1.createTaggedEncryptedOMA)(rawData, trackInfo, codec);
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: encryptedOMA.duration,
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(encryptedOMA.data, globalTrackIndex, callback);
165
+ await this.copyToFilesystem(omaFile.data, globalTrackIndex, callback);
164
166
  // Step 4 - write MAC
165
- session === null || session === void 0 ? void 0 : session.writeTrackMac(globalTrackIndex - 1, encryptedOMA.maclistValue);
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;
@@ -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;CAC3C;AAED,eAAO,MAAM,SAAS,EAAE,gBAAgB,EA4EvC,CAAC;AAEF,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAE5E"}
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,EA+GvC,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,
@@ -48,7 +56,8 @@ exports.DeviceIds = [
48
56
  {
49
57
  vendorId: 0x054c,
50
58
  productId: 0x027c,
51
- name: 'Sony NW-A608',
59
+ name: 'Sony NW-A608 / NW-E505',
60
+ disableDRM: true,
52
61
  databaseParameters: {
53
62
  initLayers: ['stick_gtrlst'],
54
63
  }
@@ -77,6 +86,32 @@ exports.DeviceIds = [
77
86
  initLayers: ['stick_gtrlst'],
78
87
  }
79
88
  },
89
+ {
90
+ vendorId: 0x054c,
91
+ productId: 0x02ED,
92
+ name: 'Sony NW-A808',
93
+ databaseParameters: {
94
+ initLayers: ['stick_gtrlst'],
95
+ }
96
+ },
97
+ {
98
+ vendorId: 0x054c,
99
+ productId: 0x04c8,
100
+ name: 'Sony NW-S754',
101
+ databaseParameters: {
102
+ initLayers: ['stick_gtrlst'],
103
+ },
104
+ disableDRM: true,
105
+ unparitioned: true,
106
+ },
107
+ {
108
+ vendorId: 0x054c,
109
+ productId: 0x00E8,
110
+ name: 'Sony NW-MS70D',
111
+ databaseParameters: {
112
+ initLayers: [],
113
+ }
114
+ }
80
115
  ];
81
116
  function findDevice(vid, pid) {
82
117
  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;IACtD,MAAM,EAAE,wBAAwB,CAAC;gBACrB,MAAM,EAAE,YAAY;cAKhB,MAAM,CAAC,qBAAqB,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CAYrF"}
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(0, true);
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,CAqCtJ;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,iBAmB/E"}
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
- const finalDataView = new DataView(finalFileBuffer.buffer);
131
- const key = (0, encryption_1.getMP3EncryptionKey)(deviceKey, index);
132
- let finalBufferCursor = rootID3.length + formatHeader.length;
133
- for (; cursor < rawFile.length - 7; cursor += 8, finalBufferCursor += 8) {
134
- finalDataView.setUint32(finalBufferCursor, rawDataView.getUint32(cursor) ^ key);
135
- finalDataView.setUint32(finalBufferCursor + 4, rawDataView.getUint32(cursor + 4) ^ key);
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
  }
@@ -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
- data: Uint8Array;
8
- maclistValue: Uint8Array;
9
- duration: number;
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
@@ -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;AAqGlE,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,oBAAoB,EAAE,KAAK,EAAE;IAAC,OAAO,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,UAAU,CAAA;CAAC;;;;EAchJ;AAeD,wBAAsB,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,iBA+B5E;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,UAAU,CAyD1D"}
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"}
@@ -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
@@ -10,4 +10,5 @@ export declare class Logger {
10
10
  bumpIndent(i: number): void;
11
11
  log(...data: string[]): void;
12
12
  }
13
+ export declare function getAudioDataFromWave(waveFile: Uint8Array): Uint8Array | null;
13
14
  //# sourceMappingURL=utils.d.ts.map
@@ -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.1.2",
3
+ "version": "0.2.1",
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.2",
43
+ "node-mass-storage": "^0.2.4",
44
44
  "nufatfs": "^0.1.10",
45
45
  "usb": "^2.4.1"
46
46
  }