diff options
| author | Dien-Nhung Nguyen <kein@kienlab.com> | 2026-06-03 22:16:08 +0700 |
|---|---|---|
| committer | Dien-Nhung Nguyen <kein@kienlab.com> | 2026-06-03 22:16:08 +0700 |
| commit | 8665f113ba3745ce0f09c698d564e2349a820803 (patch) | |
| tree | 3f1ca625c145757e75ea4e83d12d112a31b75571 | |
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | Cargo.toml | 13 | ||||
| -rw-r--r-- | notes | 2 | ||||
| -rw-r--r-- | src/main.rs | 93 | ||||
| -rwxr-xr-x | test.bash | 17 |
5 files changed, 126 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..f0d9f09 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "lrcget-rs" +version = "0.1.0" +edition = "2024" + +[dependencies] +reqwest = {version = "0.13.2", features = ["blocking", "query", "json"]} +serde = {version = "1.0.228", features = ["derive"]} +serde_json = "1.0.149" +tokio = { version = "1.47.4", features = ["full"] } + +[dependencies.taglib] +git = "https://github.com/ebassi/taglib-rust" @@ -0,0 +1,2 @@ +flexible search stragy: if there is no result for a specific query pattern, then +try another less stricted query pattern, and so on.
\ No newline at end of file diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..c3540f0 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,93 @@ +extern crate taglib; + +use std::env; +use serde::Serialize; + +#[derive(Serialize)] +struct Tags { + track_name: String, + artist_name: String, + album_name: String, + // duration: i32, +} + +impl Default for Tags { + fn default() -> Self { + Tags{ + track_name: "".to_string(), + artist_name: "".to_string(), + album_name: "".to_string() + } + } +} + +fn get_tag(file: taglib::File) -> Result<Tags, taglib::FileError> { + + // *** filenae *** + // println!("*** {} ***", file.audioproperties().); + // params.clear(); + + match file.tag() { + Ok(t) => { + println!("--- TAG ---"); + println!("title - {}", t.title().unwrap_or_default()); + println!("artist - {}", t.artist().unwrap_or_default()); + println!("album - {}", t.album().unwrap_or_default()); + // println!("duration- {}", t.duration().unwrap_or_default()); + + let params = Tags { + track_name: t.title().unwrap_or_default(), + artist_name: t.artist().unwrap_or_default(), + album_name: t.album().unwrap_or_default(), + }; + + return Ok(params); + } + Err(e) => { + return Err(e); + } + } +} + +#[tokio::main] +async fn main() -> Result<(), reqwest::Error> { + let args: Vec<String> = env::args().collect(); + let client = reqwest::Client::new(); + + for i in 1..args.len() { + let ref arg = args[i]; + let file = match taglib::File::new(arg) { + Ok(f) => f, + Err(e) => { + println!("Invalid file {} (error: {:?})", arg, e); + continue; + } + }; + + let params = match get_tag(file) { + Ok(p) => p, + Err(e) => { + println!("No available tags for {} (error: {:?})", arg, e); + continue; + } + }; + + let res = client + .get("https://lrclib.net/api/get") + .query(¶ms) + .send() + .await?; + + println!("compiled url: {:?}", res.url().as_str()); + let json_value = res.json::<serde_json::Value>().await?; + // println!("{}", serde_json::to_string_pretty(&json_value).unwrap()); + println!("plain lyrics: {}", json_value["plainLyrics"]); + + // TODO: + // The current method sends HTTP requests sequentially, one after another. + // This can be slower if you have many files, as each request waits for the previous one to finish. + // To speed it up, you could collect all futures and use `futures::future::join_all` to run them concurrently. + } + + Ok(()) +} diff --git a/test.bash b/test.bash new file mode 100755 index 0000000..3da78bc --- /dev/null +++ b/test.bash @@ -0,0 +1,17 @@ + +set -x + +track_name="I Want to Live" +artist_name="Borislav Slavov" +album_name="Baldur's Gate 3 (Original Game Soundtrack)" +duration="233" + +curl -v --get \ +--data-urlencode "track_name=$track_name" \ +--data-urlencode "artist_name=$artist_name" \ +'https://lrclib.net/api/get' +# --data-urlencode "album_name=$album_name" \ +# --data-urlencode "duration=$duration" \ + + +# curl 'https://lrclib.net/api/get?artist_name=Borislav+Slavov&track_name=I+Want+to+Live&album_name=Baldur%27s+Gate+3+(Original+Game+Soundtrack)&duration=233'
\ No newline at end of file |