aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2026-03-12 16:54:29 +0100
committermetamuffin <metamuffin@disroot.org>2026-03-12 16:54:29 +0100
commit1fd039e1da489954d4115189877d51b62b8e9d6a (patch)
tree76df48b2d6f4ca30a647e6c3c00c0b14da1cf216
parentb23d8a2f7786119fc49bb2d531618c78344b8357 (diff)
downloadjellything-1fd039e1da489954d4115189877d51b62b8e9d6a.tar
jellything-1fd039e1da489954d4115189877d51b62b8e9d6a.tar.bz2
jellything-1fd039e1da489954d4115189877d51b62b8e9d6a.tar.zst
show tracks in tableHEADmaster
-rw-r--r--locale/en.ini8
-rw-r--r--server/src/routes/admin/import.rs14
-rw-r--r--server/src/routes/node.rs2
-rw-r--r--ui/src/components/node_page.rs56
4 files changed, 66 insertions, 14 deletions
diff --git a/locale/en.ini b/locale/en.ini
index b1b295c..80da660 100644
--- a/locale/en.ini
+++ b/locale/en.ini
@@ -48,6 +48,7 @@ node.watchlist.unset=Remove from Watchlist
node.update_rating=Update Rating
node.credited=Featured
node.similar=Similar Media
+track_quality=Quality
tag.chpt=Chapters
tag.cred.kind.arra=Arranger
@@ -142,6 +143,13 @@ tag.stsz=Size on Filesystem
tag.tag1=Tags
tag.tgln=Tagline
tag.titl=Title
+tag.trak.codc=Codec
+tag.trak.kind.audi=Audio
+tag.trak.kind.text=Subtitle
+tag.trak.kind.unkn=Unknown
+tag.trak.kind.vide=Video
+tag.trak.kind=Type
+tag.trak.name=Name
tag.trak=Tracks
tag.Uadm=Admin
tag.Ulgn=Login
diff --git a/server/src/routes/admin/import.rs b/server/src/routes/admin/import.rs
index 31e7d70..f58901a 100644
--- a/server/src/routes/admin/import.rs
+++ b/server/src/routes/admin/import.rs
@@ -10,10 +10,10 @@ use jellyimport::{
ImportConfig, import_wrap, is_importing,
reporting::{IMPORT_ERRORS, IMPORT_PROGRESS},
};
-use jellyui::{components::admin::AdminImport, tr};
+use jellyui::components::admin::AdminImport;
use rocket::{
get, post,
- response::{Flash, Redirect, content::RawHtml},
+ response::{Redirect, content::RawHtml},
};
use rocket_ws::{Message, Stream, WebSocket};
use std::time::Duration;
@@ -37,10 +37,7 @@ pub async fn r_admin_import(ri: RequestInfo<'_>) -> MyResult<RawHtml<String>> {
}
#[post("/admin/import?<incremental>")]
-pub async fn r_admin_import_post(
- ri: RequestInfo<'_>,
- incremental: bool,
-) -> MyResult<Flash<Redirect>> {
+pub async fn r_admin_import_post(ri: RequestInfo<'_>, incremental: bool) -> MyResult<Redirect> {
ri.require_admin()?;
spawn(async move {
let _ = import_wrap(
@@ -53,10 +50,7 @@ pub async fn r_admin_import_post(
)
.await;
});
- Ok(Flash::success(
- Redirect::to(u_admin_import()),
- tr(ri.lang, "admin.import_success"),
- ))
+ Ok(Redirect::to(u_admin_import()))
}
#[get("/admin/import", rank = 1)]
diff --git a/server/src/routes/node.rs b/server/src/routes/node.rs
index d8d9ba5..506d771 100644
--- a/server/src/routes/node.rs
+++ b/server/src/routes/node.rs
@@ -30,10 +30,10 @@ pub fn r_node(ri: RequestInfo<'_>, slug: &str) -> MyResult<RawHtml<String>> {
..Default::default()
})? {
let n = txn.get(row)?.unwrap();
+ nku = Some(create_nku(txn, row)?);
children = c_children(txn, row, &n)?;
credits = c_credits(txn, &n)?;
credited = c_credited(txn, row)?;
- nku = Some(create_nku(txn, row)?);
}
Ok(())
})?;
diff --git a/ui/src/components/node_page.rs b/ui/src/components/node_page.rs
index 06d8b55..d6aeb33 100644
--- a/ui/src/components/node_page.rs
+++ b/ui/src/components/node_page.rs
@@ -96,9 +96,20 @@ markup::define! {
@if node.has(NO_TRACK.0) {
details {
summary { @tr(ri.lang, "tag.trak") }
- ol { @for track in node.iter(NO_TRACK) {
- li { "track" @track.get(TR_NAME) }
- }}
+ table {
+ tr {
+ th { @tr(ri.lang, "tag.trak.kind") }
+ th { @tr(ri.lang, "tag.trak.name") }
+ th { @tr(ri.lang, "track_quality") }
+ th { @tr(ri.lang, "tag.trak.codc") }
+ }
+ @for track in node.iter(NO_TRACK) { tr {
+ td { @tr(ri.lang, &format!("tag.trak.kind.{}", track.get(TR_KIND).unwrap_or(TRKIND_UNKNOWN))) }
+ td { @track.get(TR_NAME).unwrap_or("") }
+ td { @track_quality(track) }
+ td { @codec_pretty_name(track.get(TR_CODEC).unwrap_or("")) }
+ }}
+ }
}
}
@if let Some(idents) = node.get(NO_IDENTIFIERS) {
@@ -239,3 +250,42 @@ fn external_id_url(key: Tag, value: &str) -> Option<String> {
_ => return None,
})
}
+
+fn codec_pretty_name(s: &str) -> &str {
+ match s {
+ "A_OPUS" => "Opus",
+ "A_VORBIS" => "Vorbis",
+ "V_MPEG4/ISO/AVC" => "AVC",
+ "V_MPEGH/ISO/HEVC" => "HEVC",
+ "D_WEBVTT/SUBTITLES" => "WebVTT",
+ "S_TEXT/ASS" => "ASS",
+ "S_TEXT/UTF8" => "UTF-8 Plain",
+ "S_HDMV/PGS" => "HDMV PGS",
+ "S_VOBSUB" => "VobSub",
+ x if let Some(k) = x.strip_prefix("V_") => k,
+ x if let Some(k) = x.strip_prefix("A_") => k,
+ x => x,
+ }
+}
+
+fn track_quality(track: &Object) -> String {
+ match track.get(TR_KIND).unwrap_or(TRKIND_UNKNOWN) {
+ TRKIND_AUDIO => format!(
+ "{}ch {:.1}kHz",
+ track.get(TR_CHANNELS).unwrap_or(1),
+ track.get(TR_RATE).unwrap_or(0.) / 1000.
+ ),
+ TRKIND_VIDEO => format!(
+ "{}x{} {:.1}fps{}",
+ track.get(TR_PIXEL_WIDTH).unwrap_or(0),
+ track.get(TR_PIXEL_HEIGHT).unwrap_or(0),
+ track.get(TR_RATE).unwrap_or(0.),
+ if let Some(d) = track.get(TR_BIT_DEPTH) {
+ format!(" {d}bit")
+ } else {
+ String::new()
+ },
+ ),
+ _ => "".to_string(),
+ }
+}