Add shareable search links and watched movie indicators

Share: "Copy Link" button generates a URL with ?s={history_id} that
loads the saved search results without auth. Recipients see the same
movie picks.

Watched: When viewing history results or shared searches, cards for
movies the logged-in user has since watched are dimmed with a green
"Watched" badge. Uses a new POST /api/library/watch-check endpoint.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-14 20:22:55 -07:00
parent 7c25de32bd
commit 5c7b3feb1f
5 changed files with 133 additions and 2 deletions
+22
View File
@@ -33,6 +33,28 @@ async def library_stats(request: Request):
await db.close()
@router.post("/watch-check")
async def watch_check(request: Request):
"""Given a list of jellyfin_ids, return which ones the current user has watched."""
user = await get_current_user(request)
body = await request.json()
ids = body.get("jellyfin_ids", [])
if not ids:
return {"watched": []}
db = await get_db()
try:
placeholders = ",".join("?" for _ in ids)
cursor = await db.execute(
f"SELECT jellyfin_id FROM watch_state WHERE user_id = ? AND is_played = 1 AND jellyfin_id IN ({placeholders})",
[user["id"]] + ids,
)
rows = await cursor.fetchall()
return {"watched": [row["jellyfin_id"] for row in rows]}
finally:
await db.close()
@router.post("/sync")
async def trigger_sync(request: Request):
await get_current_user(request)