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). photoCount a cover počítají jen fotky, které jsou vidět na webu.
| 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í.
Skryté fotky (v administraci „Skrýt“) API neposílá a nepočítají se do photoCount. Když je skrytá titulní fotka, cover je první viditelná fotka galerie.
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…