Skip to main content

AddressablesToolsPy

Python library for reading Unity Addressables catalog files from JSON or binary catalog data.

Only reading is implemented.

Binary catalog versions 1 through 3 are supported. Version 3 support has not yet been tested against a broad catalog corpus.

Installation

pip install addressablestools

Version 1.1 includes the Python API and Rust accelerator in the same wheel, with no separate runtime dependency. Standard CPython 3.12+ on the supported platforms installs a prebuilt wheel without a Rust toolchain. Building from source requires Rust 1.88+ and a platform linker. backend="python" still selects the reference parser.

Parse JSON catalogs

from pathlib import Path

from addressablestools import AssetBundleRequestOptions, parse_json


data = Path("tests/samples/catalog.json").read_text(encoding="utf-8")
catalog = parse_json(data)

for key, locations in catalog.resources.items():
    if not isinstance(key, str) or not key.endswith(".bundle"):
        continue

    options = locations[0].data_as(AssetBundleRequestOptions)
    print(f"Bundle {key}, Crc: {options.crc}, Hash: {options.hash}")

Parse binary catalogs

from pathlib import Path

from addressablestools import parse_binary


catalog = parse_binary(Path("tests/samples/catalog.bin").read_bytes())
location = catalog.resources["Anim/Network"][0]

print(location.primary_key)
print(location.internal_id)
print(location.provider_id)
print(location.type.class_name if location.type else None)

For reproducible parsing measurements and optimization results, see the catalog benchmarks.

To build the package, including its Rust module, from this checkout:

uv sync --locked

parse(), parse_binary(), and parse_json() use it automatically for supported calls. Select the backend per call:

from pathlib import Path
from addressablestools import available_backends, parse_json

data = Path("tests/samples/catalog.json").read_text(encoding="utf-8")
print(available_backends("json"))  # ("python", "rust") when the JSON accelerator is installed
catalog = parse_json(data, backend="auto")
reference = parse_json(data, backend="python")

auto uses Python when the bundled extension is missing or incompatible. DecoderRegistry is supported: standard registries keep built-in dispatch in Rust and call the Python object decoder only for custom decoders. Calls to register() and alias() invalidate cached dispatch decisions. rust requires native support and raises NativeBackendUnavailableError instead of silently falling back. Backend selection is local to each call. The deprecated API accepts the same keyword; patchers and handlers use the same registry bridge. The previous native extra remains accepted as a compatibility alias.

Auto-detect catalog format

parse() dispatches str input to JSON parsing and bytes input to binary parsing.

from pathlib import Path

from addressablestools import parse


json_catalog = parse(Path("tests/samples/catalog.json").read_text(encoding="utf-8"))
binary_catalog = parse(Path("tests/samples/catalog.bin").read_bytes())

print(len(json_catalog.resources))
print(len(binary_catalog.resources))

Query resource locations

Catalog resources are exposed with Python-style names.

from pathlib import Path

from addressablestools import parse_json


catalog = parse_json(Path("tests/samples/catalog.json").read_text(encoding="utf-8"))
asset_key = "Assets/Paripari/AddressableAssets/VFX Texture Assets/ParticleTextures/sparkle.png"
asset_location = catalog.locate(asset_key)[0]

print(asset_location.primary_key)
print(asset_location.internal_id)
print(asset_location.provider_id)

if asset_location.dependency_key is not None:
    dependency_location = catalog.locate(asset_location.dependency_key)[0]
    print(dependency_location.primary_key)
    print(dependency_location.internal_id)

Custom binary object handling

Binary catalogs may contain custom serialized object types. A decoder registry can alias a custom type to a supported built-in type or register a decoder function for that type.

from pathlib import Path

from addressablestools import DecoderRegistry, parse_binary
from addressablestools.decoder import SerializedObjectDecoder


