From c824f31225e5b3314f4df0daf1bc90c698a5e2e6 Mon Sep 17 00:00:00 2001 From: thelamer Date: Wed, 17 Nov 2021 15:49:50 -0800 Subject: [PATCH] update metadata and add support for larger chds in xbox mode for libretro --- frontend/js/index.js | 4 ++ frontend/js/libretro.js | 64 +++++++++++++++---- metadata/default_files.json | 122 +++++++++++++++++++++--------------- package.json | 2 +- public/index.html | 2 +- setup_dev.sh | 1 - 6 files changed, 128 insertions(+), 67 deletions(-) diff --git a/frontend/js/index.js b/frontend/js/index.js index 5d1e2a7..cf064da 100644 --- a/frontend/js/index.js +++ b/frontend/js/index.js @@ -209,6 +209,10 @@ async function rendermenu(data, active_item) { $('#menu').data('root', root); var parent = data.parent; var items = data.items; + if (Object.keys(items).length == 0) { + alert('No items to load, please add some games'); + return ''; + }; for await (var name of Object.keys(items)) { var item = data.items[name]; if ((item.hasOwnProperty('cloneof')) && (items.hasOwnProperty(item.cloneof))) { diff --git a/frontend/js/libretro.js b/frontend/js/libretro.js index 090e6fc..7008b2b 100644 --- a/frontend/js/libretro.js +++ b/frontend/js/libretro.js @@ -17,6 +17,7 @@ var retroArchCfg = ` input_menu_toggle_gamepad_combo = 3 system_directory = /home/web_user/retroarch/system/` var retroArchDir = '/home/web_user/retroarch/' +var Init = { method:'GET',headers:{'Access-Control-Allow-Origin':'*'},mode:'cors'}; // Update loading div function setLoader(name) { @@ -28,8 +29,7 @@ function setLoader(name) { }; // File downloads with progress -async function downloadFile(url) { - var Init = { method:'GET',headers:{'Access-Control-Allow-Origin':'*'},mode:'cors'}; +async function downloadFile(url, gameDL) { var response = await fetch(url,Init); var length = response.headers.get('Content-Length'); if (!length) { @@ -48,7 +48,11 @@ async function downloadFile(url) { dlProgress = ((at / length).toFixed(2) * 100).toFixed(0); $('#progress').text(dlProgress.toString() + '%'); } - return array; + try { + return array; + } finally { + array = null; + } }; // Create IndexDB filestore @@ -67,13 +71,15 @@ async function setupFileSystem() { // Download all needed files and setup base filesystem async function setupMounts() { setLoader('Frontend'); - var frontendData = await downloadFile('data/frontend.zip'); + let frontendData = await downloadFile('data/frontend.zip'); var mfs = new BrowserFS.FileSystem.MountableFileSystem(); var memfs = new BrowserFS.FileSystem.InMemory(); var frontend = new BrowserFS.FileSystem.ZipFS(new Buffer(frontendData)); console.log('WEBPLAYER: initializing filesystem'); mfs.mount(retroArchDir + 'userdata', afs); mfs.mount(retroArchDir + 'bundle', frontend); + frontendData = null; + // Multizip support for MAME titles with chd files if (EJS_gameUrl.endsWith('.multizip')) { setLoader('Game'); var gameFile = await downloadFile(EJS_gameUrl); @@ -86,16 +92,18 @@ async function setupMounts() { } if (EJS_biosUrl) { setLoader('Bios'); - var biosFile = await downloadFile(EJS_biosUrl); + let biosFile = await downloadFile(EJS_biosUrl); if (EJS_biosUrl.endsWith('.zip')) { var biosPackage = new BrowserFS.FileSystem.ZipFS(new Buffer(biosFile)); mfs.mount(retroArchDir + 'system/', biosPackage); BrowserFS.initialize(mfs); + biosFile = null; } else { var bios = EJS_biosUrl.substr(EJS_biosUrl.lastIndexOf('/')+1); BrowserFS.initialize(mfs); fs.mkdirSync(retroArchDir + 'system'); fs.appendFileSync(retroArchDir + 'system/' + bios, new Buffer(biosFile)); + biosFile = null; } } else { BrowserFS.initialize(mfs); @@ -115,23 +123,53 @@ async function setupMounts() { async function downloadGame(dlGame) { if (dlGame == true) { setLoader('Game'); - if (rom.split('.').pop() !== 'bin') { - var romFile = await downloadFile(EJS_gameUrl); - fs.appendFileSync(retroArchDir + 'roms/' + rom, new Buffer(romFile)); - romFile = null; - } else { + // If this is a bin file download the cue as well (multi bin not supported) + if (rom.split('.').pop() == 'bin') { var EJS_gameUrlCue = EJS_gameUrl.split('.').shift() + '.cue'; var cue = rom.split('.').shift() + '.cue'; var cueFile = await downloadFile(EJS_gameUrlCue); - var romFile = await downloadFile(EJS_gameUrl); fs.appendFileSync(retroArchDir + 'roms/' + cue, new Buffer(cueFile)); - fs.appendFileSync(retroArchDir + 'roms/' + rom, new Buffer(romFile)); - romFile = null; + cueFile = null; }; + var response = await fetch(EJS_gameUrl,Init); + var length = response.headers.get('Content-Length'); + // Xbox edge browser hacky workaround if we have a large file + if ((length > 445000000) && (navigator.userAgent.indexOf('Edg') > -1)) { + let at = 0; + var reader = response.body.getReader(); + while (true) { + let {done, value} = await reader.read(); + if (done) { + break; + } + fs.appendFileSync(retroArchDir + 'roms/' + rom, new Buffer(value)); + at += value.length; + dlProgress = ((at / length).toFixed(2) * 100).toFixed(0); + $('#progress').text(dlProgress.toString() + '%'); + } + } else { + var array = new Uint8Array(length); + let at = 0; + var reader = response.body.getReader(); + for (;;) { + var {done, value} = await reader.read(); + if (done) { + break; + } + array.set(value, at); + at += value.length; + dlProgress = ((at / length).toFixed(2) * 100).toFixed(0); + $('#progress').text(dlProgress.toString() + '%'); + } + fs.appendFileSync(retroArchDir + 'roms/' + rom, new Buffer(array)); + array = null; + } }; $('#loading').empty(); + // Call main run of emu Module['callMain'](Module['arguments']); document.getElementById('canvas').focus(); + // Run user scipts if (EJS_onGameStart) { EJS_onGameStart(); }; diff --git a/metadata/default_files.json b/metadata/default_files.json index 80ff488..26668f1 100644 --- a/metadata/default_files.json +++ b/metadata/default_files.json @@ -495,10 +495,6 @@ "file":"/data/segaCD/backgrounds/default.png", "cid":"Qme8N7PzVPstNCQ3V5PpRmmBzokwRsHPjJQJgDbjBxnpmR" }, - { - "file":"/data/segaCD/bios/bios_CD_U.bin", - "cid":"QmR3LZ4wsd8HAEfpYrWHt4KSKSwkcLt243dETYCr9VwRAo" - }, { "file":"/data/segaCD/corners/default.png", "cid":"Qmc39zPV8PwrZTnMHNqk4mPXZpLkhkTAgkaF2B5f7WKhiq" @@ -523,10 +519,6 @@ "file":"/data/gb/backgrounds/default.png", "cid":"QmWcgbLd6rKAUGp1Q2DEfEQf1t8p8g2HN1XaHL8ZPVGWPU" }, - { - "file":"/data/gb/bios/dmg_boot.bin", - "cid":"QmXzNc3D578bHUgLwD5mAkQHzAVhmsbL1jqhfJqJ5AEN9T" - }, { "file":"/data/gb/corners/default.png", "cid":"QmQuTP338HcMh9QLEXDZdVLKbf6YCQV7dmx1UcPsdiL5DX" @@ -543,10 +535,6 @@ "file":"/data/gba/backgrounds/default.png", "cid":"QmQWF2Dr3QnwJhzaoptJUF2XzCHJzwoiKxuReDshBDr6Yf" }, - { - "file":"/data/gba/bios/gba_bios.bin", - "cid":"QmVWJiqWxzExiLq7T2j9ADp3H3rDoNnAkAr1sttcsw8Utq" - }, { "file":"/data/gba/corners/default.png", "cid":"QmQuTP338HcMh9QLEXDZdVLKbf6YCQV7dmx1UcPsdiL5DX" @@ -571,10 +559,6 @@ "file":"/data/segaGG/backgrounds/default.png", "cid":"QmV8LcGgjpqsXGqMewWhJVCbaSJn5QfzitcSmtPy974HaZ" }, - { - "file":"/data/segaGG/bios/bios.gg", - "cid":"QmcM47ctYJG2ijtuWA5QcjsKXonoGKTiSKQ5j9uzRVUueP" - }, { "file":"/data/segaGG/corners/default.png", "cid":"QmQuTP338HcMh9QLEXDZdVLKbf6YCQV7dmx1UcPsdiL5DX" @@ -607,10 +591,6 @@ "file":"/data/pce/backgrounds/default.png", "cid":"QmXVxvCqNDhTYpEvweW6hGDNG5ojpsLhsGF4MEChsma2JW" }, - { - "file":"/data/pce/bios/syscard3.pce", - "cid":"QmU5f43aAAQtAtrDVqcq5BWz95HSNa4wvqJwgpjbK5xVTx" - }, { "file":"/data/pce/corners/default.png", "cid":"QmeVdvxJt2tcUWQJubJamt4MSuq4A1SfTvSz6F3J5XzhMo" @@ -625,19 +605,31 @@ }, { "file":"/data/config/pce.json", - "cid":"QmTuXqpMqwKD4LbsnksAeTwQmaMhrkkbXvrCSUYAUYWQG8" + "cid":"QmNmCQQAae4QG6JxNvzqfMP2XgsF8w6gDzeXiyKKz7JwTo" + }, + { + "file":"/data/pce/bios/pce.zip", + "cid":"QmVZuSTmjWBbFvsgkV7fp4R1ZmjveK9Fap4Nxi6DhbpZPT" }, { "file":"/data/config/gbc.json", - "cid":"QmVELYAWho5xuwSo8hpZbiH8BoHTBxMS5pDSBtVpwYheLY" + "cid":"QmYb7Qs81M6v2AR9Fe1i2hS4ff1K8NWdBe3ZEHBoxFUL44" + }, + { + "file":"/data/gbc/bios/gb.zip", + "cid":"QmYXjcLTGdtG9JtDGVg42cWFkW6feYufRPQYGSe6ifESY8" }, { "file":"/data/config/lynx.json", - "cid":"QmQrZSx1W6qKjdXmCJFX26Kg8ZN9XtahFgNaRyacs4kbzb" + "cid":"QmYsDZRt9vk4WPgMpbDwqtXWZmMvxyJTPVFsSA7YvBBYMd" + }, + { + "file":"/data/lynx/bios/lynxboot.img", + "cid":"QmTaUUheMwLj5JqTqiZLzUfdUBj9xWikyZY4s72RGfKb9d" }, { "file":"/data/config/segaCD.json", - "cid":"QmddqqPJ8m92LvaiM5RaPhPrj43khMavb58QVgfnC4DrV8" + "cid":"QmZDGK5aFqMoTpzZJz9V8S5P6pxuqDP3RwDWYrGpiBMhdY" }, { "file":"/data/config/vb.json", @@ -645,11 +637,15 @@ }, { "file":"/data/config/doom.json", - "cid":"QmdbtjxaChjJqanfFarHJw7nYwxdsnSgYRCaKKtGkzyguX" + "cid":"QmXc3LLZkTnvz6GSftb8LycevPyFnHGwyBMayyyD1AuV5J" }, { "file":"/data/config/gba.json", - "cid":"QmX3ETMRooA2YSJoHfVyThTFE1bWiYCA9Gog8dKziRJbu1" + "cid":"QmSdiXmb2538xy4jSvy2Uy74AxyZvcra4jXYZWY9UQCQrt" + }, + { + "file":"/data/gba/bios/gba.zip", + "cid":"QmYtDaErc2RzWBYLmcwfKD81NSVjqBsGD6cJCk3kNzDyuk" }, { "file":"/data/config/vectrex.json", @@ -669,11 +665,15 @@ }, { "file":"/data/config/segaGG.json", - "cid":"QmPfQUHixS1pRoKUDdgawFSMsFKpjt46DFyW9P9fbCVHKF" + "cid":"QmZjX8naFHrD16kXasyJBZGwB1xvzjUjN5J9xsqjcgeLpA" }, { "file":"/data/config/odyssey2.json", - "cid":"QmXmFBV2RdXP2ukA6r1AeuqvTVvHTdYntQF4jtjwUonuvP" + "cid":"QmQuJmH6vhymWQp1oWAaPjL9MSx9k2LgVFGLq9iH4rN2EA" + }, + { + "file":"/data/odyssey2/bios/odyssey2.zip", + "cid":"QmcXRfDzhsEnWnMykpVwQc86kZXKXgbWMKuXf3HNzXnWKN" }, { "file":"/data/config/colecovision.json", @@ -697,19 +697,27 @@ }, { "file":"/data/config/segaSG.json", - "cid":"QmboVi6qLgZ9YSj4CnkPgJg5c6wnS88SCB7wiagSPA7CaR" + "cid":"QmXD3EUaQbv7jUMSTaAY7ViCnDAwu53qpFMJeLdvdn6jpb" }, { "file":"/data/config/nes.json", - "cid":"QmTYx6yK6zB5fpC6Z9xswge42JS8TMzfpad3rXhYNCFYV4" + "cid":"Qmb94JynyJ5FfLxfpbhCp4vLxmJWarKbesiNa7M81u8i5w" + }, + { + "file":"/data/nes/bios/nes.zip", + "cid":"QmPk9EKQ2aRVHJX91PTJfmfBDiHRzeWuZExT36BAk2sNZL" }, { "file":"/data/config/segaMS.json", - "cid":"QmXzi2gw4oTtFEqBH8JhuLXDVAzKmN3PGfTCDhkWKBaDqQ" + "cid":"QmVrZCSBsWdztUtmPrALKZPfTcJk2NUDNszKRqZko4SoH5" }, { "file":"/data/config/gb.json", - "cid":"QmScD8DusjpqSuCKT42bqe9v1uH5p4xxEYBnAYeMhtrHzA" + "cid":"QmZyDRXQdoFg8izaPURzEQ8Zv4trVVk2G5jspCng7ruaVZ" + }, + { + "file":"/data/gb/bios/gb.zip", + "cid":"QmYXjcLTGdtG9JtDGVg42cWFkW6feYufRPQYGSe6ifESY8" }, { "file":"/data/config/arcade.json", @@ -717,7 +725,11 @@ }, { "file":"/data/config/snes.json", - "cid":"QmW2bp9HCL6ZbheYVwkCbczGwo2jEuuz6VEqMJ72bzzpLN" + "cid":"QmRBEQA1KzXnzWCcnGaYNC8YGQ3tfdk4oVR32nNtunaQJX" + }, + { + "file":"/data/snes/bios/snes.zip", + "cid":"Qme4WxcE38pAZePr3jbHp4h3c9Bu23K7Gt7PNkVHU4x14e" }, { "file":"/data/config/atari2600.json", @@ -725,7 +737,7 @@ }, { "file":"/data/config/segaMD.json", - "cid":"QmSzmETrvkLfFgr3bPbwEm8tBhY6deuzQiUQZmCLdPb93F" + "cid":"QmUNbgxrPrT5E8dZ8hzjMSLyRgUY4RDJVSVozwmkNjBsKB" }, { "file":"/data/config/msx.json", @@ -733,7 +745,11 @@ }, { "file":"/data/config/atari7800.json", - "cid":"QmZDZ5ENbes4ATmt4yXyPoTjaKKT1FDyyMUaaeEVuHX3vX" + "cid":"QmSLHkLrMNwwDTaz9gTVVWKGQZRwTx2VrzuUVg5dDAxtNe" + }, + { + "file":"/data/atari7800/bios/atari7800.zip", + "cid":"QmcHsJd8dzc4gKwd3cmibFBAgBw3X7pswzdLsWSBG8Ngs7" }, { "file":"/data/config/n64.json", @@ -771,10 +787,6 @@ "file":"/data/gbc/backgrounds/default.png", "cid":"QmfCkpZzcRaJYuCxuNBWtjVA28T9M25hNWQeqUQYZbZij9" }, - { - "file":"/data/gbc/bios/gbc_bios.bin", - "cid":"QmNQJie3w8pXAjXWWXRdJrsw8JfF6AZ2UwN4MQtDyPrz6U" - }, { "file":"/data/gbc/corners/default.png", "cid":"QmQuTP338HcMh9QLEXDZdVLKbf6YCQV7dmx1UcPsdiL5DX" @@ -783,10 +795,6 @@ "file":"/data/psx/backgrounds/default.png", "cid":"QmXtrPJCdPuBPemYLxC8shQYHNHk59ES26FyGqR12bZiD2" }, - { - "file":"/data/psx/bios/scph5501.bin", - "cid":"QmVqWZXiKdhcTFYnwU8iCYnPSBwAijsQx7c2kBDixRv9bL" - }, { "file":"/data/psx/bios/psx.zip", "cid":"QmfQTsRzaE4T9LUWnKara8KVyXmoUn2RXzmSHYtDYN8Jr6" @@ -815,10 +823,6 @@ "file":"/data/segaSaturn/backgrounds/default.png", "cid":"QmQg9KY4puPcxj1KpdfV49uq6z8PcEk8Fbq7uTdj8aYQSx" }, - { - "file":"/data/segaSaturn/bios/saturn_bios.bin", - "cid":"QmPAPRxLu2vwr1LDX6JFa2kmC1LaufZVV2WF67emaf6hAJ" - }, { "file":"/data/segaSaturn/corners/default.png", "cid":"Qmdynxj7tJmnLcMCJz1gYafXLwAY4jHHyYyqFPXzE7To7P" @@ -867,10 +871,6 @@ "file":"/data/odyssey2/backgrounds/default.png", "cid":"QmXxgaCQQ5SonNQJ5ajiNDnk7Zf8CStFL8HRodY9mGRsQJ" }, - { - "file":"/data/odyssey2/bios/o2rom.bin", - "cid":"QmY8LpCqtwRzYBFUrkADcTTwJHwD9Q2oFPakxw1cpS1WJz" - }, { "file":"/data/odyssey2/corners/default.png", "cid":"QmXHdF3vrctFfovgndZfLXEKS5sjRTSinjPK7LmJwSM9Y5" @@ -919,6 +919,26 @@ "file":"/data/doom/corners/default.png", "cid":"QmQuTP338HcMh9QLEXDZdVLKbf6YCQV7dmx1UcPsdiL5DX" }, + { + "file":"/data/segaCD/bios/sega.zip", + "cid":"Qmct6NWgAbSvWW9XenBfJ8U15GiwEgDLNFKhCnhL6TFiad" + }, + { + "file":"/data/segaGG/bios/sega.zip", + "cid":"Qmct6NWgAbSvWW9XenBfJ8U15GiwEgDLNFKhCnhL6TFiad" + }, + { + "file":"/data/segaMD/bios/sega.zip", + "cid":"Qmct6NWgAbSvWW9XenBfJ8U15GiwEgDLNFKhCnhL6TFiad" + }, + { + "file":"/data/segaMS/bios/sega.zip", + "cid":"Qmct6NWgAbSvWW9XenBfJ8U15GiwEgDLNFKhCnhL6TFiad" + }, + { + "file":"/data/segaSG/bios/sega.zip", + "cid":"Qmct6NWgAbSvWW9XenBfJ8U15GiwEgDLNFKhCnhL6TFiad" + }, { "file":"/data/3do/roms/", "cid":"directory" diff --git a/package.json b/package.json index c7af5fe..0f66499 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "emulatorjs", - "version": "1.3.2", + "version": "1.3.3", "description": "Rom and art management utility for generating configuration files for use with the EmulatorJS frontend", "main": "index.js", "author": "thelamer", diff --git a/public/index.html b/public/index.html index 93d5967..705a3be 100644 --- a/public/index.html +++ b/public/index.html @@ -120,7 +120,7 @@

General Emulation

  • Wonderswan (color)- https://github.com/libretro/beetle-wswan-libretro
  • Experimental Emulators

    -

    More emulators are included than listed above the libretro psx emulator is functional but has more serious memory requirements please see HERE for a complete list of libretro cores. To enable the libretro psx emulator change your psx config to use "libretro-mednafen_psx" as the emulator and "psx.zip" as the bios. To use an alternative/experimental core just add "libretro-" to the beginning of it's name for the emulator setting for your system config.

    +

    More emulators are included than listed above the libretro psx emulator is functional but has more serious memory requirements please see HERE for a complete list of libretro cores. To use an alternative/experimental core just add "libretro-" to the beginning of it's name for the emulator setting for your system config.