@runejs/filestore
Version:
Tools for managing the RuneJS filestore.
102 lines (101 loc) • 3.27 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.MusicStore = exports.MidiFile = void 0;
const common_1 = require("@runejs/common");
const node_fs_1 = require("node:fs");
const filestore_1 = require("../filestore");
/**
* A single MIDI file object.
*/
class MidiFile {
fileData;
constructor(fileData) {
this.fileData = fileData;
}
/**
* Writes this unpacked MIDI file to the disk under `./unpacked/midi/{midiFileName}.mid`
*/
async writeToDisk() {
return new Promise((resolve, reject) => {
try {
const fileName = (0, filestore_1.getFileName)(this.fileData.nameHash).replace(/ /g, '_');
if (!(0, node_fs_1.existsSync)('./unpacked/midi')) {
(0, node_fs_1.mkdirSync)('./unpacked/midi');
}
const data = this.fileData.decompress();
(0, node_fs_1.writeFileSync)(`./unpacked/midi/${this.fileId}_${fileName}.mid`, Buffer.from(data));
resolve();
}
catch (error) {
reject(error);
}
});
}
get fileId() {
return this.fileData?.fileId || -1;
}
}
exports.MidiFile = MidiFile;
/**
* Controls MIDI file storage.
*/
class MusicStore {
fileStore;
constructor(fileStore) {
this.fileStore = fileStore;
}
/**
* Writes all unpacked MIDI files to the disk under `./unpacked/midi/`
*/
async writeToDisk() {
const files = this.decodeMusicStore();
for (const midi of files) {
try {
await midi.writeToDisk();
}
catch (e) {
common_1.logger.error(e);
}
}
}
/**
* Decodes the specified midi file.
* @param nameOrId The name or ID of the midi file.
* @returns The decoded MidiFile object, or null if the file is not found.
*/
getMidi(nameOrId) {
if (!nameOrId) {
return null;
}
const midiArchiveIndex = this.fileStore.getIndex('music');
const fileData = midiArchiveIndex.getFile(nameOrId);
return fileData ? new MidiFile(fileData) : null;
}
/**
* Decodes all midi files within the filestore.
* @returns The list of decoded MidiFile objects from the midi store.
*/
decodeMusicStore() {
const midiArchiveIndex = this.fileStore.getIndex('music');
const fileCount = midiArchiveIndex.files.size;
const midiFiles = new Array(fileCount);
for (let midiId = 0; midiId < fileCount; midiId++) {
try {
const fileData = midiArchiveIndex.getFile(midiId);
if (!fileData) {
midiFiles[midiId] = null;
common_1.logger.warn(`No file found for midi ID ${midiId}.`);
continue;
}
midiFiles[midiId] = new MidiFile(fileData);
}
catch (e) {
midiFiles[midiId] = null;
common_1.logger.error(`Error parsing midi ID ${midiId}.`);
common_1.logger.error(e);
}
}
return midiFiles;
}
}
exports.MusicStore = MusicStore;