update ROM file search order

This commit is contained in:
Alexey Nurgaliev 2023-09-01 00:59:49 +03:00
parent d017ad3002
commit d13e7ac294

View file

@ -857,27 +857,37 @@ class EmulatorJS {
})
}
downloadRom() {
return new Promise((resolve, reject) => {
const extractFileNameFromUrl = url => {
if (!url) return null;
return url.split('/').pop().split("#")[0].split("?")[0];
};
const supportsExt = (ext) => {
const core = this.getCore();
if (!this.extensions[core]) return false;
return this.extensions[core].includes(ext);
};
return new Promise(resolve => {
this.textElem.innerText = this.localization("Download Game Data");
const gotGameData = (data) => {
if (['arcade', 'mame2003'].includes(this.getCore(true))) {
this.fileName = this.config.gameUrl.split('/').pop().split("#")[0].split("?")[0];
this.fileName = extractFileNameFromUrl(this.config.gameUrl);
FS.writeFile(this.fileName, new Uint8Array(data));
resolve();
return;
}
let resData = {};
const needsCue = (["mednafen_psx", "mednafen_psx_hw", "mednafen_pce"].includes(this.getCore())) && !this.config.disableCue;
const altName = this.config.gameUrl.startsWith("blob:") ? (this.config.gameName || "game") : this.config.gameUrl.split('/').pop().split("#")[0].split("?")[0];
const altName = this.config.gameUrl.startsWith("blob:") ? (this.config.gameName || "game") : extractFileNameFromUrl(this.config.gameUrl);
let fileNames = [];
this.checkCompression(new Uint8Array(data), this.localization("Decompress Game Data"), (fileName, fileData) => {
if (fileName.includes("/")) {
const paths = fileName.split("/");
let cp = "";
for (let i=0; i<paths.length-1; i++) {
if (paths[i] === "") continue;
cp += "/"+paths[i];
cp += `/${paths[i]}`;
if (!FS.analyzePath(cp).exists) {
FS.mkdir(cp);
}
@ -887,49 +897,58 @@ class EmulatorJS {
FS.mkdir(fileName);
return;
}
if (needsCue && ["m3u", "cue"].includes(fileName.split(".").pop().toLowerCase())) {
resData[fileName] = fileData;
} else if (fileName !== "!!notCompressedData") {
resData[fileName] = true;
}
if (fileName === "!!notCompressedData") {
FS.writeFile(altName, fileData);
resData[altName] = true;
fileNames.push(altName);
} else {
FS.writeFile("/"+fileName, fileData);
FS.writeFile(`/${fileName}`, fileData);
fileNames.push(fileName);
}
}).then(() => {
const fileNames = (() => {
let rv = [];
for (const k in resData) rv.push(k);
return rv;
})();
if (fileNames.length === 1) fileNames[0] = altName;
let execFile = null;
if (needsCue) {
execFile = this.gameManager.createCueFile(fileNames);
let isoFile = null;
let supportedFile = null;
let cueFile = null;
let selectedCueExt = null;
fileNames.forEach(fileName => {
const ext = fileName.split('.').pop().toLowerCase();
if (supportsExt(ext)) {
supportedFile = fileName;
}
for (const k in resData) {
if (k === "!!notCompressedData") {
if (needsCue && execFile !== null) {
this.fileName = execFile;
} else {
this.fileName = altName;
if (['iso', 'cso', 'chd', 'elf'].includes(ext)) {
isoFile = fileName;
}
break;
}
if (!this.fileName || ((this.extensions[this.getCore()] || []).includes(k.split(".").pop()) &&
if (['cue', 'ccd', 'toc', 'm3u'].includes(ext)) {
if (this.getCore(true) === 'psx') {
//always prefer m3u files for psx cores
!(this.getCore(true) === "psx" && ["m3u", "ccd"].includes(this.fileName.split(".").pop())))) {
this.fileName = k;
}
if (needsCue && execFile === null && ["m3u", "cue"].includes(k.split(".").pop().toLowerCase())) {
FS.writeFile("/"+k, resData[k]);
if (selectedCueExt !== 'm3u') {
if (ext === 'm3u' || cueFile === null) {
cueFile = fileName;
selectedCueExt = ext;
}
}
if (needsCue && execFile !== null) {
this.fileName = execFile;
} else {
//prefer cue or ccd files over toc or m3u
if (!['cue', 'ccd'].includes(selectedCueExt)) {
if (['cue', 'ccd'].includes(ext) || cueFile === null) {
cueFile = fileName;
selectedCueExt = ext;
}
}
}
}
});
if (isoFile !== null && (supportsExt('iso') || supportsExt('cso') || supportsExt('chd') || supportsExt('elf'))) {
this.fileName = isoFile;
} else if (!this.config.disableCue && (supportsExt('cue') || supportsExt('ccd') || supportsExt('toc') || supportsExt('m3u'))) {
if (cueFile !== null) {
this.fileName = cueFile;
} else {
this.fileName = this.gameManager.createCueFile(fileNames);
}
} else if (supportedFile !== null) {
this.fileName = supportedFile;
} else {
this.fileName = fileNames[0];
}
resolve();
});