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