#!/usr/bin/env python3 """ reading - Reading list and article tracker Track articles, books, and things to read. """ import json import sys from datetime import datetime from pathlib import Path WORKSPACE = Path("/home/wdjones/.openclaw/workspace") READING_FILE = WORKSPACE / "data" / "reading.json" def load_list() -> list: """Load reading list.""" READING_FILE.parent.mkdir(parents=True, exist_ok=True) if READING_FILE.exists(): with open(READING_FILE) as f: return json.load(f) return [] def save_list(items: list): """Save reading list.""" with open(READING_FILE, 'w') as f: json.dump(items, f, indent=2) def add(title: str, url: str = None, item_type: str = 'article', tags: list = None): """Add to reading list.""" items = load_list() item = { 'id': len(items) + 1, 'title': title, 'url': url, 'type': item_type, 'tags': tags or [], 'added': datetime.now().isoformat(), 'status': 'unread', 'notes': None, } items.append(item) save_list(items) emoji = {'article': 'š', 'book': 'š', 'video': 'š¬', 'paper': 'š'}.get(item_type, 'š') print(f"{emoji} Added: {title}") def show_list(status: str = None, limit: int = 20): """Show reading list.""" items = load_list() if status: items = [i for i in items if i['status'] == status] if not items: print("Reading list is empty") return # Group by status unread = [i for i in items if i['status'] == 'unread'] reading = [i for i in items if i['status'] == 'reading'] done = [i for i in items if i['status'] == 'done'] print(f"\nš Reading List") print("=" * 50) if reading: print(f"\nš Currently Reading ({len(reading)})") for item in reading: print(f" #{item['id']} {item['title'][:40]}") if unread: print(f"\nš„ To Read ({len(unread)})") for item in unread[:10]: emoji = {'article': 'š', 'book': 'š', 'video': 'š¬'}.get(item['type'], 'š') print(f" #{item['id']} {emoji} {item['title'][:40]}") if len(unread) > 10: print(f" ... and {len(unread) - 10} more") if done: print(f"\nā Completed ({len(done)})") for item in done[-5:]: print(f" #{item['id']} {item['title'][:40]}") print() def start_reading(item_id: int): """Mark item as currently reading.""" items = load_list() for item in items: if item['id'] == item_id: item['status'] = 'reading' item['started'] = datetime.now().isoformat() save_list(items) print(f"š Started: {item['title']}") return print(f"Item not found: #{item_id}") def finish_reading(item_id: int, notes: str = None): """Mark item as done.""" items = load_list() for item in items: if item['id'] == item_id: item['status'] = 'done' item['finished'] = datetime.now().isoformat() if notes: item['notes'] = notes save_list(items) print(f"ā Finished: {item['title']}") return print(f"Item not found: #{item_id}") def main(): if len(sys.argv) < 2: show_list() return cmd = sys.argv[1] if cmd == 'add' and len(sys.argv) > 2: # Parse: add