LyRiCs(LRC)是一種資料格式,藉由在每行歌詞上加上時間戳記(timestamp),來讓音樂播放器可以在播放音樂的同時,同步將該時間點的歌詞顯示出來。筆者以前用Java實作過MP3標籤格式ID3和APE的函式庫,主要就是為了能夠處理動態歌詞。雖然現在沒什麼在用,但還是整理了以前寫過的程式碼,將動態歌詞的部份重新用Rust程式語言獨立實作出來。
lrc
「lrc」是筆者開發的套件,可以用來處理LyRiCs。不過LyRiCs並沒有一個標準的格式文件存在,因此在實作上要考慮諸多相容性的問題。這個套件僅實作最基本的部份(Simple LRC format)。
Crates.io
Cargo.toml
lrc = "*"
使用方法
從無到有建立動態歌詞
use lrc::{Lyrics, TimeTag, IDTag};
fn main() {
let mut lrc: Lyrics = Lyrics::new();
lrc.metadata.insert(IDTag::from_string("ar", "李聖傑").unwrap());
lrc.metadata.insert(IDTag::from_string("ti", "癡心絕對").unwrap());
lrc.add_timed_line(TimeTag::from_str("00:15.00").unwrap(), "想用一杯Latte把妳灌醉 好讓妳能多愛我一點").unwrap();
lrc.add_timed_line(TimeTag::from_str("00:26.76").unwrap(), "暗戀的滋味 妳不懂這種感覺 早有人陪的妳永遠不會").unwrap();
println!("{}", lrc);
}
讀取現存的動態歌詞
use lrc::{Lyrics, TimeTag};
fn main() {
let mut lrc: Lyrics = Lyrics::from_str(
"[ar: 李聖傑]
[ti: 癡心絕對]
[00:15.00]想用一杯Latte把妳灌醉 好讓妳能多愛我一點
[00:26.76]暗戀的滋味 妳不懂這種感覺 早有人陪的妳永遠不會",
)
.unwrap();
let lyrics_line_at_15th_sec = lrc.find_timed_line_index(TimeTag::new(15000)).unwrap();
println!("{}", lrc.get_timed_lines()[lyrics_line_at_15th_sec].1);
let lyrics_line_at_16th_sec = lrc.find_timed_line_index(TimeTag::new(16000)).unwrap();
println!("{}", lrc.get_timed_lines()[lyrics_line_at_16th_sec].1);
let lyrics_line_at_27th_sec = lrc.find_timed_line_index(TimeTag::new(27000)).unwrap();
println!("{}", lrc.get_timed_lines()[lyrics_line_at_27th_sec].1);
lrc.remove_timed_line(lyrics_line_at_27th_sec);
}