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