68 lines
2.0 KiB
Python
68 lines
2.0 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Reading List Agent
|
|
Fetches Safari "Saved for Later" reading list via the Mac bridge.
|
|
Returns a markdown section for the daily briefing.
|
|
"""
|
|
|
|
import sys
|
|
from shared import api_request, log_run
|
|
|
|
AGENT_ID = "reading-list"
|
|
DEFAULT_BRIDGE_URL = "http://192.168.1.62:8551"
|
|
|
|
|
|
def run(config=None):
|
|
"""Run the reading list agent.
|
|
|
|
Config keys:
|
|
bridge_url: Mac bridge URL (default: http://192.168.1.62:8551)
|
|
unread_only: only show unread items (default: True)
|
|
limit: max items to show (default: 20)
|
|
"""
|
|
cfg = config or {}
|
|
bridge_url = cfg.get("bridge_url", DEFAULT_BRIDGE_URL)
|
|
unread_only = cfg.get("unread_only", True)
|
|
limit = cfg.get("limit", 20)
|
|
|
|
try:
|
|
data = api_request(f"{bridge_url}/api/safari/reading-list")
|
|
items = data.get("items", [])
|
|
|
|
if unread_only:
|
|
items = [i for i in items if i.get("isUnread", True)]
|
|
|
|
items = items[:limit]
|
|
|
|
if not items:
|
|
return "## Reading List\n\n*No saved articles.*\n", "No articles"
|
|
|
|
md = "## Reading List\n\n"
|
|
md += "| Article | Saved |\n"
|
|
md += "|---------|-------|\n"
|
|
|
|
for item in items:
|
|
title = item.get("title", "Untitled")[:70]
|
|
url = item.get("url", "")
|
|
date_added = item.get("dateAdded", "")[:10]
|
|
# Link the title if we have a URL
|
|
display = f"[{title}]({url})" if url else title
|
|
md += f"| {display} | {date_added} |\n"
|
|
|
|
md += "\n"
|
|
summary = f"{len(items)} saved article{'s' if len(items) != 1 else ''}"
|
|
log_run(AGENT_ID, "success", output=summary)
|
|
return md, summary
|
|
|
|
except Exception as e:
|
|
err = f"Reading list error: {e}"
|
|
print(f" {err}", file=sys.stderr)
|
|
log_run(AGENT_ID, "failed", err=err)
|
|
return "## Reading List\n\n*Could not reach Apple Bridge. Is your Mac online?*\n", f"error: {e}"
|
|
|
|
|
|
if __name__ == "__main__":
|
|
section, summary = run()
|
|
print(section)
|
|
print(f"\nSummary: {summary}")
|