| Crates.io | osynic_osudb |
| lib.rs | osynic_osudb |
| version | 0.1.3 |
| created_at | 2025-03-12 14:09:51.772294+00 |
| updated_at | 2025-08-21 18:01:53.265057+00 |
| description | osu!db parser for Osynic, refactoring based on osu-db |
| homepage | |
| repository | https://github.com/osynicite/osynic_osudb |
| max_upload_size | |
| id | 1589791 |
| size | 230,668 |
🎵 高性能的 osu! 数据库解析库 🎵
基于 osu-db 重构,支持最新版本,提供现代化的 Rust API
🌐 语言版本: 中文版本 | English Version
OsynicOsudb 是一个高性能的 osu! 数据库解析库,专为现代 Rust 应用程序设计。本项目基于优秀的 osu-db 库重构而来,在保持原有功能的基础上进行了大量优化和改进。
更多关于 osu! 数据库文件结构的信息,请参考:Legacy Database File Structure
高效的 osu! 谱面序列化工具,提供以下特性:

智能谱面下载器,支持:
本项目采用模块化设计,主要包含以下实体结构:
📁 entity/
├── 🎵 osu/ # osu! 核心数据
│ ├── osudb.rs # 主数据库文件处理
│ ├── beatmap.rs # 谱面信息实体
│ └── field/ # 字段定义
│ ├── grade.rs # 成绩等级
│ ├── mode.rs # 游戏模式
│ ├── modification.rs # 模组(Mods)
│ ├── rank.rs # 排名信息
│ ├── star.rs # 星级难度
│ └── time.rs # 时间相关
├── 📚 collection/ # 收藏夹数据
│ ├── collection.rs # 单个收藏夹
│ └── collectiondb.rs # 收藏夹数据库
└── 🏆 scores/ # 成绩数据
├── scores.rs # 成绩记录
├── scoresdb.rs # 成绩数据库
└── field/ # 成绩相关字段
├── action.rs # 操作类型
├── button.rs # 按键信息
└── replay.rs # 回放数据
在您的 Cargo.toml 文件中添加以下依赖:
[dependencies]
osynic_osudb = "0.1.3"
use osynic_osudb::prelude::OsuDB;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 从文件加载 osu! 数据库
let mut osudb = OsuDB::from_file("osu!.db")?;
println!("📊 数据库统计信息:");
println!("🎵 总谱面数: {}", osudb.beatmaps.len());
println!("👤 玩家名称: {}", osudb.player_name.as_ref().unwrap_or(&"未知".to_string()));
// 遍历并显示前 3 个谱面的详细信息
for (index, beatmap) in osudb.beatmaps.iter().take(3).enumerate() {
println!("\n🎼 谱面 #{}", index + 1);
println!(" 🎨 艺术家: {}", beatmap.artist_unicode.as_ref().unwrap_or(&"N/A".to_string()));
println!(" 📝 标题: {}", beatmap.title_unicode.as_ref().unwrap_or(&"N/A".to_string()));
println!(" 👤 制作者: {}", beatmap.creator.as_ref().unwrap_or(&"N/A".to_string()));
println!(" ⭐ 难度: {}", beatmap.difficulty_name.as_ref().unwrap_or(&"N/A".to_string()));
println!(" 🎵 音频文件: {}", beatmap.audio.as_ref().unwrap_or(&"N/A".to_string()));
println!(" 🔑 MD5 哈希: {}", beatmap.hash.as_ref().unwrap_or(&"N/A".to_string()));
println!(" 📁 文件名: {}", beatmap.file_name.as_ref().unwrap_or(&"N/A".to_string()));
println!(" 📊 状态: {:?}", beatmap.status);
// 谱面统计信息
println!(" 🎯 统计信息:");
println!(" 🔵 圆圈数: {}", beatmap.hitcircle_count);
println!(" 🔗 滑条数: {}", beatmap.slider_count);
println!(" 🌀 转盘数: {}", beatmap.spinner_count);
// 难度参数
println!(" ⚙️ 难度参数:");
println!(" 📏 缩圈速度 (AR): {:.1}", beatmap.approach_rate);
println!(" 🎯 圆圈大小 (CS): {:.1}", beatmap.circle_size);
println!(" 💔 掉血速度 (HP): {:.1}", beatmap.hp_drain);
println!(" 🎚️ 总体难度 (OD): {:.1}", beatmap.overall_difficulty);
println!(" ⏰ 最后修改: {}", beatmap.last_modified);
println!(" {}", "─".repeat(50));
}
Ok(())
}
use osynic_osudb::prelude::*;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let osudb = OsuDB::from_file("osu!.db")?;
// 筛选特定条件的谱面
let hard_beatmaps: Vec<_> = osudb.beatmaps
.iter()
.filter(|beatmap| beatmap.overall_difficulty > 5.0)
.collect();
println!("🔥 高难度谱面 (OD > 5.0): {} 个", hard_beatmaps.len());
// 按艺术家分组统计
use std::collections::HashMap;
let mut artist_count: HashMap<String, usize> = HashMap::new();
for beatmap in &osudb.beatmaps {
if let Some(artist) = &beatmap.artist_unicode {
*artist_count.entry(artist.clone()).or_insert(0) += 1;
}
}
// 显示谱面数最多的前 5 个艺术家
let mut sorted_artists: Vec<_> = artist_count.iter().collect();
sorted_artists.sort_by(|a, b| b.1.cmp(a.1));
println!("\n🎨 谱面数量最多的艺术家:");
for (artist, count) in sorted_artists.iter().take(5) {
println!(" {} - {} 个谱面", artist, count);
}
Ok(())
}
本项目的核心实现基于优秀的开源项目 osu-db。我们在此基础上进行了以下改进:
licenses/ 目录下)我们感谢所有为开源社区做出贡献的开发者们! 🙏
我们热烈欢迎社区贡献!本项目保留了 osu-db 的所有核心功能,但目前主要专注于 OsuDB 解析功能的稳定性和性能优化。
基本流程:
Fork 本仓库
创建特性分支:git checkout -b feature/amazing-feature
遵循代码规范:
# 运行开发检查
make quick # 快速检查(编译 + 格式 + Clippy)
make pre-commit # 提交前检查(包含测试)
# 或者单独运行
cargo fmt --all # 代码格式化
cargo clippy --all-features -- -D warnings # 代码检查
cargo test --all-features # 运行测试
提交更改:git commit -m 'Add some amazing feature'
推送分支:git push origin feature/amazing-feature
创建 Pull Request
感谢您考虑为 OsynicOsudb 做出贡献!每一个 PR 和 Issue 都是对项目的宝贵贡献。 ✨
本项目采用 MIT License 开源协议,这意味着您可以自由地:
使用条件:
⭐ 如果这个项目对您有帮助,请给我们一个 Star! ⭐
您的支持是我们持续改进的动力 💪
🌟 GitHub 仓库 | 📦 Crates.io | 📚 文档 | 💬 Discord