aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2026-03-09 17:34:49 +0100
committermetamuffin <metamuffin@disroot.org>2026-03-09 17:34:49 +0100
commitcb5ff5f0cab8ea3d419d3b208f5bc61ebee89ffb (patch)
treeb38782aa294ee7d29d09a075129b3e29097bb13a
parent21cf747b1b9dfefef94aa399ae3a1f105c0e2c89 (diff)
downloadjellything-cb5ff5f0cab8ea3d419d3b208f5bc61ebee89ffb.tar
jellything-cb5ff5f0cab8ea3d419d3b208f5bc61ebee89ffb.tar.bz2
jellything-cb5ff5f0cab8ea3d419d3b208f5bc61ebee89ffb.tar.zst
use no_scaff feature for js transition
-rw-r--r--server/src/routes/stream.rs7
-rw-r--r--ui/client-scripts/src/backbutton.ts7
-rw-r--r--ui/client-scripts/src/transition.ts15
-rw-r--r--ui/locale/src/lib.rs2
4 files changed, 15 insertions, 16 deletions
diff --git a/server/src/routes/stream.rs b/server/src/routes/stream.rs
index 9868d6a..45b86a9 100644
--- a/server/src/routes/stream.rs
+++ b/server/src/routes/stream.rs
@@ -5,10 +5,7 @@
*/
use crate::{request_info::RequestInfo, routes::error::MyError};
use anyhow::{Result, anyhow};
-use jellycommon::{
- NO_SLUG, NO_TITLE, NO_TRACK, TR_SOURCE, TRSOURCE_LOCAL_PATH, jellyobject::Path,
- stream::StreamSpec,
-};
+use jellycommon::{jellyobject::Path, stream::StreamSpec, *};
use jellydb::{Filter, Query};
use jellystream::SMediaInfo;
use log::{info, warn};
@@ -76,7 +73,7 @@ pub async fn r_stream(
};
info!(
- "stream request (range={})",
+ "stream request {spec:?} (range={})",
range
.as_ref()
.map(|r| r.to_cr_hv())
diff --git a/ui/client-scripts/src/backbutton.ts b/ui/client-scripts/src/backbutton.ts
index b1b5c0f..5c1a8cb 100644
--- a/ui/client-scripts/src/backbutton.ts
+++ b/ui/client-scripts/src/backbutton.ts
@@ -7,7 +7,8 @@
import { e } from "./jshelper/mod.ts";
globalThis.addEventListener("DOMContentLoaded", () => {
- document.getElementsByTagName("nav").item(0)?.prepend(
- e("a", { class: "back", onclick() { history.back() } }, e("span", "Back"))
- )
+ const nav = document.getElementsByTagName("nav").item(0) as HTMLElement
+ if (nav.dataset.hasBackButton) return
+ nav.dataset.hasBackButton = "1"
+ nav.prepend(e("a", { class: "back", onclick() { history.back() } }, e("span", "Back")))
})
diff --git a/ui/client-scripts/src/transition.ts b/ui/client-scripts/src/transition.ts
index dadb266..2bf11ce 100644
--- a/ui/client-scripts/src/transition.ts
+++ b/ui/client-scripts/src/transition.ts
@@ -29,6 +29,8 @@ function patch_page() {
document.querySelectorAll("a").forEach(el => {
if (!el.href.startsWith("http")) return
if (el.target && el.target != "_self") return
+ if (el.dataset.hasTransitionHook) return
+ el.dataset.hasTransitionHook = "1"
el.addEventListener("click", async ev => {
ev.preventDefault()
await transition_to(el.href)
@@ -53,7 +55,7 @@ function show_message(mesg: string, mode: "error" | "success" = "error") {
let i = 0;
function prepare_load(href: string, state?: HistoryState) {
- const r_promise = fetch(href, { headers: { accept: "text/html" }, redirect: "manual" })
+ const r_promise = fetch(href + "?no_scaff", { headers: { accept: "text/html" }, redirect: "manual" })
return async () => {
let rt = ""
try {
@@ -70,12 +72,10 @@ function prepare_load(href: string, state?: HistoryState) {
if (e instanceof TypeError) return show_message("Navigation failed. Check your connection.")
return show_message("unknown error when fetching page")
}
- const [head, body] = rt.split("<head>")[1].split("</head>")
globalThis.history.replaceState({ top: globalThis.scrollY, index: i++ } as HistoryState, "")
if (!state) globalThis.history.pushState({}, "", href)
clear_spinner()
- document.head.innerHTML = head
- document.body.outerHTML = body
+ document.getElementById("main")!.innerHTML = rt
globalThis.dispatchEvent(new Event("DOMContentLoaded"))
globalThis.scrollTo({ top: state?.top ?? 0 });
fade(true)
@@ -88,8 +88,9 @@ function clear_spinner() {
if (spinner_element) spinner_element.remove()
spinner_element = spinner_timeout = undefined;
}
+let overlay: HTMLDivElement | undefined
function fade(dir: boolean) {
- const overlay = document.createElement("div")
+ if (!overlay) overlay = document.createElement("div")
overlay.classList.add("jst-fade")
overlay.style.backgroundColor = dir ? "black" : "transparent"
overlay.style.animationName = dir ? "jst-fadeout" : "jst-fadein"
@@ -98,9 +99,9 @@ function fade(dir: boolean) {
document.body.appendChild(overlay)
return new Promise<void>(res => {
setTimeout(() => {
- if (dir) document.body.removeChild(overlay)
+ if (dir && overlay) { document.body.removeChild(overlay); overlay = undefined }
spinner_timeout = setTimeout(() => {
- overlay.append(spinner_element = e("div", { class: "jst-spinner" }, "This is a spinner."))
+ overlay?.append(spinner_element = e("div", { class: "jst-spinner" }, "This is a spinner."))
}, 500)
res()
}, DURATION)
diff --git a/ui/locale/src/lib.rs b/ui/locale/src/lib.rs
index 49e570b..e890e5d 100644
--- a/ui/locale/src/lib.rs
+++ b/ui/locale/src/lib.rs
@@ -13,7 +13,7 @@ macro_rules! languages {
const LANGUAGES: &[(&str, &str)] = &[$(($lang, include_str!(concat!("../../../locale/", $lang, ".ini")))),*];
};
}
-languages!("en", "de");
+languages!("en", "de", "nl", "zh_Hans");
pub static LANG_TABLES: LazyLock<HashMap<&'static str, HashMap<&'static str, &'static str>>> =
LazyLock::new(|| {