pydemofoto API
Veřejné API fotogalerií. Vrací JSON, dá se volat z jakékoliv stránky (CORS je povolený pro všechny) a nepotřebuje žádný klíč.
Fotky se nahrávají v administraci. Tady je popsáno, jak je dostat na web.
Rychlý start
const API = 'https://api.pydemo.cz';
const res = await fetch(`${API}/api/galleries`);
const { items } = await res.json();
for (const gallery of items) {
console.log(gallery.title, gallery.cover?.thumb);
}
Endpointy
GET /api/galleries
Seznam zveřejněných galerií, nejnovější první (podle data galerie).
| Parametr | Výchozí | Popis |
|---|---|---|
page | 1 | Číslo stránky, od 1. |
limit | 12 | Počet galerií na stránku, 1–100. |
{
"items": [
{
"slug": "podzim-v-praze",
"title": "Podzim v Praze",
"date": "2026-10-12",
"description": "Procházka po Petříně…",
"photoCount": 14,
"cover": { "id": "…", "title": "…", "description": "…", "width": 6000, "height": 4000,
"thumb": "https://…/media/…/thumb/….jpg", "large": "https://…/media/…/large/….jpg" },
"updatedAt": "2026-10-18T08:00:00.000Z",
"url": "https://api.pydemo.cz/api/galleries/podzim-v-praze"
}
],
"page": 1, "limit": 12, "total": 30, "totalPages": 3, "hasNext": true, "hasPrev": false
}
GET /api/galleries/{slug}
Jedna galerie se všemi fotkami v pořadí, jak je Samuel seřadil. Stejná pole jako v seznamu a navíc photos.
{
"slug": "podzim-v-praze", "title": "Podzim v Praze", "date": "2026-10-12",
"description": "…", "photoCount": 14, "cover": { … },
"photos": [
{ "id": "3f9a1c2b7e", "title": "Lavička", "description": "Ráno v mlze",
"width": 6000, "height": 4000, "thumb": "https://…", "large": "https://…" }
]
}
GET /api/galleries/{slug}/photos
Fotky jedné galerie po stránkách. Parametry page a limit (výchozí 24, nejvýš 200), odpověď má stejný tvar jako seznam galerií.
GET /api/photos
Všechny zveřejněné fotky napříč galeriemi, od nejnovější galerie. Každá fotka má navíc gallery: { slug, title, date }. Hodí se na úvodní stránku nebo „poslední práce“.
Fotky
| Pole | Co to je |
|---|---|
thumb | Náhled, delší strana 800 px. Na mřížky a seznamy. |
large | Velká verze, delší strana 2560 px. Na detail fotky a celou obrazovku. |
width, height | Rozměry originálu. Poměr stran se dá použít předem, aby stránka při načítání neposkakovala: aspect-ratio: width / height. |
title, description | Název a popis fotky. Můžou být prázdné (""). |
exif | Údaje z fotoaparátu, nebo null, když je galerie nezobrazuje nebo je fotka nemá. Každé pole může být null. |
"exif": {
"camera": "Canon EOS 250D",
"lens": "EF50mm f/1.8 STM",
"focalLength": 50, // mm
"focalLength35": 80, // přepočet na kinofilm, mm
"aperture": 1.8, // clona f/1.8
"exposureTime": "1/250", // sekundy
"iso": 100,
"takenAt": "2026-10-12T14:33:10" // místní čas fotoaparátu
}
Poloha (GPS) se přes API nikdy neposílá a obrázky thumb a large žádná metadata neobsahují.
Obrázky se cachují napořád. Když se fotka změní, dostane novou adresu.
Chyby
Chyba vrací HTTP status a JSON { "error": "popis česky" }, například 404 pro neexistující nebo nezveřejněnou galerii, 400 pro špatný parametr.
Ukázka živých dat
- Načítám…