Spaces:
Sleeping
Sleeping
| import json | |
| import os | |
| from datetime import datetime | |
| from typing import List, Dict | |
| SAVE_PATH = "saved_searches.json" | |
| MAX_SAVED = 25 | |
| def _load() -> List[Dict]: | |
| if not os.path.exists(SAVE_PATH): | |
| return [] | |
| try: | |
| with open(SAVE_PATH, "r") as f: | |
| return json.load(f) | |
| except Exception: | |
| return [] | |
| def _save(data: List[Dict]): | |
| try: | |
| with open(SAVE_PATH, "w") as f: | |
| json.dump(data, f, indent=2) | |
| except Exception: | |
| pass | |
| def save(query: str, extended: bool): | |
| """ | |
| Persist a saved search (privacy-safe, local only). | |
| """ | |
| if not query.strip(): | |
| return | |
| data = _load() | |
| entry = { | |
| "query": query, | |
| "extended": bool(extended), | |
| "timestamp": datetime.utcnow().isoformat() + "Z", | |
| } | |
| data.insert(0, entry) | |
| data = data[:MAX_SAVED] | |
| _save(data) | |
| def render() -> str: | |
| """ | |
| Render saved searches as markdown for Gradio. | |
| """ | |
| data = _load() | |
| if not data: | |
| return "_No saved searches yet._" | |
| lines = ["### 💾 Saved Searches\n"] | |
| for i, s in enumerate(data, start=1): | |
| mode = "Extended" if s["extended"] else "Standard" | |
| lines.append( | |
| f"{i}. **{s['query']}** \n" | |
| f" _Mode:_ {mode} · _Saved:_ {s['timestamp']}" | |
| ) | |
| return "\n\n".join(lines) |