Skip to main content

Python API

FOSU is in active development; its API may change without compatibility shims. Parsing returns eager objects and lists, detached from native memory. All records are read-only native objects with eager Python fields, declared and typed in _model.py. Attribute reads do not allocate numeric values. Lists remain ordinary mutable Python lists.

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.

Performance

FOSU 0.5.0 (798b810), measured on 2026-09-20 using CPython 3.12.14 on an Intel Core i7-8700 under Linux/WSL2. All rows use the same 1,004 mutually accepted all-mode maps. Times include eager result construction and release; lower is better. Warm-file measurements include opening and reading page-cached files.

Python interface Resident bytes (µs/map) Warm file (µs/map)
FOSU AVX2 165.1 174.7
FOSU scalar 224.4 231.6
OsuPyParser 1.0.7 Unsupported 4,418.2

Figures are medians of complete passes, not fastest individual parses. Six passes per API were collected; passes more than 5% above their API's unfiltered median are excluded as presumed interference, leaving five or six per result. The parsers expose different models: OsuPyParser also performs derived-statistic work. See the comparison and measured variation for result contracts, or the feature-cost tables for slider geometry, gameplay, mods, and ARM measurements.

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 model classes in _model.py define the fields and convenience methods. 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.

Records support equality, repr, deepcopy, and pickle. They are not dataclasses: dataclasses.asdict and dataclasses.replace do not apply. Public record classes cannot be subclassed, and attributes cannot be assigned or deleted. Constructors accept positional or keyword arguments and retain the supplied values without runtime type validation. Parsed numeric fields are always eagerly converted to their documented Python types.

List contents can be changed without affecting the input or another parse result. Such changes do not recompute derived data. All records participate in cyclic garbage collection, including cycles consumers create through lists or values passed to constructors.

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.5.1

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.5.1
File Size Uploaded
fosu-0.5.1.tar.gz 254.8 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for fosu 0.5.1
File
fosu-0.5.1-cp310-abi3-win_amd64.whl CPython 3.10 abi3 Windows x86-64 Details
fosu-0.5.1-cp310-abi3-musllinux_1_2_x86_64.whl CPython 3.10 abi3 Linux musl 1.2+ x86-64 Details
fosu-0.5.1-cp310-abi3-musllinux_1_2_aarch64.whl CPython 3.10 abi3 Linux musl 1.2+ ARM64 Details
fosu-0.5.1-cp310-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl CPython 3.10 abi3 Linux glibc 2.26+ x86-64, Linux glibc 2.28+ x86-64 Details
fosu-0.5.1-cp310-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl CPython 3.10 abi3 Linux glibc 2.26+ ARM64, Linux glibc 2.28+ ARM64 Details
fosu-0.5.1-cp310-abi3-macosx_11_0_x86_64.whl CPython 3.10 abi3 macOS 11.0+ x86-64 Details
fosu-0.5.1-cp310-abi3-macosx_11_0_arm64.whl CPython 3.10 abi3 macOS 11.0+ ARM64 Details

Total release size: 2.2 MB

Release files / fosu-0.5.1.tar.gz

Download URL fosu-0.5.1.tar.gz
Size 254.8 kB
Tags Source
SHA-256 checksum
How to use checksums
95f74c80f475a81f4ab595ac8442122831e802b4774898212ce1e56d38cbbfe5
BLAKE2b-256 checksum
How to use checksums
2956774134ef94ea6845dbc98c7d7a87642c94172970911ea5fa6d3e7ca30cec
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 20, 2026.

Transparency log

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

Download URL fosu-0.5.1-cp310-abi3-win_amd64.whl
Size 333.5 kB
Tags CPython 3.10 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
6a9a0a303ad5647b46fc45c83fdfaf854d07037bf9eb18146614a7e11307913e
BLAKE2b-256 checksum
How to use checksums
1ed297d00fb0416052be1dd2d31301f8c9da9ed87fd19a2519d4870e85d27860
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 20, 2026.

Transparency log

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

Download URL fosu-0.5.1-cp310-abi3-musllinux_1_2_x86_64.whl
Size 326.6 kB
Tags CPython 3.10 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
c68df0a5ffb145df3cd9e276f8cb7ff8e73e65b1e636991359e2468ee728b8e4
BLAKE2b-256 checksum
How to use checksums
5d5718babd6e4051c3255d3db8d0011bce98c7dce6a6d45fcc89bb5167b34adc
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 20, 2026.

Transparency log

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

Download URL fosu-0.5.1-cp310-abi3-musllinux_1_2_aarch64.whl
Size 352.7 kB
Tags CPython 3.10 Linux musl 1.2+ ARM64 abi3
SHA-256 checksum
How to use checksums
b119d9bbccc1bd2d3bc0ffa6e8224cbb383e2be8a34cfc0e19f3e89e7f234af2
BLAKE2b-256 checksum
How to use checksums
ea19e65aa6d62e1c8efea85bc8d4230d5d925c3129b9981e6ff9a3f6f4d39771
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 20, 2026.

Transparency log

Release files / fosu-0.5.1-cp310-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl

Download URL fosu-0.5.1-cp310-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Size 327.2 kB
Tags CPython 3.10 Linux glibc 2.26+ x86-64 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
085684e70ec43cf70f32d582db7149e8c82176ec5642c1fad61e23cfd3eab0c1
BLAKE2b-256 checksum
How to use checksums
9b44a8dde183e2fce506aa2fc00bbabdf2b8a205181e67a10ffd4e662c69ba77
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 20, 2026.

Transparency log

Release files / fosu-0.5.1-cp310-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl

Download URL fosu-0.5.1-cp310-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Size 353.8 kB
Tags CPython 3.10 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
989365be2b99fce25d084a1feca651e9fa92b417d884678032431aec90ef4bcb
BLAKE2b-256 checksum
How to use checksums
a956f1b5d9b3132985f93f5e345ec217587d1e937a16bf8c7f66654d3f23b6ae
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 20, 2026.

Transparency log

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

Download URL fosu-0.5.1-cp310-abi3-macosx_11_0_x86_64.whl
Size 141.5 kB
Tags CPython 3.10 abi3 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
5526a60abfa003dd5e853a0017f022d15a0d10bdc2c69fa642aeaee2ed668c53
BLAKE2b-256 checksum
How to use checksums
939a5f0744922c4489f685b68e575c73c680e7a20adae3c92949fbd6c586ae72
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 20, 2026.

Transparency log

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

Download URL fosu-0.5.1-cp310-abi3-macosx_11_0_arm64.whl
Size 135.1 kB
Tags CPython 3.10 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
268a542adac2bd12eff06637124aaeac083972435eebb94329ca86a232f143f0
BLAKE2b-256 checksum
How to use checksums
68ccdb178f8b0b8cf90032d0c32b0209e1576003efe01d961959b77b70290f94
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 20, 2026.

Transparency log

Release history Release notifications | RSS feed

0.5.2

8 release files

This release

0.5.1 This release

8 release files

0.5.0

8 release files

0.4.1

8 release files

0.4.0

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