Web UI: fix Plex status text, PLEX_URL/PLEX_TOKEN env, local stem server auto-detect, WEB=0
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
2a4e848788
commit
4b53a720c4
5 files changed
+47
-2
No files matched your search
@@ -43,6 +43,9 @@ curl http://192.168.86.2:8765/api/info
|
||||
| `TOKEN` | empty | If set, requests need `X-Stem-Token` or `?token=` |
|
||||
| `INDEX_TTL` | `30` | Seconds between rescans of the stems folder |
|
||||
| `QUEUE_DIR` | `/queue` | stemd's Stem Now folder (`stemd/state/queue` on unraid) |
|
||||
| `PLEX_URL` | empty | Plex address, passed to the web UI via `/api/config` |
|
||||
| `PLEX_TOKEN`| empty | Plex token for the web UI (set `TOKEN` too) |
|
||||
| `WEB` | `1` | `0` turns off the web UI |
|
||||
|
||||
## API
|
||||
|
||||
|
||||
@@ -14,3 +14,5 @@ services:
|
||||
environment:
|
||||
# Optional shared secret; set the same token in the app (Settings > Stem Server).
|
||||
- TOKEN=
|
||||
- PLEX_URL=
|
||||
- PLEX_TOKEN=
|
||||
@@ -16,6 +16,7 @@ Endpoints (all GET unless noted; add ?token=... or X-Stem-Token when TOKEN is se
|
||||
POST /api/prepare?key=<key>&fmt=opus&br=160 start transcodes in the background
|
||||
POST /api/stem {"paths": [...]} "Stem Now": stemd separates these Plex files next
|
||||
/file/<key>/<file>[?fmt=opus&br=160] the stem itself, with Range support
|
||||
/api/config Plex URL and token from PLEX_URL / PLEX_TOKEN, if set
|
||||
/ the web player (web/, or WEB_DIR); no token needed
|
||||
|
||||
<key> is the track's folder relative to STEMS_DIR, e.g. "Artist/Album/01 Song".
|
||||
@@ -44,6 +45,9 @@ PORT = int(os.environ.get("PORT", "8765"))
|
||||
TOKEN = os.environ.get("TOKEN", "")
|
||||
INDEX_TTL = float(os.environ.get("INDEX_TTL", "30"))
|
||||
QUEUE_DIR = os.environ.get("QUEUE_DIR", "/queue") # stemd's request folder, shared with it
|
||||
PLEX_URL = os.environ.get("PLEX_URL", "").rstrip("/")
|
||||
PLEX_TOKEN = os.environ.get("PLEX_TOKEN", "")
|
||||
SERVE_WEB = os.environ.get("WEB", "1") != "0" # WEB=0: API only, no web player
|
||||
MAX_BODY = 8 << 20
|
||||
MARKER = ".stemify.json"
|
||||
VERSION = 1
|
||||
@@ -273,6 +277,8 @@ class Handler(BaseHTTPRequestHandler):
|
||||
self._send(status, json.dumps({"error": msg}).encode())
|
||||
|
||||
def _web(self, path):
|
||||
if not SERVE_WEB:
|
||||
return self._error(404, "not found")
|
||||
if path == "/":
|
||||
path = "/index.html"
|
||||
full = os.path.realpath(os.path.join(WEB_DIR, path.lstrip("/")))
|
||||
@@ -304,6 +310,9 @@ class Handler(BaseHTTPRequestHandler):
|
||||
"name": "stemserve", "version": VERSION, "tracks": INDEX.count,
|
||||
"ffmpeg": bool(FFMPEG), "opus": list(OPUS_RATES) if FFMPEG else [],
|
||||
"stemNow": os.access(QUEUE_DIR, os.W_OK)}).encode())
|
||||
if path == "/api/config":
|
||||
plex = {"url": PLEX_URL, "token": PLEX_TOKEN} if PLEX_URL and PLEX_TOKEN else None
|
||||
return self._send(200, json.dumps({"plex": plex}).encode(), headers={"Cache-Control": "no-store"})
|
||||
if path == "/api/index":
|
||||
body, etag = INDEX.get()
|
||||
if self.headers.get("If-None-Match") == etag:
|
||||
|
||||
Reference in new issue
Block a user