From f93e49596be3d4e5e329fad301647e5d6f40dfa7 Mon Sep 17 00:00:00 2001 From: cwj3rcb Date: Sun, 15 Feb 2026 02:01:19 -0600 Subject: [PATCH] COMPLETED MPV INFO STREAMING --- src/main.rs | 73 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 48 insertions(+), 25 deletions(-) diff --git a/src/main.rs b/src/main.rs index a77655e..697d120 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2024,13 +2024,25 @@ fn render_mpv_panel(frame: &mut Frame, app: &App, area: Rect) { let bar_line = mpv_bar_line(safe_w, ratio, pct); frame.render_widget(Paragraph::new(bar_line), c3); - let pct = st.percent.unwrap_or(0.0); + let cur_secs = st.time_pos.unwrap_or(0.0); + let dur_secs = st.duration.unwrap_or(0.0); + let cur = st.time_pos.map(fmt_hms).unwrap_or("--:--".into()); let dur = st.duration.map(fmt_hms).unwrap_or("--:--".into()); - frame.render_widget(Paragraph::new(format!("{cur} / {dur} ({pct:0.1}%)")), c4); + + let remaining = if dur_secs > 0.0 && cur_secs <= dur_secs { + fmt_hms(dur_secs - cur_secs) + } else { + "--:--".into() + }; + + frame.render_widget( + Paragraph::new(format!("{cur} / {dur} ({remaining} remaining)")), + c4, + ); let controls = - "p play P autoplay Space pause a audio s subs v sub vis f fullscreen x stop / search q quit"; + "Space: pause x: stop f: fullscreen\na: audio s: subs v: sub vis"; frame.render_widget(Paragraph::new(controls).wrap(Wrap { trim: true }), c5); } @@ -2040,30 +2052,43 @@ fn mpv_bar_line(width: u16, ratio: f64, pct: f64) -> String { return String::new(); } - // If super narrow, just show percentage. - if w < 8 { - return format!("{:>4.0}%", pct.clamp(0.0, 100.0)); - } - let prefix = "mpv "; - let mut suffix = format!(" {:>5.1}%", pct.clamp(0.0, 100.0)); - let suffix_len = suffix.len(); + let pct_text = format!("{:>5.1}%", pct.clamp(0.0, 100.0)); // " 43.3%" + let pct_area_min = pct_text.len().saturating_add(2); // a little breathing room - // If we can't fit the suffix, drop it. - let bar_space = if prefix.len() + 2 + suffix_len <= w { - w - prefix.len() - suffix_len - } else { - suffix.clear(); - w - prefix.len() - }; - - // Need at least room for "[]" - if bar_space < 2 { - return format!("{prefix}{:>4.0}%", pct.clamp(0.0, 100.0)); + // If we're super narrow, just show percent. + if w <= prefix.len() + pct_text.len() + 1 { + return format!("{prefix}{pct_text}"); } - let bar = unicode_progress_bar(bar_space, ratio); - format!("{prefix}{bar}{suffix}") + // Reserve a right-side "pct area" if possible; otherwise shrink it. + let avail_after_prefix = w - prefix.len(); + let pct_area = pct_area_min.min(avail_after_prefix.saturating_sub(3)); // keep some room for a bar + + // Bar gets the rest. + let mut bar_w = avail_after_prefix.saturating_sub(pct_area); + + // Ensure the bar is at least wide enough for "[]". + if bar_w < 2 { + bar_w = 2; + } + + let bar = unicode_progress_bar(bar_w, ratio); + + // Whatever remains after prefix+bar becomes the pct area (actual). + let pct_area_actual = w.saturating_sub(prefix.len() + bar.len()); + let mut pct_buf = vec![' '; pct_area_actual]; + + // Center pct_text inside that pct area + if pct_area_actual >= pct_text.len() { + let start = (pct_area_actual - pct_text.len()) / 2; + for (i, ch) in pct_text.chars().enumerate() { + pct_buf[start + i] = ch; + } + } + + let pct_field: String = pct_buf.into_iter().collect(); + format!("{prefix}{bar}{pct_field}") } @@ -2112,8 +2137,6 @@ fn unicode_progress_bar(width: usize, ratio: f64) -> String { s } - - struct Panes { top: Rect, left_main: Rect,