registry = DecoderRegistry()
registry.alias(
    "Custom.Assembly; Custom.AssetBundleRequestOptions",
    SerializedObjectDecoder.ASSET_BUNDLE_REQUEST_OPTIONS_MATCH_NAME,
)


catalog = parse_binary(Path("catalog.bin").read_bytes(), registry=registry)

Decoder functions receive the exact serialized type together with the object offset. These calls use the bundled Rust resource traversal automatically. Add backend="rust" to require it or backend="python" to use the reference parser. Decoder functions keep running in Python with the same reader and shared object cache. Registry subclasses and instance overrides of resolution methods retain the per-object Python bridge.

from dataclasses import dataclass
from pathlib import Path

from addressablestools import BinaryDecodeContext, DecoderRegistry, parse_binary


@dataclass(frozen=True)
class CustomInt32Value:
    value: int


registry = DecoderRegistry()


@registry.register("Custom.Assembly; Custom.Int32Value")
def decode_custom_int32(context: BinaryDecodeContext) -> CustomInt32Value:
    if context.is_default:
        return CustomInt32Value(0)
    context.reader.seek(context.offset)
    return CustomInt32Value(context.reader.read_int32())


catalog = parse_binary(Path("catalog.bin").read_bytes(), registry=registry)

Changelog

See the changelog for release history and upgrade notes.

Deprecated API

The old AddressablesTools import path is deprecated as of 0.2.0. It remains available as a thin compatibility layer, but new code should import addressablestools directly. Calling AddressablesTools.parse(), AddressablesTools.parse_json(), or AddressablesTools.parse_binary() emits a DeprecationWarning.

Legacy compatibility

Existing callers can keep using the old import path while migrating:

from pathlib import Path

import AddressablesTools
from AddressablesTools.classes import AssetBundleRequestOptions


catalog = AddressablesTools.parse_json(Path("tests/samples/catalog.json").read_text("utf-8"))
for key, locations in catalog.Resources.items():
    if isinstance(key, str) and key.endswith(".bundle"):
        assert isinstance(locations[0].Data.Object, AssetBundleRequestOptions)
        print(locations[0].Data.Object.Crc)

catalog.Resources lazily creates a normal dictionary of legacy location lists on first access and reuses it afterward. Repeated lookups such as catalog.Resources[key][0].InternalId no longer rebuild the entire catalog.

The dictionary and lists are a cached snapshot: edits to them persist across accesses on that wrapper, without changing the underlying modern resource mapping. Location properties still read the underlying objects' current fields. If you change the modern resource mapping or want to discard snapshot edits, use del catalog.Resources; the next access rebuilds it. Separate catalog wrappers have separate snapshots. For new code, prefer addressablestools and its catalog.resources mapping.

Within a resource snapshot, aliases for the same underlying location share one legacy location wrapper; each key still has its own list. location.Dependencies also caches a list snapshot and automatically rebuilds it if the underlying list is replaced. After in-place edits to the underlying list, or to discard edits to the snapshot, use del location.Dependencies to rebuild it on the next access. When aliases share a location wrapper, they also share this dependency snapshot.

Repeated location.Data.Object, location.Data.Type, location.Type, and bundle ComInfo reads reuse metadata wrappers. Replacing the underlying data, type, or common-info object refreshes the relevant wrapper automatically; scalar field changes remain visible. Lists and dictionaries returned by custom decoders keep their existing behavior: each access wraps their current contents.

The legacy AddressablesTools.classes module is also provided for existing imports while migration is in progress.

Metadata

Release files for addressablestools 1.1.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 addressablestools 1.1.1
File Size Uploaded Provenance
addressablestools-1.1.1.tar.gz 558.9 kB With provenance Details

Built distributions (wheels)

