summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDien-Nhung Nguyen <kein@kienlab.com>2026-06-03 22:16:08 +0700
committerDien-Nhung Nguyen <kein@kienlab.com>2026-06-03 22:16:08 +0700
commit8665f113ba3745ce0f09c698d564e2349a820803 (patch)
tree3f1ca625c145757e75ea4e83d12d112a31b75571
-rw-r--r--.gitignore1
-rw-r--r--Cargo.toml13
-rw-r--r--notes2
-rw-r--r--src/main.rs93
-rwxr-xr-xtest.bash17
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"
diff --git a/notes b/notes
new file mode 100644
index 0000000..42404cc
--- /dev/null
+++ b/notes
@@ -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(&params)
+ .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