#replay #parser #loader #open #bs #beat-saber #beat-leader

bsor

BS Open Replay (bsor) 加载器

4 个版本 (2 个重大更新)

0.3.0 2023年1月17日
0.2.1 2023年1月14日
0.2.0 2023年1月13日
0.1.1 2023年1月11日
0.1.0 2023年1月11日

#16 in #replay

GPL-3.0-or-later

85KB
2K SLoC

rust-bsor

BS Open Replay Rust 解析器

免责声明:这是一个 Rust 学习项目,所以可能存在错误和非惯用代码

已知限制

当前版本不支持由非常旧的 Beat Leader 模组保存的、不符合 BL Open Replays 规范的回放(错误的 utf8 字符串编码)。已添加针对此边缘情况的失败测试(目前忽略),可能在 0.4.0 版本中实现。

安装

在您的项目目录中运行以下 Cargo 命令

cargo add bsor

或添加以下行到您的 [dependencies] 部分 Cargo.toml

bsor = "0.3"

用法

将整个回放加载到内存中

use bsor::prelude::*;
use std::fs::File;
use std::io::BufReader;

fn main() {
    let mut br = BufReader::new(File::open("example.bsor").unwrap());

    let replay = Replay::load(&mut br).unwrap();

    println!("{:#?}", replay);
}

由于您可能很少需要完整的回放结构(尤其是帧块),同时希望保持内存使用量低,还可以选择仅加载选定的块(请注意,标题和信息块始终加载)。

注意:与需要任何 Read 读取器作为参数的 Replay::load() 不同,ParsedReplay::parse() 需要 Read + Seek 读取器

use bsor::prelude::*;
use std::fs::File;
use std::io::BufReader;

fn main() {
    let mut br = BufReader::new(File::open("example.bsor").unwrap());

    let replay_index = ReplayIndex::index(br).unwrap();
    
    let notes = replay_index.notes.load(br).unwrap();
    
    println!(
        "Info: {:#?}\nNotes count: {:#?}",
        replay_index.info,
        notes.len()
    );

    if !notes.is_empty() {
        let notes_count = notes.len();
        let idx = notes_count / 2;
        println!(
            "Note[{}] = {:#?}",
            idx, notes[idx]
        );
    } else {
        println!("Replay contains no notes 🤔");
    }
}

内存节省可能非常显著,例如,对于平均大小的 1375kB 回放

内存使用
整个回放 1383kB
标题 + 信息 9kB
1255kB
注意 137kB

测试

该软件包根据 BL Open Replay 规范进行了全面测试,但请注意,实际的回放可能与其略有不同,例如,BL 模块的较旧版本错误地编码了 utf8 字符串。如果您遇到软件包无法读取的回放,请在 GitHub 问题 中报告,并提供链接。

无运行时依赖