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).

ParametrVýchozíPopis
page1Číslo stránky, od 1.
limit12Poč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

PoleCo to je
thumbNáhled, delší strana 800 px. Na mřížky a seznamy.
largeVelká verze, delší strana 2560 px. Na detail fotky a celou obrazovku.
width, heightRozmě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, descriptionNá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