77 lines
2.4 KiB
Python
77 lines
2.4 KiB
Python
|
|
"""
|
||
|
|
Platform Gateway — Karakeep integration (bookmarking).
|
||
|
|
"""
|
||
|
|
|
||
|
|
import json
|
||
|
|
|
||
|
|
from config import KARAKEEP_URL, KARAKEEP_API_KEY
|
||
|
|
from proxy import proxy_request
|
||
|
|
|
||
|
|
|
||
|
|
def handle_karakeep_save(handler, body):
|
||
|
|
"""Save a URL to Karakeep as a bookmark."""
|
||
|
|
if not KARAKEEP_API_KEY:
|
||
|
|
handler._send_json({"error": "Karakeep not configured"}, 502)
|
||
|
|
return
|
||
|
|
try:
|
||
|
|
data = json.loads(body)
|
||
|
|
except Exception as e:
|
||
|
|
handler._send_json({"error": "Invalid JSON"}, 400)
|
||
|
|
return
|
||
|
|
|
||
|
|
url = data.get("url", "")
|
||
|
|
if not url:
|
||
|
|
handler._send_json({"error": "Missing url"}, 400)
|
||
|
|
return
|
||
|
|
|
||
|
|
payload = json.dumps({"type": "link", "url": url}).encode()
|
||
|
|
headers = {
|
||
|
|
"Authorization": f"Bearer {KARAKEEP_API_KEY}",
|
||
|
|
"Content-Type": "application/json",
|
||
|
|
}
|
||
|
|
try:
|
||
|
|
status, _, resp = proxy_request(
|
||
|
|
f"{KARAKEEP_URL}/api/v1/bookmarks", "POST",
|
||
|
|
headers, payload, timeout=15
|
||
|
|
)
|
||
|
|
if status in (200, 201):
|
||
|
|
result = json.loads(resp)
|
||
|
|
handler._send_json({"ok": True, "id": result.get("id", "")})
|
||
|
|
else:
|
||
|
|
print(f"[Karakeep] Save failed ({status}): {resp[:200]}")
|
||
|
|
handler._send_json({"error": "Failed to save", "status": status}, status)
|
||
|
|
except Exception as e:
|
||
|
|
print(f"[Karakeep] Error: {e}")
|
||
|
|
handler._send_json({"error": str(e)}, 500)
|
||
|
|
|
||
|
|
|
||
|
|
def handle_karakeep_delete(handler, body):
|
||
|
|
"""Delete a bookmark from Karakeep."""
|
||
|
|
if not KARAKEEP_API_KEY:
|
||
|
|
handler._send_json({"error": "Karakeep not configured"}, 502)
|
||
|
|
return
|
||
|
|
try:
|
||
|
|
data = json.loads(body)
|
||
|
|
except Exception as e:
|
||
|
|
handler._send_json({"error": "Invalid JSON"}, 400)
|
||
|
|
return
|
||
|
|
bookmark_id = data.get("id", "")
|
||
|
|
if not bookmark_id:
|
||
|
|
handler._send_json({"error": "Missing id"}, 400)
|
||
|
|
return
|
||
|
|
headers = {
|
||
|
|
"Authorization": f"Bearer {KARAKEEP_API_KEY}",
|
||
|
|
}
|
||
|
|
try:
|
||
|
|
status, _, resp = proxy_request(
|
||
|
|
f"{KARAKEEP_URL}/api/v1/bookmarks/{bookmark_id}", "DELETE",
|
||
|
|
headers, timeout=10
|
||
|
|
)
|
||
|
|
if status in (200, 204):
|
||
|
|
handler._send_json({"ok": True})
|
||
|
|
else:
|
||
|
|
handler._send_json({"error": "Delete failed", "status": status}, status)
|
||
|
|
except Exception as e:
|
||
|
|
print(f"[Karakeep] Delete error: {e}")
|
||
|
|
handler._send_json({"error": str(e)}, 500)
|