mirror of
https://github.com/themitosan/fpPS4-Temmie-s-Launcher.git
synced 2024-06-15 18:57:39 -04:00
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:
parent
26ca3f10c3
commit
95cf06000f
|
@ -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
BIN
App/img/logo.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 136 KiB |
432
App/index.htm
432
App/index.htm
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
});
|
||||
|
|
|
@ -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: {}
|
||||
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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
260
App/js/updateEmu.js
Normal 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
44
App/node_modules/node-stream-zip/LICENSE
generated
vendored
Normal 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
224
App/node_modules/node-stream-zip/README.md
generated
vendored
Normal 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
199
App/node_modules/node-stream-zip/node_stream_zip.d.ts
generated
vendored
Normal 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
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
47
App/node_modules/node-stream-zip/package.json
generated
vendored
Normal 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"
|
||||
}
|
||||
}
|
|
@ -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)
|
|
@ -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": ""
|
||||
|
||||
}
|
||||
}
|
|
@ -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": ""
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
|
||||
}
|
||||
}
|
|
@ -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": ""
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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": ""
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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>
|
|
@ -11,7 +11,7 @@
|
|||
"width": 1186,
|
||||
"height": 710,
|
||||
"toolbar": true,
|
||||
"min_width": 1062,
|
||||
"min_width": 1102,
|
||||
"min_height": 626,
|
||||
"fullscreen": false,
|
||||
"position": "center",
|
||||
|
|
Loading…
Reference in a new issue