45 lines
1.5 KiB
Python
45 lines
1.5 KiB
Python
import os
|
|
from pathlib import Path
|
|
import httpx
|
|
|
|
API_KEY = os.getenv("PEXELS_KEY", "Vc99rnmOhHhJAbgGQoKLZtsaIVfkeownoQNbTj78VemUjKh08ZYRbf18")
|
|
CACHE_DIR = Path("static/images/pexels")
|
|
|
|
def _client():
|
|
return httpx.Client(
|
|
base_url="https://api.pexels.com/v1/",
|
|
headers={"Authorization": API_KEY},
|
|
timeout=15,
|
|
)
|
|
|
|
def fetch_first(query: str, orientation: str = "portrait") -> dict | None:
|
|
if not API_KEY:
|
|
return None
|
|
try:
|
|
with _client() as client:
|
|
resp = client.get(
|
|
"search",
|
|
params={"query": query, "orientation": orientation, "per_page": 1, "page": 1},
|
|
)
|
|
resp.raise_for_status()
|
|
data = resp.json()
|
|
photo = (data.get("photos") or [None])[0]
|
|
if not photo:
|
|
return None
|
|
src = photo["src"].get("large2x") or photo["src"].get("large") or photo["src"].get("original")
|
|
CACHE_DIR.mkdir(parents=True, exist_ok=True)
|
|
target = CACHE_DIR / f"{photo['id']}.jpg"
|
|
if src:
|
|
img = httpx.get(src, timeout=15)
|
|
img.raise_for_status()
|
|
target.write_bytes(img.content)
|
|
return {
|
|
"id": photo["id"],
|
|
"local_path": f"images/pexels/{photo['id']}.jpg",
|
|
"photographer": photo.get("photographer"),
|
|
"photographer_url": photo.get("photographer_url"),
|
|
}
|
|
except Exception as e:
|
|
print(f"Error fetching from Pexels: {e}")
|
|
return None
|