finished robust info
This commit is contained in:
@@ -173,7 +173,7 @@ impl JellyfinClient {
|
|||||||
("Recursive", recursive),
|
("Recursive", recursive),
|
||||||
("StartIndex", &start_index.to_string()),
|
("StartIndex", &start_index.to_string()),
|
||||||
("Limit", &limit.to_string()),
|
("Limit", &limit.to_string()),
|
||||||
("Fields", "PrimaryImageAspectRatio,SortName,ProductionYear,IndexNumber,ParentIndexNumber,RunTimeTicks,Genres,Studios,Overview,SeriesName"),
|
("Fields", "PrimaryImageAspectRatio,SortName,ProductionYear,IndexNumber,ParentIndexNumber,RunTimeTicks,Genres,Studios,Overview,SeriesName,Album,AlbumArtist,Artists"),
|
||||||
("SortBy", sort_by),
|
("SortBy", sort_by),
|
||||||
("SortOrder", "Ascending"),
|
("SortOrder", "Ascending"),
|
||||||
]);
|
]);
|
||||||
@@ -226,7 +226,7 @@ impl JellyfinClient {
|
|||||||
("UserId", user_id),
|
("UserId", user_id),
|
||||||
("StartIndex", &start_index.to_string()),
|
("StartIndex", &start_index.to_string()),
|
||||||
("Limit", &limit.to_string()),
|
("Limit", &limit.to_string()),
|
||||||
("Fields", "PrimaryImageAspectRatio,SortName,ProductionYear,IndexNumber,ParentIndexNumber,RunTimeTicks,Genres,Studios,Overview,SeriesName"),
|
("Fields", "PrimaryImageAspectRatio,SortName,ProductionYear,IndexNumber,ParentIndexNumber,RunTimeTicks,Genres,Studios,Overview,SeriesName,Album,AlbumArtist,Artists"),
|
||||||
])
|
])
|
||||||
.send()
|
.send()
|
||||||
.map_err(|e| format!("request failed: {e}"))?;
|
.map_err(|e| format!("request failed: {e}"))?;
|
||||||
@@ -353,6 +353,15 @@ pub struct JfItem {
|
|||||||
|
|
||||||
#[serde(rename = "SeriesName")]
|
#[serde(rename = "SeriesName")]
|
||||||
pub series_name: Option<String>,
|
pub series_name: Option<String>,
|
||||||
|
|
||||||
|
#[serde(rename = "Album")]
|
||||||
|
pub album: Option<String>,
|
||||||
|
|
||||||
|
#[serde(rename = "AlbumArtist")]
|
||||||
|
pub album_artist: Option<String>,
|
||||||
|
|
||||||
|
#[serde(rename = "Artists", default)]
|
||||||
|
pub artists: Vec<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize)]
|
#[derive(Deserialize)]
|
||||||
|
|||||||
71
src/main.rs
71
src/main.rs
@@ -976,8 +976,6 @@ fn ensure_loaded_to_end(app: &mut App) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fn ticks_to_runtime_str(ticks: Option<i64>) -> Option<String> {
|
fn ticks_to_runtime_str(ticks: Option<i64>) -> Option<String> {
|
||||||
// Jellyfin ticks are 10,000,000 per second
|
// Jellyfin ticks are 10,000,000 per second
|
||||||
let t = ticks?;
|
let t = ticks?;
|
||||||
@@ -996,6 +994,22 @@ fn ticks_to_runtime_str(ticks: Option<i64>) -> Option<String> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn join_artists(artists: &[String]) -> String {
|
||||||
|
let names: Vec<String> = artists
|
||||||
|
.iter()
|
||||||
|
.map(|s| s.trim().to_string())
|
||||||
|
.filter(|s| !s.is_empty())
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
if names.is_empty() { "-".into() } else { names.join(", ") }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn first_nonempty(opt: &Option<String>) -> Option<String> {
|
||||||
|
opt.as_deref()
|
||||||
|
.map(|s| s.trim())
|
||||||
|
.filter(|s| !s.is_empty())
|
||||||
|
.map(|s| s.to_string())
|
||||||
|
}
|
||||||
|
|
||||||
fn join_genres(genres: &[String]) -> String {
|
fn join_genres(genres: &[String]) -> String {
|
||||||
if genres.is_empty() { "-".into() } else { genres.join(", ") }
|
if genres.is_empty() { "-".into() } else { genres.join(", ") }
|
||||||
@@ -1046,7 +1060,6 @@ fn format_details(it: &core::jellyfin::JfItem) -> String {
|
|||||||
overview_str(&it.overview),
|
overview_str(&it.overview),
|
||||||
),
|
),
|
||||||
|
|
||||||
// Episodes: show SeriesName if present
|
|
||||||
"Episode" => {
|
"Episode" => {
|
||||||
let series = it.series_name.clone().unwrap_or_else(|| "-".into());
|
let series = it.series_name.clone().unwrap_or_else(|| "-".into());
|
||||||
let se = match (it.parent_index_number, it.index_number) {
|
let se = match (it.parent_index_number, it.index_number) {
|
||||||
@@ -1064,14 +1077,42 @@ fn format_details(it: &core::jellyfin::JfItem) -> String {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Music: you asked only Name + Runtime
|
// --- Songs ---
|
||||||
"Audio" => format!(
|
"Audio" => {
|
||||||
"Name: {}\nRuntime: {}",
|
let artist = first_nonempty(&it.album_artist)
|
||||||
it.name,
|
.or_else(|| it.artists.get(0).cloned())
|
||||||
ticks_to_runtime_str(it.run_time_ticks).unwrap_or_else(|| "-".into()),
|
.unwrap_or_else(|| "-".into());
|
||||||
),
|
|
||||||
|
let album = first_nonempty(&it.album).unwrap_or_else(|| "-".into());
|
||||||
|
|
||||||
|
format!(
|
||||||
|
"Name: {}\nRuntime: {}\nArtist: {}\nAlbum: {}\nYear: {}",
|
||||||
|
it.name,
|
||||||
|
ticks_to_runtime_str(it.run_time_ticks).unwrap_or_else(|| "-".into()),
|
||||||
|
artist,
|
||||||
|
album,
|
||||||
|
year_str(it.production_year),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- Albums ---
|
||||||
|
"MusicAlbum" => {
|
||||||
|
let artist = first_nonempty(&it.album_artist)
|
||||||
|
.or_else(|| it.artists.get(0).cloned())
|
||||||
|
.unwrap_or_else(|| "-".into());
|
||||||
|
|
||||||
|
format!(
|
||||||
|
"Name: {}\nRuntime: {}\nArtist: {}\nYear: {}",
|
||||||
|
it.name,
|
||||||
|
ticks_to_runtime_str(it.run_time_ticks).unwrap_or_else(|| "-".into()),
|
||||||
|
artist,
|
||||||
|
year_str(it.production_year),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- Artists ---
|
||||||
|
"MusicArtist" => format!("Name: {}", it.name),
|
||||||
|
|
||||||
// fallback
|
|
||||||
_ => format!(
|
_ => format!(
|
||||||
"Name: {}\nId: {}\nType: {:?}\nYear: {:?}",
|
"Name: {}\nId: {}\nType: {:?}\nYear: {:?}",
|
||||||
it.name, it.id, it.item_type, it.production_year
|
it.name, it.id, it.item_type, it.production_year
|
||||||
@@ -1079,16 +1120,6 @@ fn format_details(it: &core::jellyfin::JfItem) -> String {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fn ui(frame: &mut Frame, app: &App) {
|
fn ui(frame: &mut Frame, app: &App) {
|
||||||
let area = frame.area();
|
let area = frame.area();
|
||||||
let panes = layout(area);
|
let panes = layout(area);
|
||||||
|
|||||||
Reference in New Issue
Block a user