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.

125 lines (124 loc) • 4.69 kB
import { ProgressBarSymbol } from "../../console/progressBar.js"; import ArchiveEntry from "../../models/files/archives/archiveEntry.js"; import Chd from "../../models/files/archives/chd/chd.js"; import Dolphin from "../../models/files/archives/dolphin/dolphin.js"; import Maxcso from "../../models/files/archives/maxcso/maxcso.js"; import Rar from "../../models/files/archives/rar.js"; import SevenZip from "../../models/files/archives/sevenZip/sevenZip.js"; import Tar from "../../models/files/archives/tar.js"; import Zip from "../../models/files/archives/zip.js"; import IndexedFiles from "../../models/indexedFiles.js"; import { PreferFiletype } from "../../models/options.js"; import IntlUtil from "../../utils/intlUtil.js"; import Module from "../module.js"; class ROMIndexer extends Module { options; constructor(options, progressBar) { super(progressBar, ROMIndexer.name); this.options = options; } /** * Index files. */ index(files) { this.prefixedLogger.trace( `indexing ${IntlUtil.toLocaleString(files.length)} file${files.length === 1 ? "" : "s"}` ); this.progressBar.setSymbol(ProgressBarSymbol.ROM_INDEXING); this.progressBar.resetProgress(files.length); const result = IndexedFiles.fromFiles(files); for (const checksum of Object.keys(result)) { this.sortMap(result[checksum]); this.progressBar.incrementCompleted(); } this.prefixedLogger.trace( `found ${result.getSize()} unique file${result.getSize() === 1 ? "" : "s"}` ); this.prefixedLogger.trace("done indexing files"); return result; } sortMap(checksumsToFiles) { const outputDir = this.options.getOutputDirRoot(); for (const [checksum, files] of checksumsToFiles) { const sortedFiles = files.toSorted((fileOne, fileTwo) => { const fileOneIsOutputFile = fileOne.getCanBeCandidateInput() ? 0 : 1; const fileTwoIsOutputFile = fileTwo.getCanBeCandidateInput() ? 0 : 1; if (fileOneIsOutputFile !== fileTwoIsOutputFile) { return fileOneIsOutputFile - fileTwoIsOutputFile; } let fileOneArchive; let fileTwoArchive; if (this.options.getPreferFiletype() === PreferFiletype.ARCHIVE) { fileOneArchive = fileOne instanceof ArchiveEntry ? 0 : 1; fileTwoArchive = fileTwo instanceof ArchiveEntry ? 0 : 1; } else { fileOneArchive = fileOne instanceof ArchiveEntry ? 1 : 0; fileTwoArchive = fileTwo instanceof ArchiveEntry ? 1 : 0; } if (fileOneArchive !== fileTwoArchive) { return fileOneArchive - fileTwoArchive; } const preferFilenameRegex = this.options.getPreferFilenameRegex(); if (preferFilenameRegex) { const fileOneMatches = preferFilenameRegex.some( (regex) => regex.test(fileOne.getFilePath()) ) ? 0 : 1; const fileTwoMatches = preferFilenameRegex.some( (regex) => regex.test(fileTwo.getFilePath()) ) ? 0 : 1; if (fileOneMatches !== fileTwoMatches) { return fileOneMatches - fileTwoMatches; } } const fileOneArchived = ROMIndexer.archiveEntryPriority(fileOne); const fileTwoArchived = ROMIndexer.archiveEntryPriority(fileTwo); if (fileOneArchived !== fileTwoArchived) { return fileOneArchived - fileTwoArchived; } if (this.options.getOverwrite() || this.options.getOverwriteInvalid()) { const fileOneInOutput = fileOne.getFilePath().startsWith(outputDir) ? 1 : 0; const fileTwoInOutput = fileTwo.getFilePath().startsWith(outputDir) ? 1 : 0; if (fileOneInOutput !== fileTwoInOutput) { return fileOneInOutput - fileTwoInOutput; } } return fileOne.toString().localeCompare(fileTwo.toString()); }); checksumsToFiles.set(checksum, sortedFiles); } } /** * This ordering should match {@link FileFactory#archiveFromArchiveExtension} */ static archiveEntryPriority(file) { if (!(file instanceof ArchiveEntry)) { return 0; } if (file.getArchive() instanceof Zip) { return 1; } if (file.getArchive() instanceof Tar) { return 2; } if (file.getArchive() instanceof Rar) { return 3; } if (file.getArchive() instanceof SevenZip) { return 4; } if (file.getArchive() instanceof Maxcso) { return 5; } if (file.getArchive() instanceof Dolphin) { return 6; } if (file.getArchive() instanceof Chd) { return 7; } return 99; } } export { ROMIndexer as default }; //# sourceMappingURL=romIndexer.js.map