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. --- Cargo.lock | 46 +++++++++++++++++++++++----------------------- Cargo.toml | 3 ++- src/daemon.rs | 22 +++++++++++++++++++--- 3 files changed, 44 insertions(+), 27 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2c284f7..0372809 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,29 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "RSPlayer" +version = "0.8.5" +dependencies = [ + "clap", + "clap_complete", + "cpal", + "ctrlc", + "directories", + "dirs", + "hex", + "libc", + "md-5", + "notify-rust", + "rand 0.10.1", + "reqwest", + "rusqlite", + "serde", + "serde_json", + "symphonia", + "toml", +] + [[package]] name = "alsa" version = "0.11.0" @@ -1946,29 +1969,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "rsp" -version = "0.8.5" -dependencies = [ - "clap", - "clap_complete", - "cpal", - "ctrlc", - "directories", - "dirs", - "hex", - "libc", - "md-5", - "notify-rust", - "rand 0.10.1", - "reqwest", - "rusqlite", - "serde", - "serde_json", - "symphonia", - "toml", -] - [[package]] name = "rsqlite-vfs" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index d40a19b..0b31f88 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "rsp" +name = "RSPlayer" version = "0.8.5" edition = "2024" description = "Rust music player daemon with Unix socket IPC" @@ -9,6 +9,7 @@ keywords = ["music", "player", "daemon", "audio"] categories = ["multimedia", "command-line-utilities"] [lib] +name = "rsp" path = "src/lib.rs" [[bin]] 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