diff --git a/ldm/dream/server.py b/ldm/dream/server.py
index 372d719052..9147a3180a 100644
--- a/ldm/dream/server.py
+++ b/ldm/dream/server.py
@@ -76,7 +76,7 @@ class DreamServer(BaseHTTPRequestHandler):
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
- with open("./static/dream_web/index.html", "rb") as content:
+ with open("./static/legacy_web/index.html", "rb") as content:
self.wfile.write(content.read())
elif self.path == "/config.js":
# unfortunately this import can't be at the top level, since that would cause a circular import
@@ -94,7 +94,7 @@ class DreamServer(BaseHTTPRequestHandler):
self.end_headers()
output = []
- log_file = os.path.join(self.outdir, "dream_web_log.txt")
+ log_file = os.path.join(self.outdir, "legacy_web_log.txt")
if os.path.exists(log_file):
with open(log_file, "r") as log:
for line in log:
@@ -114,7 +114,7 @@ class DreamServer(BaseHTTPRequestHandler):
else:
path_dir = os.path.dirname(self.path)
out_dir = os.path.realpath(self.outdir.rstrip('/'))
- if self.path.startswith('/static/dream_web/'):
+ if self.path.startswith('/static/legacy_web/'):
path = '.' + self.path
elif out_dir.replace('\\', '/').endswith(path_dir):
file = os.path.basename(self.path)
@@ -188,7 +188,7 @@ class DreamServer(BaseHTTPRequestHandler):
config['seed'] = seed
# Append post_data to log, but only once!
if not upscaled:
- with open(os.path.join(self.outdir, "dream_web_log.txt"), "a") as log:
+ with open(os.path.join(self.outdir, "legacy_web_log.txt"), "a") as log:
log.write(f"{path}: {json.dumps(config)}\n")
self.wfile.write(bytes(json.dumps(
diff --git a/static/legacy_web/favicon.ico b/static/legacy_web/favicon.ico
new file mode 100644
index 0000000000..51eb844a6a
Binary files /dev/null and b/static/legacy_web/favicon.ico differ
diff --git a/static/legacy_web/index.css b/static/legacy_web/index.css
new file mode 100644
index 0000000000..e95c818e19
--- /dev/null
+++ b/static/legacy_web/index.css
@@ -0,0 +1,143 @@
+* {
+ font-family: 'Arial';
+ font-size: 100%;
+}
+body {
+ font-size: 1em;
+}
+textarea {
+ font-size: 0.95em;
+}
+header, form, #progress-section {
+ margin-left: auto;
+ margin-right: auto;
+ max-width: 1024px;
+ text-align: center;
+}
+fieldset {
+ border: none;
+ line-height: 2.2em;
+}
+select, input {
+ margin-right: 10px;
+ padding: 2px;
+}
+input[type=submit] {
+ background-color: #666;
+ color: white;
+}
+input[type=checkbox] {
+ margin-right: 0px;
+ width: 20px;
+ height: 20px;
+ vertical-align: middle;
+}
+input#seed {
+ margin-right: 0px;
+}
+div {
+ padding: 10px 10px 10px 10px;
+}
+header {
+ margin-bottom: 16px;
+}
+header h1 {
+ margin-bottom: 0;
+ font-size: 2em;
+}
+#search-box {
+ display: flex;
+}
+#scaling-inprocess-message {
+ font-weight: bold;
+ font-style: italic;
+ display: none;
+}
+#prompt {
+ flex-grow: 1;
+ padding: 5px 10px 5px 10px;
+ border: 1px solid #999;
+ outline: none;
+}
+#submit {
+ padding: 5px 10px 5px 10px;
+ border: 1px solid #999;
+}
+#reset-all, #remove-image {
+ margin-top: 12px;
+ font-size: 0.8em;
+ background-color: pink;
+ border: 1px solid #999;
+ border-radius: 4px;
+}
+#results {
+ text-align: center;
+ margin: auto;
+ padding-top: 10px;
+}
+#results figure {
+ display: inline-block;
+ margin: 10px;
+}
+#results figcaption {
+ font-size: 0.8em;
+ padding: 3px;
+ color: #888;
+ cursor: pointer;
+}
+#results img {
+ border-radius: 5px;
+ object-fit: cover;
+}
+#fieldset-config {
+ line-height:2em;
+}
+input[type="number"] {
+ width: 60px;
+}
+#seed {
+ width: 150px;
+}
+button#reset-seed {
+ font-size: 1.7em;
+ background: #efefef;
+ border: 1px solid #999;
+ border-radius: 4px;
+ line-height: 0.8;
+ margin: 0 10px 0 0;
+ padding: 0 5px 3px;
+ vertical-align: middle;
+}
+label {
+ white-space: nowrap;
+}
+#progress-section {
+ display: none;
+}
+#progress-image {
+ width: 30vh;
+ height: 30vh;
+}
+#cancel-button {
+ cursor: pointer;
+ color: red;
+}
+#txt2img {
+ background-color: #DCDCDC;
+}
+#variations {
+ background-color: #EEEEEE;
+}
+#img2img {
+ background-color: #F5F5F5;
+}
+#gfpgan {
+ background-color: #DCDCDC;
+}
+#progress-section {
+ background-color: #F5F5F5;
+}
+
+#no-results-message:not(:only-child) {
+ display: none;
+}
diff --git a/static/legacy_web/index.html b/static/legacy_web/index.html
new file mode 100644
index 0000000000..3d845f74ef
--- /dev/null
+++ b/static/legacy_web/index.html
@@ -0,0 +1,126 @@
+
+
+ Stable Diffusion Dream Server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
✖
+
+

