Skip to main content

Python API

FOSU is in active development; its API may change without compatibility shims. Parsing returns eager, mutable dataclasses and lists, detached from native memory.

Install and use

Requires CPython 3.10+. Stable-ABI wheels target glibc and musl Linux on x86-64 and AArch64, plus macOS 11+ on Intel and Apple Silicon. One wheel per platform supports every compatible CPython version. Windows x86-64 is supported both natively and through the Linux x86-64 wheel under WSL.

python -m pip install fosu

Installing from a source checkout requires a C++20 compiler. An ordinary isolated pip install . provisions CMake and Ninja when needed; Unix Makefiles are also supported when Ninja is unavailable. --no-build-isolation makes the caller responsible for all build tools.

import fosu

beatmap = fosu.parse_file("map.osu")
for note in beatmap.hit_objects:
    if isinstance(note, fosu.Slider):
        print(note.time, note.length, note.control_points)

parse_file(path) accepts strings, bytes, and os.PathLike. parse(data) accepts buffer-protocol objects, including bytes, bytearray, memoryview, and arrays. Non-bytes buffers are copied to an immutable snapshot; encode text explicitly.

Inputs are bounded by available address space. Allocation failures raise MemoryError, and file failures raise OSError. Native parsing releases the GIL; Python value construction holds it. Concurrent calls return independent results. Malformed records are skipped and counted in beatmap.stats.malformed_lines; success does not certify playability.

Section selection

listing = fosu.parse_file(
    "map.osu",
    sections=fosu.Sections.METADATA | fosu.Sections.DIFFICULTY,
)

Both entry points accept keyword-only sections, defaulting to Sections.ALL. Members are GENERAL, EDITOR, METADATA, DIFFICULTY, EVENTS, TIMING_POINTS, COLOURS, and HIT_OBJECTS. Combine them with |. Skipped sections retain defaults and empty lists; Sections(0) selects none. Unsupported mask bits are rejected.

Include GENERAL for mode-dependent difficulty rules (such as mania CircleSize) and EVENTS for break-dependent combo rules. Only selected sections contribute malformed-line counts.

Results and important distinctions

The typed dataclasses in _model.py define the fields. Shared fields use C++ names. Important Python-specific behavior:

  • hit_objects contains Circle, Slider, Spinner, or HoldNote, in stable timestamp order. Narrow the union with isinstance.
  • Times are milliseconds. Slider endpoints are 0 by default. Pass calculate_slider_end_times=True to parse or parse_file to calculate them using curve distance, timing and repeats. Do not use slider endpoints unless calculation was requested. Accessing the field never computes or caches anything. Other object types still have numeric endpoints. Omitted sections use their default settings. Hit samples and slider edge fields remain text.
  • Slider control_points includes the head position, unlike the native point range. curve_segments preserves modern segment boundaries and explicit B-spline degrees. slides=2 means forward and back.
  • tag_list and bookmark_list are parsed conveniences alongside the tags and bookmarks text fields.
  • IDs and preview time map the -1 sentinel to None.
  • Strings decode with UTF-8 surrogateescape, preserving undecodable bytes.
  • Inherited timing-point NaN beat lengths are preserved; consumers must not treat them as ordinary slider velocities.

Values can be edited, copied with deepcopy, exported with dataclasses.asdict, or pickled. They do not validate assignments or recompute related fields: changing a slider's position does not move its stored head point, and changing type does not recalculate combo flags. dataclasses.replace is a shallow copy. Mutation does not change the input or another parse result.

Pass calculate_slider_paths=True to retain each slider's path (otherwise None). fosu.slider_position_at(slider.path, progress) is a pure query over that polyline, with progress clamped to [0, 1]. Returned PathPoint coordinates are relative to the head; add the slider's x/y for playfield coordinates. Paths alone do not calculate end times. Requesting both reuses their distance. Native code exposes the same query and Beatmap.slider_paths, indexed by slider.

