igir
Version:
🕹 A zero-setup ROM collection manager that sorts, filters, extracts or archives, patches, and reports on collections of any size on any OS.
65 lines (64 loc) • 2.41 kB
JavaScript
import path from "node:path";
import { ProgressBarSymbol } from "../console/progressBar.js";
import Disk from "../models/dats/disk.js";
import IgirHeader from "../models/dats/igirHeader.js";
import LogiqxDAT from "../models/dats/logiqx/logiqxDat.js";
import FsUtil from "../utils/fsUtil.js";
import Module from "./module.js";
class Dir2DatCreator extends Module {
options;
constructor(options, progressBar) {
super(progressBar, Dir2DatCreator.name);
this.options = options;
}
/**
* Write the DAT.
*/
async create(dat, candidates) {
if (!this.options.shouldDir2Dat()) {
return void 0;
}
if (candidates.length === 0) {
this.prefixedLogger.trace(`${dat.getName()}: no candidates to create dir2dat for`);
return void 0;
}
this.prefixedLogger.trace(`${dat.getName()}: writing dir2dat`);
this.progressBar.setSymbol(ProgressBarSymbol.WRITING);
this.progressBar.resetProgress(1);
const gamesToCandidates = candidates.reduce((map, candidate) => {
if (!candidate.canWrite()) {
return map;
}
const key = candidate.getGame();
if (map.has(key)) {
map.get(key)?.push(candidate);
} else {
map.set(key, [candidate]);
}
return map;
}, /* @__PURE__ */ new Map());
const gamesFromCandidates = Array.from(gamesToCandidates, ([game, candidates2]) => {
const roms = candidates2.at(0)?.getRomsWithFiles().map((romWithFiles) => romWithFiles.getRom());
return game.withProps({
roms: roms?.filter((rom) => !(rom instanceof Disk)),
disks: roms?.filter((rom) => rom instanceof Disk)
});
});
const dir2datDir = this.options.getDir2DatOutput();
if (!await FsUtil.exists(dir2datDir)) {
await FsUtil.mkdir(dir2datDir, { recursive: true });
}
const header = new IgirHeader("dir2dat", dat, this.options);
const dir2dat = new LogiqxDAT({ header, games: gamesFromCandidates });
const dir2datContents = dir2dat.toXmlDat();
const dir2datPath = path.join(dir2datDir, dir2dat.getFilename());
this.prefixedLogger.info(`${dir2dat.getName()}: creating dir2dat '${dir2datPath}'`);
await FsUtil.writeFile(dir2datPath, dir2datContents);
this.prefixedLogger.trace(`${dir2dat.getName()}: done writing dir2dat`);
return dir2datPath;
}
}
export {
Dir2DatCreator as default
};
//# sourceMappingURL=dir2DatCreator.js.map