+
+ Postprocessing...1/3
+
+
+
+
+
+
+
+
diff --git a/static/legacy_web/index.js b/static/legacy_web/index.js
new file mode 100644
index 0000000000..ac68034920
--- /dev/null
+++ b/static/legacy_web/index.js
@@ -0,0 +1,213 @@
+function toBase64(file) {
+ return new Promise((resolve, reject) => {
+ const r = new FileReader();
+ r.readAsDataURL(file);
+ r.onload = () => resolve(r.result);
+ r.onerror = (error) => reject(error);
+ });
+}
+
+function appendOutput(src, seed, config) {
+ let outputNode = document.createElement("figure");
+
+ let variations = config.with_variations;
+ if (config.variation_amount > 0) {
+ variations = (variations ? variations + ',' : '') + seed + ':' + config.variation_amount;
+ }
+ let baseseed = (config.with_variations || config.variation_amount > 0) ? config.seed : seed;
+ let altText = baseseed + ' | ' + (variations ? variations + ' | ' : '') + config.prompt;
+
+ // img needs width and height for lazy loading to work
+ const figureContents = `
+
+
+
+ ${seed}
+ `;
+
+ outputNode.innerHTML = figureContents;
+ let figcaption = outputNode.querySelector('figcaption');
+
+ // Reload image config
+ figcaption.addEventListener('click', () => {
+ let form = document.querySelector("#generate-form");
+ for (const [k, v] of new FormData(form)) {
+ if (k == 'initimg') { continue; }
+ form.querySelector(`*[name=${k}]`).value = config[k];
+ }
+
+ document.querySelector("#seed").value = baseseed;
+ document.querySelector("#with_variations").value = variations || '';
+ if (document.querySelector("#variation_amount").value <= 0) {
+ document.querySelector("#variation_amount").value = 0.2;
+ }
+
+ saveFields(document.querySelector("#generate-form"));
+ });
+
+ document.querySelector("#results").prepend(outputNode);
+}
+
+function saveFields(form) {
+ for (const [k, v] of new FormData(form)) {
+ if (typeof v !== 'object') { // Don't save 'file' type
+ localStorage.setItem(k, v);
+ }
+ }
+}
+
+function loadFields(form) {
+ for (const [k, v] of new FormData(form)) {
+ const item = localStorage.getItem(k);
+ if (item != null) {
+ form.querySelector(`*[name=${k}]`).value = item;
+ }
+ }
+}
+
+function clearFields(form) {
+ localStorage.clear();
+ let prompt = form.prompt.value;
+ form.reset();
+ form.prompt.value = prompt;
+}
+
+const BLANK_IMAGE_URL = 'data:image/svg+xml,';
+async function generateSubmit(form) {
+ const prompt = document.querySelector("#prompt").value;
+
+ // Convert file data to base64
+ let formData = Object.fromEntries(new FormData(form));
+ formData.initimg_name = formData.initimg.name
+ formData.initimg = formData.initimg.name !== '' ? await toBase64(formData.initimg) : null;
+
+ let strength = formData.strength;
+ let totalSteps = formData.initimg ? Math.floor(strength * formData.steps) : formData.steps;
+
+ let progressSectionEle = document.querySelector('#progress-section');
+ progressSectionEle.style.display = 'initial';
+ let progressEle = document.querySelector('#progress-bar');
+ progressEle.setAttribute('max', totalSteps);
+ let progressImageEle = document.querySelector('#progress-image');
+ progressImageEle.src = BLANK_IMAGE_URL;
+
+ progressImageEle.style.display = {}.hasOwnProperty.call(formData, 'progress_images') ? 'initial': 'none';
+
+ // Post as JSON, using Fetch streaming to get results
+ fetch(form.action, {
+ method: form.method,
+ body: JSON.stringify(formData),
+ }).then(async (response) => {
+ const reader = response.body.getReader();
+
+ let noOutputs = true;
+ while (true) {
+ let {value, done} = await reader.read();
+ value = new TextDecoder().decode(value);
+ if (done) {
+ progressSectionEle.style.display = 'none';
+ break;
+ }
+
+ for (let event of value.split('\n').filter(e => e !== '')) {
+ const data = JSON.parse(event);
+
+ if (data.event === 'result') {
+ noOutputs = false;
+ appendOutput(data.url, data.seed, data.config);
+ progressEle.setAttribute('value', 0);
+ progressEle.setAttribute('max', totalSteps);
+ } else if (data.event === 'upscaling-started') {
+ document.getElementById("processing_cnt").textContent=data.processed_file_cnt;
+ document.getElementById("scaling-inprocess-message").style.display = "block";
+ } else if (data.event === 'upscaling-done') {
+ document.getElementById("scaling-inprocess-message").style.display = "none";
+ } else if (data.event === 'step') {
+ progressEle.setAttribute('value', data.step);
+ if (data.url) {
+ progressImageEle.src = data.url;
+ }
+ } else if (data.event === 'canceled') {
+ // avoid alerting as if this were an error case
+ noOutputs = false;
+ }
+ }
+ }
+
+ // Re-enable form, remove no-results-message
+ form.querySelector('fieldset').removeAttribute('disabled');
+ document.querySelector("#prompt").value = prompt;
+ document.querySelector('progress').setAttribute('value', '0');
+
+ if (noOutputs) {
+ alert("Error occurred while generating.");
+ }
+ });
+
+ // Disable form while generating
+ form.querySelector('fieldset').setAttribute('disabled','');
+ document.querySelector("#prompt").value = `Generating: "${prompt}"`;
+}
+
+async function fetchRunLog() {
+ try {
+ let response = await fetch('/run_log.json')
+ const data = await response.json();
+ for(let item of data.run_log) {
+ appendOutput(item.url, item.seed, item);
+ }
+ } catch (e) {
+ console.error(e);
+ }
+}
+
+window.onload = async () => {
+ document.querySelector("#prompt").addEventListener("keydown", (e) => {
+ if (e.key === "Enter" && !e.shiftKey) {
+ const form = e.target.form;
+ generateSubmit(form);
+ }
+ });
+ document.querySelector("#generate-form").addEventListener('submit', (e) => {
+ e.preventDefault();
+ const form = e.target;
+
+ generateSubmit(form);
+ });
+ document.querySelector("#generate-form").addEventListener('change', (e) => {
+ saveFields(e.target.form);
+ });
+ document.querySelector("#reset-seed").addEventListener('click', (e) => {
+ document.querySelector("#seed").value = -1;
+ saveFields(e.target.form);
+ });
+ document.querySelector("#reset-all").addEventListener('click', (e) => {
+ clearFields(e.target.form);
+ });
+ document.querySelector("#remove-image").addEventListener('click', (e) => {
+ initimg.value=null;
+ });
+ loadFields(document.querySelector("#generate-form"));
+
+ document.querySelector('#cancel-button').addEventListener('click', () => {
+ fetch('/cancel').catch(e => {
+ console.error(e);
+ });
+ });
+ document.documentElement.addEventListener('keydown', (e) => {
+ if (e.key === "Escape")
+ fetch('/cancel').catch(err => {
+ console.error(err);
+ });
+ });
+
+ if (!config.gfpgan_model_exists) {
+ document.querySelector("#gfpgan").style.display = 'none';
+ }
+ await fetchRunLog()
+};