perf: speed-up musicDB load

This commit is contained in:
mokurin000
2025-08-01 03:50:36 +08:00
parent 68e8a6e005
commit 7fe64ac4cd
3 changed files with 27 additions and 5 deletions

View File

@@ -4,12 +4,13 @@ use nyquest::{AsyncClient, Body, Request, header::USER_AGENT};
mod model; mod model;
use model::{GetResponse, GetUserId}; use model::{GetResponse, GetUserId};
use serde::Serialize;
pub struct QRCode<'a> { pub struct QRCode<'a> {
pub qrcode_content: &'a str, pub qrcode_content: &'a str,
} }
#[derive(Debug, snafu::Snafu)] #[derive(Debug, snafu::Snafu, Serialize)]
pub enum QRLoginError { pub enum QRLoginError {
#[snafu(display("QRCode expired [10mins]"))] #[snafu(display("QRCode expired [10mins]"))]
QRCodeExpired10, QRCodeExpired10,
@@ -23,13 +24,17 @@ pub enum QRLoginError {
#[snafu(context(false))] #[snafu(context(false))]
#[snafu(display("request error: {source}"))] #[snafu(display("request error: {source}"))]
NyquestError { NyquestError {
#[serde(skip)]
source: nyquest::Error, source: nyquest::Error,
#[serde(skip)]
backtrace: Backtrace, backtrace: Backtrace,
}, },
#[snafu(context(false))] #[snafu(context(false))]
JSONError { JSONError {
#[serde(skip)]
source: serde_json::error::Error, source: serde_json::error::Error,
#[serde(skip)]
backtrace: Backtrace, backtrace: Backtrace,
}, },
} }

View File

@@ -1,4 +1,4 @@
use std::{fs::OpenOptions, sync::LazyLock}; use std::{fs::OpenOptions, io::BufReader, sync::LazyLock, time::SystemTime};
use rust_decimal::{Decimal, dec, serde::DecimalFromString}; use rust_decimal::{Decimal, dec, serde::DecimalFromString};
use rustc_hash::FxHashMap; use rustc_hash::FxHashMap;
@@ -26,6 +26,7 @@ pub struct Level {
type MusicDB = FxHashMap<u32, MusicInfo>; type MusicDB = FxHashMap<u32, MusicInfo>;
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..."); info!("loading musicDB...");
let json = OpenOptions::new() let json = OpenOptions::new()
@@ -34,11 +35,17 @@ pub static MUSIC_DB: LazyLock<Option<MusicDB>> = LazyLock::new(|| {
.open("musicDB.json") .open("musicDB.json")
.inspect_err(|e| warn!("failed to load musicDB: {e}")) .inspect_err(|e| warn!("failed to load musicDB: {e}"))
.ok()?; .ok()?;
let buf_reader = BufReader::new(json);
let db: Vec<MusicInfo> = serde_json::from_reader(json) let db: Vec<MusicInfo> = serde_json::from_reader(buf_reader)
.inspect_err(|e| warn!("failed to load musicDB: {e}")) .inspect_err(|e| 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())
}); });

View File

@@ -1,4 +1,7 @@
use std::sync::atomic::{AtomicBool, Ordering}; use std::{
io::stdout,
sync::atomic::{AtomicBool, Ordering},
};
use nyquest_preset::nyquest::ClientBuilder; use nyquest_preset::nyquest::ClientBuilder;
use palc::Parser; use palc::Parser;
@@ -116,10 +119,17 @@ async fn main() -> Result<(), Box<dyn snafu::Error>> {
} }
commands::Commands::QRLogin { ref qrcode_content } => { commands::Commands::QRLogin { ref qrcode_content } => {
let qrcode = QRCode { qrcode_content }; let qrcode = QRCode { qrcode_content };
match qrcode.login(&client).await { let resp = qrcode.login(&client).await;
match &resp {
Ok(user_id) => info!("login succeed: {user_id}"), Ok(user_id) => info!("login succeed: {user_id}"),
Err(e) => error!("login failed: {e}"), Err(e) => error!("login failed: {e}"),
} }
if !human_readable {
let lock = stdout().lock();
serde_json::to_writer_pretty(lock, &resp)?;
}
} }
commands::Commands::AuthLite { title_ver, variant } => { commands::Commands::AuthLite { title_ver, variant } => {