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);
}