# FotkyBuzalkovi

Systém pro zpracování, ukládání a vyhledávání rodinných fotografií s automatickou extrakcí EXIF metadat.

## Architektura

Projekt používá kombinaci tří databází, kde každá řeší specifickou úlohu:

```
┌─────────────────────────────────────────────────────────┐
│                    Python aplikace                       │
│              (zpracování fotek, EXIF, hash)              │
└────────────┬──────────────┬──────────────┬───────────────┘
             │              │              │
             ▼              ▼              ▼
      ┌────────────┐  ┌────────────┐  ┌────────────┐
      │ PostgreSQL │  │  MongoDB   │  │   Redis    │
      │ (relační)  │  │ (EXIF/doc) │  │  (cache)   │
      └────────────┘  └────────────┘  └────────────┘
       192.168.1.76    192.168.1.76    localhost
         :5432           :27017          :6379
```

### Proč tři databáze?

| Databáze | Role | Co ukládá |
|----------|------|-----------|
| **PostgreSQL** | Strukturovaná data, relace | `photos`, `cameras`, `photo_tags` - ID, cesty, hashe, FK |
| **MongoDB** | Flexibilní dokumenty | Plná EXIF metadata (různé fotoaparáty = různá pole) |
| **Redis** | Cache + fronty | Miniatury, výsledky vyhledávání, fronta zpracování |

## Datové úložiště

### PostgreSQL - `fotky_buzalkovi`

- **cameras** - seznam fotoaparátů (model, vyrobce)
- **photos** - hlavní tabulka (file_name, file_path, file_hash, taken_at, rozměry, FK na camera)
- **photo_tags** - tagy ke každé fotce (many-to-many)

### MongoDB - `fotky_buzalkovi`

- **photos** kolekce - kompletní EXIF data, GPS souřadnice, nastavení clony, ISO, atd.

### Redis (plánováno)

- **cache:thumb:{photo_id}** - cached miniatury (TTL 1h)
- **queue:process** - fronta nezpracovaných fotek
- **session:{user_id}** - session data

## K čemu Redis

1. **Cache miniatur** - generování miniatur je drahé, Redis je drží v RAM (rychlost ~0.1ms vs ~50ms z disku)
2. **Cache vyhledávání** - "fotky z dovolené 2025" se může opakovat, výsledek se cachuje
3. **Fronta zpracování** - když nahrajete 1000 fotek, Redis funguje jako worker queue
4. **Deduplikace** - rychlá kontrola, zda hash fotky už existuje
5. **Rate limiting** - omezení uploadů

## Instalace

### 1. Python prostředí

```powershell
python -m venv .venv
.venv\Scripts\Activate.ps1
pip install psycopg2-binary pymongo redis pillow exifread python-dotenv
```

### 2. PostgreSQL

Předpoklad: PostgreSQL běží na `192.168.1.76:5432`.

```powershell
python create_schema.py
```

### 3. MongoDB

Předpoklad: MongoDB běží na `192.168.1.76:27017`.

```powershell
python test_mongo.py
```

### 4. Redis (Windows)

Redis oficiálně Windows nepodporuje. Tři možnosti:

**Možnost A - WSL2 (doporučeno):**
```powershell
wsl --install
# v WSL:
sudo apt update
sudo apt install redis-server
sudo service redis-server start
```

**Možnost B - Docker:**
```powershell
docker run -d --name redis -p 6379:6379 redis:latest
```

**Možnost C - Memurai (Windows-native Redis-kompatibilní):**
- Stáhnout z https://www.memurai.com/

Test:
```powershell
python test_db_connection.py
```

## Konfigurace

**⚠️ Hesla v současných skriptech jsou v plain textu - před nasazením přesunout do `.env`:**

```env
PG_HOST=192.168.1.76
PG_PORT=5432
PG_USER=vladimir.buzalka
PG_PASSWORD=...
PG_DB=fotky_buzalkovi

MONGO_URI=mongodb://192.168.1.76:27017/
MONGO_DB=fotky_buzalkovi

REDIS_HOST=localhost
REDIS_PORT=6379
```

## Struktura projektu

```
FotkyBuzalkovi/
├── demo_fotky/              # Testovací fotografie
├── create_schema.py         # Vytvoření PostgreSQL schématu
├── test_db_connection.py    # Test všech tří databází
├── test_mongo.py            # Test MongoDB + vytvoření kolekcí
├── .gitignore
└── README.md
```

## Známé problémy

- `create_schema.py` používá MySQL syntaxi `INDEX idx_x` uvnitř `CREATE TABLE` - v PostgreSQL je potřeba `CREATE INDEX` zvlášť po `CREATE TABLE`
- Hesla jsou hardcodovaná v Python souborech - migrovat do `.env` + `python-dotenv`

## Roadmap

- [ ] Opravit PostgreSQL schéma (INDEX syntaxe)
- [ ] Migrace hesel do `.env`
- [ ] Instalace Redis
- [ ] Skript pro hromadný import fotek z `demo_fotky/`
- [ ] EXIF parser (pillow + exifread)
- [ ] Generování miniatur s Redis cache
- [ ] Web UI pro prohlížení galerie
