| Crates.io | osynic_serializer |
| lib.rs | osynic_serializer |
| version | 0.1.2 |
| created_at | 2025-03-12 14:12:25.644318+00 |
| updated_at | 2025-08-21 18:49:29.094177+00 |
| description | A osu beatmapsets serializer lib & TUI application based on osynic_osudb |
| homepage | |
| repository | https://github.com/osynicite/osynic_serializer |
| max_upload_size | |
| id | 1589794 |
| size | 267,916 |
osynic_serializer 是一款高效的 osu! 谱面序列化工具,基于 osynic_osudb 开发。支持 FOLDER 和 OSUDB 两种序列化算法,能够快速提取并处理 osu! 谱面数据。
推荐与 osynic_downloader 配合使用,实现完整的谱面管理和同步解决方案。
使用 Cargo 直接安装:
cargo install osynic_serializer
# 克隆仓库
git clone https://github.com/osynicite/osynic_serializer
cd osynic_serializer
# 编译发布版本
cargo build --release
# 可选:安装到本地
cargo install --path .
# 序列化为 songs.json 格式
osynic-sl -t songs -a FOLDER -o ./output
# 序列化为 sets.json 格式
osynic-sl -t sets -a FOLDER -o ./output
# 使用指定 osu! 安装路径
osynic-sl -t songs -p "D:\Games\osu!" -o ./output
# 使用默认 osu! 安装路径(自动检测)
osynic-sl -t songs -o ./output
# 对比并输出本地缺失的谱面集
osynic-sl -t sets -d "./remote/diffSets.json" -o ./output
# 对比并输出本地缺失的单个谱面
osynic-sl -t songs -d "./remote/diffSongs.json" -o ./output
# 导出完整的谱面数据用于备份
osynic-sl -t songs -o ./backup
# 设备A:导出本地谱面列表
osynic-sl -t sets -o ./sync
# 设备B:对比并下载缺失谱面
osynic-sl -t sets -d "./sync/sets_dm.json" -o ./to_download
| 参数 | 简写 | 默认值 | 说明 |
|---|---|---|---|
--algorithm |
-a |
OSUDB |
序列化算法选择 |
--json-type |
-t |
songs |
输出 JSON 格式类型 |
--path |
-p |
自动检测 | osu! 安装目录路径 |
--diff |
-d |
- | 差量对比文件路径 |
--output |
-o |
songs |
输出目录路径 |
--help |
-h |
- | 显示帮助信息 |
--algorithm / -a选择谱面数据的提取方式:
OSUDB (推荐): 从 osu!.db 文件读取,数据最准确FOLDER: 从 Songs 文件夹扫描,适用于无 db 文件的情况--json-type / -t指定输出的 JSON 数据格式:
songs: 包含完整谱面信息的详细格式sets: 仅包含谱面集 ID 的精简格式--path / -p指定 osu! 安装目录,程序会自动寻找:
Songs/ 文件夹(FOLDER 模式)osu!.db 文件(OSUDB 模式)如不指定,程序会尝试自动检测常见安装位置。
--diff / -d提供对比文件进行增量处理:
--json-type 参数一致-t sets)适用于谱面集管理和批量下载:
{
"beatmapset_ids": [
"114514",
"1919810",
"1538879"
]
}
-t songs)包含详细的谱面元数据:
[
{
"song_id": 1985060,
"artist_name": "ヒトリエ",
"mapper_name": "flake",
"song_name": "日常と地球の額縁 (wowaka x 初音ミク Edit)",
"no_video": false
},
{
"song_id": 1997071,
"artist_name": "ナブナ",
"mapper_name": "Ryuusei Aika",
"song_name": "始発とカフカ",
"no_video": false
}
]
创建 sync.bat 用于自动化谱面同步:
@echo off
echo 正在导出本地谱面数据...
osynic-sl -t sets -o ./export
echo 正在对比远程数据...
osynic-sl -t sets -d "./remote/sets.json" -o ./missing
echo 同步完成!请查看 ./missing 目录
pause
# 自动检测并处理多个 osu! 安装
$osuPaths = @(
"C:\Users\$env:USERNAME\AppData\Local\osu!",
"D:\Games\osu!",
"E:\osu!"
)
foreach ($path in $osuPaths) {
if (Test-Path $path) {
Write-Host "处理路径: $path"
osynic-sl -t songs -p $path -o "./backup/$(Split-Path $path -Leaf)"
}
}
OsynicSerializer 不仅是命令行工具,也是功能完整的 Rust 库。
在 Cargo.toml 中添加:
[dependencies]
osynic_serializer = { version = "0.1.2", default-features = false, features = ["cli"] }
use osynic_serializer::commands::{
serialize_by_folder, // 基于 Songs 文件夹序列化
serialize_by_osu_db, // 基于 osu!.db 文件序列化
diff_sets, // 谱面集差量对比
diff_songs, // 谱面差量对比
};
use osynic_serializer::types::{
SongWithMapper, // 单个谱面信息
SongsWithMapper, // 谱面集合
Beatmapsets, // 谱面集 ID 集合
};
use osynic_serializer::commands::{serialize_by_folder, serialize_by_osu_db};
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 方式1:从 Songs 文件夹序列化
let songs_from_folder = serialize_by_folder("/path/to/osu/Songs")?;
println!("找到 {} 个谱面", songs_from_folder.songs.len());
// 方式2:从 osu!.db 序列化
let songs_from_db = serialize_by_osu_db("/path/to/osu")?;
println!("数据库中有 {} 个谱面", songs_from_db.songs.len());
Ok(())
}
use osynic_serializer::commands::{diff_songs, diff_sets};
use osynic_serializer::types::{SongsWithMapper, Beatmapsets};
fn sync_beatmaps() -> Result<(), Box<dyn std::error::Error>> {
// 获取本地谱面数据
let local_songs = serialize_by_osu_db("/path/to/osu")?;
// 加载远程谱面数据
let remote_data = std::fs::read_to_string("remote_songs.json")?;
let remote_songs: SongsWithMapper = serde_json::from_str(&remote_data)?;
// 计算差量
let missing_songs = diff_songs(&remote_songs, &local_songs);
println!("需要下载 {} 个谱面", missing_songs.songs.len());
Ok(())
}
use osynic_serializer::functions::{
check::{check_osu_dir, get_osu_dir},
parse::parse_song_id_list_with_mapper,
storage::marked_save_to,
};
fn custom_workflow() -> Result<(), Box<dyn std::error::Error>> {
// 1. 检查 osu! 安装
if !check_osu_dir() {
eprintln!("未找到 osu! 安装");
return Ok(());
}
let osu_path = get_osu_dir();
println!("检测到 osu! 安装: {}", osu_path);
// 2. 序列化数据
let songs = serialize_by_osu_db(&osu_path)?;
// 3. 提取谱面集 ID
let beatmapset_ids = parse_song_id_list_with_mapper(&songs.songs);
// 4. 保存结果
let json_data = serde_json::to_string_pretty(&beatmapset_ids)?;
marked_save_to("./output", "beatmapsets.json", &json_data)?;
Ok(())
}
可以直接使用底层的 osu!.db 解析库:
// 直接使用 osynic_osudb 的功能
use osynic_serializer::osynic_osudb::*;
# 更新 Rust 到最新版本
rustup update stable
# 检查版本(需要 1.85.0+)
rustc --version
手动指定 osu! 安装路径:
osynic-sl -p "C:\Users\YourName\AppData\Local\osu!" -t songs -o ./output
或者指定包含 Songs 文件夹的任意目录。
OSUDB 模式(推荐):
FOLDER 模式:
差量处理用于找出两个谱面集合之间的差异:
可能原因:
解决方案:
# 尝试重新构建数据库(在 osu! 中按 F5)
# 或使用详细输出查看错误信息
osynic-sl -t songs --verbose
我们欢迎各种形式的贡献!无论是代码、文档、Bug 报告还是功能建议。
# 1. Fork 并克隆仓库
git clone https://github.com/your-username/osynic_serializer
cd osynic_serializer
# 2. 安装开发依赖
cargo build
# 3. 运行测试
cargo test
# 4. 检查代码格式
cargo fmt --check
cargo clippy -- -D warnings
提交 Bug 报告时请包含:
我们特别欢迎以下方面的改进:
特别感谢以下项目和贡献者:
以及所有为本项目贡献代码、报告问题、提出建议的开发者们!
本项目基于 MIT License 开源。
使用 osu! 相关资源时,请遵守:
⭐ 如果这个项目对你有帮助,请给我们一个 Star!
Made with ❤️ by Osynicite