| import argparse |
| import sys |
| from pathlib import Path |
|
|
| from ddgs_api.config import ensure_ca_bundle, env_bool, env_int, env_str, load_env |
| from ddgs_api.search import ddgs_search, print_json, print_text |
|
|
|
|
| def build_parser() -> argparse.ArgumentParser: |
| parser = argparse.ArgumentParser( |
| prog="ddgs-search", |
| description="CLI scaffold for DuckDuckGo Search (DDGS) text search", |
| ) |
| parser.add_argument("query", nargs="+", help="Search query text") |
| parser.add_argument( |
| "--region", |
| default=env_str("DDGS_REGION", "us-en"), |
| help="Region code (default: DDGS_REGION or us-en)", |
| ) |
| parser.add_argument( |
| "--safesearch", |
| choices=["on", "moderate", "off"], |
| default=env_str("DDGS_SAFESEARCH", "moderate"), |
| help="Safe search level (default: DDGS_SAFESEARCH or moderate)", |
| ) |
| parser.add_argument( |
| "--timelimit", |
| choices=["d", "w", "m", "y"], |
| default=env_str("DDGS_TIMELIMIT", None), |
| help="Time limit: d/w/m/y (default: DDGS_TIMELIMIT)", |
| ) |
| parser.add_argument( |
| "--max-results", |
| type=int, |
| default=env_int("DDGS_MAX_RESULTS", 10), |
| help="Maximum number of results (default: DDGS_MAX_RESULTS or 10)", |
| ) |
| parser.add_argument( |
| "--backend", |
| default=env_str("DDGS_BACKEND", "auto"), |
| help="Backend to use (default: DDGS_BACKEND or auto)", |
| ) |
| parser.add_argument( |
| "--proxy", |
| default=env_str("DDGS_PROXY", None), |
| help="Proxy URL (default: DDGS_PROXY)", |
| ) |
| parser.add_argument( |
| "--timeout", |
| type=int, |
| default=env_int("DDGS_TIMEOUT", 30), |
| help="Request timeout seconds (default: DDGS_TIMEOUT or 30)", |
| ) |
| verify_default = env_bool("DDGS_VERIFY", True) |
| parser.add_argument( |
| "--verify", |
| dest="verify", |
| action="store_true", |
| default=verify_default, |
| help="Enable SSL verification (default: DDGS_VERIFY or true)", |
| ) |
| parser.add_argument( |
| "--no-verify", |
| dest="verify", |
| action="store_false", |
| help="Disable SSL verification (not recommended)", |
| ) |
| parser.add_argument( |
| "--format", |
| choices=["json", "jsonl", "text"], |
| default=env_str("DDGS_OUTPUT", "json"), |
| help="Output format: json, jsonl, text (default: DDGS_OUTPUT or json)", |
| ) |
| return parser |
|
|
|
|
| def main(argv: list[str] | None = None, *, project_root: Path | None = None) -> int: |
| load_env(project_root=project_root) |
| ensure_ca_bundle(project_root=project_root) |
| parser = build_parser() |
| args = parser.parse_args(argv) |
|
|
| query = " ".join(args.query) |
|
|
| try: |
| results = ddgs_search( |
| query, |
| region=args.region, |
| safesearch=args.safesearch, |
| timelimit=args.timelimit, |
| max_results=args.max_results, |
| backend=args.backend, |
| proxy=args.proxy, |
| timeout=args.timeout, |
| verify=args.verify, |
| ) |
| except Exception as exc: |
| sys.stderr.write(f"Error: {exc}\n") |
| return 1 |
|
|
| if args.format == "text": |
| print_text(results) |
| elif args.format == "jsonl": |
| print_json(results, jsonl=True) |
| else: |
| print_json(results, jsonl=False) |
|
|
| return 0 |
|
|