49 lines
1.8 KiB
Python
49 lines
1.8 KiB
Python
from typing import Any
|
|
|
|
import httpx
|
|
|
|
from app.config import get_settings
|
|
|
|
|
|
class WgerClient:
|
|
def __init__(self) -> None:
|
|
settings = get_settings()
|
|
self.base_url = settings.wger_base_url.rstrip("/")
|
|
|
|
def search_exercises(self, query: str, limit: int = 8) -> list[dict[str, Any]]:
|
|
with httpx.Client(timeout=20.0) as client:
|
|
response = client.get(
|
|
f"{self.base_url}/exercise/search/",
|
|
params={"term": query, "language": "ru"},
|
|
)
|
|
response.raise_for_status()
|
|
data = response.json()
|
|
sug = data.get("suggestions", data) if isinstance(data, dict) else []
|
|
if isinstance(sug, dict):
|
|
results = sug.get("results", [])
|
|
elif isinstance(sug, list):
|
|
results = sug
|
|
else:
|
|
results = []
|
|
|
|
out: list[dict[str, Any]] = []
|
|
for item in results[:limit]:
|
|
if isinstance(item, dict):
|
|
name = item.get("value") or item.get("name") or str(item)
|
|
out.append({"name": name, "data": item})
|
|
elif isinstance(item, str):
|
|
out.append({"name": item})
|
|
if out:
|
|
return out
|
|
|
|
response2 = client.get(
|
|
f"{self.base_url}/exerciseinfo/",
|
|
params={"language": 2, "limit": limit},
|
|
)
|
|
response2.raise_for_status()
|
|
for item in (response2.json().get("results") or [])[:limit]:
|
|
name = item.get("name") or f"#{item.get('id')}"
|
|
if query.lower() in name.lower():
|
|
out.append({"id": item.get("id"), "name": name, "category": item.get("category")})
|
|
return out[:limit]
|