UNPKG

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
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