requirements.txt
Rama main · réplica de lectura del repositorio original.
fastapi>=0.110.0
uvicorn[standard]>=0.29.0
websockets>=12.0
pyyaml>=6.0.1
mutagen>=1.47.0
httpx>=0.27
# Spectral-fingerprint analysis for the spectrogram endpoint (cutoff frequency,
# brickwall/rolloff detection) — /api/spectrogram, ripster/routes/spectrogram.py.
numpy>=1.26
# Required by FastAPI for Form/multipart endpoints (uploads). Without it the app
# crashes at startup: 'Form data requires "python-multipart" to be installed'.
python-multipart>=0.0.9
# CRITICAL — do NOT loosen. Several deps (esp. standard pywidevine) try to drag
# protobuf below 4.x — this hard pin blocks that downgrade.
# 6.33.4: OrpheusDL Spotify desktop_api + pywidevine ship protobuf-6.33 gencode
# (runtime must be >= gencode). Do NOT drop below 6.33 or OrpheusDL/pywidevine
# fail to import (VersionError).
# grpcio выпилен 25.09.2026 вместе с движком `amd`: живых gRPC-клиентов в
# проекте нет (публичный wrapper — HTTP Wrapper-Lite), ни один модуль `grpc`
# не импортирует.
protobuf==6.33.4
# Optional: enable Deezer engine (remove if you don't need Deezer)
deemix>=3.6.6
# Qobuz + Tidal engines (single package, serves both).
# Pinned to 2.0.5 — the last 2.0.x on PyPI. streamrip 2.1.x broke Qobuz login
# (GitHub #954, #956, #796), and 2.0.6 was never published to PyPI (the jump is
# 2.0.5 → 2.1.0), so `==2.0.6` made `pip install -r` fail. Do NOT bump to 2.1.x.
# streamrip pulls its own aiofiles<0.8; do NOT add a separate aiofiles line.
streamrip==2.0.5
# Desktop launcher — Ripster opens in its OWN native window (not a browser tab)
# via the system webview (Edge WebView2 on Windows; no bundled Chromium, unlike
# Electron/QtWebEngine). ripster_launcher.py falls back to the default browser if
# this is absent. Pulls pythonnet + clr_loader on Windows.
pywebview==6.2.1
# IANA tz database. Windows ships none, and `zoneinfo` silently raises
# ZoneInfoNotFoundError → the account-countries panel lost every timezone
# offset. Pure DATA (all 633 files; the 22 __init__.py hold 252 bytes of
# docstring, no code) with ZERO Requires-Dist, so it cannot perturb the
# construct/protobuf pins in ripster-dependency-versions. Pinned like every
# other line here on purpose: `updater.update_source()` re-runs a plain
# `pip install -r requirements.txt`, and an unpinned line gives pip a reason
# to re-resolve the whole file — the exact way a "harmless" package breaks
# Apple decrypt. Bump deliberately, next to a re-verify of pywidevine+pymp4.
tzdata==2026.4
sounddevice==0.5.6
soundfile==0.14.0
temari==0.3.1