From 3aea522b0969e0d41cb3d0eec737563518dfe861 Mon Sep 17 00:00:00 2001 From: salmonik Date: Sun, 7 Jun 2026 21:56:40 +0300 Subject: change lrc lyrics display. --- src/daemon.rs | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) (limited to 'src/daemon.rs') diff --git a/src/daemon.rs b/src/daemon.rs index 0590f71..a0de698 100644 --- a/src/daemon.rs +++ b/src/daemon.rs @@ -523,14 +523,21 @@ fn handle_lyrics_stream(stream: &mut UnixStream, audio: &Arc) { return; } + let mut last_idx = None; + let mut prev_line_count = 0; loop { let pos = audio.position(); let current_idx = lyrics.iter().rposition(|l| l.time <= pos).unwrap_or(0); + if last_idx == Some(current_idx) { + thread::sleep(Duration::from_millis(100)); + continue; + } + last_idx = Some(current_idx); + let start = current_idx.saturating_sub(1); let end = (current_idx + 3).min(lyrics.len()); let mut output = String::new(); - output.push_str("\x1b[2J\x1b[H"); for (idx, l) in lyrics.iter().enumerate().take(end).skip(start) { if idx == current_idx { output.push_str(&format!(" > {}\n", l.text)); @@ -538,13 +545,22 @@ fn handle_lyrics_stream(stream: &mut UnixStream, audio: &Arc) { output.push_str(&format!(" {}\n", l.text)); } } - if stream.write_all(output.as_bytes()).is_err() { + let line_count = output.lines().count(); + let mut frame = String::new(); + if prev_line_count > 0 { + frame.push_str(&format!("\x1b[{}A\x1b[1B", prev_line_count)); + } else { + frame.push_str(&format!("\x1b[2K")); + } + frame.push_str(&output); + if stream.write_all(frame.as_bytes()).is_err() { break; } if stream.flush().is_err() { break; } - thread::sleep(Duration::from_millis(200)); + prev_line_count = line_count; + thread::sleep(Duration::from_millis(100)); } } -- cgit v1.2.3