refactor: music-db crate

This commit is contained in:
mokurin000
2025-08-02 23:52:46 +08:00
parent f7b3161847
commit 503f5f3f33
11 changed files with 57 additions and 36 deletions

14
Cargo.lock generated
View File

@@ -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",

View File

@@ -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 = [

18
music_db/Cargo.toml Normal file
View File

@@ -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"]

View File

@@ -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<Option<MusicDB>> = 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<MusicInfo> = 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())
});

View File

@@ -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",
] }

View File

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

View File

@@ -1,10 +1,9 @@
use crate::{
helper::query_music,
title::model::{
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 {

View File

@@ -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")]

View File

@@ -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")]

View File

@@ -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<dyn snafu::Error>> {
let human_readable = !machine_readable;
let client = ClientBuilder::default().build_async().await?;
preload_db();
// TODO: refactor via enum_dispatch
match command {

View File

@@ -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__":