Table of built distributions (wheels) for addressablestools 1.1.1
File
addressablestools-1.1.1-cp312-abi3-win_amd64.whl CPython 3.12 abi3 Windows x86-64 Details
addressablestools-1.1.1-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.12 abi3 Linux glibc 2.17+ x86-64 Details
addressablestools-1.1.1-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.12 abi3 Linux glibc 2.17+ ARM64 Details
addressablestools-1.1.1-cp312-abi3-macosx_11_0_arm64.whl CPython 3.12 abi3 macOS 11.0+ ARM64 Details
addressablestools-1.1.1-cp312-abi3-macosx_10_13_x86_64.whl CPython 3.12 abi3 macOS 10.13+ x86-64 Details

Total release size: 1.9 MB

Release files / addressablestools-1.1.1.tar.gz

Download URL addressablestools-1.1.1.tar.gz
Size 558.9 kB
Tags Source
SHA-256 checksum
How to use checksums
fd7ebca12139a9b6dc23463255b2e5214b094a472752bee30cc3f2f626ca31b6
BLAKE2b-256 checksum
How to use checksums
338d90c0ec233088fa3d8598567000dbad12e18d315ff3810a37c49cef46188c
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 10, 2026.

Transparency log

Release files / addressablestools-1.1.1-cp312-abi3-win_amd64.whl

Download URL addressablestools-1.1.1-cp312-abi3-win_amd64.whl
Size 188.4 kB
Tags CPython 3.12 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
ef03bd530c81fccf9a2e138099fa45be552d9ebe4619314ef9d40961706010be
BLAKE2b-256 checksum
How to use checksums
591ba18e6c2203b582b98724098153ac0a9070b8916b4317e7b14eb753325163
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 10, 2026.

Transparency log

Release files / addressablestools-1.1.1-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL addressablestools-1.1.1-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 311.9 kB
Tags CPython 3.12 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
59741104c28799b8f8e5c7d9ec9a011059fd514492c19854059ca21a64306d81
BLAKE2b-256 checksum
How to use checksums
26bdf2ba85c6a5410c33e77e0798649f57da995838f9e170a176d1f160f8fee0
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 10, 2026.

Transparency log

Release files / addressablestools-1.1.1-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL addressablestools-1.1.1-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 308.5 kB
Tags CPython 3.12 Linux glibc 2.17+ ARM64 abi3
SHA-256 checksum
How to use checksums
41feafd949a06613a711f61bf43a83f42e606c5670f1ce18daead2bc67a84fa3
BLAKE2b-256 checksum
How to use checksums
a671a3a0badddf1595c44842401205a9e254ae897de5c94708a74aa470bfc49c
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 10, 2026.

Transparency log

Release files / addressablestools-1.1.1-cp312-abi3-macosx_11_0_arm64.whl

Download URL addressablestools-1.1.1-cp312-abi3-macosx_11_0_arm64.whl
Size 281.9 kB
Tags CPython 3.12 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
27cbf5977e59c1c56af9d581b643e75b7e40e527f6027c695cfeaa583d43bd68
BLAKE2b-256 checksum
How to use checksums
068b87eb1a812c23799b525e8cff048dd8fcf5720024ecddd16f38daf7cc96fd
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 10, 2026.

Transparency log

Release files / addressablestools-1.1.1-cp312-abi3-macosx_10_13_x86_64.whl

Download URL addressablestools-1.1.1-cp312-abi3-macosx_10_13_x86_64.whl
Size 290.4 kB
Tags CPython 3.12 abi3 macOS 10.13+ x86-64
SHA-256 checksum
How to use checksums
6d6c3b40cd5e0faf1ee360685c916f6cca60f81d2efbdbff578444cd2993aea1
BLAKE2b-256 checksum
How to use checksums
3e662ec44f65d505d0a1eaf951f56fcb0a137ccaf9de73532863f54f34d5f80f
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 10, 2026.

Transparency log

Security for addressablestools 1.1.1

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.

Full provenance

All 6 files in this release have been uploaded with provenance metadata.

Select from 6 files

Attestation for addressablestools-1.1.1.tar.gz

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 10, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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