General: Implement fpPS4 updater [NEED TESTING], Css: Various fixes, Emu: Fixed not being able to close fpPS4 using stop fpPS4 button and more!

This commit is contained in:
TemmieHeartz 2023-01-16 21:19:29 -03:00
parent 26ca3f10c3
commit 95cf06000f
22 changed files with 2513 additions and 249 deletions

View file

@ -6,6 +6,7 @@
Main application stylesheet
******************************************************************************
*/
html, body {
color: #fff;
overflow: hidden;
@ -33,6 +34,10 @@ input[type='range'] {
input[disabled='disabled'], input[disabled] {
cursor: no-drop;
}
input[type='checkbox'] {
margin-right: 8px;
vertical-align: middle;
}
img {
-webkit-user-drag: none;
}
@ -318,7 +323,7 @@ img {
text-align: center;
border-radius: 10px;
box-shadow: 0px 0px 30px #000a;
background-image: linear-gradient(180deg, #2a3a56, #0d1932);
background-image: linear-gradient(180deg, #2f405f, #131f38);
}
.DIV_SETTINGS_BG {
top: 0px;
@ -352,7 +357,7 @@ img {
text-align: left;
margin-left: 8px;
margin-bottom: 8px;
border-radius: 6px;
border-radius: 4px;
font-family: sans-serif;
background-color: #111d;
width: calc(100% - 32px);
@ -368,14 +373,14 @@ img {
}
.DIV_settingsEntryFlex {
display: flex;
flex-wrap: nowrap;
align-items: center;
flex-direction: row;
align-content: center;
}
.DIV_settingsH2 {
font-size: 20px;
font-style: italic;
font-family: monospace;
font-weight: 600;
font-family: system-ui;
margin: 0px 0px 8px 2px;
}
.DIV_settingsSave {
@ -439,6 +444,58 @@ img {
margin-bottom: 2px;
font-family: system-ui;
}
.DIV_FPPS4_UPDATER {
top: 0px;
left: 0px;
width: 100%;
height: 100%;
z-index: 110;
cursor: wait;
display: none;
transition: 0.4s;
flex-wrap: nowrap;
position: absolute;
align-items: center;
flex-direction: row;
align-content: center;
font-family: system-ui;
justify-content: center;
backdrop-filter: blur(4px);
background-color: #03033144;
}
.DIV_PROGRESSBAR {
width: 72%;
height: 10px;
cursor: wait;
overflow: hidden;
margin-top: 44px;
border-width: 1px;
position: absolute;
border-style: solid;
background-color: #c5c5c5ad;
}
.DIV_PROGRESSBAR_INTERNAL {
top: 0px;
left: 0px;
width: 0%;
height: 100%;
transition: 0.4s;
position: absolute;
background-image: linear-gradient(90deg, #ccc, #fff);
}
.DIV_DESIGN_LINES {
left: 0px;
width: 100%;
height: 1px;
position: absolute;
background-color: #fffb;
}
.LINE_TOP {
top: 12%;
}
.LINE_BOTTOM {
bottom: 12%;
}
/*
Images
@ -542,12 +599,18 @@ img {
}
.BTN_STOP {
margin: 0px 4px 0px 4px;
padding: 1px 70px 1px 70px;
padding: 1px 30px 1px 30px;
}
.BTN_SAVE {
border: none;
font-size: 18px;
min-width: 300px;
min-height: 60px;
border-radius: 6px;
background-image: linear-gradient(180deg, #fff, #ccc);
}
.BTN_SAVE:active {
background-image: linear-gradient(0deg, #fff, #ccc);
}
.BTN_selectPath {
float: right;
@ -568,6 +631,17 @@ img {
padding: 4px 10px 4px 10px;
background-image: linear-gradient(180deg, #fff, #bbb);
}
.SETTINGS_TEXT {
color: #0f0;
border: none;
outline: none;
min-width: 160px;
margin-left: 4px;
border-radius: 4px;
background-color: #000;
font-family: monospace;
padding: 6px 0px 6px 6px;
}
/*
Labels
@ -586,7 +660,7 @@ img {
}
.LABEL_checkbox {
cursor: pointer;
font-size: 16px;
font-size: 14px;
font-style: italic;
}
.LABEL_emuColor {
@ -610,10 +684,16 @@ img {
.LABEL_settingsExperimental {
padding: 6px;
cursor: pointer;
font-family: math;
font-family: monospace;
background-color: #000;
text-shadow: 0px 0px 10px #f00;
}
.LABEL_FLEX_MARGIN {
margin: 4px;
}
.LABEL_monospace {
font-family: monospace;
}
/*
Animations

BIN
App/img/logo.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

View file

@ -11,210 +11,254 @@
<body>
<!-- fpPS4 Updater -->
<div class="DIV_FPPS4_UPDATER" id="DIV_FPPS4_UPDATER">
<!-- GUI Design -->
<div class="DIV_DESIGN_LINES LINE_TOP"></div>
<div class="DIV_DESIGN_LINES LINE_BOTTOM"></div>
<!-- Status -->
<label class="LABEL_FLEX_MARGIN">
<label id="LABEL_FPPS4_UPDATER_STATUS_LANG">Status</label>:
</label>
<label id="LABEL_FPPS4_UPDATER_STATUS">???</label>
<!-- Progressbar -->
<div class="DIV_PROGRESSBAR">
<div class="DIV_PROGRESSBAR_INTERNAL" id="DIV_PROGRESSBAR_UPDATE_FPPS4"></div>
</div>
</div>
<!-- Launcher Settings -->
<div class="DIV_SETTINGS_HOLDER" id="DIV_SETTINGS">
<div class="DIV_SETTINGS">
<div class="DIV_TITLE" id="DIV_SETTINGS_TITLE">Launcher Settings</div>
<!-- BG -->
<div class="DIV_SETTINGS_BG"></div>
<!-- Settings List -->
<div class="DIV_SETTINGS_LIST">
<!-- Language -->
<div class="DIV_settingsH2" id="DIV_SETTINGS_LANGUAGE">Language</div>
<div class="DIV_settingsEntry">
<label id="LABEL_SETTINGS_CURRENT_LANGUAGE">Current Language</label>:
<select id="SELECT_settingsLanguage" class="SELECT_settings">
<!-- Language goes here -->
</select><br>
<label id="LABEL_SETTINGS_LANGUAGE_RESTART">You must restart launcher to take effect</label>
</div>
<div class="SEPARATOR_00"></div>
<!-- Paths -->
<div class="DIV_settingsH2" id="DIV_SETTINGS_PATHS">Paths</div>
<div class="DIV_settingsEntry">
<label id="LABEL_SETTINGS_APP_GAMES_PATH">App / Games Path</label>:
<label id="LBL_SETTINGS_gamePath" class="LABEL_settingsPath">???</label>
<input type="button" class="BTN_selectPath" id="BTN_SETTINGS_SELECT_APPS_GAMES_PATH" value="Select path" onclick="APP.settings.selectPath({
settings: 'gamePath',
label: 'LBL_SETTINGS_gamePath'
});">
<input type="button" class="BTN_selectPath" id="BTN_SETTINGS_OPEN_APPS_GAMES_PATH" value="Open folder" onclick="APP.fileManager.openDir(APP.settings.data.gamePath);">
</div>
<div class="DIV_settingsEntry">
<label id="LABEL_SETTINGS_FPPS4_PATH">fpPS4 Path</label>:
<label id="LBL_SETTINGS_emuPath" class="LABEL_settingsPath">???</label>
<input type="button" class="BTN_selectPath" id="BTN_SETTINGS_SELECT_FPPS4_PATH" value="Select File" onclick="APP.settings.selectFile({
extension: '.exe',
settings: 'emuPath',
label: 'LBL_SETTINGS_emuPath'
});">
</div>
<!-- Game List -->
<div class="SEPARATOR_00"></div>
<div class="DIV_settingsH2" id="DIV_SETTINGS_GAME_LIST">Game List</div>
<div class="DIV_settingsEntry">
<div class="DIV_SETTINGS">
<div class="DIV_TITLE" id="DIV_SETTINGS_TITLE">Launcher Settings</div>
<!-- BG -->
<div class="DIV_SETTINGS_BG"></div>
<!-- Settings List -->
<div class="DIV_SETTINGS_LIST">
<label id="LABEL_SETTINGS_GAME_SEARCH_MODE">Game search mode</label>:
<select id="SELECT_settingsSearchMode" class="SELECT_settings">
<option value="appName">Name</option>
<option value="titleId">Title ID</option>
</select>
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<label id="LABEL_SETTINGS_GAME_LIST_BACKGROUND_BLUR">Background Blur</label>:
<input type="range" min="0" max="6" step="0.01" value="2" id="RANGE_settingsGameListBgBlur" onmouseup="APP.design.renderSettings(!0);" onkeyup="APP.design.renderSettings(!0);">
<label id="LABEL_settingsGameListBgBlur">???</label>%
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex" id="DIV_settingsGridBorderRadius">
<label id="LABEL_SETTINGS_GRID_BORDER_RADIUS">(Grid) Border-Radius</label>:
<input type="range" min="0" max="15" step="0.1" value="8" id="RANGE_settingsGridIconBorderRadius" onmouseup="APP.design.renderSettings(!0);" onkeyup="APP.design.renderSettings(!0);">
<label id="LABEL_settingsGridBorderRadius">???</label>%
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<!-- Language -->
<div class="DIV_settingsH2" id="DIV_SETTINGS_LANGUAGE">Language</div>
<label id="LABEL_SETTINGS_GAME_LIST_BACKGROUND_OPACITY">Background Opacity</label>:
<div class="DIV_settingsEntry">
<label id="LABEL_SETTINGS_CURRENT_LANGUAGE">Current Language</label>:
<select id="SELECT_settingsLanguage" class="SELECT_settings">
<!-- Language goes here -->
</select><br>
(<label id="LABEL_SETTINGS_LANGUAGE_RESTART">You must restart launcher to take effect</label>)
</div>
<div class="SEPARATOR_00"></div>
<!-- Paths -->
<div class="DIV_settingsH2" id="DIV_SETTINGS_PATHS">Paths</div>
<div class="DIV_settingsEntry">
<label id="LABEL_SETTINGS_APP_GAMES_PATH">App / Games Path</label>:
<label id="LBL_SETTINGS_gamePath" class="LABEL_settingsPath">???</label>
<input type="button" class="BTN_selectPath" id="BTN_SETTINGS_SELECT_APPS_GAMES_PATH" value="Select path" onclick="APP.settings.selectPath({
settings: 'gamePath',
label: 'LBL_SETTINGS_gamePath'
});">
<input type="button" class="BTN_selectPath" id="BTN_SETTINGS_OPEN_APPS_GAMES_PATH" value="Open folder" onclick="APP.fileManager.openDir(APP.settings.data.gamePath);">
</div>
<input type="range" min="0" max="1" step="0.01" value="0.6" id="RANGE_settingsGameListBgOpacity" onmouseup="APP.design.renderSettings(!0);" onkeyup="APP.design.renderSettings(!0);">
<label id="LABEL_settingsGameListBgOpacity">???</label>%
<div class="DIV_settingsEntry">
<label id="LABEL_SETTINGS_FPPS4_PATH">fpPS4 Path</label>:
<label id="LBL_SETTINGS_emuPath" class="LABEL_settingsPath">???</label>
<input type="button" class="BTN_selectPath" id="BTN_SETTINGS_SELECT_FPPS4_PATH" value="Select File" onclick="APP.settings.selectFile({
extension: '.exe',
settings: 'emuPath',
label: 'LBL_SETTINGS_emuPath'
});">
</div>
<!-- Game List -->
<div class="SEPARATOR_00"></div>
<div class="DIV_settingsH2" id="DIV_SETTINGS_GAME_LIST">Game List</div>
<div class="DIV_settingsEntry">
<label id="LABEL_SETTINGS_GAME_SEARCH_MODE">Game search mode</label>:
<select id="SELECT_settingsSearchMode" class="SELECT_settings">
<option value="appName">Name</option>
<option value="titleId">Title ID</option>
</select>
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<label id="LABEL_SETTINGS_GAME_LIST_BACKGROUND_BLUR">Background Blur</label>:
<input type="range" min="0" max="6" step="0.01" value="2" id="RANGE_settingsGameListBgBlur" onmouseup="APP.design.renderSettings(!0);" onkeyup="APP.design.renderSettings (!0);">
<label id="LABEL_settingsGameListBgBlur">???</label>%
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex" id="DIV_settingsGridBorderRadius">
<label id="LABEL_SETTINGS_GRID_BORDER_RADIUS">(Grid) Border-Radius</label>:
<input type="range" min="0" max="15" step="0.1" value="8" id="RANGE_settingsGridIconBorderRadius" onmouseup="APP.design.renderSettings(!0);" onkeyup="APP.design. renderSettings(!0);">
<label id="LABEL_settingsGridBorderRadius">???</label>%
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<label id="LABEL_SETTINGS_GAME_LIST_BACKGROUND_OPACITY">Background Opacity</label>:
<input type="range" min="0" max="1" step="0.01" value="0.6" id="RANGE_settingsGameListBgOpacity" onmouseup="APP.design.renderSettings(!0);" onkeyup="APP.design. renderSettings(!0);">
<label id="LABEL_settingsGameListBgOpacity">???</label>%
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<input type="checkbox" id="CHECKBOX_settingsGameSearchCaseSensitive">
<label class="LABEL_checkbox" id="LABEL_SETTINGS_GAME_LIST_SEARCH_CASE_SENSITIVE" onclick="APP.tools.processCheckbox('CHECKBOX_settingsGameSearchCaseSensitive');">
Enable case-sentitive search on game list
</label>
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex" id="DIV_settingsShowBgOnGameEntry">
<input type="checkbox" id="CHECKBOX_settingsShowBgOnGameEntry">
<label class="LABEL_checkbox" id="LABEL_SETTINGS_GAME_LIST_NORMAL_SHOW_BG" onclick="APP.tools.processCheckbox('CHECKBOX_settingsShowBgOnGameEntry');">
Show background image for every game entry on list
</label>
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<input type="checkbox" id="CHECKBOX_settingsShowExecList">
<label class="LABEL_checkbox" id="LABEL_SETTINGS_SHOW_METADATA_GAME_ENTRY" onclick="APP.tools.processCheckbox('CHECKBOX_settingsShowExecList');">
Show app / game metadata (or executable path) for every title in game list
</label>
</div>
<!-- Emu running -->
<div class="SEPARATOR_00"></div>
<div class="DIV_settingsH2" id="DIV_SETTINGS_EMU_RUNNING">Emu Running</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<label id="LABEL_SETTINGS_EMU_RUNNING_BACKGROUND_BLUR">Background Blur</label>:
<input type="range" min="0" max="6" step="0.01" value="6" id="RANGE_settingsEmuRunningBgBlur" onmouseup="APP.design.renderSettings(!0);" onkeyup="APP.design. renderSettings(!0);">
<label id="LABEL_settingsEmuRunningBgBlur">???</label>%
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<label id="LABEL_SETTINGS_EMU_RUNNING_BACKGROUND_OPACITY">Background Opacity</label>:
<input type="range" min="0" max="1" step="0.01" value="0.7" id="RANGE_settingsEmuRunningBgOpacity" onmouseup="APP.design.renderSettings(!0);" onkeyup="APP.design. renderSettings(!0);">
<label id="LABEL_settingsEmuRunningBgOpacity">???</label>%
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<input type="checkbox" id="CHECKBOX_settingsShowGameMetadata">
<label class="LABEL_checkbox" id="LABEL_SETTINGS_SHOW_METADATA_GUI" onclick="APP.tools.processCheckbox('CHECKBOX_settingsShowGameMetadata');">
Display icon / name GUI while fpPS4 is running
</label>
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<input type="checkbox" id="CHECKBOX_settingsShowExecRunning">
<label class="LABEL_checkbox" id="LABEL_SETTINGS_SHOW_METADATA_EMU_RUNNING" onclick="APP.tools.processCheckbox('CHECKBOX_settingsShowExecRunning');">
Display app / game metadata (or executable path) below game title
</label>
</div>
<!-- Log options -->
<div class="SEPARATOR_00"></div>
<div class="DIV_settingsH2" id="DIV_SETTINGS_LOG_OPTIONS">Log Options</div>
<div class="DIV_settingsEntry">
<label id="LABEL_SETTINGS_LOG_START_WINDOW_STATE">Start console window</label>:
<select id="SELECT_settingsStartExternalWindow" class="SELECT_settings" onchange="APP.design.updateLauncherSettingsGUI();">
<option value="normal">Normal</option>
<option value="max">Maximized</option>
<option value="min">Minimized</option>
</select>
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<input type="checkbox" id="CHECKBOX_settingsExternalWindowPrompt">
<label class="LABEL_checkbox" id="LABEL_SETTINGS_PROMPT_KEY_FPPS4_CLOSES" onclick="APP.tools.processCheckbox('CHECKBOX_settingsExternalWindowPrompt');">
Prompt user to press any key when fpPS4 closes
</label>
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<input type="checkbox" id="CHECKBOX_settingsExperimentalIntLog">
<label class="LABEL_checkbox" id="LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG" onclick="APP.tools.processCheckbox('CHECKBOX_settingsExperimentalIntLog');">
<label class="LABEL_settingsExperimental">EXPERIMENTAL</label> Log fpPS4 process output (<code>stdout</code> and <code>stderr</code>) on intenal log (Press F12 --> Console)
</label>
</div>
<!-- fpPS4 Updater -->
<div class="SEPARATOR_00"></div>
<div class="DIV_settingsH2" id="DIV_SETTINGS_FPPS4_UPDATER">fpPS4 Updater</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<input type="checkbox" id="CHECKBOX_settingsEnableFpps4Updates">
<label class="LABEL_checkbox" id="LABEL_SETTINGS_ENABLE_LAUNCHER_FPPS4_UPDATES" onclick="APP.tools.processCheckbox('CHECKBOX_settingsEnableFpps4Updates');">
Enable fpPS4 updater
</label>
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<label class="LABEL_checkbox" id="LABEL_SETTINGS_FPPS4_UPDATE_BRANCH">
Search updates from branch
</label>:
<input type="text" placeholder="main, trunk..." class="SETTINGS_TEXT" id="INPUT_settingsUpdateFpps4Branch">
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<input type="button" class="SELECT_settings" id="BTN_SETTINGS_FORCE_FPPS4_UPDATE" value="Force fpPS4 update" onclick="APP.emuManager.update.check({forceUpdate: !0});">
</div>
<!-- Misc. -->
<div class="SEPARATOR_00"></div>
<div class="DIV_settingsH2" id="DIV_SETTINGS_MISC">Misc.</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<input type="checkbox" id="CHECKBOX_settingsEnableParamSfo">
<label class="LABEL_checkbox" id="LABEL_SETTINGS_ENABLE_PARAMSFO_SUPPORT" onclick="APP.tools.processCheckbox('CHECKBOX_settingsEnableParamSfo');">
Enable <code>PARAM.SFO</code> support <i>(Click on "Delete all game settings" and restart launcher to take effect)</i>
</label>
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<input type="checkbox" id="CHECKBOX_settingsRemoveProjectGp4">
<label class="LABEL_checkbox" id="LABEL_SETTINGS_REMOVE_PROJECT_GP4_FILES" onclick="APP.tools.processCheckbox('CHECKBOX_settingsRemoveProjectGp4');">
Remove <code>Project.gp4</code> from every game on game list load
</label>
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<input type="button" class="SELECT_settings" id="BTN_SETTINGS_DELETE_ALL_GAME_SETTINGS" value="Delete all game settings" onclick="APP.settings.resetAllGameSettings();">
<input type="button" class="SELECT_settings" id="BTN_SETTINGS_RESTART_LAUNCHER" value="Restart launcher" onclick="chrome.runtime.reload();">
</div>
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<input type="checkbox" id="CHECKBOX_settingsGameSearchCaseSensitive">
<label class="LABEL_checkbox" id="LABEL_SETTINGS_GAME_LIST_SEARCH_CASE_SENSITIVE" onclick="APP.tools.processCheckbox('CHECKBOX_settingsGameSearchCaseSensitive');">
Enable case-sentitive search on game list
</label>
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex" id="DIV_settingsShowBgOnGameEntry">
<input type="checkbox" id="CHECKBOX_settingsShowBgOnGameEntry">
<label class="LABEL_checkbox" id="LABEL_SETTINGS_GAME_LIST_NORMAL_SHOW_BG" onclick="APP.tools.processCheckbox('CHECKBOX_settingsShowBgOnGameEntry');">
Show background image for every game entry on list
</label>
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<input type="checkbox" id="CHECKBOX_settingsShowExecList">
<label class="LABEL_checkbox" id="LABEL_SETTINGS_SHOW_METADATA_GAME_ENTRY" onclick="APP.tools.processCheckbox('CHECKBOX_settingsShowExecList');">
Show app / game metadata (or executable path) for every title in game list
</label>
</div>
<!-- Emu running -->
<div class="SEPARATOR_00"></div>
<div class="DIV_settingsH2" id="DIV_SETTINGS_EMU_RUNNING">Emu Running</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<label id="LABEL_SETTINGS_EMU_RUNNING_BACKGROUND_BLUR">Background Blur</label>:
<input type="range" min="0" max="6" step="0.01" value="6" id="RANGE_settingsEmuRunningBgBlur" onmouseup="APP.design.renderSettings(!0);" onkeyup="APP.design.renderSettings(!0);">
<label id="LABEL_settingsEmuRunningBgBlur">???</label>%
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<label id="LABEL_SETTINGS_EMU_RUNNING_BACKGROUND_OPACITY">Background Opacity</label>:
<input type="range" min="0" max="1" step="0.01" value="0.7" id="RANGE_settingsEmuRunningBgOpacity" onmouseup="APP.design.renderSettings(!0);" onkeyup="APP.design.renderSettings(!0);">
<label id="LABEL_settingsEmuRunningBgOpacity">???</label>%
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<input type="checkbox" id="CHECKBOX_settingsShowGameMetadata">
<label class="LABEL_checkbox" id="LABEL_SETTINGS_SHOW_METADATA_GUI" onclick="APP.tools.processCheckbox('CHECKBOX_settingsShowGameMetadata');">
Display icon / name GUI while fpPS4 is running
</label>
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<input type="checkbox" id="CHECKBOX_settingsShowExecRunning">
<label class="LABEL_checkbox" id="LABEL_SETTINGS_SHOW_METADATA_EMU_RUNNING" onclick="APP.tools.processCheckbox('CHECKBOX_settingsShowExecRunning');">
Display app / game metadata (or executable path) below game title
</label>
</div>
<!-- Log options -->
<div class="SEPARATOR_00"></div>
<div class="DIV_settingsH2" id="DIV_SETTINGS_LOG_OPTIONS">Log Options</div>
<div class="DIV_settingsEntry">
<label id="LABEL_SETTINGS_LOG_START_WINDOW_STATE">Start console window</label>:
<select id="SELECT_settingsStartExternalWindow" class="SELECT_settings" onchange="APP.design.updateLauncherSettingsGUI();">
<option value="normal">Normal</option>
<option value="max">Maximized</option>
<option value="min">Minimized</option>
</select>
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<input type="checkbox" id="CHECKBOX_settingsExternalWindowPrompt">
<label class="LABEL_checkbox" id="LABEL_SETTINGS_PROMPT_KEY_FPPS4_CLOSES" onclick="APP.tools.processCheckbox('CHECKBOX_settingsExternalWindowPrompt');">
Prompt user to press any key when fpPS4 closes
</label>
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<input type="checkbox" id="CHECKBOX_settingsExperimentalIntLog">
<label class="LABEL_checkbox" id="LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG" onclick="APP.tools.processCheckbox('CHECKBOX_settingsExperimentalIntLog');">
<label class="LABEL_settingsExperimental">EXPERIMENTAL</label> Log fpPS4 process output (<code>stdout</code> and <code>stderr</code>) on intenal log (Press F12 --> Console)
</label>
</div>
<!-- Misc. -->
<div class="SEPARATOR_00"></div>
<div class="DIV_settingsH2" id="DIV_SETTINGS_MISC">Misc.</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<input type="checkbox" id="CHECKBOX_settingsEnableParamSfo">
<label class="LABEL_checkbox" id="LABEL_SETTINGS_ENABLE_PARAMSFO_SUPPORT" onclick="APP.tools.processCheckbox('CHECKBOX_settingsEnableParamSfo');">
Enable <code>PARAM.SFO</code> support <i>(Click on "Delete all game settings" and restart launcher to take effect)</i>
</label>
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<input type="checkbox" id="CHECKBOX_settingsRemoveProjectGp4">
<label class="LABEL_checkbox" id="LABEL_SETTINGS_REMOVE_PROJECT_GP4_FILES" onclick="APP.tools.processCheckbox('CHECKBOX_settingsRemoveProjectGp4');">
Remove <code>Project.gp4</code> from every game on game list load
</label>
</div>
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
<input type="button" class="SELECT_settings" id="BTN_SETTINGS_DELETE_ALL_GAME_SETTINGS" value="Delete all game settings" onclick="APP.settings.resetAllGameSettings();">
<input type="button" class="SELECT_settings" id="BTN_SETTINGS_RESTART_LAUNCHER" value="Restart launcher" onclick="chrome.runtime.reload();">
<!-- Save & Exit Buttons -->
<div class="DIV_settingsSave">
<input type="button" class="BTN_SAVE" id="BTN_SETTINGS_APPLY_CLOSE" onclick="APP.design.saveSettings();" value="Apply & Close">
<input type="button" class="BTN_SAVE" id="BTN_SETTINGS_CLOSE" onclick="APP.design.toggleSettings(!0);" value="Close">
</div>
</div>
<!-- Save & Exit Buttons -->
<div class="DIV_settingsSave">
<input type="button" class="BTN_SAVE" id="BTN_SETTINGS_APPLY_CLOSE" onclick="APP.design.saveSettings();" value="Apply & Close">
<input type="button" class="BTN_SAVE" id="BTN_SETTINGS_CLOSE" onclick="APP.design.toggleSettings(!0);" value="Close">
</div>
</div>
</div>
<!-- Top Menu -->
<div class="DIV_ACTIONS" id="DIV_ACTIONS">
@ -233,6 +277,7 @@
<input type="button" class="BTN_actions" id="BTN_REFRESH" onclick="APP.gameList.load();" value="Refresh game list">
<input type="button" class="BTN_actions" id="BTN_SETTINGS" onclick="APP.design.toggleSettings();" value="Settings">
<input type="button" class="BTN_actions" id="BTN_CLEAR_LOG" onclick="APP.clearLog();" value="Clear Log">
<input type="button" class="BTN_actions" id="BTN_UPDATE_FPPS4" onclick="APP.emuManager.update.check();" value="Update fpPS4" disabled="disabled">
<input type="button" class="BTN_actions" id="BTN_ABOUT" onclick="APP.about();" value="About">
<input type="button" class="BTN_STOP" id="BTN_KILL" onclick="APP.emuManager.killEmu();" disabled="disabled" value="Stop fpPS4">
@ -358,10 +403,11 @@
<script type="text/javascript" src="js/paramSfoParser.js"></script>
<script type="text/javascript" src="js/gamelist.js"></script>
<script type="text/javascript" src="js/settings.js"></script>
<script type="text/javascript" src="js/design.js"></script>
<script type="text/javascript" src="js/updateEmu.js"></script>
<script type="text/javascript" src="js/emumanager.js"></script>
<script type="text/javascript" src="js/design.js"></script>
<script type="text/javascript" src="js/main.js"></script>
</div>
</body>

View file

@ -347,10 +347,7 @@ temp_DESIGN = {
// Check if emu is present before allowing to run
if (APP.fs.existsSync(APP.settings.data.emuPath) === !0 && APP.gameList.selectedGame !== ''){
var btnRun = '',
btnLog = '',
btnRefresh = '',
btnSettings = '',
var btnDisabled = '',
btnKill = 'disabled',
emuRunPath = 'block',
bgBlur = APP.settings.data.bgListBlur,
@ -364,10 +361,7 @@ temp_DESIGN = {
if (APP.emuManager.emuRunning === !0){
btnKill = '';
btnLog = 'disabled';
btnRun = 'disabled';
btnRefresh = 'disabled';
btnSettings = 'disabled';
btnDisabled = 'disabled';
bgBlur = APP.settings.data.bgEmuBlur;
showGuiMetadata = {'display': 'flex'};
bgOpacity = APP.settings.data.bgEmuOpacity;
@ -391,12 +385,13 @@ temp_DESIGN = {
TMS.css('DIV_GAMELIST_BG', {'filter': 'blur(' + bgBlur + 'px) opacity(' + bgOpacity + ')'});
// Update Buttons
document.getElementById('BTN_RUN').disabled = btnRun;
document.getElementById('BTN_KILL').disabled = btnKill;
document.getElementById('BTN_CLEAR_LOG').disabled = btnLog;
document.getElementById('BTN_REFRESH').disabled = btnRefresh;
document.getElementById('BTN_SETTINGS').disabled = btnSettings;
document.getElementById('INPUT_gameListSearch').disabled = btnRun;
document.getElementById('BTN_RUN').disabled = btnDisabled;
document.getElementById('BTN_REFRESH').disabled = btnDisabled;
document.getElementById('BTN_SETTINGS').disabled = btnDisabled;
document.getElementById('BTN_CLEAR_LOG').disabled = btnDisabled;
document.getElementById('BTN_UPDATE_FPPS4').disabled = btnDisabled;
document.getElementById('INPUT_gameListSearch').disabled = btnDisabled;
} else {
@ -661,6 +656,7 @@ temp_DESIGN = {
document.getElementById('CHECKBOX_settingsShowBgOnGameEntry').checked = JSON.parse(cSettings.showBgOnEntry);
document.getElementById('CHECKBOX_settingsShowGameMetadata').checked = JSON.parse(cSettings.showGuiMetadata);
document.getElementById('CHECKBOX_settingsRemoveProjectGp4').checked = JSON.parse(cSettings.removeProjectGp4);
document.getElementById('CHECKBOX_settingsEnableFpps4Updates').checked = JSON.parse(cSettings.enableEmuUpdates);
document.getElementById('CHECKBOX_settingsGameSearchCaseSensitive').checked = JSON.parse(cSettings.searchCaseSensitive);
document.getElementById('CHECKBOX_settingsExternalWindowPrompt').checked = JSON.parse(cSettings.logExternalWindowPrompt);
@ -675,6 +671,9 @@ temp_DESIGN = {
document.getElementById('RANGE_settingsEmuRunningBgOpacity').value = cSettings.bgEmuOpacity;
document.getElementById('RANGE_settingsGridIconBorderRadius').value = cSettings.gridBorderRadius;
// Text
document.getElementById('INPUT_settingsUpdateFpps4Branch').value = cSettings.fpps4BranchName;
// Fix for grid size / border-radius
if (cSettings.gridIconSize > 512){
cSettings.gridIconSize = 512;
@ -735,6 +734,7 @@ temp_DESIGN = {
APP.settings.data.showPathRunning = JSON.parse(document.getElementById('CHECKBOX_settingsShowExecRunning').checked);
APP.settings.data.showGuiMetadata = JSON.parse(document.getElementById('CHECKBOX_settingsShowGameMetadata').checked);
APP.settings.data.removeProjectGp4 = JSON.parse(document.getElementById('CHECKBOX_settingsRemoveProjectGp4').checked);
APP.settings.data.enableEmuUpdates = JSON.parse(document.getElementById('CHECKBOX_settingsEnableFpps4Updates').checked);
APP.settings.data.searchCaseSensitive = JSON.parse(document.getElementById('CHECKBOX_settingsGameSearchCaseSensitive').checked);
APP.settings.data.logExternalWindowPrompt = JSON.parse(document.getElementById('CHECKBOX_settingsExternalWindowPrompt').checked);
@ -749,6 +749,9 @@ temp_DESIGN = {
APP.settings.data.bgEmuOpacity = parseFloat(document.getElementById('RANGE_settingsEmuRunningBgOpacity').value);
APP.settings.data.gridBorderRadius = parseFloat(document.getElementById('RANGE_settingsGridIconBorderRadius').value);
// Text
APP.settings.data.fpps4BranchName = document.getElementById('INPUT_settingsUpdateFpps4Branch').value;
/*
End
*/
@ -761,6 +764,44 @@ temp_DESIGN = {
APP.design.toggleSettings(!0);
}
},
/*
Updater
*/
// Display / Hide GUI
toggleEmuUpdateGUI: function(mode){
var cssData;
switch (mode) {
case 'show':
cssData = {'display': 'flex'};
break;
case 'hide':
cssData = {'display': 'none'};
break;
default:
cssData = {'display': 'none'};
break;
}
// Reset progressbar status
TMS.css('DIV_PROGRESSBAR_UPDATE_FPPS4', {'width': '0%'});
// Update display mode
TMS.css('DIV_FPPS4_UPDATER', cssData);
},
// Update status
updateProgressbarStatus: function(percentage, status){
TMS.css('DIV_PROGRESSBAR_UPDATE_FPPS4', {'width': percentage + '%'});
document.getElementById('LABEL_FPPS4_UPDATER_STATUS').innerHTML = status;
}
}

View file

@ -4,7 +4,7 @@
emumanager.js
This file contains all functions / variables about running main project
executable and game module checks.
executable, game module checks and updating fpPS4 executable.
******************************************************************************
*/
@ -13,6 +13,9 @@ temp_EMUMANAGER = {
// Emulator is running
emuRunning: !1,
// Update functions
update: temp_EMU_UPDATE,
// Run emu
runGame: function(){
@ -85,7 +88,7 @@ temp_EMUMANAGER = {
}
// Kill process and set emu running var to false
APP.getProcessInfo('fpPS4.exe', function(pData){
APP.getProcessInfo(APP.path.parse(APP.settings.data.emuPath).base, function(pData){
process.kill(pData.th32ProcessID);
this.emuRunning = !1;
});

View file

@ -56,7 +56,7 @@ temp_LANGUAGE = {
"logWindowTitle": "Running fpPS4",
"killEmuStatus": "Main process closed - close fpPS4 log window to go back",
"logCleared": "INFO - Previous log was cleared!\n ",
"about": "fpPS4 Temmie\'s Launcher - Version: %VARIABLE_0%\nCreated by TemmieHeartz\n(https://twitter.com/themitosan)\n\nfpPS4 is created by red-prig\n(https://github.com/red-prig/fpPS4)\n\nPlugin memoryjs is created by Rob--\n(https://github.com/rob--/memoryjs)\n\nSVG icons were obtained from https://www.svgrepo.com/",
"about": "fpPS4 Temmie\'s Launcher - Version: %VARIABLE_0%\nCreated by TemmieHeartz\n(https://twitter.com/themitosan)\n\nfpPS4 is created by red-prig\n(https://github.com/red-prig/fpPS4)\n\nPlugin memoryjs is created by Rob--\n(https://github.com/rob--/memoryjs)\n\nPlugin node-stream-zip is created by antelle\n(https://github.com/antelle/node-stream-zip)\n\nSVG icons were obtained from https://www.svgrepo.com/",
"mainLog": 'fpPS4 Temmie\'s Launcher - Version: %VARIABLE_0%\nRunning on nw.js (node-webkit) version %VARIABLE_1% [%VARIABLE_2%]',
"settingsErrorCreatePath": "ERROR - Unable to create path!\n(%VARIABLE_0%)\n%VARIABLE_1%",
"settingsErrorfpPS4NotFound": "ERROR - Unable to locate main fpPS4 executable!\nMake sure to select it in Settings or insert it in \"Emu\" folder and click OK.",
@ -95,7 +95,19 @@ temp_LANGUAGE = {
"gameListVersion": "Version",
"selectGameLoadPatchErrorParamSfo": "ERROR - Unable to read PARAM.SFO from this patch!\n%VARIABLE_0%",
"path": "Path",
"gamelistGamePath404": "ERROR - Unable to find selected app / game path!\n%VARIABLE_0%"
"gamelistGamePath404": "ERROR - Unable to find selected app / game path!\n%VARIABLE_0%",
"updateEmuFetchActionsError": "ERROR - Unable to fetch GitHub actions data!",
"updateEmuIsLatestVersion": "INFO - You are using the latest fpPS4 version available!\nCommit ID (SHA): %VARIABLE_0%",
"updateEmuShaAvailable": "INFO - A new update is available!\n\nLocal version: %VARIABLE_0%\nNew version: %VARIABLE_1%\n\nDo you want to update?",
"updateEmuShaUnavailable": "INFO - This Launcher detected that you didn\'t updated fpPS4 yet (or fpPS4 executable was not found!)\n\nYou can fix this by running fpPS4 updater process.\nDo you want to proceed?",
"updateEmuDownloadFailed": "ERROR - Unable to download fpPS4 update!\nResponse status: %VARIABLE_0% - OK: %VARIABLE_1%",
"updateEmuProcessComplete": "INFO - Update complete!\nNew fpPS4 version (commit id / sha): %VARIABLE_0%",
"updateEmu-1-4": "Downloading fpPS4 update (<label class=\"LABEL_monospace\">%VARIABLE_0%</label>)",
"updateEmu-2-4": "Extracting update",
"updateEmu-3-4": "Removing leftover files",
"updateEmu-4-4": "Update complete!",
"settingsLogEmuSha": "INFO - fpPS4 version: (%VARIABLE_0%)"
},
@ -108,4 +120,4 @@ temp_LANGUAGE = {
// Selected lang
selected: {}
}
}

View file

@ -14,9 +14,11 @@ var APP = {
fs: require('fs'),
win: nw.Window.get(),
path: require('path'),
https: require('https'),
childProcess: require('child_process'),
packageJson: require('../package.json'),
memoryjs: require('App/node_modules/memoryjs'),
streamZip: require('App/node_modules/node-stream-zip'),
// App version
title: '',
@ -257,6 +259,7 @@ delete temp_SETTINGS;
delete temp_GAMELIST;
delete temp_LANGUAGE;
delete temp_EMUMANAGER;
delete temp_EMU_UPDATE;
delete temp_FILEMANAGER;
delete temp_PARAMSFO_PARSER;
@ -297,6 +300,9 @@ window.onload = function(){
// Remove all previous imported modules
APP.gameList.removeAllModules();
// Check if fpPS4 have any update (silenty)
APP.emuManager.update.check({silent: !0});
} catch (err) {
// Log error

View file

@ -45,7 +45,7 @@ temp_SETTINGS = {
// Game list
showBgOnEntry: !0,
showPathEntry: !0,
gameListMode: 'normal',
gameListMode: 'compact',
// Emu running
showPathRunning: !0,
@ -66,7 +66,14 @@ temp_SETTINGS = {
// (Grid)
gridIconSize: 116,
gridBorderRadius: 8,
/*
fpPS4 Update
*/
enableEmuUpdates: !0,
latestCommitSha: '',
fpps4BranchName: 'trunk',
/*
Debug
*/
@ -210,11 +217,16 @@ temp_SETTINGS = {
if (this.data.emuPath === '' || APP.fs.existsSync(this.data.emuPath) === !1){
APP.settings.data.emuPath = mainPath + '/Emu/fpPS4.exe';
}
// If fpPS4 is not found, reset latest commit sha and request update
if (APP.fs.existsSync(this.data.emuPath) !== !0){
this.data.latestCommitSha = '';
APP.emuManager.update.check();
}
logMessage = APP.lang.getVariable('settingsErrorfpPS4NotFound');
window.alert(logMessage);
// If latestCommitSha isn't empty, log it
if (this.data.latestCommitSha !== ''){
APP.log(APP.lang.getVariable('settingsLogEmuSha', [APP.settings.data.latestCommitSha.slice(0, 7)]));
}
// Log message

260
App/js/updateEmu.js Normal file
View file

@ -0,0 +1,260 @@
/*
******************************************************************************
fpPS4 Temmie's Launcher
updateEmu.js
This file is responsible for feching latest data from red-prig fpPS4 actions
and update.
******************************************************************************
*/
temp_EMU_UPDATE = {
// GitHub actions link
githubLink: 'https://api.github.com/repos/red-prig/fpPS4/actions/artifacts',
/*
Fetch latest github actions
options: Object
jsonData: [Object] GitHub actions list (json)
forceUpdate: [Boolean] Skip checks and download latest version available
silent: [Boolean] Don't show message if user already have latest version
*/
check: function(options){
if (options === void 0){
options = {
forceUpdate: !1,
silent: !1
};
}
// If Emu updates is available, has internet and fpPS4 isn't running
if (APP.settings.data.enableEmuUpdates === !0 && navigator.onLine === !0 && APP.emuManager.emuRunning === !1){
// Disable check for updates emu
document.getElementById('BTN_UPDATE_FPPS4').disabled = 'disabled';
// Get error message
const errMsg = APP.lang.getVariable('updateEmuFetchActionsError');
// Fetch data
fetch(this.githubLink).then(function(resp){
// Check if fetch status is ok
if (resp.ok === !0){
resp.json().then(function(jsonData){
options['jsonData'] = jsonData;
APP.emuManager.update.processActions(options);
});
} else {
// If launcher can't get data, log error and reset button
APP.log(errMsg);
console.error(errMsg);
document.getElementById('BTN_UPDATE_FPPS4').disabled = '';
}
});
}
},
// Process github actions data
processActions: function(options){
const data = options.jsonData;
if (data !== void 0){
var conf, updateData, updateId,
latestSha = APP.settings.data.latestCommitSha,
accpetableBranch = APP.settings.data.fpps4BranchName;
// Read latest actions
for (var i = 0; i < Object.keys(data.artifacts).length; i++){
// Shortcut
const workflow = data.artifacts[i].workflow_run;
// If user already updated and have latest changes
if (workflow.head_sha === latestSha){
updateId = i;
break;
}
// Check if branch is the same selected on settings, repo is from red-prig and if lash head_sha is different
if (workflow.head_branch === accpetableBranch && workflow.head_sha !== latestSha){
updateId = i;
break;
}
}
// Enable fpPS4 updates button again
document.getElementById('BTN_UPDATE_FPPS4').disabled = '';
// Check if there's matching updates
if (updateId !== void 0){
// Set latest valid commit as new update
updateData = data.artifacts[updateId];
// Set user message
var canPrompt = !0,
msgMode = 'confirm',
msgData = APP.lang.getVariable('updateEmuShaAvailable', [latestSha.slice(0, 7), updateData.workflow_run.head_sha.slice(0, 7)]);
// If user didn't updated yet using launcher
if (latestSha === ''){
msgData = APP.lang.getVariable('updateEmuShaUnavailable');
}
// If local version is the latest
if (latestSha === updateData.workflow_run.head_sha){
// Update prompt
msgMode = 'alert';
msgData = APP.lang.getVariable('updateEmuIsLatestVersion', [latestSha.slice(0, 7)]);
// If silent is active
if (options.silent === !0){
canPrompt = !1;
}
}
// Call popup
if (canPrompt === !0 && options.forceUpdate === !1){
conf = window[msgMode](msgData);
}
// If anren't latest version and user confirms
if (msgMode === 'confirm' && conf === !0 || options.forceUpdate === !0){
this.getZipFile(updateData);
}
}
}
},
/*
Get zip from specific github action run
Since fpPS4 actions require being logged to download, nightly.links service will be used instead.
https://nightly.link
*/
getZipFile: function(actionsData){
// If (by some reason) fpPS4 is running - close it!
APP.emuManager.killEmu();
// Display GUI
APP.design.toggleEmuUpdateGUI('show');
APP.design.updateProgressbarStatus(25, APP.lang.getVariable('updateEmu-1-4', [actionsData.workflow_run.head_sha.slice(0, 7)]));
// Start download
fetch('https://nightly.link/red-prig/fpPS4/actions/runs/' + actionsData.workflow_run.id + '/fpPS4.zip').then(function(resp){
if (resp.ok === !0){
APP.https.get(resp.url, function(data){
const fPath = APP.settings.data.nwPath + '/Emu/fpPS4.zip',
writeStream = APP.fs.createWriteStream(fPath);
data.pipe(writeStream);
writeStream.on('finish', function(){
// Close writestream
writeStream.close();
// Extract emu executable
APP.emuManager.update.extractZip({
newExecName: 'fpPS4_' + actionsData.workflow_run.head_sha.slice(0, 7) + '.exe',
actions: actionsData,
path: fPath
});
});
});
} else {
console.error(resp);
APP.log(APP.lang.getVariable('updateEmuDownloadFailed', [resp.status, resp.ok]));
}
});
},
// Extract zip
extractZip: function(data){
// Update status
APP.design.updateProgressbarStatus(50, APP.lang.getVariable('updateEmu-2-4'));
// Open and extract zip file
const updateFile = new APP.streamZip.async({ file: data.path });
updateFile.extract('fpPS4.exe', APP.path.parse(data.path).dir + '/' + data.newExecName, function(err){
if (err){
console.error(err);
}
}).then(function(){
// Close zip
updateFile.close();
// Finish process
APP.emuManager.update.finish(data);
});
},
// Finish process
finish: function(data){
// Update status
APP.design.updateProgressbarStatus(75, APP.lang.getVariable('updateEmu-3-4'));
// Remove download file
APP.fs.unlinkSync(data.path);
// Update settings
APP.settings.data.latestCommitSha = data.actions.workflow_run.head_sha;
APP.settings.data.emuPath = APP.path.parse(data.path).dir + '/' + data.newExecName;
// Save settings
APP.settings.save();
// Display success message
const processCompleteMsg = APP.lang.getVariable('updateEmuProcessComplete', [data.actions.workflow_run.head_sha.slice(0, 7)]);
APP.design.updateProgressbarStatus(100, APP.lang.getVariable('updateEmu-4-4'));
// Timing out just to update GUI
setTimeout(function(){
APP.log(processCompleteMsg);
window.alert(processCompleteMsg);
// Hide update gui
APP.design.toggleEmuUpdateGUI('hide');
}, 410);
}
}

44
App/node_modules/node-stream-zip/LICENSE generated vendored Normal file
View file

@ -0,0 +1,44 @@
Copyright (c) 2021 Antelle https://github.com/antelle
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
== dependency license: adm-zip ==
Copyright (c) 2012 Another-D-Mention Software and other contributors,
http://www.another-d-mention.ro/
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

224
App/node_modules/node-stream-zip/README.md generated vendored Normal file
View file

@ -0,0 +1,224 @@
# node-stream-zip ![CI Checks](https://github.com/antelle/node-stream-zip/workflows/CI%20Checks/badge.svg)
node.js library for reading and extraction of ZIP archives.
Features:
- it never loads entire archive into memory, everything is read by chunks
- large archives support
- all operations are non-blocking, no sync i/o
- fast initialization
- no dependencies, no binary addons
- decompression with built-in zlib module
- deflate, sfx, macosx/windows built-in archives
- ZIP64 support
## Installation
```sh
npm i node-stream-zip
```
## Usage
There are two APIs provided:
1. [promise-based / async](#async-api)
2. [callbacks](#callback-api)
It's recommended to use the new, promise API, however the legacy callback API
may be more flexible for certain operations.
### Async API
Open a zip file
```javascript
const StreamZip = require('node-stream-zip');
const zip = new StreamZip.async({ file: 'archive.zip' });
```
Stream one entry to stdout
```javascript
const stm = await zip.stream('path/inside/zip.txt');
stm.pipe(process.stdout);
stm.on('end', () => zip.close());
```
Read a file as buffer
```javascript
const data = await zip.entryData('path/inside/zip.txt');
await zip.close();
```
Extract one file to disk
```javascript
await zip.extract('path/inside/zip.txt', './extracted.txt');
await zip.close();
```
List entries
```javascript
const entriesCount = await zip.entriesCount;
console.log(`Entries read: ${entriesCount}`);
const entries = await zip.entries();
for (const entry of Object.values(entries)) {
const desc = entry.isDirectory ? 'directory' : `${entry.size} bytes`;
console.log(`Entry ${entry.name}: ${desc}`);
}
// Do not forget to close the file once you're done
await zip.close();
```
Extract a folder from archive to disk
```javascript
fs.mkdirSync('extracted');
await zip.extract('path/inside/zip/', './extracted');
await zip.close();
```
Extract everything
```javascript
fs.mkdirSync('extracted');
const count = await zip.extract(null, './extracted');
console.log(`Extracted ${count} entries`);
await zip.close();
```
When extracting a folder, you can listen to `extract` event
```javascript
zip.on('extract', (entry, file) => {
console.log(`Extracted ${entry.name} to ${file}`);
});
```
`entry` event is generated for every entry during loading
```javascript
zip.on('entry', entry => {
// you can already stream this entry,
// without waiting until all entry descriptions are read (suitable for very large archives)
console.log(`Read entry ${entry.name}`);
});
```
### Callback API
Open a zip file
```javascript
const StreamZip = require('node-stream-zip');
const zip = new StreamZip({ file: 'archive.zip' });
// Handle errors
zip.on('error', err => { /*...*/ });
```
List entries
```javascript
zip.on('ready', () => {
console.log('Entries read: ' + zip.entriesCount);
for (const entry of Object.values(zip.entries())) {
const desc = entry.isDirectory ? 'directory' : `${entry.size} bytes`;
console.log(`Entry ${entry.name}: ${desc}`);
}
// Do not forget to close the file once you're done
zip.close();
});
```
Stream one entry to stdout
```javascript
zip.on('ready', () => {
zip.stream('path/inside/zip.txt', (err, stm) => {
stm.pipe(process.stdout);
stm.on('end', () => zip.close());
});
});
```
Extract one file to disk
```javascript
zip.on('ready', () => {
zip.extract('path/inside/zip.txt', './extracted.txt', err => {
console.log(err ? 'Extract error' : 'Extracted');
zip.close();
});
});
```
Extract a folder from archive to disk
```javascript
zip.on('ready', () => {
fs.mkdirSync('extracted');
zip.extract('path/inside/zip/', './extracted', err => {
console.log(err ? 'Extract error' : 'Extracted');
zip.close();
});
});
```
Extract everything
```javascript
zip.on('ready', () => {
fs.mkdirSync('extracted');
zip.extract(null, './extracted', (err, count) => {
console.log(err ? 'Extract error' : `Extracted ${count} entries`);
zip.close();
});
});
```
Read a file as buffer in sync way
```javascript
zip.on('ready', () => {
const data = zip.entryDataSync('path/inside/zip.txt');
zip.close();
});
```
When extracting a folder, you can listen to `extract` event
```javascript
zip.on('extract', (entry, file) => {
console.log(`Extracted ${entry.name} to ${file}`);
});
```
`entry` event is generated for every entry during loading
```javascript
zip.on('entry', entry => {
// you can already stream this entry,
// without waiting until all entry descriptions are read (suitable for very large archives)
console.log(`Read entry ${entry.name}`);
});
```
## Options
You can pass these options to the constructor
- `storeEntries: true` - you will be able to work with entries inside zip archive, otherwise the only way to access them is `entry` event
- `skipEntryNameValidation: true` - by default, entry name is checked for malicious characters, like `../` or `c:\123`, pass this flag to disable validation errors
## Methods
- `zip.entries()` - get all entries description
- `zip.entry(name)` - get entry description by name
- `zip.stream(entry, function(err, stm) { })` - get entry data reader stream
- `zip.entryDataSync(entry)` - get entry data in sync way
- `zip.close()` - cleanup after all entries have been read, streamed, extracted, and you don't need the archive
## Building
The project doesn't require building. To run unit tests with [nodeunit](https://github.com/caolan/nodeunit):
```sh
npm test
```
## Known issues
- [utf8](https://github.com/rubyzip/rubyzip/wiki/Files-with-non-ascii-filenames) file names
## Out of scope
- AES encrypted files: the library will throw an error if you try to open it
## Contributors
ZIP parsing code has been partially forked from [cthackers/adm-zip](https://github.com/cthackers/adm-zip) (MIT license).

199
App/node_modules/node-stream-zip/node_stream_zip.d.ts generated vendored Normal file
View file

@ -0,0 +1,199 @@
/// <reference types="node" />
declare namespace StreamZip {
interface StreamZipOptions {
/**
* File to read
* @default undefined
*/
file?: string;
/**
* Alternatively, you can pass fd here
* @default undefined
*/
fd?: number;
/**
* You will be able to work with entries inside zip archive,
* otherwise the only way to access them is entry event
* @default true
*/
storeEntries?: boolean;
/**
* By default, entry name is checked for malicious characters, like ../ or c:\123,
* pass this flag to disable validation error
* @default false
*/
skipEntryNameValidation?: boolean;
/**
* Filesystem read chunk size
* @default automatic based on file size
*/
chunkSize?: number;
/**
* Encoding used to decode file names
* @default UTF8
*/
nameEncoding?: string;
}
interface ZipEntry {
/**
* file name
*/
name: string;
/**
* true if it's a directory entry
*/
isDirectory: boolean;
/**
* true if it's a file entry, see also isDirectory
*/
isFile: boolean;
/**
* file comment
*/
comment: string;
/**
* if the file is encrypted
*/
encrypted: boolean;
/**
* version made by
*/
verMade: number;
/**
* version needed to extract
*/
version: number;
/**
* encrypt, decrypt flags
*/
flags: number;
/**
* compression method
*/
method: number;
/**
* modification time
*/
time: number;
/**
* uncompressed file crc-32 value
*/
crc: number;
/**
* compressed size
*/
compressedSize: number;
/**
* uncompressed size
*/
size: number;
/**
* volume number start
*/
diskStart: number;
/**
* internal file attributes
*/
inattr: number;
/**
* external file attributes
*/
attr: number;
/**
* LOC header offset
*/
offset: number;
}
class StreamZipAsync {
constructor(config: StreamZipOptions);
entriesCount: Promise<number>;
comment: Promise<string>;
entry(name: string): Promise<ZipEntry | undefined>;
entries(): Promise<{ [name: string]: ZipEntry }>;
entryData(entry: string | ZipEntry): Promise<Buffer>;
stream(entry: string | ZipEntry): Promise<NodeJS.ReadableStream>;
extract(entry: string | ZipEntry | null, outPath: string): Promise<number | undefined>;
on(event: 'entry', handler: (entry: ZipEntry) => void): void;
on(event: 'extract', handler: (entry: ZipEntry, outPath: string) => void): void;
close(): Promise<void>;
}
}
type StreamZipOptions = StreamZip.StreamZipOptions;
type ZipEntry = StreamZip.ZipEntry;
declare class StreamZip {
constructor(config: StreamZipOptions);
/**
* number of entries in the archive
*/
entriesCount: number;
/**
* archive comment
*/
comment: string;
on(event: 'error', handler: (error: any) => void): void;
on(event: 'entry', handler: (entry: ZipEntry) => void): void;
on(event: 'ready', handler: () => void): void;
on(event: 'extract', handler: (entry: ZipEntry, outPath: string) => void): void;
entry(name: string): ZipEntry | undefined;
entries(): { [name: string]: ZipEntry };
stream(
entry: string | ZipEntry,
callback: (err: any | null, stream?: NodeJS.ReadableStream) => void
): void;
entryDataSync(entry: string | ZipEntry): Buffer;
openEntry(
entry: string | ZipEntry,
callback: (err: any | null, entry?: ZipEntry) => void,
sync: boolean
): void;
extract(
entry: string | ZipEntry | null,
outPath: string,
callback: (err?: any, res?: number) => void
): void;
close(callback?: (err?: any) => void): void;
static async: typeof StreamZip.StreamZipAsync;
}
export = StreamZip;

1210
App/node_modules/node-stream-zip/node_stream_zip.js generated vendored Normal file

File diff suppressed because it is too large Load diff

47
App/node_modules/node-stream-zip/package.json generated vendored Normal file
View file

@ -0,0 +1,47 @@
{
"name": "node-stream-zip",
"version": "1.15.0",
"description": "node.js library for reading and extraction of ZIP archives",
"keywords": [
"zip",
"archive",
"unzip",
"stream"
],
"homepage": "https://github.com/antelle/node-stream-zip",
"author": "Antelle <antelle.net@gmail.com> (https://github.com/antelle)",
"bugs": {
"email": "antelle.net@gmail.com",
"url": "https://github.com/antelle/node-stream-zip/issues"
},
"license": "MIT",
"files": [
"LICENSE",
"node_stream_zip.js",
"node_stream_zip.d.ts"
],
"scripts": {
"lint": "eslint node_stream_zip.js test/tests.js",
"check-types": "tsc node_stream_zip.d.ts",
"test": "nodeunit test/tests.js"
},
"main": "node_stream_zip.js",
"types": "node_stream_zip.d.ts",
"repository": {
"type": "git",
"url": "https://github.com/antelle/node-stream-zip.git"
},
"engines": {
"node": ">=0.12.0"
},
"devDependencies": {
"@types/node": "^14.14.6",
"eslint": "^7.19.0",
"nodeunit": "^0.11.3",
"prettier": "^2.2.1"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/antelle"
}
}

View file

@ -6,4 +6,4 @@ I would like to thank everyone who contributed to the translation of this projec
- French: [Mizmalik](https://github.com/Mizmalik)
- Chinese (Simplified): [nini22P](https://github.com/nini22P)
- Russian: ThatSameGuy _(Revisions by [gandalfthewhite](https://github.com/gandalfthewhite19890404))_
- Italian: [Dan Adrian Radut (Aka. B8nee)](https://github.com/B8nee)
- Italian: [Dan Adrian Radut (Aka. B8nee)](https://github.com/B8nee)

View file

@ -8,7 +8,7 @@
"logWindowTitle": "Exécution de fpPS4",
"killEmuStatus": "Le processus principal a été fermé - fermez la fenêtre des logs pour continuer",
"logCleared": "INFO - La liste des journaux a été effacée!\n ",
"about": "fpPS4 Lanceur de Temmie - Version: %VARIABLE_0%\nCréé par TemmieHeartz\n(https://twitter.com/themitosan)\n\nfpPS4 a été créé/développé par red-prig\n(https://github.com/red -prig/fpPS4)\n\nLe plugin Memoryjs a été créé/développé par Rob--\n(https://github.com/rob--/memoryjs)\n\nLes icônes SVG ont été obtenues à partir de\nhttps://www.svgrepo.com/",
"about": "",
"mainLog": "Lanceur de fpPS4 Temmie - Version: %VARIABLE_0%\nUtilisation de nw.js (node-webkit) version %VARIABLE_1% [%VARIABLE_2%]",
"settingsErrorCreatePath": "ERREUR - Impossible de créer le dossier!\n(%VARIABLE_0%)\n%VARIABLE_1%",
"settingsErrorfpPS4NotFound": "ERREUR - Impossible de trouver l'exécutable fpPS4!\nSélectionnez l'exécutable dans les paramètres ou placez-le dans le dossier \"Emu\" et cliquez sur OK.",
@ -47,7 +47,18 @@
"gameListVersion": "Version",
"selectGameLoadPatchErrorParamSfo": "ERREUR - Impossible de charger PARAM.SFO de ce correctif!\n%VARIABLE_0%",
"path": "Chemin",
"gamelistGamePath404": ""
"gamelistGamePath404": "",
"updateEmuFetchActionsError": "",
"updateEmuIsLatestVersion": "",
"updateEmuShaAvailable": "",
"updateEmuShaUnavailable": "",
"updateEmuDownloadFailed": "",
"updateEmuProcessComplete": "",
"updateEmu-1-4": "",
"updateEmu-2-4": "",
"updateEmu-3-4": "",
"updateEmu-4-4": "",
"settingsLogEmuSha": ""
},
"input_text": {
@ -95,7 +106,10 @@
"LABEL_FPPS4_OPTIONS_LAUNCHER_OPTIONS": "Options du lanceur",
"LABEL_FPPS4_OPTIONS_HACKS": "Hacks",
"LABEL_SETTINGS_SHOW_METADATA_GUI": "",
"LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG": ""
"LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG": "",
"DIV_SETTINGS_FPPS4_UPDATER": "",
"LABEL_SETTINGS_ENABLE_LAUNCHER_FPPS4_UPDATES": "",
"LABEL_SETTINGS_FPPS4_UPDATE_BRANCH": ""
},
@ -131,7 +145,9 @@
"BTN_FPPS4_OPTIONS_RESET_SETTINGS": "Réinitialiser les options",
"BTN_launcherOptionsExportMetadata": "Exporter les métadonnées",
"BTN_RUN": "Démarrer fpPS4",
"BTN_SETTINGS_RESTART_LAUNCHER": ""
"BTN_SETTINGS_RESTART_LAUNCHER": "",
"BTN_UPDATE_FPPS4": "",
"BTN_SETTINGS_FORCE_FPPS4_UPDATE": ""
}
}

View file

@ -8,7 +8,7 @@
"logWindowTitle": "Eseguendo fpPS4",
"killEmuStatus": "Il processo principale è stato chiuso: chiudi la finestra del log per continuare",
"logCleared": "INFO - L'elenco dei log è stato cancellato!\n",
"about": "fpPS4 Temmie's Launcher - Versione: %VARIABLE_0%\nCreato da TemmieHeartz\n(https://twitter.com/themitosan)\n\nfpPS4 è stato creato/sviluppato da red-prig\n(https://github.com/red-prig/fpPS4)\n\nIl plugin Memoryjs è stato creato/sviluppato da Rob--\n(https://github.com/rob--/memoryjs)\n\nLe icone SVG sono state ottenute da https://www.svgrepo.com/",
"about": "",
"mainLog": "fpPS4 Temmie's Launcher - Versione: %VARIABLE_0%\nUsando nw.js (node-webkit) versione %VARIABLE_1% [%VARIABLE_2%]",
"settingsErrorCreatePath": "ERRORE - Impossibile creare la cartella!\n(%VARIABLE_0%)\n%VARIABLE_1%",
"settingsErrorfpPS4NotFound": "ERRORE - Impossibile trovare l'eseguibile fpPS4!\nSelezionare l'eseguibile nelle impostazioni o posizionarlo all'interno della cartella \"Emu\" e fare clic su ok.",
@ -47,7 +47,18 @@
"gameListVersion": "Versione",
"selectGameLoadPatchErrorParamSfo": "ERRORE - Impossibile caricare PARAM.SFO di questa patch!\n%VARIABLE_0%",
"path": "Percorso",
"gamelistGamePath404": "INFO - La cartella app/giochi selezionata non esiste!\n%VARIABLE_0%"
"gamelistGamePath404": "INFO - La cartella app/giochi selezionata non esiste!\n%VARIABLE_0%",
"updateEmuFetchActionsError": "",
"updateEmuIsLatestVersion": "",
"updateEmuShaAvailable": "",
"updateEmuShaUnavailable": "",
"updateEmuDownloadFailed": "",
"updateEmuProcessComplete": "",
"updateEmu-1-4": "",
"updateEmu-2-4": "",
"updateEmu-3-4": "",
"updateEmu-4-4": "",
"settingsLogEmuSha": ""
},
"input_text": {
@ -95,7 +106,10 @@
"LABEL_FPPS4_OPTIONS_LAUNCHER_OPTIONS": "Opzioni del launcher",
"LABEL_FPPS4_OPTIONS_HACKS": "Hacks",
"LABEL_SETTINGS_SHOW_METADATA_GUI": "Mostra l'icona e il nome dell'app/gioco durante l'emulazione",
"LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG": "<label class=\"LABEL_settingsExperimental\">SPERIMENTALE</label> Visualizza l'output dell'emulatore (<code>stdout</code> e <code>stderr</code>) nel log interno (premi F12 --> Console)"
"LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG": "<label class=\"LABEL_settingsExperimental\">SPERIMENTALE</label> Visualizza l'output dell'emulatore (<code>stdout</code> e <code>stderr</code>) nel log interno (premi F12 --> Console)",
"DIV_SETTINGS_FPPS4_UPDATER": "",
"LABEL_SETTINGS_ENABLE_LAUNCHER_FPPS4_UPDATES": "",
"LABEL_SETTINGS_FPPS4_UPDATE_BRANCH": ""
},
@ -131,7 +145,9 @@
"BTN_FPPS4_OPTIONS_RESET_SETTINGS": "Ripristina le impostazioni",
"BTN_launcherOptionsExportMetadata": "Esportare i metadati",
"BTN_RUN": "Avvia fpPS4",
"BTN_SETTINGS_RESTART_LAUNCHER": "Riavvia il launcher"
"BTN_SETTINGS_RESTART_LAUNCHER": "Riavvia il launcher",
"BTN_UPDATE_FPPS4": "",
"BTN_SETTINGS_FORCE_FPPS4_UPDATE": ""
}
}

View file

@ -8,7 +8,7 @@
"logWindowTitle": "Executando fpPS4",
"killEmuStatus": "Processo principal foi fechado - feche a janela do log para continuar",
"logCleared": "INFO - A lista de log foi limpa!\n ",
"about": "fpPS4 Temmie's Launcher - Versão: %VARIABLE_0%\nCriado por TemmieHeartz\n(https://twitter.com/themitosan)\n\nfpPS4 foi criado / desenvolvido por red-prig\n(https://github.com/red-prig/fpPS4)\n\nPlugin memoryjs foi criado / desenvolvido por Rob--\n(https://github.com/rob--/memoryjs)\n\nIcones SVG foram obtidos através do site https://www.svgrepo.com/",
"about": "fpPS4 Temmie's Launcher - Versão: %VARIABLE_0%\nCriado por TemmieHeartz\n(https://twitter.com/themitosan)\n\nfpPS4 foi criado / desenvolvido por red-prig\n(https://github.com/red-prig/fpPS4)\n\nPlugin memoryjs foi criado / desenvolvido por Rob--\n(https://github.com/rob--/memoryjs)\n\nPlugin node-stream-zip foi criado / desenvolvido por antelle\n(https://github.com/antelle/node-stream-zip)\n\nÍcones SVG foram obtidos através do site https://www.svgrepo.com/",
"mainLog": "fpPS4 Temmie's Launcher - Versão: %VARIABLE_0%\nUsando nw.js (node-webkit) versão %VARIABLE_1% [%VARIABLE_2%]",
"settingsErrorCreatePath": "ERRO - Não foi possível criar a pasta!\n(%VARIABLE_0%)\n%VARIABLE_1%",
"settingsErrorfpPS4NotFound": "ERRO - Não foi possível encontrar o executável do fpPS4!\nSelecione o executável nas configurações ou coloque ele dentro da pasta \"Emu\" e clique em ok.",
@ -47,7 +47,18 @@
"gameListVersion": "Versão",
"selectGameLoadPatchErrorParamSfo": "ERRO - Não foi possível carregar PARAM.SFO desse patch!\n%VARIABLE_0%",
"path": "Caminho",
"gamelistGamePath404": "INFO - A pasta de app / games selecionada não existe!\n%VARIABLE_0%"
"gamelistGamePath404": "INFO - A pasta de app / games selecionada não existe!\n%VARIABLE_0%",
"updateEmuFetchActionsError": "ERRO - Não foi possível obter informações do GitHub Actions!",
"updateEmuIsLatestVersion": "INFO - Você já está usando a versão mais recente!\nCommit ID (SHA): %VARIABLE_0%",
"updateEmuShaAvailable": "INFO - Uma nova atualização está disponível!\n\nVersão local: %VARIABLE_0%\nNova versão: %VARIABLE_1%\n\nVocê gostaria de atualizar?",
"updateEmuShaUnavailable": "INFO - O launcher detectou que nenhuma atualização foi feita\n(Ou o executável do fpPS4 não foi encontrado!)\n\nÉ possível corrigir esse problema usando o procedimento de atualização automática.\n\nVocê deseja prosseguir?",
"updateEmuDownloadFailed": "ERRO - Não foi possível baixar a atualização do fpPS4!\nStatus de resposta: %VARIABLE_0% - OK: %VARIABLE_1%",
"updateEmuProcessComplete": "INFO - Update concluído!\nNova versão (Commit ID / SHA): %VARIABLE_0%",
"updateEmu-1-4": "Baixando update do fpPS4 (<label class=\"LABEL_monospace\">%VARIABLE_0%</label>)",
"updateEmu-2-4": "Extraíndo update",
"updateEmu-3-4": "Removendo arquivos de sobra",
"updateEmu-4-4": "Update concluído!",
"settingsLogEmuSha": "INFO - Versão do fpPS4: (%VARIABLE_0%)"
},
"input_text": {
@ -95,7 +106,10 @@
"LABEL_FPPS4_OPTIONS_LAUNCHER_OPTIONS": "Opções do Launcher",
"LABEL_FPPS4_OPTIONS_HACKS": "Hacks",
"LABEL_SETTINGS_SHOW_METADATA_GUI": "Mostrar ícone e nome do app / game durante a emulação",
"LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG": "<label class=\"LABEL_settingsExperimental\">EXPERIMENTAL</label> Exibir output do emulador (<code>stdout</code> e <code>stderr</code>) no log interno (Aperte F12 --> Console)"
"LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG": "<label class=\"LABEL_settingsExperimental\">EXPERIMENTAL</label> Exibir output do emulador (<code>stdout</code> e <code>stderr</code>) no log interno (Aperte F12 --> Console)",
"DIV_SETTINGS_FPPS4_UPDATER": "Atualizações do fpPS4",
"LABEL_SETTINGS_ENABLE_LAUNCHER_FPPS4_UPDATES": "Habilitar atualizador do fpPS4",
"LABEL_SETTINGS_FPPS4_UPDATE_BRANCH": "Obter atualizações da branch"
},
@ -131,7 +145,9 @@
"BTN_FPPS4_OPTIONS_RESET_SETTINGS": "Resetar configurações",
"BTN_launcherOptionsExportMetadata": "Exportar metadados",
"BTN_RUN": "Iniciar fpPS4",
"BTN_SETTINGS_RESTART_LAUNCHER": "Reiniciar launcher"
"BTN_SETTINGS_RESTART_LAUNCHER": "Reiniciar launcher",
"BTN_UPDATE_FPPS4": "Atualizar fpPS4",
"BTN_SETTINGS_FORCE_FPPS4_UPDATE": "Fazer atualização forçada"
}
}

View file

@ -8,7 +8,7 @@
"logWindowTitle": "Запуск fpPS4",
"killEmuStatus": "Основной процесс был закрыт - закройте окно лога для продолжения работы",
"logCleared": "ИНФО - Список логов был очищен!\n ",
"about": "fpPS4 Temmie's Launcher - Версия: %VARIABLE_0%\nСоздатель - TemmieHeartz\n(https://twitter.com/themitosan)\n\nfpPS4, создатель - red-prig\n(https://github.com/red-prig/fpPS4)\n\nплагин memoryjs - разработан: Rob--\n(https://github.com/rob--/memoryjs)\n\nИконки SVG были получены с https://www.svgrepo.com/",
"about": "",
"mainLog": "fpPS4 Temmie's Launcher - Версия: %VARIABLE_0%\nИспользование nw.js (node-webkit) версия %VARIABLE_1% [%VARIABLE_2%]",
"settingsErrorCreatePath": "ОШИБКА - Папка не может быть создана!\n(%VARIABLE_0%)\n%VARIABLE_1%",
"settingsErrorfpPS4NotFound": "ОШИБКА - Не удалось найти исполняемый файл fpPS4!\nВыберите исполняемый файл в настройках или поместите его внутрь \"Emu\" и нажмите OK.",
@ -47,7 +47,18 @@
"gameListVersion": "Версия",
"selectGameLoadPatchErrorParamSfo": "ОШИБКА - Невозможно загрузить PARAM.SFO из этого патча!\n%VARIABLE_0%",
"path": "Путь",
"gamelistGamePath404": ""
"gamelistGamePath404": "",
"updateEmuFetchActionsError": "",
"updateEmuIsLatestVersion": "",
"updateEmuShaAvailable": "",
"updateEmuShaUnavailable": "",
"updateEmuDownloadFailed": "",
"updateEmuProcessComplete": "",
"updateEmu-1-4": "",
"updateEmu-2-4": "",
"updateEmu-3-4": "",
"updateEmu-4-4": "",
"settingsLogEmuSha": ""
},
"input_text": {
@ -95,7 +106,10 @@
"LABEL_FPPS4_OPTIONS_LAUNCHER_OPTIONS": "Параметры запуска",
"LABEL_FPPS4_OPTIONS_HACKS": "Хаки",
"LABEL_SETTINGS_SHOW_METADATA_GUI": "",
"LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG": ""
"LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG": "",
"DIV_SETTINGS_FPPS4_UPDATER": "",
"LABEL_SETTINGS_ENABLE_LAUNCHER_FPPS4_UPDATES": "",
"LABEL_SETTINGS_FPPS4_UPDATE_BRANCH": ""
},
@ -131,7 +145,9 @@
"BTN_FPPS4_OPTIONS_RESET_SETTINGS": "Сброс настроек",
"BTN_launcherOptionsExportMetadata": "Экспорт метаданных",
"BTN_RUN": "Запустить",
"BTN_SETTINGS_RESTART_LAUNCHER": ""
"BTN_SETTINGS_RESTART_LAUNCHER": "",
"BTN_UPDATE_FPPS4": "",
"BTN_SETTINGS_FORCE_FPPS4_UPDATE": ""
}
}

View file

@ -8,7 +8,7 @@
"logWindowTitle": "Running fpPS4",
"killEmuStatus": "主进程被关闭 - 关闭日志窗口以继续",
"logCleared": "INFO - 日志已被清除!\n ",
"about": "fpPS4 Temmie's Launcher - 版本号: %VARIABLE_0%\n由 TemmieHeartz 创建\n(https://twitter.com/themitosan)\n\nfpPS4 由 red-prig 创建\n(https://github.com/red-prig/fpPS4)\n\nmemoryjs 插件由 Rob-- 创建\n(https://github.com/rob--/memoryjs)\n\nSVG 图标来自 https://www.svgrepo.com/",
"about": "",
"mainLog": "fpPS4 Temmie's Launcher - 版本号: %VARIABLE_0%\n运行中的 nw.js (node-webkit) 版本号: %VARIABLE_1% [%VARIABLE_2%]",
"settingsErrorCreatePath": "ERROR - 无法创建文件夹!\n(%VARIABLE_0%)\n%VARIABLE_1%",
"settingsErrorfpPS4NotFound": "ERROR - 无法找到 fpPS4 的可执行文件!\n在设置中选择可执行文件或将其放在 \"Emu\" 文件夹中,然后点击确定。",
@ -47,7 +47,18 @@
"gameListVersion": "版本号",
"selectGameLoadPatchErrorParamSfo": "ERROR - 无法从这个补丁中加载 PARAM.SFO\n%VARIABLE_0%",
"path": "路径",
"gamelistGamePath404": ""
"gamelistGamePath404": "",
"updateEmuFetchActionsError": "",
"updateEmuIsLatestVersion": "",
"updateEmuShaAvailable": "",
"updateEmuShaUnavailable": "",
"updateEmuDownloadFailed": "",
"updateEmuProcessComplete": "",
"updateEmu-1-4": "",
"updateEmu-2-4": "",
"updateEmu-3-4": "",
"updateEmu-4-4": "",
"settingsLogEmuSha": ""
},
"input_text": {
@ -95,8 +106,10 @@
"LABEL_FPPS4_OPTIONS_LAUNCHER_OPTIONS": "启动器选项",
"LABEL_FPPS4_OPTIONS_HACKS": "Hacks",
"LABEL_SETTINGS_SHOW_METADATA_GUI": "在界面上显示图标和标题",
"LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG": "<label class=\"LABEL_settingsExperimental\">实验性功能</label> 在内部控制台显示 fpPS4 进程日志 (<code>stdout</code> 和 <code>stderr</code>) (按 F12 --> Console)"
"LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG": "<label class=\"LABEL_settingsExperimental\">实验性功能</label> 在内部控制台显示 fpPS4 进程日志 (<code>stdout</code> 和 <code>stderr</code>) (按 F12 --> Console)",
"DIV_SETTINGS_FPPS4_UPDATER": "",
"LABEL_SETTINGS_ENABLE_LAUNCHER_FPPS4_UPDATES": "",
"LABEL_SETTINGS_FPPS4_UPDATE_BRANCH": ""
},
@ -132,7 +145,9 @@
"BTN_FPPS4_OPTIONS_RESET_SETTINGS": "重置设置",
"BTN_launcherOptionsExportMetadata": "导出元数据",
"BTN_RUN": "运行 fpPS4",
"BTN_SETTINGS_RESTART_LAUNCHER": "重新启动启动器"
"BTN_SETTINGS_RESTART_LAUNCHER": "重新启动启动器",
"BTN_UPDATE_FPPS4": "",
"BTN_SETTINGS_FORCE_FPPS4_UPDATE": ""
}
}

View file

@ -17,6 +17,7 @@ If you dump your game using <a href="https://cdn.discordapp.com/attachments/1055
## External plugins used on this project
- <a href="https://github.com/rob--/memoryjs">memoryjs</a> - created by <a href="https://github.com/rob--">Rob-- </a>
- <a href="https://github.com/themitosan/TMS.js">TMS.js</a> by <a href="https://github.com/themitosan/">TemmieHeartz</a> <sup><i>(hi!)</i></sup>
- <a href="https://github.com/antelle/node-stream-zip">node-stream-zip</a> - created by <a href="https://github.com/antelle">antelle</a>
- <a href="https://github.com/temmieheartz/TMS.js">TMS.js</a> by <a href="https://github.com/temmieheartz/">TemmieHeartz</a> <sup><i>(Hi!)</i></sup>
<u><i><b>IMPORTANT</b>: This software does not allow you to obtain free PS4 Games / Apps.</i></u>
<u><i><b>IMPORTANT</b>: This software does not allow you to obtain free PS4 Games / Apps.</i></u>

View file

@ -11,7 +11,7 @@
"width": 1186,
"height": 710,
"toolbar": true,
"min_width": 1062,
"min_width": 1102,
"min_height": 626,
"fullscreen": false,
"position": "center",