calculate_slider_events=True additionally populates slider.events with HEAD, TICK, REPEAT, LEGACY_LAST_TICK, and TAIL records in official generator order, grouped by slider-span traversal. This is not necessarily timestamp order: a legacy last tick may be timed before a late tick or the repeat beginning its final span. The legacy event is the effective historical tail judgement, not an additional score or combo event; the real TAIL and slider end_time remain unchanged. This option includes path and end-time calculation. Each record has time, span index/start time, path progress, and a position relative to the head. Native code exposes Beatmap.slider_events, indexed by slider. Without the option, events are empty. These are path events using the decoded slider's timing, not a converted ruleset's nested hitobjects: no samples or catch conversion. Expansion beyond 1,048,576 events per map raises MemoryError rather than silently dropping events.

apply_stacking=True applies unmodded osu!standard stacking after parsing, including the pre-v6 algorithm. Hit-object x/y and absolute slider control points are adjusted before returning. obj.raw_position() subtracts the stacking offset from the current x/y, or returns x/y when stacking is absent. It can have small floating-point rounding differences. Coordinates are floats in both interfaces, including when stacking is disabled. Each object also retains stack_height and stack_offset in its Stacking value for inspection; do not add the offset again. Relative path/event positions remain unchanged: add them to the adjusted head. It includes path and end-time calculation, but not events. Native results use Beatmap.stacking, indexed by hit object. Other modes are unchanged; Python stacking is None when not calculated. Include GENERAL, DIFFICULTY, TIMING_POINTS and HIT_OBJECTS when selecting sections for meaningful results.

mods= accepts combined Mods values. EZ and HR adjust difficulty settings for osu!standard and osu!taiko; HR also reflects standard hit objects and slider control points vertically. EZ/HR require GENERAL and DIFFICULTY in sections. They are not yet supported for osu!catch or osu!mania because those modes require converted fruit offsets or resolved hit windows; support is planned. DT, NIGHTCORE, and HT support every mode and divide gameplay timeline values by 1.5, 1.5, and 0.75 respectively. This includes hit objects, calculated slider events, timing-point offsets and uninherited beat lengths, and breaks. General and Editor timestamp metadata remains in source-map time.

See compatibility for supported behavior and limitations; there is no ruleset conversion.

CPU selection

fosu.backend reports "avx2", "neon", or "scalar". Set FOSU_BACKEND=auto|scalar|avx2|neon before importing to select an engine. Unsupported explicit requests raise ImportError; selection stays fixed for the loaded extension. See development checks.

Release files for fosu 0.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for fosu 0.4.0
File Size Uploaded
fosu-0.4.0.tar.gz 242.4 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for fosu 0.4.0
File
fosu-0.4.0-cp310-abi3-win_amd64.whl CPython 3.10 abi3 Windows x86-64 Details
fosu-0.4.0-cp310-abi3-musllinux_1_2_x86_64.whl CPython 3.10 abi3 Linux musl 1.2+ x86-64 Details
fosu-0.4.0-cp310-abi3-musllinux_1_2_aarch64.whl CPython 3.10 abi3 Linux musl 1.2+ ARM64 Details
fosu-0.4.0-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl CPython 3.10 abi3 Linux glibc 2.28+ x86-64, Linux glibc 2.17+ x86-64 Details
fosu-0.4.0-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl CPython 3.10 abi3 Linux glibc 2.17+ ARM64, Linux glibc 2.28+ ARM64 Details
fosu-0.4.0-cp310-abi3-macosx_11_0_x86_64.whl CPython 3.10 abi3 macOS 11.0+ x86-64 Details
fosu-0.4.0-cp310-abi3-macosx_11_0_arm64.whl CPython 3.10 abi3 macOS 11.0+ ARM64 Details

Total release size: 2.1 MB

Release files / fosu-0.4.0.tar.gz

