"""Brave search engine implementation."""
from collections.abc import Mapping
from typing import Any, ClassVar
from ddgs.base import BaseSearchEngine
from ddgs.results import TextResult
class Brave(BaseSearchEngine[TextResult]):
"""Brave search engine."""
name = "brave"
category = "text"
provider = "brave"
search_url = "https://search.brave.com/search"
search_method = "GET"
items_xpath = "//div[@data-type='web']"
elements_xpath: ClassVar[Mapping[str, str]] = {
"title": ".//div[(contains(@class,'title') or contains(@class,'sitename-container')) and position()=last()]//text()", # noqa: E501
"href": ".//a[div[contains(@class, 'title')]]/@href",
"body": ".//div[contains(@class, 'snippet')]//div[contains(@class, 'content')]//text()",
}
def build_payload(
self,
query: str,
region: str,
safesearch: str,
timelimit: str | None,
page: int = 1,
**kwargs: str, # noqa: ARG002
) -> dict[str, Any]:
"""Build a payload for the search request."""
payload = {"q": query, "source": "web"}
country, _lang = region.lower().split("-")
cookies = {country: country, "useLocation": "0"}
if safesearch != "moderate":
cookies["safesearch"] = "strict" if safesearch == "on" else "off"
self.http_client.client.set_cookies("https://search.brave.com", cookies)
if timelimit:
payload["tf"] = {"d": "pd", "w": "pw", "m": "pm", "y": "py"}[timelimit]
if page > 1:
payload["offset"] = f"{page - 1}"
return payload