File size: 3,339 Bytes
2aa3e66 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | 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: # noqa: BLE001
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
|