refactor: music-db crate
This commit is contained in:
14
Cargo.lock
generated
14
Cargo.lock
generated
@@ -946,6 +946,17 @@ dependencies = [
|
|||||||
"windows-sys 0.59.0",
|
"windows-sys 0.59.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "music-db"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"rust_decimal",
|
||||||
|
"rustc-hash",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
|
"spdlog-rs",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nanorand"
|
name = "nanorand"
|
||||||
version = "0.7.0"
|
version = "0.7.0"
|
||||||
@@ -1481,9 +1492,8 @@ dependencies = [
|
|||||||
"flate2",
|
"flate2",
|
||||||
"hmac-sha256",
|
"hmac-sha256",
|
||||||
"md5",
|
"md5",
|
||||||
|
"music-db",
|
||||||
"nyquest",
|
"nyquest",
|
||||||
"rust_decimal",
|
|
||||||
"rustc-hash",
|
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"snafu",
|
"snafu",
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
[workspace]
|
[workspace]
|
||||||
members = ["sdgb-api", "sdgb-cli"]
|
members = ["music_db", "sdgb-api", "sdgb-cli"]
|
||||||
resolver = "3"
|
resolver = "3"
|
||||||
default-members = ["sdgb-cli"]
|
default-members = ["sdgb-cli"]
|
||||||
|
|
||||||
[workspace.dependencies]
|
[workspace.dependencies]
|
||||||
|
music-db = { path = "./music_db", default-features = false }
|
||||||
sdgb-api = { path = "./sdgb-api", default-features = false }
|
sdgb-api = { path = "./sdgb-api", default-features = false }
|
||||||
|
|
||||||
spdlog-rs = { version = "0.4.3", default-features = false, features = [
|
spdlog-rs = { version = "0.4.3", default-features = false, features = [
|
||||||
|
|||||||
18
music_db/Cargo.toml
Normal file
18
music_db/Cargo.toml
Normal 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"]
|
||||||
@@ -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 rust_decimal::{Decimal, dec, serde::DecimalFromString};
|
||||||
use rustc_hash::FxHashMap;
|
use rustc_hash::FxHashMap;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use spdlog::{info, warn};
|
|
||||||
|
|
||||||
#[derive(Deserialize)]
|
#[derive(Deserialize)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[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(|| {
|
pub static MUSIC_DB: LazyLock<Option<MusicDB>> = LazyLock::new(|| {
|
||||||
let time = SystemTime::now();
|
|
||||||
info!("loading musicDB...");
|
|
||||||
|
|
||||||
let json = OpenOptions::new()
|
let json = OpenOptions::new()
|
||||||
.read(true)
|
.read(true)
|
||||||
.create(false)
|
.create(false)
|
||||||
.open("musicDB.json")
|
.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()?;
|
.ok()?;
|
||||||
let buf_reader = BufReader::new(json);
|
let buf_reader = BufReader::new(json);
|
||||||
|
|
||||||
let db: Vec<MusicInfo> = serde_json::from_reader(buf_reader)
|
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()?;
|
.ok()?;
|
||||||
|
|
||||||
info!(
|
|
||||||
"loaded musicDB, cost {}ms",
|
|
||||||
time.elapsed().unwrap_or_default().as_millis()
|
|
||||||
);
|
|
||||||
|
|
||||||
Some(db.into_iter().map(|entry| (entry.id, entry)).collect())
|
Some(db.into_iter().map(|entry| (entry.id, entry)).collect())
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -18,6 +18,7 @@ strum = { workspace = true }
|
|||||||
tokio = { workspace = true, optional = true }
|
tokio = { workspace = true, optional = true }
|
||||||
compio = { workspace = true, optional = true }
|
compio = { workspace = true, optional = true }
|
||||||
spdlog-rs = { workspace = true }
|
spdlog-rs = { workspace = true }
|
||||||
|
music-db = { workspace = true }
|
||||||
|
|
||||||
# (de)serialization
|
# (de)serialization
|
||||||
serde = { workspace = true }
|
serde = { workspace = true }
|
||||||
@@ -43,8 +44,3 @@ bincode = { version = "2.0.1", optional = true }
|
|||||||
|
|
||||||
# magic macro
|
# magic macro
|
||||||
crabtime = { git = "https://github.com/wdanilo/crabtime.git", rev = "2ed856f5" }
|
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",
|
|
||||||
] }
|
|
||||||
|
|||||||
@@ -9,6 +9,3 @@ pub fn level_name(level: u32) -> &'static str {
|
|||||||
_ => "Unknown",
|
_ => "Unknown",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mod music_db;
|
|
||||||
pub use music_db::{Level, MusicInfo, query_music, query_music_level, preload_db};
|
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
use crate::{
|
use music_db::query_music;
|
||||||
helper::query_music,
|
|
||||||
title::model::{
|
use crate::title::model::{
|
||||||
dxrating::{DxCalculatedEntries, DxLevelName, DxMusicRecord, DxSheetId},
|
dxrating::{DxCalculatedEntries, DxLevelName, DxMusicRecord, DxSheetId},
|
||||||
get_user_music_api::UserMusicDetail,
|
get_user_music_api::UserMusicDetail,
|
||||||
get_user_rating_api::{MusicRating, UserRating},
|
get_user_rating_api::{MusicRating, UserRating},
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
impl DxCalculatedEntries {
|
impl DxCalculatedEntries {
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
use std::fmt::Display;
|
use std::fmt::Display;
|
||||||
|
|
||||||
|
use music_db::query_music;
|
||||||
|
use music_db::query_music_level;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
|
|
||||||
use crate::helper::level_name;
|
use crate::helper::level_name;
|
||||||
use crate::helper::query_music;
|
|
||||||
use crate::helper::query_music_level;
|
|
||||||
|
|
||||||
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
|
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
|
|||||||
@@ -2,12 +2,12 @@ use std::fmt::Display;
|
|||||||
|
|
||||||
use bincode::Decode;
|
use bincode::Decode;
|
||||||
use bincode::Encode;
|
use bincode::Encode;
|
||||||
|
use music_db::query_music;
|
||||||
|
use music_db::query_music_level;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
|
|
||||||
use crate::helper::level_name;
|
use crate::helper::level_name;
|
||||||
use crate::helper::query_music;
|
|
||||||
use crate::helper::query_music_level;
|
|
||||||
|
|
||||||
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
|
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ use spdlog::{Level, LevelFilter::MoreSevereEqual, sink::StdStreamSink, terminal_
|
|||||||
use sdgb_api::{
|
use sdgb_api::{
|
||||||
all_net::QRCode,
|
all_net::QRCode,
|
||||||
auth_lite::{SDGB, SDHJ, delivery_raw},
|
auth_lite::{SDGB, SDHJ, delivery_raw},
|
||||||
helper::preload_db,
|
|
||||||
title::{
|
title::{
|
||||||
MaiVersionExt, Sdgb1_50,
|
MaiVersionExt, Sdgb1_50,
|
||||||
methods::APIMethod,
|
methods::APIMethod,
|
||||||
@@ -76,7 +75,6 @@ async fn main() -> Result<(), Box<dyn snafu::Error>> {
|
|||||||
let human_readable = !machine_readable;
|
let human_readable = !machine_readable;
|
||||||
|
|
||||||
let client = ClientBuilder::default().build_async().await?;
|
let client = ClientBuilder::default().build_async().await?;
|
||||||
preload_db();
|
|
||||||
|
|
||||||
// TODO: refactor via enum_dispatch
|
// TODO: refactor via enum_dispatch
|
||||||
match command {
|
match command {
|
||||||
|
|||||||
@@ -62,6 +62,11 @@ def main():
|
|||||||
"players.json",
|
"players.json",
|
||||||
"players_pub.json",
|
"players_pub.json",
|
||||||
)
|
)
|
||||||
|
process(
|
||||||
|
lambda d: d["userRating"].pop("rating"),
|
||||||
|
"b50.json",
|
||||||
|
"b50_pub.json",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
Reference in New Issue
Block a user