Skip to main content

A Python wrapper for osu! tools using pythonnet

Project description

osu-tools-py

PyPI License

中文说明

A high-performance Python wrapper for ppy/osu-tools, powered by pythonnet.

This library allows you to calculate Performance Points (PP), Star Ratings (SR), and other difficulty attributes for osu! beatmaps directly from Python. It embeds the official C# DLLs (compiled from osu!lazer), ensuring results are identical to the official game algorithms.

Features:

  • 🚀 Accurate: Uses the actual C# code from osu!lazer for calculations.
  • 📦 Batteries Included: Comes with pre-compiled DLLs (no need to compile C# yourself).
  • 🖥️ Cross-Platform: Supports Windows, Linux, and macOS (Intel & Apple Silicon/M1/M2).
  • 🧩 Type Safe: Fully typed Python API with data classes.

📋 Prerequisites

Before installing the Python package, you must have the .NET 8 Runtime installed on your system.

📦 Installation

pip install osu-tools-py

🚀 Quick Start

1. Calculate osu!stable PP

To get PP values that match the official osu! website (osu!stable), you must follow two rules:

  1. Add the "CL" (Classic) mod to your mod list.
  2. Provide a legacy_total_score (any value > 0).
from osu_tools import OsuCalculator

# Initialize (loads .NET runtime)
calc = OsuCalculator()

# Example: Calculate Max PP for HDDT on Standard Mode
result = calc.calculate(
    file_path="beatmaps/12345.osu",
    mode=0,
    # Rule 1: Always include "CL" for Stable calculations
    mods=["HD", "DT", "CL"], 
    acc=100.0,
    # Rule 2: Provide a legacy score > 0 to enable Stable physics/scoring
    legacy_total_score=1000000 
)

if result.is_success:
    print(f"Stars: {result.stars:.2f}")
    print(f"PP:    {result.pp:.2f}")
    print(f"Aim:   {result.pp_aim:.2f}")
    print(f"Speed: {result.pp_speed:.2f}")
else:
    print(f"Error: {result.error}")

2. Calculate Real Score (from Replay/API)

When calculating a specific score for osu!stable, pass the hit statistics and ensure you include the Stable compatibility flags.

# Real stats from a score
stats = {
    'great': 450,
    'ok': 12,
    'meh': 1,
    'miss': 2
}

result = calc.calculate(
    file_path="beatmaps/12345.osu",
    mode=0,
    mods=["HD", "CL"], # Don't forget CL!
    combo=850,
    statistics=stats,
    legacy_total_score=1000000 # Required for Stable logic
)

print(f"Real PP: {result.pp:.2f}")
print(f"Real PPAcc: {result.pp_acc:.2f}") # PP from Accuracy

Batch Calculation

When calculating multiple scores for the same beatmap/mode/mods, use calculate_many() to reuse beatmap decoding and difficulty calculation:

results = calc.calculate_many([
    {"file_path": "beatmaps/12345.osu", "mode": 0, "mods": ["HD", "CL"], "acc": 100.0},
    {"file_path": "beatmaps/12345.osu", "mode": 0, "mods": ["HD", "CL"], "acc": 98.5, "misses": 1},
])

Lazer Calculation Example

If you want to calculate PP for the Lazer scoring system (where slider tails affect accuracy):

# Lazer calculation example
lazer_stats = {
    'great': 450,
    'ok': 10,
    'miss': 5,
    'slider_tail_hit': 200, # Lazer specific stat
    'large_tick_hit': 50    # Lazer specific stat
}

result = calc.calculate(
    file_path="beatmaps/12345.osu",
    mode=0,
    mods=[], 
    combo=800,
    statistics=lazer_stats,
)

Supported Inputs

  • Mods: Supports list of strings ["HD", "DT"], list of dicts [{"acronym": "HD"}], or objects.
  • Modes:
    • 0: osu! (Standard)
    • 1: osu!taiko
    • 2: osu!catch
    • 3: osu!mania

Return Data

The function returns a CalculationResult object:

@dataclass
class CalculationResult:
    mode: int
    stars: float
    pp: float
    pp_aim: float
    pp_speed: float
    pp_acc: float
    pp_flashlight: float
    max_combo: int
    error: Optional[str]
    # ...

🛠️ Building from Source

If you want to modify the C# logic or build the wheels yourself:

  1. Requirements:

    • Python 3.10+
    • .NET 8.0 SDK
    • uv (Python package manager)
  2. Clone:

    git clone --recursive https://github.com/yaowan233/osu-tools-py.git
    cd osu-tools-py
    
  3. Build: The project uses GitHub Actions for matrix builds (Windows/Linux/macOS), but you can build locally:

    # 1. Compile C# DLLs
    cd osu-tools/PerformanceCalculator
    dotnet publish -c Release -o ../../src/osu_tools/lib
    
    # 2. Build Python Wheel
    cd ../..
    uv build
    

⚠️ Troubleshooting

  1. RuntimeError: Failed to create a default .NET runtime:

    • Ensure you installed .NET 8 Runtime.
    • On Linux/macOS, ensure dotnet is in your PATH.
  2. PP seems lower than official site:

    • Did you add "CL" to your mods list?
    • Did you pass legacy_total_score=1000000?

📄 License

This project is licensed under the MIT License. Based on ppy/osu-tools (MIT) and pythonnet (MIT).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

osu_tools_py-0.1.5-py3-none-win_amd64.whl (32.9 MB view details)

Uploaded Python 3Windows x86-64

osu_tools_py-0.1.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (38.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

osu_tools_py-0.1.5-py3-none-macosx_11_0_arm64.whl (40.4 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

osu_tools_py-0.1.5-py3-none-macosx_10_15_x86_64.whl (40.8 MB view details)

Uploaded Python 3macOS 10.15+ x86-64

File details

Details for the file osu_tools_py-0.1.5-py3-none-win_amd64.whl.

File metadata

  • Download URL: osu_tools_py-0.1.5-py3-none-win_amd64.whl
  • Upload date:
  • Size: 32.9 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for osu_tools_py-0.1.5-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 845647a0f2425bb37dfc72059a8d8679a28f292f486940d72ba000980ab7ad73
MD5 7f3fa8b7fec262db73256200a37458bf
BLAKE2b-256 c7e3668531d8b579e7856b6f7d4a5e201edd2300cab1ee580a37881af82d1b63

See more details on using hashes here.

Provenance

The following attestation bundles were made for osu_tools_py-0.1.5-py3-none-win_amd64.whl:

Publisher: release.yml on yaowan233/osu-tools-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file osu_tools_py-0.1.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for osu_tools_py-0.1.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b56f4d9e2c8537f7f4e13a6f02c6e833180ecc09f567cc329e8c22d7fd844314
MD5 c76cb133a05220fc0276854a84cd8c52
BLAKE2b-256 a1847b47cb445747df3b99b04958f24f7262df12d9a699d7811b99fc5507a5c0

See more details on using hashes here.

Provenance

The following attestation bundles were made for osu_tools_py-0.1.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on yaowan233/osu-tools-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file osu_tools_py-0.1.5-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for osu_tools_py-0.1.5-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 86b91a95d01f505d8be4c7e3f3edaedf8ce7bbb27ac9fe5042ca6ab56b6467ab
MD5 e69d5c4541483bd128f7f2f24cd2c438
BLAKE2b-256 43ab685996b74fa6a8c45b6b9f3d269e2e3782d9ece99c9a34a3235b4fa3900b

See more details on using hashes here.

Provenance

The following attestation bundles were made for osu_tools_py-0.1.5-py3-none-macosx_11_0_arm64.whl:

Publisher: release.yml on yaowan233/osu-tools-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file osu_tools_py-0.1.5-py3-none-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for osu_tools_py-0.1.5-py3-none-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 bd6d181a09bd09eb402a721e61fe16476cd92dcf326d40b1e0d8832788d0b9b8
MD5 ac895b84d9f668e89bd3486a936709f7
BLAKE2b-256 53aa4aa77f4f4f973469a43bb086dba238c90a2ffa76a520672f4b896864072a

See more details on using hashes here.

Provenance

The following attestation bundles were made for osu_tools_py-0.1.5-py3-none-macosx_10_15_x86_64.whl:

Publisher: release.yml on yaowan233/osu-tools-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page