eveo7-mumbleserver-ice
Python bindings for Mumble's Murmur server,
generated from upstream's MumbleServer.ice Slice IDL via
ZeroC Ice slice2py. This package is the
distribution layer — the IDL lives upstream, slice2py produces the
binding, this repo packages it as a Python wheel with type stubs.
pip install eveo7-mumbleserver-ice
Compatibility
| Component | Supported |
|---|---|
| Mumble | 1.5.x, 1.6.x — see the Mumble 1.5+ note below |
| Python | CPython 3.11 – 3.14 |
| OS | Linux, macOS, Windows (Linux always builds from source — see below) |
[!IMPORTANT] Bindings target Mumble's
::MumbleServerSlice contract, introduced in Mumble 1.5. The module was renamed from::Murmurupstream, so attaching to a 1.4.x Murmur server fails atMetaPrx.checkedCast(...)returningNone. For pre-1.5 servers, use a binding generated against the old IDL.
Quick start
Connect to a running Mumble server's Ice endpoint and exercise a representative operation:
import Ice
import eveo7_mumbleserver_ice as pkg
communicator = Ice.initialize()
try:
base = communicator.stringToProxy("Meta:tcp -h 127.0.0.1 -p 6502")
meta = pkg.MetaPrx.checkedCast(base)
if meta is None:
raise RuntimeError("server is not exposing ::MumbleServer::Meta")
major, minor, patch, label = meta.getVersion()
print(f"Mumble {major}.{minor}.{patch} ({label})")
for server in meta.getAllServers():
if server.isRunning():
print(f" server #{server.id()}: {len(server.getUsers())} users")
finally:
communicator.destroy()
asyncio
A thin asyncio adapter lives at eveo7_mumbleserver_ice.aio. Two entry
points: wrap() bridges a single <op>Async() future onto an awaitable
asyncio.Future, and AsyncProxy reflectively forwards attribute
access so each operation can be awaited directly.
[!TIP] The adapter's value is concurrent fan-out:
gather(*wrap(...))over many proxies. Single-call overhead is ~50× the sync path, so don't reach foraiofor one-shot queries. Realistic speedup against a real Mumble server: ~4× for I/O-bound ops over serial sync calls.
import asyncio
from eveo7_mumbleserver_ice.aio import AsyncProxy, wrap
# Assumes ``meta`` was obtained as in Quick start above.
async def report(meta):
# Single bridged call:
major, minor, patch, label = await wrap(meta.getVersionAsync())
print(f"Mumble {major}.{minor}.{patch} ({label})")
# AsyncProxy — every attribute resolves to ``<name>Async()``
# under the hood and returns an awaitable:
ameta = AsyncProxy(meta)
uptime = await ameta.getUptime()
print(f"uptime: {uptime}s")
# Concurrent fan-out — the adapter's primary use case:
running = [s for s in meta.getAllServers() if s.isRunning()]
user_lists = await asyncio.gather(
*(wrap(s.getUsersAsync()) for s in running)
)
total = sum(len(u) for u in user_lists)
print(f"online across {len(running)} servers: {total} users")
Ice.InvocationFuture is not a concurrent.futures.Future
subclass — asyncio.wrap_future rejects it — so the adapter
hand-rolls the bridge via add_done_callback + call_soon_threadsafe.
asyncio is stdlib, no extra install needed; wrap() is always
available.
Installation notes
[!NOTE] On Linux, no
manylinuxwheel is published forzeroc-iceupstream — every install compiles the C extension from source. Modern GCC's default-std=gnu23breaks the upstream sources, soCFLAGS=-std=gnu17must be set at build time.uv syncforwards this automatically via the[tool.uv].extra-build-variablesblock in this repo'spyproject.toml; a plainpip installrequires the flag in the environment.
macOS / Windows installs pull pre-built zeroc-ice wheels: cp311 /
cp312 (from 3.7.10.1) and cp313 / cp314 (from 3.7.11). No local
build is required.
Type stubs ship at eveo7_mumbleserver_ice/__init__.pyi alongside a
PEP 561 py.typed marker, so mypy / pyright / basedpyright resolve
from eveo7_mumbleserver_ice import ServerPrx to a concrete typed
class rather than Any.
Architecture
The generated surface — five files, regenerated atomically:
MumbleServer.ice— vendored Slice snapshot pulled from upstreammumble-voip/mumble@master..mumble-server-ice.sha256— sha256sum-format lockfile pinning the snapshot's byte content. Verified on every regen; only bumped when an upstream diff is reviewed and accepted (update_ice -- --force).eveo7_mumbleserver_ice/MumbleServer_ice.py—slice2pyoutput. ~7k lines, marked auto-generated.eveo7_mumbleserver_ice/__init__.py+__init__.pyi— generated by this repo's pipeline (_nox/update_ice.py,_nox/stub_gen/); the former re-exports every public class from the slice2py module, the latter renders honest stubs from the IDL AST.
Hand-written modules (the asyncio adapter at
eveo7_mumbleserver_ice/aio.py) live alongside and are not touched
by regeneration.
Development
All dev tasks run through nox sessions; see noxfile.py for the full
list. Headline ones:
uv sync # install dev deps
uv run nox -s lint typecheck tests # default gates
uv run nox -s preflight # full per-push CI parity
uv run nox -s release_check # pre-tag (incl. install matrix)
uv run nox -s postregen # post-update_ice verifier
uv run nox -s update_ice # regenerate bindings
uv run nox -s check_drift # codegen drift gate
uv run nox -s stubtest # stubs ↔ runtime parity
uv run nox -s integration_real_mumble # docker Mumble matrix
uv run nox -s benchmark # marshaling perf
uv run nox -s slice_diff -- old.ice new.ice # diff Slice snapshots
The integration matrix exercises the last release of each Mumble
minor line — 1.4.x (the legacy ::Murmur module: the test detects
the pre-rename surface and reports a clean skip-with-reason instead
of a hard failure), 1.5.x and 1.6.x (current ::MumbleServer API
that the bindings target).
[!IMPORTANT] Regeneration (
nox -s update_ice) must run on Python 3.11 or 3.12 — the dev group pinszeroc-ice==3.7.10.1for byte-stable output, and that release's C extension references CPython symbols removed in 3.13. Downstream installs on 3.13 / 3.14 still work via the 3.7.11 wheel.
After cloning, install the pre-push hook once so a forgotten regen is caught locally:
uv run pre-commit install --hook-type pre-push
See also
CHANGELOG.md— release history (Russian:CHANGELOG.ru.md).- Mumble — upstream server
and the source of truth for
MumbleServer.ice. - ZeroC Ice — Python mapping — Slice → Python contract this binding implements.
README.ru.md— Russian translation of this file.
License
BSD-3-Clause, declared
as an SPDX expression in pyproject.toml. Mumble's own
upstream license is textually
identical BSD-3-Clause, and applies to the MumbleServer.ice snapshot
vendored here and to the slice2py output derived from it. Full
upstream attribution and the verbatim Mumble license text live in
NOTICE.md (Russian sibling: NOTICE.ru.md)
— shipped alongside the source distribution and at
dist-info/licenses/ in the wheel.
Metadata
Release files for eveo7-mumbleserver-ice 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| eveo7_mumbleserver_ice-0.1.0.tar.gz | 75.7 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| eveo7_mumbleserver_ice-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 126.3 kB
Release files / eveo7_mumbleserver_ice-0.1.0.tar.gz
| Download URL | eveo7_mumbleserver_ice-0.1.0.tar.gz |
|---|---|
| Size | 75.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e859741dd3472389cbb52e7983d0f5b5ca57c42c0062b7e5b945d94f51b38bb5
|
|
BLAKE2b-256 checksum How to use checksums |
cfeecbe90f4160c4e9671d5975eb111b3a95a1c76e67fffa503d904137b01118
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / eveo7_mumbleserver_ice-0.1.0-py3-none-any.whl
| Download URL | eveo7_mumbleserver_ice-0.1.0-py3-none-any.whl |
|---|---|
| Size | 50.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
28130752d4944115885b39fc33da9f995f36e51bb8232f6cd658f653842a6cc3
|
|
BLAKE2b-256 checksum How to use checksums |
96cf5b2b8dc559395d86e229b73488556a215dbbdac3c1abf02c18a482b065b8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for eveo7-mumbleserver-ice 0.1.0
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
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.