diff --git a/flipstreamviewer.py b/flipstreamviewer.py
index a9fcbe2..6428d02 100644
--- a/flipstreamviewer.py
+++ b/flipstreamviewer.py
@@ -60,6 +60,8 @@ def btoa_utf8(value):
return base64.b64encode(value.encode("utf-8")).decode()
def atob_utf8(value):
+ if not value:
+ return ""
return base64.b64decode(value.encode()).decode("utf-8")
STREAM_COMPRESSION = 0
@@ -67,8 +69,9 @@ UPDATE_DELAY = 1.0
allowed_ips = ["127.0.0.1"]
setparam = {}
setstate = {}
-param = {"lora": "", "_capture_offsetX": 0, "_capture_offsetY": 0, "_capture_scale": 100}
-state = {"message": btoa_utf8(""), "update_and_reload": False, "presetTitle": time.strftime("%Y%m%d-%H%M"), "presetFolder": "", "presetFile": "", "loraRate": "1", "loraRank": "0", "loraMode": "", "loraFolder": "", "loraFile": "", "loraTagOptions": "[]", "loraTag": "", "loraLinkHref": "", "loraPreviewSrc": "", "darker": 0.0, "wd14th": 0.35, "wd14cth": 0.85}
+default_param = {"lora": "", "_capture_offsetX": 0, "_capture_offsetY": 0, "_capture_scale": 100}
+param = default_param.copy()
+state = {"message": "", "update_and_reload": False, "presetTitle": time.strftime("%Y%m%d-%H%M"), "presetFolder": "", "presetFile": "", "loraRate": "1", "loraRank": "0", "loraMode": "", "loraFolder": "", "loraFile": "", "loraTagOptions": "[]", "loraTag": "", "loraLinkHref": "", "loraPreviewSrc": "", "darker": 0.0, "wd14th": 0.35, "wd14cth": 0.85}
frame_updating = None
frame_buffer = None
frame_mtime = 0
@@ -243,18 +246,14 @@ div.row {
width: 50%;
}
-#toggleViewButton {
- width: 100%;
- height: 85%;
- border: none;
- background: transparent;
-}
-
#messageBox {
width: 100%;
- height: 15%;
+ height: 100%;
border: none;
+ padding: 10px;
background: transparent;
+ text-align: left;
+ user-select: none;
font-size: 1.5rem;
text-shadow:
black 2px 0px, black -2px 0px,
@@ -293,6 +292,9 @@ function btoa_utf8(str) {
}
function atob_utf8(str) {
+ if (!str) {
+ return "";
+ }
return decodeURIComponent(escape(atob(str)));
}
@@ -800,6 +802,7 @@ function toggleView() {
function hideView() {
const leftPanel = document.getElementById("leftPanel");
+ const centerPanel = document.getElementById("centerPanel");
const rightPanel = document.getElementById("rightPanel");
const presetLeftPanel = document.getElementById("presetLeftPanel");
const presetRightPanel = document.getElementById("presetRightPanel");
@@ -810,6 +813,7 @@ function hideView() {
document.getElementById("loraPreview").src = "";
document.querySelectorAll('.FlipStreamPreviewBox').forEach(x => x.src = "");
leftPanel.style.visibility = "hidden";
+ centerPanel.style.visibility = "hidden";
rightPanel.style.visibility = "hidden";
presetLeftPanel.style.visibility = "hidden";
presetRightPanel.style.visibility = "hidden";
@@ -821,7 +825,14 @@ async function refreshView() {
const data = await fetch("/flipstreamviewer/refresh_view")
.then(r => r.json()).catch(e => ({ status: "Fails to refresh view: " + e }));
document.getElementById("statusInfo").textContent = data.status_info || "Empty";
- document.getElementById("messageBox").textContent = atob_utf8(data.message) || "";
+ document.getElementById("messageBox").innerText = atob_utf8(data.message) || "";
+ document.querySelectorAll('.FlipStreamLogBox').forEach(async x => {
+ if (x.id in data.log) {
+ x.innerText = atob_utf8(data.log[x.id]) || "";
+ } else {
+ x.innerText = "";
+ }
+ });
if (document.body.style.backgroundImage != "none") {
document.body.style.backgroundImage = `url('/flipstreamviewer/stream?mtime=${data.stream_mtime || 0}')`;
document.querySelectorAll('.FlipStreamPreviewBox').forEach(async x => {
@@ -1003,7 +1014,7 @@ async def viewer(request):
def add_textbox(title, label, default, rows):
if not label.isidentifier():
raise RuntimeError(f"{title}: label must contain only valid identifier characters.")
- param.setdefault(label, default)
+ param.setdefault(label, btoa_utf8(default))
block[f"{title}_{label}"] = f"""
"""
@@ -1119,6 +1130,13 @@ async def viewer(request):
"""
+
+ def add_logbox(title, label, log, rows):
+ if not label.isidentifier():
+ raise RuntimeError(f"{title}: label must contain only valid identifier characters.")
+ if (label + "LogBox") in state:
+ block[f"{title}_{label}"] = f"""
+ """
hist = server.PromptServer.instance.prompt_queue.get_history(max_items=1)
nodedict = next(iter(hist.values()))["prompt"][2] if hist else None
@@ -1141,6 +1159,8 @@ async def viewer(request):
add_fileselect(title, **inputs)
if class_type == "FlipStreamPreviewBox":
add_previewbox(title, **inputs)
+ if class_type == "FlipStreamLogBox":
+ add_logbox(title, **inputs)
text_html = f"""{HEAD}