Download URL fosu-0.4.0.tar.gz
Size 242.4 kB
Tags Source
SHA-256 checksum
How to use checksums
f07c8bb39cb4179699668462df88416703d30bc7e1260abdfd59dcbf1cd01854
BLAKE2b-256 checksum
How to use checksums
f41b1226cfa6b68d8915ae0c3b555605849d1b5c73dd482e842f349a68de223f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Release files / fosu-0.4.0-cp310-abi3-win_amd64.whl

Download URL fosu-0.4.0-cp310-abi3-win_amd64.whl
Size 327.7 kB
Tags CPython 3.10 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
54f1dba22d1db004ba5cbe0a98a3ae7e25b924752096cfc761d30141d892cc4e
BLAKE2b-256 checksum
How to use checksums
35d45009b589ea5a7b4976ae63d861402dc00392c7f0c8e7764a1076ccde88fa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Release files / fosu-0.4.0-cp310-abi3-musllinux_1_2_x86_64.whl

Download URL fosu-0.4.0-cp310-abi3-musllinux_1_2_x86_64.whl
Size 292.8 kB
Tags CPython 3.10 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
9cbcfada995225fe8e6251716a1100629da19e76f080f3adbf8ef7b2bdfc8258
BLAKE2b-256 checksum
How to use checksums
e1ca8676c414b4ac3dfb4cb975bec785482c0228235fada910955facbaee7273
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Release files / fosu-0.4.0-cp310-abi3-musllinux_1_2_aarch64.whl

Download URL fosu-0.4.0-cp310-abi3-musllinux_1_2_aarch64.whl
Size 321.0 kB
Tags CPython 3.10 Linux musl 1.2+ ARM64 abi3
SHA-256 checksum
How to use checksums
3c3cbb645482f3c922c7f80a92ce02461dce33bca2da5afaef6fdae674818031
BLAKE2b-256 checksum
How to use checksums
304d646fde31522893b834ffe8299ca0fa5cbd8033550b808edb0d2b3ab8a927
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Release files / fosu-0.4.0-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL fosu-0.4.0-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Size 292.5 kB
Tags CPython 3.10 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
ea863f26d5e36a269eb87c759288165d17648a9b3d409a824d23bc595cf0e346
BLAKE2b-256 checksum
How to use checksums
ec8704a6d672aea535419b94673fda37363ff7382c3539f47d44bdefa9870399
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Release files / fosu-0.4.0-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl

Download URL fosu-0.4.0-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Size 321.6 kB
Tags CPython 3.10 Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
03f0d11d1463d5f5cca7ac338fbf0d4e7b384fd1d9c08e12d33601a7764aa448
BLAKE2b-256 checksum
How to use checksums
7837798c5ce291a08a51478f489f35ce7a7aa5ff43526f4db8adaef9d5483665
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Release files / fosu-0.4.0-cp310-abi3-macosx_11_0_x86_64.whl

Download URL fosu-0.4.0-cp310-abi3-macosx_11_0_x86_64.whl
Size 136.8 kB
Tags CPython 3.10 abi3 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
426ad78c9a727200949c413f0e540b64ca1650cf43f8f12cad47c9b345847487
BLAKE2b-256 checksum
How to use checksums
d3254b307d31379e5f86d4504a830300ada16364c6da793dae36f4c5ccc8945d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Release files / fosu-0.4.0-cp310-abi3-macosx_11_0_arm64.whl

Download URL fosu-0.4.0-cp310-abi3-macosx_11_0_arm64.whl
Size 130.2 kB
Tags CPython 3.10 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
4441a478e7df2c131779c27389bd064d224dd787da947dcb3b1352fb7b4f5c96
BLAKE2b-256 checksum
How to use checksums
7f3480c12658cf52524a1a242e8e4b55e641cb2ca407a12fe6c1143d2edfb567
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Release history Release notifications | RSS feed

0.5.2

8 release files

0.5.1

8 release files

0.5.0

8 release files

0.4.1

8 release files

This release

0.4.0 This release

8 release files

0.3.0

8 release files

0.2.1

8 release files

0.2.0

8 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page