Spaces:
Running
Running
Hermes Agent commited on
Commit ·
f800904
1
Parent(s): 701239e
chore(ops): temporary tmdb_probe diagnostic endpoint
Browse files- apex/gateway/ops.py +38 -0
apex/gateway/ops.py
CHANGED
|
@@ -177,6 +177,44 @@ async def ops_read(path: str, tail: int = 0, lines: int = 200, request: Request
|
|
| 177 |
return JSONResponse({"ok": True, "path": normalized, "size": size, "content": text})
|
| 178 |
|
| 179 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 180 |
@router.post("/apex/ops/jellyfin/reset")
|
| 181 |
async def ops_jellyfin_reset(request: Request):
|
| 182 |
"""Remove everything under /data/jellyfin and lay down a clean directory skeleton."""
|
|
|
|
| 177 |
return JSONResponse({"ok": True, "path": normalized, "size": size, "content": text})
|
| 178 |
|
| 179 |
|
| 180 |
+
@router.get("/apex/ops/tmdb_probe")
|
| 181 |
+
async def ops_tmdb_probe(tmdb_id: int = 1248251, request: Request = None):
|
| 182 |
+
"""Diagnostic: fetch a TMDB movie detail the same way tg_streamer does and
|
| 183 |
+
return the raw bytes + decoded original_title so encoding divergence between
|
| 184 |
+
the Space runtime and local dev can be pinned down."""
|
| 185 |
+
if not _is_admin(request):
|
| 186 |
+
return _denied()
|
| 187 |
+
import aiohttp
|
| 188 |
+
import socket
|
| 189 |
+
import urllib.parse
|
| 190 |
+
|
| 191 |
+
tmdb_key = os.environ.get("TMDB_API_KEY", "").strip().strip('"')
|
| 192 |
+
if not tmdb_key:
|
| 193 |
+
tmdb_key = os.environ.get("APEX_TMDB_API_KEY", "").strip().strip('"')
|
| 194 |
+
if not tmdb_key:
|
| 195 |
+
return JSONResponse({"ok": False, "error": "no TMDB_API_KEY in env"})
|
| 196 |
+
qs = urllib.parse.urlencode({"api_key": tmdb_key})
|
| 197 |
+
url = f"https://api.themoviedb.org/3/movie/{tmdb_id}?{qs}"
|
| 198 |
+
try:
|
| 199 |
+
connector = aiohttp.TCPConnector(family=socket.AF_INET)
|
| 200 |
+
async with aiohttp.ClientSession(connector=connector) as session:
|
| 201 |
+
async with session.get(url, timeout=15) as resp:
|
| 202 |
+
raw = await resp.read()
|
| 203 |
+
j = await resp.json()
|
| 204 |
+
return JSONResponse({
|
| 205 |
+
"ok": True,
|
| 206 |
+
"status": resp.status,
|
| 207 |
+
"content_type": resp.headers.get("Content-Type"),
|
| 208 |
+
"raw_hex_head": raw[:512].hex(),
|
| 209 |
+
"raw_head": raw[:512].decode("utf-8", errors="replace"),
|
| 210 |
+
"title": j.get("title"),
|
| 211 |
+
"original_title": j.get("original_title"),
|
| 212 |
+
"original_title_repr": repr(j.get("original_title")),
|
| 213 |
+
})
|
| 214 |
+
except Exception as exc:
|
| 215 |
+
return JSONResponse({"ok": False, "error": f"{type(exc).__name__}: {exc}"})
|
| 216 |
+
|
| 217 |
+
|
| 218 |
@router.post("/apex/ops/jellyfin/reset")
|
| 219 |
async def ops_jellyfin_reset(request: Request):
|
| 220 |
"""Remove everything under /data/jellyfin and lay down a clean directory skeleton."""
|