From 581e0314b4f3de335598ca33e119a67f4736e625 Mon Sep 17 00:00:00 2001 From: pyr0ball Date: Wed, 13 May 2026 19:04:07 -0700 Subject: [PATCH] =?UTF-8?q?fix:=20tautulli=20=E2=80=94=20entry=5Fid=20coll?= =?UTF-8?q?ision=20on=20missing=20ts,=20token=20settings,=20test=20coverag?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/ingest/tautulli.py | 3 ++- app/rest.py | 3 +++ docs/tautulli-setup.md | 2 +- tests/test_ingest_tautulli.py | 10 ++++++++++ 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/app/ingest/tautulli.py b/app/ingest/tautulli.py index 19878bc..dba0cf0 100644 --- a/app/ingest/tautulli.py +++ b/app/ingest/tautulli.py @@ -82,7 +82,8 @@ def parse_webhook( ingest_time = now_iso() severity = _severity(action) matched = apply_patterns(text, compiled_patterns) - entry_id = make_entry_id(source_id, 0, str(raw_ts) + text) + id_ts = str(raw_ts) if raw_ts else ingest_time + entry_id = make_entry_id(source_id, 0, id_ts + text) return RetrievedEntry( entry_id=entry_id, diff --git a/app/rest.py b/app/rest.py index fa9e031..60fcd69 100644 --- a/app/rest.py +++ b/app/rest.py @@ -141,6 +141,7 @@ class SettingsBody(BaseModel): llm_url: str | None = None llm_model: str | None = None llm_api_key: str | None = None + tautulli_token: str | None = None severity_overrides: list[SeverityOverride] | None = None @@ -338,6 +339,8 @@ def patch_settings(body: SettingsBody) -> dict: prefs["llm_model"] = body.llm_model if body.llm_api_key is not None: prefs["llm_api_key"] = body.llm_api_key + if body.tautulli_token is not None: + prefs["tautulli_token"] = body.tautulli_token if body.severity_overrides is not None: prefs["severity_overrides"] = [o.model_dump() for o in body.severity_overrides] _save_prefs(prefs) diff --git a/docs/tautulli-setup.md b/docs/tautulli-setup.md index dce1da9..5d719a8 100644 --- a/docs/tautulli-setup.md +++ b/docs/tautulli-setup.md @@ -43,7 +43,7 @@ http://:8534/turnstone/api/ingest/tautulli ``` Replace `` with the hostname or IP of the machine running -Turnstone. If Turnstone is behind a reverse proxy, use the proxy URL instead. +Turnstone. (8534 is the default port; adjust if you're using a reverse proxy or changed the port) ## Optional token authentication diff --git a/tests/test_ingest_tautulli.py b/tests/test_ingest_tautulli.py index 28f5d3d..0892e2c 100644 --- a/tests/test_ingest_tautulli.py +++ b/tests/test_ingest_tautulli.py @@ -147,6 +147,16 @@ class TestTextFormat: entry = parse_webhook(_STOP_PAYLOAD, []) assert entry.text.startswith("[plex:stop]") + def test_pause_action(self): + payload = {**_STOP_PAYLOAD, "action": "pause", "timestamp": "1747195600", "session_key": "pause01"} + entry = parse_webhook(payload, []) + assert entry.text.startswith("[plex:pause]") + + def test_resume_action(self): + payload = {**_STOP_PAYLOAD, "action": "resume", "timestamp": "1747195700", "session_key": "resume01"} + entry = parse_webhook(payload, []) + assert entry.text.startswith("[plex:resume]") + def test_tv_episode_formats_show_and_title(self): entry = parse_webhook(_ERROR_PAYLOAD, []) assert '"Oshi no Ko — Episode 7"' in entry.text