From 503f5f3f33e5eccd020d9e22a48c1265754ca728 Mon Sep 17 00:00:00 2001 From: mokurin000 <1348292515a@gmail.com> Date: Sat, 2 Aug 2025 23:52:46 +0800 Subject: [PATCH] refactor: music-db crate --- Cargo.lock | 14 +++++++++++-- Cargo.toml | 3 ++- music_db/Cargo.toml | 18 ++++++++++++++++ .../music_db/mod.rs => music_db/src/lib.rs | 21 ++++++++----------- sdgb-api/Cargo.toml | 6 +----- sdgb-api/src/helper/mod.rs | 3 --- .../title/model/dxrating/conversion/mod.rs | 13 ++++++------ .../src/title/model/get_user_music_api/mod.rs | 4 ++-- .../title/model/get_user_rating_api/mod.rs | 4 ++-- sdgb-cli/src/main.rs | 2 -- utils/export_players.py | 5 +++++ 11 files changed, 57 insertions(+), 36 deletions(-) create mode 100644 music_db/Cargo.toml rename sdgb-api/src/helper/music_db/mod.rs => music_db/src/lib.rs (91%) diff --git a/Cargo.lock b/Cargo.lock index f535d7f..d945420 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -946,6 +946,17 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "music-db" +version = "0.1.0" +dependencies = [ + "rust_decimal", + "rustc-hash", + "serde", + "serde_json", + "spdlog-rs", +] + [[package]] name = "nanorand" version = "0.7.0" @@ -1481,9 +1492,8 @@ dependencies = [ "flate2", "hmac-sha256", "md5", + "music-db", "nyquest", - "rust_decimal", - "rustc-hash", "serde", "serde_json", "snafu", diff --git a/Cargo.toml b/Cargo.toml index e7987ac..6d7b00a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,10 @@ [workspace] -members = ["sdgb-api", "sdgb-cli"] +members = ["music_db", "sdgb-api", "sdgb-cli"] resolver = "3" default-members = ["sdgb-cli"] [workspace.dependencies] +music-db = { path = "./music_db", default-features = false } sdgb-api = { path = "./sdgb-api", default-features = false } spdlog-rs = { version = "0.4.3", default-features = false, features = [ diff --git a/music_db/Cargo.toml b/music_db/Cargo.toml new file mode 100644 index 0000000..7277b9e --- /dev/null +++ b/music_db/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "music-db" +version = "0.1.0" +edition = "2024" + +[dependencies] +rustc-hash = "2.1.1" +rust_decimal = { version = "1.37.2", default-features = false, features = [ + "serde-with-arbitrary-precision", + "macros", +] } + +serde = { workspace = true } +serde_json = { workspace = true } +spdlog-rs = { workspace = true, optional = true } + +[features] +log = ["dep:spdlog-rs"] diff --git a/sdgb-api/src/helper/music_db/mod.rs b/music_db/src/lib.rs similarity index 91% rename from sdgb-api/src/helper/music_db/mod.rs rename to music_db/src/lib.rs index 4e81047..d004c00 100644 --- a/sdgb-api/src/helper/music_db/mod.rs +++ b/music_db/src/lib.rs @@ -1,9 +1,8 @@ -use std::{fs::OpenOptions, io::BufReader, sync::LazyLock, time::SystemTime}; +use std::{fs::OpenOptions, io::BufReader, sync::LazyLock}; use rust_decimal::{Decimal, dec, serde::DecimalFromString}; use rustc_hash::FxHashMap; use serde::Deserialize; -use spdlog::{info, warn}; #[derive(Deserialize)] #[serde(rename_all = "camelCase")] @@ -42,26 +41,24 @@ pub fn query_music_level(music_id: u32, level: u32) -> Option<&'static Level> { } pub static MUSIC_DB: LazyLock> = LazyLock::new(|| { - let time = SystemTime::now(); - info!("loading musicDB..."); - let json = OpenOptions::new() .read(true) .create(false) .open("musicDB.json") - .inspect_err(|e| warn!("failed to load musicDB: {e}")) + .inspect_err(|_e| { + #[cfg(feature = "log")] + spdlog::warn!("failed to load musicDB: {_e}") + }) .ok()?; let buf_reader = BufReader::new(json); let db: Vec = serde_json::from_reader(buf_reader) - .inspect_err(|e| warn!("failed to load musicDB: {e}")) + .inspect_err(|_e| { + #[cfg(feature = "log")] + spdlog::warn!("failed to load musicDB: {_e}") + }) .ok()?; - info!( - "loaded musicDB, cost {}ms", - time.elapsed().unwrap_or_default().as_millis() - ); - Some(db.into_iter().map(|entry| (entry.id, entry)).collect()) }); diff --git a/sdgb-api/Cargo.toml b/sdgb-api/Cargo.toml index 2260fe5..cea2631 100644 --- a/sdgb-api/Cargo.toml +++ b/sdgb-api/Cargo.toml @@ -18,6 +18,7 @@ strum = { workspace = true } tokio = { workspace = true, optional = true } compio = { workspace = true, optional = true } spdlog-rs = { workspace = true } +music-db = { workspace = true } # (de)serialization serde = { workspace = true } @@ -43,8 +44,3 @@ bincode = { version = "2.0.1", optional = true } # magic macro crabtime = { git = "https://github.com/wdanilo/crabtime.git", rev = "2ed856f5" } -rustc-hash = "2.1.1" -rust_decimal = { version = "1.37.2", default-features = false, features = [ - "serde-with-arbitrary-precision", - "macros", -] } diff --git a/sdgb-api/src/helper/mod.rs b/sdgb-api/src/helper/mod.rs index 1894cd1..7744433 100644 --- a/sdgb-api/src/helper/mod.rs +++ b/sdgb-api/src/helper/mod.rs @@ -9,6 +9,3 @@ pub fn level_name(level: u32) -> &'static str { _ => "Unknown", } } - -mod music_db; -pub use music_db::{Level, MusicInfo, query_music, query_music_level, preload_db}; diff --git a/sdgb-api/src/title/model/dxrating/conversion/mod.rs b/sdgb-api/src/title/model/dxrating/conversion/mod.rs index c26600d..7cdb6e4 100644 --- a/sdgb-api/src/title/model/dxrating/conversion/mod.rs +++ b/sdgb-api/src/title/model/dxrating/conversion/mod.rs @@ -1,10 +1,9 @@ -use crate::{ - helper::query_music, - title::model::{ - dxrating::{DxCalculatedEntries, DxLevelName, DxMusicRecord, DxSheetId}, - get_user_music_api::UserMusicDetail, - get_user_rating_api::{MusicRating, UserRating}, - }, +use music_db::query_music; + +use crate::title::model::{ + dxrating::{DxCalculatedEntries, DxLevelName, DxMusicRecord, DxSheetId}, + get_user_music_api::UserMusicDetail, + get_user_rating_api::{MusicRating, UserRating}, }; impl DxCalculatedEntries { diff --git a/sdgb-api/src/title/model/get_user_music_api/mod.rs b/sdgb-api/src/title/model/get_user_music_api/mod.rs index fd4fd9b..c47d429 100644 --- a/sdgb-api/src/title/model/get_user_music_api/mod.rs +++ b/sdgb-api/src/title/model/get_user_music_api/mod.rs @@ -1,11 +1,11 @@ use std::fmt::Display; +use music_db::query_music; +use music_db::query_music_level; use serde::Deserialize; use serde::Serialize; use crate::helper::level_name; -use crate::helper::query_music; -use crate::helper::query_music_level; #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] diff --git a/sdgb-api/src/title/model/get_user_rating_api/mod.rs b/sdgb-api/src/title/model/get_user_rating_api/mod.rs index 1814b90..b15a1cb 100644 --- a/sdgb-api/src/title/model/get_user_rating_api/mod.rs +++ b/sdgb-api/src/title/model/get_user_rating_api/mod.rs @@ -2,12 +2,12 @@ use std::fmt::Display; use bincode::Decode; use bincode::Encode; +use music_db::query_music; +use music_db::query_music_level; use serde::Deserialize; use serde::Serialize; use crate::helper::level_name; -use crate::helper::query_music; -use crate::helper::query_music_level; #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] diff --git a/sdgb-cli/src/main.rs b/sdgb-cli/src/main.rs index ca5bdd8..f1f39af 100644 --- a/sdgb-cli/src/main.rs +++ b/sdgb-cli/src/main.rs @@ -13,7 +13,6 @@ use spdlog::{Level, LevelFilter::MoreSevereEqual, sink::StdStreamSink, terminal_ use sdgb_api::{ all_net::QRCode, auth_lite::{SDGB, SDHJ, delivery_raw}, - helper::preload_db, title::{ MaiVersionExt, Sdgb1_50, methods::APIMethod, @@ -76,7 +75,6 @@ async fn main() -> Result<(), Box> { let human_readable = !machine_readable; let client = ClientBuilder::default().build_async().await?; - preload_db(); // TODO: refactor via enum_dispatch match command { diff --git a/utils/export_players.py b/utils/export_players.py index b54c4ff..b4d33d5 100644 --- a/utils/export_players.py +++ b/utils/export_players.py @@ -62,6 +62,11 @@ def main(): "players.json", "players_pub.json", ) + process( + lambda d: d["userRating"].pop("rating"), + "b50.json", + "b50_pub.json", + ) if __name__ == "__main__":