video: OMDb Test button shows the real reason (not just 'HTTP 401')
OMDb returns a JSON body even on 401, so surface its actual Error: 'Invalid API key!' (nudges the user to click OMDb's activation email) vs 'Request limit reached!' (free-tier daily quota). The worker's pause note uses the same message.
This commit is contained in:
parent
d0c8aa9338
commit
38d48bae37
2 changed files with 34 additions and 4 deletions
|
|
@ -506,11 +506,20 @@ class OMDBClient:
|
||||||
import requests
|
import requests
|
||||||
try:
|
try:
|
||||||
r = requests.get(self.BASE, params={"apikey": self.api_key, "i": "tt0111161"}, timeout=12)
|
r = requests.get(self.BASE, params={"apikey": self.api_key, "i": "tt0111161"}, timeout=12)
|
||||||
d = r.json() if r.status_code == 200 else {}
|
# OMDb returns a JSON body even on 401 — surface its actual Error so the
|
||||||
|
# user sees WHY ("Invalid API key!" = not activated/wrong key;
|
||||||
|
# "Request limit reached!" = free-tier daily quota, resets at midnight).
|
||||||
|
try:
|
||||||
|
d = r.json() or {}
|
||||||
|
except Exception:
|
||||||
|
d = {}
|
||||||
if d.get("Response") == "True":
|
if d.get("Response") == "True":
|
||||||
return True, "OMDb connection OK"
|
return True, "OMDb connection OK"
|
||||||
if "invalid api key" in (d.get("Error") or "").lower():
|
err = (d.get("Error") or "").strip()
|
||||||
return False, "Invalid OMDb API key"
|
if "invalid api key" in err.lower():
|
||||||
|
return False, "Invalid OMDb API key — did you click the activation link OMDb emailed you?"
|
||||||
|
if err:
|
||||||
|
return False, "OMDb: " + err
|
||||||
return False, "OMDb returned HTTP " + str(r.status_code)
|
return False, "OMDb returned HTTP " + str(r.status_code)
|
||||||
except Exception:
|
except Exception:
|
||||||
logger.exception("OMDb test failed")
|
logger.exception("OMDb test failed")
|
||||||
|
|
@ -524,7 +533,12 @@ class OMDBClient:
|
||||||
# A bad/expired key is a 401 (sometimes a 200 with "Invalid API key!") — a
|
# A bad/expired key is a 401 (sometimes a 200 with "Invalid API key!") — a
|
||||||
# config problem that affects EVERY item, so flag it distinctly.
|
# config problem that affects EVERY item, so flag it distinctly.
|
||||||
if r.status_code == 401:
|
if r.status_code == 401:
|
||||||
raise OMDbAuthError("OMDb rejected the API key (HTTP 401)")
|
err = ""
|
||||||
|
try:
|
||||||
|
err = ((r.json() or {}).get("Error") or "").strip()
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
raise OMDbAuthError(err or "OMDb rejected the API key (HTTP 401)")
|
||||||
r.raise_for_status()
|
r.raise_for_status()
|
||||||
d = r.json() or {}
|
d = r.json() or {}
|
||||||
if d.get("Response") != "True":
|
if d.get("Response") != "True":
|
||||||
|
|
|
||||||
|
|
@ -354,6 +354,22 @@ def test_omdb_worker_keeps_item_on_transient_error(db):
|
||||||
assert w.stats["errors"] == 1 and w.paused is False # one blip doesn't pause
|
assert w.stats["errors"] == 1 and w.paused is False # one blip doesn't pause
|
||||||
|
|
||||||
|
|
||||||
|
def test_omdb_test_surfaces_real_error(monkeypatch):
|
||||||
|
# The Test button should show OMDb's actual reason, not just "HTTP 401".
|
||||||
|
class _R:
|
||||||
|
status_code = 401
|
||||||
|
def json(self): return {"Response": "False", "Error": "Request limit reached!"}
|
||||||
|
monkeypatch.setitem(sys.modules, "requests", types.SimpleNamespace(get=lambda u, **k: _R()))
|
||||||
|
ok, msg = OMDBClient("KEY").test()
|
||||||
|
assert ok is False and "Request limit reached!" in msg
|
||||||
|
|
||||||
|
class _R2(_R):
|
||||||
|
def json(self): return {"Response": "False", "Error": "Invalid API key!"}
|
||||||
|
monkeypatch.setitem(sys.modules, "requests", types.SimpleNamespace(get=lambda u, **k: _R2()))
|
||||||
|
ok2, msg2 = OMDBClient("KEY").test()
|
||||||
|
assert ok2 is False and "activation" in msg2.lower() # nudges toward the email link
|
||||||
|
|
||||||
|
|
||||||
def test_omdb_ratings_raises_on_invalid_key(monkeypatch):
|
def test_omdb_ratings_raises_on_invalid_key(monkeypatch):
|
||||||
from core.video.enrichment.clients import OMDbAuthError
|
from core.video.enrichment.clients import OMDbAuthError
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue