You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Protobuf dependency conflict: votify crashes at import with the librespot extra (upstream glomatico#103 / glomatico#105)
Evidence (all verified locally, 2026-09-13)
Three layers combine:
Undeclared direct dependency. votify's generated protobuf code (votify/api/proto/*_pb2.py, header "Protobuf Python Version: 6.33.4") imports google.protobuf.runtime_version (protobuf >= 5.27), but pyproject.toml never declares protobuf — it arrives only transitively via pywidevine>=1.9.0. requirements.txt already declares protobuf>=6.33.5 while pyproject does not (split-brain). Environments where protobuf resolves older crash at startup with ImportError: cannot import name 'runtime_version' (the traceback in upstream ImportError: cannot import name 'runtime_version' from 'google.protobuf' glomatico/votify#103).
Even the resolvable combo breaks at runtime. librespot 0.0.1 + protobuf 6.33.x (what the maintainer's own uv.lock ships) crashes when the librespot session is used: librespot 0.0.1's gencode predates protoc 3.19 and dies with TypeError: Descriptors cannot be created directly under the default upb backend (verified on Python 3.14). Amplifier: SpotifyApi.__init__ defaults to session_type=SessionType.LIBRESPOT (votify/api/api.py:47), so the extra is on the default README path.
Proposed fix (staged as a fork PR, linked below)
Declare protobuf>=6.33.5 directly in [project].dependencies (no <7 cap — protobuf's official cross-version runtime guarantee supports gencode since 3.20.0 through runtime 8.x).
Cap the extra: librespot>=0.0.1,<0.0.2 (the only release whose metadata can resolve with protobuf 6.x).
In votify/__init__.py, os.environ.setdefault("PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION", "python") guarded by find_spec("librespot"), so the default librespot session works out of the box; users without the extra keep the faster upb backend.
Regenerate uv.lock.
Attribution
This issue was produced with AI assistance under the direction of @JavaGT: exploration, evidence verification and implementation by GLM agents (ZCode); plan and diff audited by OpenAI GPT-5.6 ("Luna") and xAI Grok 4.6 via opencode.
Protobuf dependency conflict: votify crashes at import with the librespot extra (upstream glomatico#103 / glomatico#105)
Evidence (all verified locally, 2026-09-13)
Three layers combine:
votify/api/proto/*_pb2.py, header "Protobuf Python Version: 6.33.4") importsgoogle.protobuf.runtime_version(protobuf >= 5.27), butpyproject.tomlnever declaresprotobuf— it arrives only transitively viapywidevine>=1.9.0.requirements.txtalready declaresprotobuf>=6.33.5while pyproject does not (split-brain). Environments where protobuf resolves older crash at startup withImportError: cannot import name 'runtime_version'(the traceback in upstream ImportError: cannot import name 'runtime_version' from 'google.protobuf' glomatico/votify#103).librespotextra.pyproject.toml:32-33allowslibrespot>=0.0.1. PyPI metadata (fetched 2026-09-13): librespot 0.0.2 pinsprotobuf==4.21.0and 0.0.3–0.0.10 pinprotobuf==3.20.1— all irreconcilable with pywidevine's>=6.33.0,<7(upstream Dependency conflict: protobuf incompatibility between librespot and pywidevine makes Votify unusable glomatico/votify#105).uv.lockships) crashes when the librespot session is used: librespot 0.0.1's gencode predates protoc 3.19 and dies withTypeError: Descriptors cannot be created directlyunder the default upb backend (verified on Python 3.14). Amplifier:SpotifyApi.__init__defaults tosession_type=SessionType.LIBRESPOT(votify/api/api.py:47), so the extra is on the default README path.Proposed fix (staged as a fork PR, linked below)
protobuf>=6.33.5directly in[project].dependencies(no<7cap — protobuf's official cross-version runtime guarantee supports gencode since 3.20.0 through runtime 8.x).librespot>=0.0.1,<0.0.2(the only release whose metadata can resolve with protobuf 6.x).votify/__init__.py,os.environ.setdefault("PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION", "python")guarded byfind_spec("librespot"), so the default librespot session works out of the box; users without the extra keep the faster upb backend.uv.lock.Attribution
This issue was produced with AI assistance under the direction of @JavaGT: exploration, evidence verification and implementation by GLM agents (ZCode); plan and diff audited by OpenAI GPT-5.6 ("Luna") and xAI Grok 4.6 via opencode.