#osu #nom #parser #osynic #osudb

osynic_osudb

osu!db parser for Osynic, refactoring based on osu-db

3 releases

Uses new Rust 2024

new 0.1.2 Mar 13, 2025
0.1.1 Mar 12, 2025
0.1.0 Mar 12, 2025

#6 in #osu

Download history

85 downloads per month
Used in osynic_serializer

MIT license

53KB
1.5K SLoC

Logo逃走啦~

OsynicOsudb

Osynic的osu!db解析部分,基于osu-db重构


中文版本 | English Version

📄 简介

Osynic的osu!db解析部分,基于osu-db重构,主要做了读写分离并改了实体结构,最近把解析部分升级到了nom8,并解决了osu!.db在20250107版本的变更

🌐 相关项目

osynic_serializer 是一款高效的osu!谱面序列化工具,基于osynic_osudb开发,支持FOLDER、OSUDB两种序列化算法;搭配osynic_downloader使用可实现osu!谱面的快速序列化与多设备谱面同步。

osynic_serializer.gif

📦 实体结构

  • entity
    • osu
      • osudb
      • beatmaps
      • fields
        • grade
        • mode
        • modification
        • rank
        • star
        • time
    • collection
      • collection
      • collectiondb
    • scores
      • scores
      • scoresdb
      • fields
        • action
        • button
        • replay

📦 安装

在你的Cargo.toml文件中添加以下依赖:

[dependencies]
osynic_osudb = "0.1.0"

📖 使用

use osynic_osudb::prelude::OsuDB;

fn main() {
    // 将osu!.db文件解析为OsuDB结构体
    let mut osudb = OsuDB::from_file("osu!.db").unwrap();

    // 打印前三个谱面的信息
    for (index, beatmap) in osudb.beatmaps.iter_mut().take(3).enumerate() {
        println!(
            "Song {}: {} - {}",
            index + 1,
            beatmap.artist_unicode.as_ref().unwrap(),
            beatmap.title_unicode.as_ref().unwrap()
        );
        println!("Creator: {}", beatmap.creator.as_ref().unwrap());
        println!("Difficulty: {}", beatmap.difficulty_name.as_ref().unwrap());
        println!("Audio: {}", beatmap.audio.as_ref().unwrap());
        println!("Hash: {}", beatmap.hash.as_ref().unwrap());
        println!("File Name: {}", beatmap.file_name.as_ref().unwrap());
        println!("Status: {:?}", beatmap.status);
        println!("Hitcircle Count: {}", beatmap.hitcircle_count);
        println!("Slider Count: {}", beatmap.slider_count);
        println!("Spinner Count: {}", beatmap.spinner_count);
        println!("Last Modified: {}", beatmap.last_modified);
        println!("Approach Rate: {}", beatmap.approach_rate);
        println!("Circle Size: {}", beatmap.circle_size);
        println!("HP Drain: {}", beatmap.hp_drain);
        println!("Overall Difficulty: {}", beatmap.overall_difficulty);
        println!("---------------------------------");
    }
}

❤️ 鸣谢

本项目的主要实现来源于osu-db这个crate,如果要说我做了什么的话,主要就在项目结构按照自己个人偏好进行的调整了

osynic_osudb是基于osu-db重构的,主要做了读写分离并改了实体结构,最近把解析部分升级到了nom8,并解决了osu!.db在20250107版本的变更

osu-db基于 Unlicense 开源协议,尽管如此,我们也将其项目证书放在了licenses文件夹下

🤝 贡献指南

这个库基本上保留了osu-db的所有功能,但是我的业务需求只需要使用其中的OsuDB解析部分,其他部分是否好使我并没有测试过

所以,如果代码有任何问题,或者你有任何建议,欢迎提交PR或者Issue,我会尽快处理~

如果你想贡献代码,请遵循以下规则:

  • 遵循Rust官方编码规范
  • 新增功能需附带测试用例
  • 提交前运行cargo fmtcargo clippy

📜 开源协议

本项目基于 MIT License 开源,请尊重原作者的著作权。

Dependencies

~2–3MB
~61K SLoC