|
import requests |
|
from typing import Tuple, Optional, Dict, Any |
|
|
|
|
|
class CamptocampAPI: |
|
""" |
|
A Python wrapper for the Camptocamp.org REST API v6. |
|
Supports querying outings, routes, waypoints, and more. |
|
""" |
|
|
|
BASE_URL = "https://api.camptocamp.org" |
|
|
|
def __init__(self, language: str = "en") -> None: |
|
""" |
|
Initialize the API client. |
|
|
|
Args: |
|
language (str): Language code for results ('en', 'fr', etc.). |
|
""" |
|
self.language = language |
|
|
|
def _request(self, endpoint: str, params: Dict[str, Any]) -> Dict[str, Any]: |
|
""" |
|
Internal method to send a GET request to the Camptocamp API. |
|
|
|
Args: |
|
endpoint (str): API endpoint (e.g., "/outings"). |
|
params (Dict): Dictionary of query parameters. |
|
|
|
Returns: |
|
Dict: Parsed JSON response. |
|
""" |
|
params["pl"] = self.language |
|
url = f"{self.BASE_URL}{endpoint}" |
|
response = requests.get(url, params=params) |
|
response.raise_for_status() |
|
return response.json() |
|
|
|
def get_recent_outings( |
|
self, |
|
bbox: Tuple[float, float, float, float], |
|
date_range: Optional[Tuple[str, str]] = None, |
|
activity: Optional[str] = None, |
|
limit: int = 10, |
|
) -> Dict[str, Any]: |
|
""" |
|
Get recent outings around a specific location and date. |
|
|
|
Args: |
|
bbox (Tuple[float, float, float, float]): Bounding box as (west, south, east, north). |
|
date_range (Optional[Tuple[str, str]]): Date range (start, end) in YYYY-MM-DD format. |
|
activity (Optional[str]): Activity filter (e.g., "climbing", "hiking"). |
|
limit (int): Max number of results. |
|
|
|
Returns: |
|
Dict: API response containing outings. |
|
""" |
|
params = { |
|
"bbox": ",".join(map(str, bbox)), |
|
"limit": limit, |
|
"orderby": "-date", |
|
} |
|
if date_range: |
|
params["date"] = f"{date_range[0]},{date_range[1]}" |
|
if activity: |
|
params["act"] = activity |
|
|
|
return self._request("/outings", params) |
|
|
|
def search_routes_by_activity( |
|
self, |
|
bbox: Tuple[float, float, float, float], |
|
activity: str, |
|
limit: int = 10, |
|
) -> Dict[str, Any]: |
|
""" |
|
Search for routes in a given area and activity type. |
|
|
|
Args: |
|
bbox (Tuple[float, float, float, float]): Bounding box as (west, south, east, north). |
|
activity (str): Activity filter (e.g., "rock_climbing"). |
|
limit (int): Max number of results. |
|
|
|
Returns: |
|
Dict: API response containing route data. |
|
""" |
|
params = { |
|
"bbox": ",".join(map(str, bbox)), |
|
"act": activity, |
|
"limit": limit, |
|
"orderby": "-date", |
|
} |
|
return self._request("/routes", params) |
|
|
|
def get_route_details(self, route_id: int) -> Dict[str, Any]: |
|
""" |
|
Retrieve full route information by its ID. |
|
|
|
Args: |
|
route_id (int): Camptocamp route ID. |
|
|
|
Returns: |
|
Dict: Full route document with metadata and description. |
|
""" |
|
return self._request(f"/routes/{route_id}/{self.language}", {}) |
|
|
|
def search_waypoints( |
|
self, |
|
bbox: Tuple[float, float, float, float], |
|
limit: int = 10, |
|
) -> Dict[str, Any]: |
|
""" |
|
Get waypoints (e.g., huts, summits) within a given area. |
|
|
|
Args: |
|
bbox (Tuple[float, float, float, float]): Bounding box as (west, south, east, north). |
|
limit (int): Max number of results. |
|
|
|
Returns: |
|
Dict: API response with waypoint data. |
|
""" |
|
params = { |
|
"bbox": ",".join(map(str, bbox)), |
|
"limit": limit, |
|
} |
|
return self._request("/waypoints", params) |
|
|