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.
69 lines (68 loc) • 2.62 kB
JavaScript
import path from "node:path";
import { ProgressBarSymbol } from "../../console/progressBar.js";
import MergedDiscGame from "../../models/dats/mergedDiscGame.js";
import IntlUtil from "../../utils/intlUtil.js";
import Module from "../module.js";
import GameGrouper from "./utils/gameGrouper.js";
class DATDiscMerger extends Module {
options;
constructor(options, progressBar) {
super(progressBar, DATDiscMerger.name);
this.options = options;
}
/**
* Merge {@link Game}s.
*/
merge(dat) {
if (!this.options.getMergeDiscs()) {
this.prefixedLogger.trace(`${dat.getName()}: not merging discs`);
return dat;
}
if (dat.getGames().length === 0) {
this.prefixedLogger.trace(`${dat.getName()}: no games to merge`);
return dat;
}
this.prefixedLogger.trace(
`${dat.getName()}: merging ${IntlUtil.toLocaleString(dat.getGames().length)} game${dat.getGames().length === 1 ? "" : "s"}`
);
this.progressBar.setSymbol(ProgressBarSymbol.DAT_MERGE_SPLIT);
this.progressBar.resetProgress(dat.getGames().length);
const groupedGames = this.groupGames(dat.getGames());
const newDat = dat.withGames(groupedGames);
this.prefixedLogger.trace(
`${newDat.getName()}: merged to ${IntlUtil.toLocaleString(newDat.getGames().length)} game${newDat.getGames().length === 1 ? "" : "s"}`
);
this.prefixedLogger.trace(`${newDat.getName()}: done merging`);
return newDat;
}
groupGames(games) {
const gameNamesToGames = GameGrouper.groupMultiDiscGames(games, (game) => game.getName());
return [...gameNamesToGames].flatMap(([gameName, games2]) => {
if (games2.length === 1) {
return games2[0];
}
const roms = games2.flatMap((game) => game.getRoms());
const romNamesToCount = roms.reduce((map, rom) => {
map.set(rom.getName(), (map.get(rom.getName()) ?? 0) + 1);
return map;
}, /* @__PURE__ */ new Map());
const duplicateRomNames = [...romNamesToCount].filter(([, count]) => count > 1).map(([romName]) => romName).toSorted((a, b) => a.localeCompare(b));
const subGames = duplicateRomNames.length > 1 ? (
// De-conflict the filenames by adding a subfolder of the original game's name
games2.map(
(game) => game.withProps({
roms: game.getRoms().map((rom) => rom.withName(path.join(game.getName(), rom.getName())))
})
)
) : games2;
return new MergedDiscGame({
name: gameName,
subGames
});
});
}
}
export {
DATDiscMerger as default
};
//# sourceMappingURL=datDiscMerger.js.map