Initial commit
This commit is contained in:
commit
822e56506a
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2023 UUP dump authors
|
||||
|
||||
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.
|
349
css/normalize.css
vendored
Normal file
349
css/normalize.css
vendored
Normal file
@ -0,0 +1,349 @@
|
||||
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
|
||||
|
||||
/* Document
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* 1. Correct the line height in all browsers.
|
||||
* 2. Prevent adjustments of font size after orientation changes in iOS.
|
||||
*/
|
||||
|
||||
html {
|
||||
line-height: 1.15; /* 1 */
|
||||
-webkit-text-size-adjust: 100%; /* 2 */
|
||||
}
|
||||
|
||||
/* Sections
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Remove the margin in all browsers.
|
||||
*/
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Render the `main` element consistently in IE.
|
||||
*/
|
||||
|
||||
main {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/**
|
||||
* Correct the font size and margin on `h1` elements within `section` and
|
||||
* `article` contexts in Chrome, Firefox, and Safari.
|
||||
*/
|
||||
|
||||
h1 {
|
||||
font-size: 2em;
|
||||
margin: 0.67em 0;
|
||||
}
|
||||
|
||||
/* Grouping content
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* 1. Add the correct box sizing in Firefox.
|
||||
* 2. Show the overflow in Edge and IE.
|
||||
*/
|
||||
|
||||
hr {
|
||||
box-sizing: content-box; /* 1 */
|
||||
height: 0; /* 1 */
|
||||
overflow: visible; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct the inheritance and scaling of font size in all browsers.
|
||||
* 2. Correct the odd `em` font sizing in all browsers.
|
||||
*/
|
||||
|
||||
pre {
|
||||
font-family: monospace, monospace; /* 1 */
|
||||
font-size: 1em; /* 2 */
|
||||
}
|
||||
|
||||
/* Text-level semantics
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Remove the gray background on active links in IE 10.
|
||||
*/
|
||||
|
||||
a {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Remove the bottom border in Chrome 57-
|
||||
* 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
|
||||
*/
|
||||
|
||||
abbr[title] {
|
||||
border-bottom: none; /* 1 */
|
||||
text-decoration: underline; /* 2 */
|
||||
text-decoration: underline dotted; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the correct font weight in Chrome, Edge, and Safari.
|
||||
*/
|
||||
|
||||
b,
|
||||
strong {
|
||||
font-weight: bolder;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct the inheritance and scaling of font size in all browsers.
|
||||
* 2. Correct the odd `em` font sizing in all browsers.
|
||||
*/
|
||||
|
||||
code,
|
||||
kbd,
|
||||
samp {
|
||||
font-family: monospace, monospace; /* 1 */
|
||||
font-size: 1em; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the correct font size in all browsers.
|
||||
*/
|
||||
|
||||
small {
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prevent `sub` and `sup` elements from affecting the line height in
|
||||
* all browsers.
|
||||
*/
|
||||
|
||||
sub,
|
||||
sup {
|
||||
font-size: 75%;
|
||||
line-height: 0;
|
||||
position: relative;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
sub {
|
||||
bottom: -0.25em;
|
||||
}
|
||||
|
||||
sup {
|
||||
top: -0.5em;
|
||||
}
|
||||
|
||||
/* Embedded content
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Remove the border on images inside links in IE 10.
|
||||
*/
|
||||
|
||||
img {
|
||||
border-style: none;
|
||||
}
|
||||
|
||||
/* Forms
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* 1. Change the font styles in all browsers.
|
||||
* 2. Remove the margin in Firefox and Safari.
|
||||
*/
|
||||
|
||||
button,
|
||||
input,
|
||||
optgroup,
|
||||
select,
|
||||
textarea {
|
||||
font-family: inherit; /* 1 */
|
||||
font-size: 100%; /* 1 */
|
||||
line-height: 1.15; /* 1 */
|
||||
margin: 0; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the overflow in IE.
|
||||
* 1. Show the overflow in Edge.
|
||||
*/
|
||||
|
||||
button,
|
||||
input { /* 1 */
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the inheritance of text transform in Edge, Firefox, and IE.
|
||||
* 1. Remove the inheritance of text transform in Firefox.
|
||||
*/
|
||||
|
||||
button,
|
||||
select { /* 1 */
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* Correct the inability to style clickable types in iOS and Safari.
|
||||
*/
|
||||
|
||||
button,
|
||||
[type="button"],
|
||||
[type="reset"],
|
||||
[type="submit"] {
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the inner border and padding in Firefox.
|
||||
*/
|
||||
|
||||
button::-moz-focus-inner,
|
||||
[type="button"]::-moz-focus-inner,
|
||||
[type="reset"]::-moz-focus-inner,
|
||||
[type="submit"]::-moz-focus-inner {
|
||||
border-style: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restore the focus styles unset by the previous rule.
|
||||
*/
|
||||
|
||||
button:-moz-focusring,
|
||||
[type="button"]:-moz-focusring,
|
||||
[type="reset"]:-moz-focusring,
|
||||
[type="submit"]:-moz-focusring {
|
||||
outline: 1px dotted ButtonText;
|
||||
}
|
||||
|
||||
/**
|
||||
* Correct the padding in Firefox.
|
||||
*/
|
||||
|
||||
fieldset {
|
||||
padding: 0.35em 0.75em 0.625em;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct the text wrapping in Edge and IE.
|
||||
* 2. Correct the color inheritance from `fieldset` elements in IE.
|
||||
* 3. Remove the padding so developers are not caught out when they zero out
|
||||
* `fieldset` elements in all browsers.
|
||||
*/
|
||||
|
||||
legend {
|
||||
box-sizing: border-box; /* 1 */
|
||||
color: inherit; /* 2 */
|
||||
display: table; /* 1 */
|
||||
max-width: 100%; /* 1 */
|
||||
padding: 0; /* 3 */
|
||||
white-space: normal; /* 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the correct vertical alignment in Chrome, Firefox, and Opera.
|
||||
*/
|
||||
|
||||
progress {
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the default vertical scrollbar in IE 10+.
|
||||
*/
|
||||
|
||||
textarea {
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Add the correct box sizing in IE 10.
|
||||
* 2. Remove the padding in IE 10.
|
||||
*/
|
||||
|
||||
[type="checkbox"],
|
||||
[type="radio"] {
|
||||
box-sizing: border-box; /* 1 */
|
||||
padding: 0; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Correct the cursor style of increment and decrement buttons in Chrome.
|
||||
*/
|
||||
|
||||
[type="number"]::-webkit-inner-spin-button,
|
||||
[type="number"]::-webkit-outer-spin-button {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct the odd appearance in Chrome and Safari.
|
||||
* 2. Correct the outline style in Safari.
|
||||
*/
|
||||
|
||||
[type="search"] {
|
||||
-webkit-appearance: textfield; /* 1 */
|
||||
outline-offset: -2px; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the inner padding in Chrome and Safari on macOS.
|
||||
*/
|
||||
|
||||
[type="search"]::-webkit-search-decoration {
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct the inability to style clickable types in iOS and Safari.
|
||||
* 2. Change font properties to `inherit` in Safari.
|
||||
*/
|
||||
|
||||
::-webkit-file-upload-button {
|
||||
-webkit-appearance: button; /* 1 */
|
||||
font: inherit; /* 2 */
|
||||
}
|
||||
|
||||
/* Interactive
|
||||
========================================================================== */
|
||||
|
||||
/*
|
||||
* Add the correct display in Edge, IE 10+, and Firefox.
|
||||
*/
|
||||
|
||||
details {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/*
|
||||
* Add the correct display in all browsers.
|
||||
*/
|
||||
|
||||
summary {
|
||||
display: list-item;
|
||||
}
|
||||
|
||||
/* Misc
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Add the correct display in IE 10+.
|
||||
*/
|
||||
|
||||
template {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the correct display in IE 10.
|
||||
*/
|
||||
|
||||
[hidden] {
|
||||
display: none;
|
||||
}
|
226
css/sakura.css
Normal file
226
css/sakura.css
Normal file
@ -0,0 +1,226 @@
|
||||
/* Sakura.css v1.5.0
|
||||
* ================
|
||||
* Minimal css theme.
|
||||
* Project: https://github.com/oxalorg/sakura/
|
||||
*/
|
||||
/* Body */
|
||||
html {
|
||||
font-size: 62.5%;
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;
|
||||
}
|
||||
|
||||
body {
|
||||
font-size: 1.8rem;
|
||||
line-height: 1.618;
|
||||
max-width: 38em;
|
||||
margin: auto;
|
||||
color: #4a4a4a;
|
||||
background-color: #f9f9f9;
|
||||
padding: 13px;
|
||||
}
|
||||
|
||||
@media (max-width: 684px) {
|
||||
body {
|
||||
font-size: 1.53rem;
|
||||
}
|
||||
}
|
||||
@media (max-width: 382px) {
|
||||
body {
|
||||
font-size: 1.35rem;
|
||||
}
|
||||
}
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
line-height: 1.1;
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;
|
||||
font-weight: 700;
|
||||
margin-top: 3rem;
|
||||
margin-bottom: 1.5rem;
|
||||
overflow-wrap: break-word;
|
||||
word-wrap: break-word;
|
||||
-ms-word-break: break-all;
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 2.35em;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 2em;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 1.75em;
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: 1.5em;
|
||||
}
|
||||
|
||||
h5 {
|
||||
font-size: 1.25em;
|
||||
}
|
||||
|
||||
h6 {
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 0px;
|
||||
margin-bottom: 2.5rem;
|
||||
}
|
||||
|
||||
small, sub, sup {
|
||||
font-size: 75%;
|
||||
}
|
||||
|
||||
hr {
|
||||
border-color: #1d7484;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
color: #1d7484;
|
||||
}
|
||||
a:visited {
|
||||
color: #144f5a;
|
||||
}
|
||||
a:hover {
|
||||
color: #982c61;
|
||||
border-bottom: 2px solid #4a4a4a;
|
||||
}
|
||||
|
||||
ul {
|
||||
padding-left: 1.4em;
|
||||
margin-top: 0px;
|
||||
margin-bottom: 2.5rem;
|
||||
}
|
||||
|
||||
li {
|
||||
margin-bottom: 0.4em;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
margin-left: 0px;
|
||||
margin-right: 0px;
|
||||
padding-left: 1em;
|
||||
padding-top: 0.8em;
|
||||
padding-bottom: 0.8em;
|
||||
padding-right: 0.8em;
|
||||
border-left: 5px solid #1d7484;
|
||||
margin-bottom: 2.5rem;
|
||||
background-color: #f1f1f1;
|
||||
}
|
||||
|
||||
blockquote p {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
img, video {
|
||||
height: auto;
|
||||
max-width: 100%;
|
||||
margin-top: 0px;
|
||||
margin-bottom: 2.5rem;
|
||||
}
|
||||
|
||||
/* Pre and Code */
|
||||
pre {
|
||||
background-color: #f1f1f1;
|
||||
display: block;
|
||||
padding: 1em;
|
||||
overflow-x: auto;
|
||||
margin-top: 0px;
|
||||
margin-bottom: 2.5rem;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
code, kbd, samp {
|
||||
font-size: 0.9em;
|
||||
padding: 0 0.5em;
|
||||
background-color: #f1f1f1;
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
pre > code {
|
||||
padding: 0;
|
||||
background-color: transparent;
|
||||
white-space: pre;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
/* Tables */
|
||||
table {
|
||||
text-align: justify;
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
|
||||
td, th {
|
||||
padding: 0.5em;
|
||||
border-bottom: 1px solid #f1f1f1;
|
||||
}
|
||||
|
||||
/* Buttons, forms and input */
|
||||
input, textarea {
|
||||
border: 1px solid #4a4a4a;
|
||||
}
|
||||
input:focus, textarea:focus {
|
||||
border: 1px solid #1d7484;
|
||||
}
|
||||
|
||||
textarea {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.button, button, input[type=submit], input[type=reset], input[type=button], input[type=file]::file-selector-button {
|
||||
display: inline-block;
|
||||
padding: 5px 10px;
|
||||
text-align: center;
|
||||
text-decoration: none;
|
||||
white-space: nowrap;
|
||||
background-color: #1d7484;
|
||||
color: #f9f9f9;
|
||||
border-radius: 1px;
|
||||
border: 1px solid #1d7484;
|
||||
cursor: pointer;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.button[disabled], button[disabled], input[type=submit][disabled], input[type=reset][disabled], input[type=button][disabled], input[type=file]::file-selector-button[disabled] {
|
||||
cursor: default;
|
||||
opacity: 0.5;
|
||||
}
|
||||
.button:hover, button:hover, input[type=submit]:hover, input[type=reset]:hover, input[type=button]:hover, input[type=file]::file-selector-button:hover {
|
||||
background-color: #982c61;
|
||||
color: #f9f9f9;
|
||||
outline: 0;
|
||||
}
|
||||
.button:focus-visible, button:focus-visible, input[type=submit]:focus-visible, input[type=reset]:focus-visible, input[type=button]:focus-visible, input[type=file]::file-selector-button:focus-visible {
|
||||
outline-style: solid;
|
||||
outline-width: 2px;
|
||||
}
|
||||
|
||||
textarea, select, input {
|
||||
color: #4a4a4a;
|
||||
padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */
|
||||
margin-bottom: 10px;
|
||||
background-color: #f1f1f1;
|
||||
border: 1px solid #f1f1f1;
|
||||
border-radius: 4px;
|
||||
box-shadow: none;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
textarea:focus, select:focus, input:focus {
|
||||
border: 1px solid #1d7484;
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
input[type=checkbox]:focus {
|
||||
outline: 1px dotted #1d7484;
|
||||
}
|
||||
|
||||
label, legend, fieldset {
|
||||
display: block;
|
||||
margin-bottom: 0.5rem;
|
||||
font-weight: 600;
|
||||
}
|
16
css/style.css
Normal file
16
css/style.css
Normal file
@ -0,0 +1,16 @@
|
||||
#search-builds-query,
|
||||
#language-selection-select {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#download-info {
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
|
||||
table {
|
||||
text-align: revert;
|
||||
}
|
||||
|
||||
.hidden {
|
||||
display: none;
|
||||
}
|
56
download.html
Normal file
56
download.html
Normal file
@ -0,0 +1,56 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>LightUUP - Download build</title>
|
||||
|
||||
<link rel="stylesheet" href="css/normalize.css">
|
||||
<link rel="stylesheet" href="css/sakura.css">
|
||||
<link rel="stylesheet" href="css/style.css">
|
||||
|
||||
<script src="js/common.js" defer></script>
|
||||
<script src="js/download.js" defer></script>
|
||||
</head>
|
||||
<body>
|
||||
<h1>LightUUP</h1>
|
||||
<p>A simple UUP downloads generator.</p>
|
||||
|
||||
<p>
|
||||
[<a href="/">Home</a>]
|
||||
[<a href="known.html">Downloads</a>]
|
||||
[<a href="https://git.uupdump.net/uup-dump/lightuup">Source code</a>]
|
||||
</p>
|
||||
|
||||
<h2>Download build</h2>
|
||||
<p id="build-name">Name not yet known.</p>
|
||||
<input id="build-uuid" type="hidden">
|
||||
|
||||
<div id="language-selection" class="hidden">
|
||||
<h3>Select language</h3>
|
||||
<p>Please select your desired language.</p>
|
||||
|
||||
<p><select id="language-selection-select"></select></p>
|
||||
</div>
|
||||
|
||||
<div id="edition-selection" class="hidden">
|
||||
<h3>Select editions</h3>
|
||||
<p>Please select your desired editions.</p>
|
||||
<div id="edition-selection-list"></div>
|
||||
</div>
|
||||
|
||||
<div id="download-info" class="hidden">
|
||||
<h3>Download your selection</h3>
|
||||
<p>You can download your selection by clicking the link below. In case you want to customize some advanced options, such as adding additional editions, please see the <code>ConvertConfig.ini</code> file in the downloaded archive.</p>
|
||||
|
||||
<p><a id="download-link">Create the download package</a></p>
|
||||
|
||||
<p>This download is provided from <a href="https://uupdump.net">UUP dump</a>.</p>
|
||||
</div>
|
||||
|
||||
<div id="status" class="hidden">
|
||||
<h3 id="status-title"></h3>
|
||||
<p id="status-text"></p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
27
index.html
Normal file
27
index.html
Normal file
@ -0,0 +1,27 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>LightUUP</title>
|
||||
|
||||
<link rel="stylesheet" href="css/normalize.css">
|
||||
<link rel="stylesheet" href="css/sakura.css">
|
||||
<link rel="stylesheet" href="css/style.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>LightUUP</h1>
|
||||
<p>A simple UUP downloads generator.</p>
|
||||
|
||||
<p>
|
||||
[<a href="/">Home</a>]
|
||||
[<a href="known.html">Downloads</a>]
|
||||
[<a href="https://git.uupdump.net/uup-dump/lightuup">Source code</a>]
|
||||
</p>
|
||||
|
||||
<h2>Welcome to LightUUP!</h2>
|
||||
<p>LightUUP is a simple UUP dump JSON API client written in HTML and JavaScript. You can customize it however you want to provide your own UUP download experience.</p>
|
||||
|
||||
<a href="known.html">Browse available builds</a>
|
||||
</body>
|
||||
</html>
|
58
js/common.js
Normal file
58
js/common.js
Normal file
@ -0,0 +1,58 @@
|
||||
const UUP_API_ENDPOINT = 'https://api.uupdump.net/';
|
||||
|
||||
const STATUS_DIV_NAME = '#status';
|
||||
const STATUS_TITLE_NAME = '#status-title';
|
||||
const STATUS_TEXT_NAME = '#status-text';
|
||||
|
||||
const TEXT_ERROR = 'Error';
|
||||
const TEXT_PLEASE_WAIT = 'Please wait...';
|
||||
const TEXT_RETRIEVING_DATA = 'The data you requested is being retrieved...';
|
||||
|
||||
const $ = document.querySelector.bind(document)
|
||||
const $$ = document.querySelectorAll.bind(document)
|
||||
|
||||
async function getResponseFromApi(page, params) {
|
||||
let query = '';
|
||||
let data;
|
||||
|
||||
if(Object.keys(params).length != 0)
|
||||
query = '?' + new URLSearchParams(params).toString();
|
||||
|
||||
const url = `${UUP_API_ENDPOINT}${page}${query}`;
|
||||
|
||||
try {
|
||||
const response = await fetch(url);
|
||||
data = await response.json();
|
||||
} catch(error) {
|
||||
return {'error': error.message};
|
||||
}
|
||||
|
||||
if(!('response' in data))
|
||||
return {'error': 'Response from the server is invalid.'};
|
||||
|
||||
return data['response'];
|
||||
}
|
||||
|
||||
function showSection(selector) {
|
||||
$(selector).classList.remove('hidden');
|
||||
}
|
||||
|
||||
function hideSection(selector) {
|
||||
$(selector).classList.add('hidden');
|
||||
}
|
||||
|
||||
function setStatusError(text) {
|
||||
$(STATUS_TITLE_NAME).innerHTML = TEXT_ERROR;
|
||||
$(STATUS_TEXT_NAME).innerHTML = text;
|
||||
showSection(STATUS_DIV_NAME);
|
||||
}
|
||||
|
||||
function setStatusLoading() {
|
||||
$(STATUS_TITLE_NAME).innerHTML = TEXT_PLEASE_WAIT;
|
||||
$(STATUS_TEXT_NAME).innerHTML = TEXT_RETRIEVING_DATA;
|
||||
showSection(STATUS_DIV_NAME);
|
||||
}
|
||||
|
||||
function clearStatus() {
|
||||
hideSection(STATUS_DIV_NAME);
|
||||
}
|
155
js/download.js
Normal file
155
js/download.js
Normal file
@ -0,0 +1,155 @@
|
||||
const UUP_PACKAGE_LINK = 'https://uupdump.net/get.php';
|
||||
|
||||
const BUILD_NAME = '#build-name';
|
||||
const BUILD_UUID = '#build-uuid';
|
||||
|
||||
const LANGUAGE_SELECTION = '#language-selection';
|
||||
const LANGUAGE_SELECTION_SELECT = '#language-selection-select';
|
||||
|
||||
const EDITION_SELECTION = '#edition-selection';
|
||||
const EDITION_SELECTION_LIST = '#edition-selection-list';
|
||||
|
||||
const DOWNLOAD_INFO = '#download-info';
|
||||
const DOWNLOAD_LINK = '#download-link';
|
||||
|
||||
const TEXT_NO_LANGUAGES = 'This build can\'t be downloaded.';
|
||||
const TEXT_UNSPECIFIED_BUILD = 'Build not specified.';
|
||||
const TEXT_SELECT_EDITION = 'Please select at least one edition.'
|
||||
|
||||
function addListenersToEditionOptions() {
|
||||
$$('.edition-option').forEach((x) => {
|
||||
x.addEventListener('click', () => {
|
||||
evaluateEditions();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function updateLanguageList(langList) {
|
||||
const langs = Object.values(langList);
|
||||
langs.sort();
|
||||
|
||||
const options = langs.map((x) => {
|
||||
return `
|
||||
<option value="${x}">
|
||||
${x}
|
||||
</option>
|
||||
`;
|
||||
}).join('');
|
||||
|
||||
$(LANGUAGE_SELECTION_SELECT).innerHTML = `
|
||||
<option value="">--- Please select ---</option>
|
||||
${options}
|
||||
`;
|
||||
|
||||
showSection(LANGUAGE_SELECTION);
|
||||
}
|
||||
|
||||
function updateEditionList(editionList) {
|
||||
const editions = Object.values(editionList);
|
||||
editions.sort();
|
||||
|
||||
const options = editions.map((x) => {
|
||||
return `
|
||||
<label>
|
||||
<input class="edition-option" type="checkbox" value="${x}">
|
||||
<code>${x}</code>
|
||||
</label>
|
||||
`;
|
||||
}).join('');
|
||||
|
||||
$(EDITION_SELECTION_LIST).innerHTML = options;
|
||||
addListenersToEditionOptions();
|
||||
showSection(EDITION_SELECTION);
|
||||
}
|
||||
|
||||
function updateBuildName(updateInfo) {
|
||||
const title = updateInfo['title'];
|
||||
const arch = updateInfo['arch'];
|
||||
|
||||
$(BUILD_NAME).innerHTML = `${title} ${arch}`;
|
||||
}
|
||||
|
||||
function buildDownloadLink(editions) {
|
||||
const editionsStr = editions.join(';').toLowerCase();
|
||||
const query = '?' + new URLSearchParams({
|
||||
'id': $(BUILD_UUID).value,
|
||||
'pack': $(LANGUAGE_SELECTION_SELECT).value,
|
||||
'edition': editionsStr,
|
||||
'autodl': 2
|
||||
}).toString();
|
||||
|
||||
return `${UUP_PACKAGE_LINK}${query}`;
|
||||
}
|
||||
|
||||
function evaluateEditions() {
|
||||
const selectedEditions = [];
|
||||
|
||||
for(const x of $$('.edition-option').values()) {
|
||||
if(x.checked)
|
||||
selectedEditions.push(x.value);
|
||||
}
|
||||
|
||||
if(selectedEditions.length < 1) {
|
||||
hideSection(DOWNLOAD_INFO)
|
||||
return;
|
||||
}
|
||||
|
||||
$(DOWNLOAD_LINK).href = buildDownloadLink(selectedEditions);
|
||||
showSection(DOWNLOAD_INFO);
|
||||
}
|
||||
|
||||
async function preparePage(uuid) {
|
||||
setStatusLoading();
|
||||
const response = await getResponseFromApi('listlangs.php', {'id': uuid});
|
||||
|
||||
if('error' in response) {
|
||||
setStatusError(response['error']);
|
||||
return;
|
||||
}
|
||||
|
||||
if(response['langList'].length < 1) {
|
||||
setStatusError(TEXT_NO_LANGUAGES);
|
||||
return;
|
||||
}
|
||||
|
||||
updateBuildName(response['updateInfo']);
|
||||
updateLanguageList(response['langList']);
|
||||
clearStatus();
|
||||
}
|
||||
|
||||
async function languageSelected(uuid, lang) {
|
||||
hideSection(EDITION_SELECTION);
|
||||
hideSection(DOWNLOAD_INFO);
|
||||
|
||||
if(lang === "")
|
||||
return;
|
||||
|
||||
setStatusLoading();
|
||||
const response = await getResponseFromApi('listeditions.php', {'id': uuid, 'lang': lang});
|
||||
|
||||
if('error' in response) {
|
||||
setStatusError(response['error']);
|
||||
return;
|
||||
}
|
||||
|
||||
updateEditionList(response['editionList']);
|
||||
clearStatus();
|
||||
}
|
||||
|
||||
$(LANGUAGE_SELECTION_SELECT).addEventListener('change', async () => {
|
||||
const selection = $(LANGUAGE_SELECTION_SELECT).value;
|
||||
const uuid = $(BUILD_UUID).value;
|
||||
|
||||
await languageSelected(uuid, selection);
|
||||
});
|
||||
|
||||
document.addEventListener('DOMContentLoaded', async () => {
|
||||
if(!window.location.hash) {
|
||||
setStatusError(TEXT_UNSPECIFIED_BUILD);
|
||||
return;
|
||||
}
|
||||
|
||||
const uuid = window.location.hash.substring(1);
|
||||
$(BUILD_UUID).value = uuid;
|
||||
preparePage(uuid);
|
||||
});
|
65
js/known.js
Normal file
65
js/known.js
Normal file
@ -0,0 +1,65 @@
|
||||
const SEARCH_FORM = '#search-builds';
|
||||
const SEARCH_INPUT = '#search-builds-query';
|
||||
const SEARCH_DATE_SORT = '#search-builds-date-sort';
|
||||
|
||||
const SEARCH_RESULTS = '#search-results';
|
||||
const SEARCH_RESULTS_TABLE = '#search-results-table-body';
|
||||
|
||||
function buildResultsTable(results) {
|
||||
const builds = Object.values(results['builds']);
|
||||
const table = builds.map((x) => {
|
||||
return `
|
||||
<tr>
|
||||
<td>
|
||||
<a href="download.html#${x['uuid']}">
|
||||
${x['title']} ${x['arch']}
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
${new Date(x['created'] * 1000).toLocaleDateString()}
|
||||
</td>
|
||||
</tr>
|
||||
`;
|
||||
}).join('');
|
||||
|
||||
$(SEARCH_RESULTS_TABLE).innerHTML = table;
|
||||
showSection(SEARCH_RESULTS);
|
||||
}
|
||||
|
||||
async function performSearch(search, sort) {
|
||||
const query = {
|
||||
'search': search,
|
||||
'sortByDate': sort
|
||||
}
|
||||
|
||||
hideSection(SEARCH_RESULTS);
|
||||
setStatusLoading();
|
||||
const response = await getResponseFromApi('listid.php', query);
|
||||
|
||||
if('error' in response) {
|
||||
setStatusError(response['error']);
|
||||
return;
|
||||
}
|
||||
|
||||
clearStatus();
|
||||
buildResultsTable(response);
|
||||
}
|
||||
|
||||
$(SEARCH_FORM).addEventListener('submit', async (event) => {
|
||||
event.preventDefault();
|
||||
const search = $(SEARCH_INPUT).value;
|
||||
const sort = $(SEARCH_DATE_SORT).checked ? 1 : 0;
|
||||
window.location.hash = search;
|
||||
|
||||
await performSearch(search, sort);
|
||||
});
|
||||
|
||||
document.addEventListener('DOMContentLoaded', async () => {
|
||||
if(!window.location.hash)
|
||||
return;
|
||||
|
||||
const search = window.location.hash.substring(1);
|
||||
$(SEARCH_INPUT).value = search;
|
||||
|
||||
await performSearch(search, 0);
|
||||
});
|
55
known.html
Normal file
55
known.html
Normal file
@ -0,0 +1,55 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>LightUUP - Browse available builds</title>
|
||||
|
||||
<link rel="stylesheet" href="css/normalize.css">
|
||||
<link rel="stylesheet" href="css/sakura.css">
|
||||
<link rel="stylesheet" href="css/style.css">
|
||||
|
||||
<script src="js/common.js" defer></script>
|
||||
<script src="js/known.js" defer></script>
|
||||
</head>
|
||||
<body>
|
||||
<h1>LightUUP</h1>
|
||||
<p>A simple UUP downloads generator.</p>
|
||||
|
||||
<p>
|
||||
[<a href="/">Home</a>]
|
||||
[<a href="known.html">Downloads</a>]
|
||||
[<a href="https://git.uupdump.net/uup-dump/lightuup">Source code</a>]
|
||||
</p>
|
||||
|
||||
<h2>Browse available builds</h2>
|
||||
<form id="search-builds">
|
||||
<input id="search-builds-query" type="search" placeholder="Search for builds...">
|
||||
|
||||
<label>
|
||||
<input id="search-builds-date-sort" type="checkbox">
|
||||
Sort results by addition date
|
||||
</label>
|
||||
|
||||
<button type="submit">Search</button>
|
||||
</form>
|
||||
|
||||
<div id="search-results" class="hidden">
|
||||
<h3>Search results</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Date added</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="search-results-table-body"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div id="status" class="hidden">
|
||||
<h3 id="status-title"></h3>
|
||||
<p id="status-text"></p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in New Issue
Block a user