notebookVb

This commit is contained in:
administrator
2026-05-24 07:59:25 +02:00
parent 662c890257
commit 7e05384c1f
10 changed files with 87 additions and 1261 deletions
+1 -1
View File
@@ -68,4 +68,4 @@ ENV.bak/
# Generovaná data (velké soubory, nepatří do gitu) # Generovaná data (velké soubory, nepatří do gitu)
output/ output/
photo_exploration.json 30 SběrDat/photo_exploration.json
+5 -122
View File
@@ -216,84 +216,13 @@ with Image.open(path) as img:
--- ---
## 7. Návrh databázového schématu (draft) ## 7. Databázové schéma
```sql Kompletní aktuální schéma (tabulky, sloupce, indexy) viz **[SCHEMA.md](SCHEMA.md)**.
CREATE TABLE photos (
id BIGSERIAL PRIMARY KEY,
-- identita (3 úrovně)
sha256_file CHAR(64) UNIQUE NOT NULL, -- byte identita
sha256_pixels CHAR(64), -- pixel identita
phash BIGINT, -- vizuální podobnost
-- soubor
file_path VARCHAR(1000) NOT NULL,
file_name VARCHAR(255) NOT NULL,
file_size BIGINT,
mime_type VARCHAR(50),
format VARCHAR(20), -- JPEG, PNG, HEIC, ...
width INT,
height INT,
-- pořízení
taken_at TIMESTAMPTZ, -- s timezone (máme OffsetTime!)
taken_at_source VARCHAR(20), -- 'exif' / 'mtime' / 'iptc' / 'unknown'
-- technika (z EXIF)
camera_make VARCHAR(100),
camera_model VARCHAR(255),
lens_model VARCHAR(255),
iso INT,
aperture NUMERIC(4,2),
exposure_time VARCHAR(20), -- "1/500"
focal_length_mm NUMERIC(5,2),
-- GPS (NULL pokud chybí)
gps_lat NUMERIC(10,7),
gps_lon NUMERIC(10,7),
gps_altitude NUMERIC(7,2),
-- klasifikace
is_screenshot BOOLEAN DEFAULT FALSE,
face_count INT, -- z XMP, rozšířit AI
-- flexibilní JSONB pro celý dump
exif_raw JSONB,
iptc_raw JSONB,
xmp_raw JSONB,
-- import / zpracování
imported_at TIMESTAMPTZ DEFAULT NOW(),
processed_at TIMESTAMPTZ,
processing_status VARCHAR(50) DEFAULT 'pending'
);
CREATE INDEX idx_photos_sha256_pixels ON photos(sha256_pixels);
CREATE INDEX idx_photos_phash ON photos(phash);
CREATE INDEX idx_photos_taken_at ON photos(taken_at);
CREATE INDEX idx_photos_camera_model ON photos(camera_model);
CREATE INDEX idx_photos_exif_gin ON photos USING GIN (exif_raw);
CREATE TABLE tags (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
parent_tag_id INT REFERENCES tags(id), -- hierarchie "místo > Praha > Karlův most"
UNIQUE(name, parent_tag_id)
);
CREATE TABLE photo_tags (
photo_id BIGINT REFERENCES photos(id) ON DELETE CASCADE,
tag_id INT REFERENCES tags(id) ON DELETE CASCADE,
source VARCHAR(20), -- 'manual' / 'iptc' / 'xmp' / 'auto'
created_at TIMESTAMPTZ DEFAULT NOW(),
PRIMARY KEY (photo_id, tag_id)
);
```
--- ---
## 8. Otevřené otázky pro příště ## 8. Otevřené otázky
### Foto bez EXIF (sirotek typu [7]) ### Foto bez EXIF (sirotek typu [7])
@@ -326,52 +255,6 @@ CREATE TABLE photo_tags (
--- ---
## 10. Aktuální stav projektu (k 2026-05-21) ## 10. Aktuální stav a struktura projektu
### Soubory v projektu Viz **[README.md](README.md)** — hlavní rozcestník projektu.
```
FotkyBuzalkovi/
├── demo_fotky/ # 7 ukázkových fotek
├── explore_photos.py # Explorační skript (hashe, EXIF, IPTC, XMP)
├── photo_exploration.json # Výstup exploreru
├── create_schema.py # ZASTARALÉ - obsahuje MySQL syntaxi a hardcoded hesla
├── test_db_connection.py # Test PG + Mongo + Redis (Mongo/Redis nebudou potřeba)
├── test_mongo.py # ZASTARALÉ - Mongo nepoužijeme
├── README.md
└── NAVRH.md # Tento dokument
```
### Co bude potřeba udělat
- [ ] Smazat nebo přepsat `create_schema.py` (MySQL syntaxe `INDEX` uvnitř `CREATE TABLE` v PG nefunguje)
- [ ] Migrovat hesla do `.env` + `python-dotenv`
- [ ] Smazat / archivovat `test_mongo.py`
- [ ] Vytvořit migraci podle schématu v sekci 7
- [ ] Skript pro import fotek s deduplikací (workflow v sekci 4)
- [ ] Rozhodnout otevřené otázky ze sekce 8
### Nainstalované Python balíčky
```
psycopg2-binary 2.9.12 # PostgreSQL driver
pymongo 4.17.0 # (nepotřebujeme)
redis 7.4.0 # (zatím nepotřebujeme)
pillow 12.2.0 # Základní práce s obrázky
ExifRead 3.5.1 # Primární EXIF parser (lepší než Pillow)
imagehash 4.3.2 # Perceptuální hashe (pHash, dHash, wHash)
+ numpy, scipy, PyWavelets (závislosti imagehash)
```
---
## 11. Užitečné odkazy
- [Pillow](https://pillow.readthedocs.io/) — Python Imaging Library
- [ExifRead](https://github.com/ianare/exif-py) — EXIF parser
- [imagehash](https://github.com/JohannesBuchner/imagehash) — perceptuální hashe
- [exiftool](https://exiftool.org/) — gold standard pro metadata (Perl, ale `pyexiftool` wrapper)
- [pgvector](https://github.com/pgvector/pgvector) — vektory v PostgreSQL pro sémantické hledání
- [PostgreSQL JSONB docs](https://www.postgresql.org/docs/current/datatype-json.html)
- [IPTC Photo Metadata Standard](https://www.iptc.org/std/photometadata/specification/IPTC-PhotoMetadata)
- [XMP Specification (Adobe)](https://www.adobe.com/devnet/xmp.html)
+81 -136
View File
@@ -1,153 +1,98 @@
# FotkyBuzalkovi # FotkyBuzalkovi
Systém pro zpracování, ukládání a vyhledávání rodinných fotografií s automatickou extrakcí EXIF metadat. Systém pro organizaci a tagování ~200 000 rodinných fotek. Lokální nasazení, bez cloudu.
## Architektura ## Kde jsme
Projekt používá kombinaci tří databází, kde každá řeší specifickou úlohu: - **85 833 fotek** zpracovaných v DB (EXIF, hashe, metadata)
- **39 961 unikátních souborů** fyzicky zálohovaných na Tower1
- Sběr fotek běží ze dvou serverů (tower, Tower1) i z Windows PC
- Průzkumný Streamlit dashboard hotový (`run_webreport.py`)
``` ## Stack
┌─────────────────────────────────────────────────────────┐
│ 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? - **PostgreSQL** (192.168.1.76:5432) — jediná databáze, JSONB nahrazuje MongoDB
- **Filesystem** — fotky zůstávají na disku, v DB jen cesty a metadata
| Databáze | Role | Co ukládá | - **Python** — veškeré skripty (ExifRead pro EXIF, imagehash pro pHash, blake3 pro zálohy)
|----------|------|-----------|
| **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 ## Struktura projektu
``` ```
FotkyBuzalkovi/ FotkyBuzalkovi/
├── demo_fotky/ # Testovací fotografie ├── 00 PictureCollector/ # Sběr fotek ze všech počítačů na Tower1
├── create_schema.py # Vytvoření PostgreSQL schématu ├── collect_pictures.py # Hlavní skript (Linux, běží na tower + Tower1)
├── test_db_connection.py # Test všech tří databází │ ├── collect_pictures_windows.py # Windows verze (pro libovolný PC v síti)
├── test_mongo.py # Test MongoDB + vytvoření kolekcí │ ├── create_tables.py # Vytvoření tabulek zaloha_obrazku + zdrojove_soubory
│ ├── verify_tables.py # Ověření struktury tabulek
│ ├── clear_tables.py # TRUNCATE obou tabulek (pozor!)
│ ├── stats.py # Statistiky sběru
│ ├── ssh_deploy.py # Nasazení skriptu na tower
│ ├── ssh_deploy_tower1.py # Nasazení skriptu na Tower1
│ ├── ssh_install_deps.py # Instalace závislostí na tower
│ ├── ssh_install_tower1.py # Instalace závislostí na Tower1
│ ├── ssh_check_mount.py # Kontrola NFS mountu
│ ├── ssh_check_tower1.py # Kontrola Tower1
│ └── ssh_find_userscripts.py # Hledání Unraid user scriptů
├── 20 PrůzkumFotek/ # Průzkum a vizualizace dat
│ ├── report.py # Streamlit dashboard (spouštět přes run_webreport.py)
│ └── analyze_all.py # Konzolová analýza (jednorázová)
├── 30 SběrDat/ # Zpracování fotek — EXIF parsing, import do DB
│ ├── explore_photos.py # Explorační skript (hashe, EXIF, IPTC, XMP)
│ ├── 10_collect_metadata.py # Sběr metadat z fotek
│ ├── import_to_db.py # Import do tabulky photos
│ ├── create_schema.py # Vytvoření tabulek photos/tags/photo_tags
│ └── photo_exploration.json # Výstup exploreru (7 demo fotek)
├── demo_fotky/ # 7 testovacích fotek (iPhone, screenshot, sirotek)
├── output/ # Výstupy skriptů
│ └── 10_metadata.jsonl # Nasbíraná metadata
├── trash/ # Zastaralé skripty (test_mongo.py, test_db_connection.py)
├── run_webreport.py # Spustí Streamlit dashboard (1 klik v PyCharm)
├── .env # Konfigurace (hesla)
├── .gitignore ├── .gitignore
└── README.md
├── NAVRH.md # → viz docs/NAVRH.md (architektonická rozhodnutí, hashe, metadata)
└── SCHEMA.md # → viz docs/SCHEMA.md (kompletní DB schéma)
``` ```
## Známé problémy ## Detailní dokumentace
- `create_schema.py` používá MySQL syntaxi `INDEX idx_x` uvnitř `CREATE TABLE` - v PostgreSQL je potřeba `CREATE INDEX` zvlášť po `CREATE TABLE` | Soubor | Obsah |
- Hesla jsou hardcodovaná v Python souborech - migrovat do `.env` + `python-dotenv` |--------|-------|
| [SCHEMA.md](SCHEMA.md) | Kompletní DB schéma — všechny tabulky, sloupce, indexy, constrainty |
| [NAVRH.md](NAVRH.md) | Architektonická rozhodnutí, 4 úrovně hashů, EXIF/IPTC/XMP, workflow importu |
## Roadmap ## Infrastruktura
- [ ] Opravit PostgreSQL schéma (INDEX syntaxe) | Server | IP | Role |
- [ ] Migrace hesel do `.env` |--------|----|------|
- [ ] Instalace Redis | **tower** | 192.168.1.76 | Hlavní NAS, PostgreSQL, spouští skripty |
- [ ] Skript pro hromadný import fotek z `demo_fotky/` | **Tower1** | 192.168.1.50 | Archivní NAS, fyzická záloha fotek (`/mnt/user/ZalohaVsechObrazku`) |
- [ ] EXIF parser (pillow + exifread)
- [ ] Generování miniatur s Redis cache SSH klíče sdílené mezi servery. Z tower přístup na Tower1 přes NFS mount.
- [ ] Web UI pro prohlížení galerie
## Rychlý start
```powershell
# Spustit dashboard
python run_webreport.py
# Nasadit collect_pictures na server
python "00 PictureCollector/ssh_deploy.py"
python "00 PictureCollector/ssh_deploy_tower1.py"
# Spustit sběr fotek z Windows PC
python "00 PictureCollector/collect_pictures_windows.py"
```
## Otevřené otázky
1. Fotky bez EXIF (7 % fotek) — importovat s mtime / odmítnout / označit?
2. Shoda `sha256_pixels` — přeskočit / sloučit metadata / uložit oba?
3. Storage layout — in-place / `archiv/YYYY/MM/` / content-addressable?
4. Propojení tabulek skupiny 1 (photos) a skupiny 2 (zaloha_obrazku) — zatím žádný FK
5. Fotky 20132021 — velký propad, chybí zdroje (mobily, iCloud?)
6. 4 210 fotek z 2022 bez kamery — pravděpodobně hromadný export z iCloudu (25.9.2023)
-906
View File
@@ -1,906 +0,0 @@
[
{
"filesystem": {
"file_name": "2026-04-22 09.05.08.jpg",
"file_path": "U:\\PycharmProjects\\FotkyBuzalkovi\\demo_fotky\\2026-04-22 09.05.08.jpg",
"file_size_bytes": 10186179,
"file_size_mb": 9.71,
"mtime": "2026-04-22T09:05:08",
"ctime": "2026-05-19T06:22:12.659966",
"extension": ".jpg"
},
"hashes": {
"sha256_file": "4ea38e22f815c4512e6bfe06d9203180e5920ac7324d2e0e9271e918d53adff5",
"sha256_pixels": "b95b72d63a300cde544091c11f8e884896d583afa0dc380cdebc47b3ade8d05f",
"phash": "f7a2c8606d4c76d4",
"dhash": "c4884c4c4c4cc010",
"ahash": "feffe6a702246098",
"whash": "feffe7a702006098"
},
"pillow": {
"format": "JPEG",
"mode": "RGB",
"width": 5712,
"height": 4284,
"megapixels": 24.47,
"has_transparency": false,
"dpi": [
"72.0",
"72.0"
],
"icc_profile_present": true,
"exif_present": true,
"xmp_snippet": "<?xpacket begin=\"\" id=\"W5M0MpCehiHzreSzNTczkc9d\"?> <x:xmpmeta xmlns:x=\"adobe:ns:meta/\" x:xmptk=\"XMP Core 6.0.0\"> <rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"> <rdf:Description rdf:about=\"\" xmlns:exif=\"http://ns.adobe.com/exif/1.0/\" xmlns:xmp=\"http://ns.adobe.com/xap/1.0/\" xmlns:tiff=\"http://ns.adobe.com/tiff/1.0/\" xmlns:exifEX=\"http://cipa.jp/exif/1.0/\" xmlns:mwg-rs=\"http://www.metadataworkinggroup.com/schemas/regions/\" xmlns:stDim=\"http://ns.adobe.com/xap/1.0/sType/Dimens",
"has_embedded_thumbnail": false
},
"exif_pillow": {
"_error": "'int' object has no attribute 'items'"
},
"exif_exifread": {
"Image Make": "Apple",
"Image Model": "iPhone 16 Pro Max",
"Image Orientation": "Rotated 90 CW",
"Image XResolution": "72",
"Image YResolution": "72",
"Image ResolutionUnit": "Pixels/Inch",
"Image Software": "26.3.1",
"Image DateTime": "2026:04:22 09:05:07",
"Image HostComputer": "iPhone 16 Pro Max",
"Image ExifOffset": "232",
"GPS GPSLatitudeRef": "N",
"GPS GPSLatitude": "[50, 5, 1009/100]",
"GPS GPSLongitudeRef": "E",
"GPS GPSLongitude": "[14, 24, 3089/100]",
"GPS GPSAltitudeRef": "0",
"GPS GPSAltitude": "299875/1571",
"GPS GPSTimeStamp": "[7, 5, 6]",
"GPS GPSSpeedRef": "K",
"GPS GPSSpeed": "0",
"GPS GPSImgDirectionRef": "T",
"GPS GPSImgDirection": "379301/2482",
"GPS GPSDestBearingRef": "T",
"GPS GPSDestBearing": "379301/2482",
"GPS GPSDate": "2026:04:22",
"GPS Tag 0x001F": "43090/3283",
"Image GPSInfo": "2808",
"Thumbnail JPEGInterchangeFormat": "3224",
"Thumbnail JPEGInterchangeFormatLength": "10108",
"EXIF ExposureTime": "1/715",
"EXIF FNumber": "1244236/699009",
"EXIF ExposureProgram": "Program Normal",
"EXIF ISOSpeedRatings": "80",
"EXIF ExifVersion": "0232",
"EXIF DateTimeOriginal": "2026:04:22 09:05:07",
"EXIF DateTimeDigitized": "2026:04:22 09:05:07",
"EXIF OffsetTime": "+02:00",
"EXIF OffsetTimeOriginal": "+02:00",
"EXIF OffsetTimeDigitized": "+02:00",
"EXIF ComponentsConfiguration": "YCbCr",
"EXIF ShutterSpeedValue": "18849/1988",
"EXIF ApertureValue": "42657/25639",
"EXIF BrightnessValue": "72829/10013",
"EXIF ExposureBiasValue": "0",
"EXIF MeteringMode": "Pattern",
"EXIF Flash": "Flash did not fire, compulsory flash mode",
"EXIF FocalLength": "251773/37217",
"EXIF SubjectArea": "[1375, 2179, 413, 416]",
"EXIF MakerNote": "[65, 112, 112, 108, 101, 32, 105, 79, 83, 0, 0, 1, 77, 77, 0, 59, 0, 1, 0, 9, ... ]",
"EXIF SubSecTimeOriginal": "565",
"EXIF SubSecTimeDigitized": "565",
"EXIF FlashPixVersion": "0100",
"EXIF ColorSpace": "Uncalibrated",
"EXIF ExifImageWidth": "5712",
"EXIF ExifImageLength": "4284",
"EXIF SensingMethod": "One-chip color area",
"EXIF SceneType": "Directly Photographed",
"EXIF ExposureMode": "Auto Exposure",
"EXIF WhiteBalance": "Auto",
"EXIF FocalLengthIn35mmFilm": "24",
"EXIF SceneCaptureType": "Standard",
"EXIF LensSpecification": "[253126/37417, 2052196/131047, 1244236/699009, 14/5]",
"EXIF LensMake": "Apple",
"EXIF LensModel": "iPhone 16 Pro Max back triple camera 6.765mm f/1.78",
"EXIF Tag 0xA460": "2",
"MakerNote MakerNoteVersion": "16",
"MakerNote Tag 0x0002": "[161, 0, 127, 0, 112, 0, 61, 0, 40, 0, 49, 0, 45, 0, 10, 0, 31, 0, 213, 1, ... ]",
"MakerNote Tag 0x0003": "[6, 7, 8, 85, 102, 108, 97, 103, 115, 85, 118, 97, 108, 117, 101, 89, 116, 105, 109, 101, ... ]",
"MakerNote AEStable": "No",
"MakerNote AETarget": "188",
"MakerNote AEAverage": "204",
"MakerNote AFStable": "Yes",
"MakerNote Tag 0x0008": "[-856227839/729350144, -1321/103, 64/3]",
"MakerNote Tag 0x000C": "[279109/1162032945, 876031301/809906477]",
"MakerNote Tag 0x000D": "41",
"MakerNote Tag 0x000E": "0",
"MakerNote Tag 0x0010": "1",
"MakerNote Tag 0x0011": "4E88-B357-FC9658AA6BCC",
"MakerNote ImageCaptureType": "Scene",
"MakerNote Tag 0x0019": "19013666",
"MakerNote Tag 0x001A": "8D88B1",
"MakerNote Tag 0x001D": "842542391/1128675373",
"MakerNote Tag 0x001F": "1",
"MakerNote Tag 0x0020": "497E-A420-FA5685058AE3",
"MakerNote Tag 0x0021": "106496/43",
"MakerNote Tag 0x0023": "[277217292, 1443889152]",
"MakerNote Tag 0x0026": "3",
"MakerNote Tag 0x0027": "909192513/926431021",
"MakerNote Tag 0x002B": "459C-B603-F499EADDB45A",
"MakerNote Tag 0x002D": "5227",
"MakerNote CameraType": "Back Normal",
"MakerNote Tag 0x002F": "51",
"MakerNote Tag 0x0030": "71686300/454712541",
"MakerNote Tag 0x0036": "13797",
"MakerNote Tag 0x0037": "8",
"MakerNote Tag 0x0038": "121",
"MakerNote Tag 0x0039": "1",
"MakerNote Tag 0x003A": "164",
"MakerNote Tag 0x003B": "0",
"MakerNote Tag 0x003C": "4",
"MakerNote Tag 0x003D": "100",
"MakerNote Tag 0x003F": "0",
"MakerNote Tag 0x0041": "0",
"MakerNote Tag 0x0042": "0",
"MakerNote Tag 0x0043": "0",
"MakerNote Tag 0x0044": "0",
"MakerNote Tag 0x0045": "0",
"MakerNote Tag 0x0046": "0",
"MakerNote Tag 0x0048": "0",
"MakerNote Tag 0x0049": "0",
"MakerNote Tag 0x004A": "2",
"MakerNote Tag 0x004D": "808505857/33752145",
"MakerNote Tag 0x004E": "[49, 81, 50, 16, 3, 162, 5, 10, 210, 6, 7, 8, 9, 83, 50, 46, 49, 83, 50, 46, ... ]",
"MakerNote Tag 0x004F": "[0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 98, 112, 108, 105, 115, 116, 48, 48, 216, 1, 2, 3, 4, 5]",
"MakerNote Tag 0x0052": "3",
"MakerNote Tag 0x0053": "2",
"MakerNote Tag 0x0054": "[6, 7, 8, 9, 10, 11, 11, 11, 12, 13, 12, 81, 55, 81, 51, 81, 52, 81, 48, 81, ... ]",
"MakerNote Tag 0x0055": "126",
"MakerNote Tag 0x0058": "2307",
"MakerNote Tag 0x005A": "[6, 7, 8, 7, 9, 81, 51, 81, 49, 81, 52, 81, 50, 81, 48, 34, 60, 189, 98, 49, ... ]",
"MakerNote Tag 0x0060": "2048",
"MakerNote Tag 0x0061": "24"
},
"iptc": {},
"xmp": {
"creator_tool": "26.3.1",
"create_date": "2026-04-22T09:05:07.565",
"modify_date": "2026-04-22T09:05:07",
"face_regions_count": 1,
"_xmp_length_bytes": 6047
}
},
{
"filesystem": {
"file_name": "2026-04-24 15.15.47.jpg",
"file_path": "U:\\PycharmProjects\\FotkyBuzalkovi\\demo_fotky\\2026-04-24 15.15.47.jpg",
"file_size_bytes": 5928247,
"file_size_mb": 5.65,
"mtime": "2026-04-24T15:15:47",
"ctime": "2026-05-19T06:22:06.110438",
"extension": ".jpg"
},
"hashes": {
"sha256_file": "500ac874b758feb80f02d5c95d7cb60fd3d651de6220631e9e836c0e9efcf9bf",
"sha256_pixels": "48e05ab5ee5e532117c76d7f6000ede03c1e382ebdb90e22b3df158a90e3933e",
"phash": "e99c96b8b493a4b4",
"dhash": "182062829393cb4e",
"ahash": "fff8f8f0c1c1e0e3",
"whash": "fff8f8e0c0c0e0e1"
},
"pillow": {
"format": "JPEG",
"mode": "RGB",
"width": 4032,
"height": 3024,
"megapixels": 12.19,
"has_transparency": false,
"dpi": [
"72.0",
"72.0"
],
"icc_profile_present": true,
"exif_present": true,
"has_embedded_thumbnail": false
},
"exif_pillow": {
"ResolutionUnit": 2.0,
"ExifOffset": 232.0,
"Make": "Apple",
"Model": "iPhone 13 Pro Max",
"Software": "26.4.1",
"Orientation": 1.0,
"DateTime": "2026:04:24 15:15:46",
"YCbCrPositioning": 1.0,
"XResolution": 72.0,
"YResolution": 72.0,
"HostComputer": "iPhone 13 Pro Max"
},
"exif_exifread": {
"Image Make": "Apple",
"Image Model": "iPhone 13 Pro Max",
"Image Orientation": "Horizontal (normal)",
"Image XResolution": "72",
"Image YResolution": "72",
"Image ResolutionUnit": "Pixels/Inch",
"Image Software": "26.4.1",
"Image DateTime": "2026:04:24 15:15:46",
"Image HostComputer": "iPhone 13 Pro Max",
"Image YCbCrPositioning": "Centered",
"Image ExifOffset": "232",
"Thumbnail JPEGInterchangeFormat": "2750",
"Thumbnail JPEGInterchangeFormatLength": "7338",
"EXIF ExposureTime": "1/184",
"EXIF FNumber": "3/2",
"EXIF ExposureProgram": "Program Normal",
"EXIF ISOSpeedRatings": "40",
"EXIF ExifVersion": "0232",
"EXIF DateTimeOriginal": "2026:04:24 15:15:46",
"EXIF DateTimeDigitized": "2026:04:24 15:15:46",
"EXIF OffsetTime": "+02:00",
"EXIF OffsetTimeOriginal": "+02:00",
"EXIF OffsetTimeDigitized": "+02:00",
"EXIF ComponentsConfiguration": "YCbCr",
"EXIF ShutterSpeedValue": "83635/11111",
"EXIF ApertureValue": "27767/23734",
"EXIF BrightnessValue": "80499/13364",
"EXIF ExposureBiasValue": "0",
"EXIF MeteringMode": "Pattern",
"EXIF Flash": "Flash did not fire, compulsory flash mode",
"EXIF FocalLength": "57/10",
"EXIF SubjectArea": "[2014, 1508, 2218, 1328]",
"EXIF MakerNote": "[65, 112, 112, 108, 101, 32, 105, 79, 83, 0, 0, 1, 77, 77, 0, 60, 0, 1, 0, 9, ... ]",
"EXIF SubSecTimeOriginal": "964",
"EXIF SubSecTimeDigitized": "964",
"EXIF FlashPixVersion": "0100",
"EXIF ColorSpace": "Uncalibrated",
"EXIF ExifImageWidth": "4032",
"EXIF ExifImageLength": "3024",
"EXIF SensingMethod": "One-chip color area",
"EXIF SceneType": "Directly Photographed",
"EXIF ExposureMode": "Auto Exposure",
"EXIF WhiteBalance": "Auto",
"EXIF FocalLengthIn35mmFilm": "26",
"EXIF SceneCaptureType": "Standard",
"EXIF LensSpecification": "[299253/190607, 9, 3/2, 14/5]",
"EXIF LensMake": "Apple",
"EXIF LensModel": "iPhone 13 Pro Max back triple camera 5.7mm f/1.5",
"EXIF Tag 0xA460": "2",
"MakerNote MakerNoteVersion": "16",
"MakerNote Tag 0x0002": "[171, 1, 108, 1, 146, 1, 148, 1, 102, 1, 61, 1, 15, 1, 225, 0, 191, 0, 107, 2, ... ]",
"MakerNote Tag 0x0003": "[6, 7, 8, 85, 102, 108, 97, 103, 115, 85, 118, 97, 108, 117, 101, 89, 116, 105, 109, 101, ... ]",
"MakerNote AEStable": "Yes",
"MakerNote AETarget": "199",
"MakerNote AEAverage": "208",
"MakerNote AFStable": "Yes",
"MakerNote Tag 0x0008": "[401975979/194379776, 22723/23, 256/9]",
"MakerNote Tag 0x000C": "[16384/1061, 67112487/105295456]",
"MakerNote Tag 0x000D": "34",
"MakerNote Tag 0x000E": "0",
"MakerNote Tag 0x0010": "1",
"MakerNote ImageCaptureType": "Photo",
"MakerNote Tag 0x0019": "2",
"MakerNote Tag 0x001A": "-9193-",
"MakerNote Tag 0x001F": "0",
"MakerNote Tag 0x0020": "4018-B96D-3A65CF0E00D6",
"MakerNote Tag 0x0021": "2228224/0",
"MakerNote Tag 0x0023": "[8781826, -950272000]",
"MakerNote Tag 0x0026": "3",
"MakerNote Tag 0x0027": "163616959/158636587",
"MakerNote Tag 0x0028": "1",
"MakerNote Tag 0x002B": "443A-AA33-717906FF9D4E",
"MakerNote Tag 0x002D": "5365",
"MakerNote CameraType": "Back Normal",
"MakerNote Tag 0x002F": "71",
"MakerNote Tag 0x0030": "808506369/33752069",
"MakerNote Tag 0x0033": "4096",
"MakerNote Tag 0x0034": "4",
"MakerNote Tag 0x0035": "3",
"MakerNote Tag 0x0036": "4214",
"MakerNote Tag 0x0037": "4",
"MakerNote Tag 0x0038": "121",
"MakerNote Tag 0x0039": "0",
"MakerNote Tag 0x003A": "0",
"MakerNote Tag 0x003B": "0",
"MakerNote Tag 0x003C": "4",
"MakerNote Tag 0x003D": "34",
"MakerNote Tag 0x003F": "45",
"MakerNote Tag 0x0040": "[6, 6, 7, 81, 51, 81, 49, 81, 50, 81, 48, 16, 0, 34, 0, 0, 0, 0, 16, 1, ... ]",
"MakerNote Tag 0x0041": "0",
"MakerNote Tag 0x0042": "0",
"MakerNote Tag 0x0043": "0",
"MakerNote Tag 0x0044": "0",
"MakerNote Tag 0x0045": "0",
"MakerNote Tag 0x0046": "0",
"MakerNote Tag 0x0048": "570",
"MakerNote Tag 0x0049": "0",
"MakerNote Tag 0x004A": "2",
"MakerNote Tag 0x004D": "808505857/33752145",
"MakerNote Tag 0x004E": "[49, 81, 50, 16, 3, 162, 5, 10, 210, 6, 7, 8, 9, 83, 50, 46, 49, 83, 50, 46, ... ]",
"MakerNote Tag 0x004F": "[0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 144, 245, 0, 2, 232, 143, 0, 0, 0, 9, 0, 0]",
"MakerNote Tag 0x0052": "3",
"MakerNote Tag 0x0053": "1",
"MakerNote Tag 0x0055": "0",
"MakerNote Tag 0x0058": "1795",
"MakerNote Tag 0x0060": "11057",
"MakerNote Tag 0x0061": "26"
},
"iptc": {},
"xmp": {}
},
{
"filesystem": {
"file_name": "2026-05-02 10.04.44.png",
"file_path": "U:\\PycharmProjects\\FotkyBuzalkovi\\demo_fotky\\2026-05-02 10.04.44.png",
"file_size_bytes": 652043,
"file_size_mb": 0.62,
"mtime": "2026-05-02T10:04:44",
"ctime": "2026-05-19T06:22:01.483987",
"extension": ".png"
},
"hashes": {
"sha256_file": "bfbebc9c3db1b1c50af4925c7208c422425e637da1b497271096e298382ca2c3",
"sha256_pixels": "53bb4fd7cb92bb3e709f3bef385324034ed608a0fb23f54de1f5b5d1c3b3fa67",
"phash": "8f4be06bd2f0161e",
"dhash": "4b6b755d7b6f6fea",
"ahash": "f9b91fff17839fff",
"whash": "b8980fef030303ff"
},
"pillow": {
"format": "PNG",
"mode": "RGB",
"width": 1284,
"height": 2778,
"megapixels": 3.57,
"has_transparency": false,
"dpi": [
143.99259999999998,
143.99259999999998
],
"icc_profile_present": false,
"exif_present": true,
"xmp_snippet": "<x:xmpmeta xmlns:x=\"adobe:ns:meta/\" x:xmptk=\"XMP Core 6.0.0\">\n <rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n <rdf:Description rdf:about=\"\"\n xmlns:exif=\"http://ns.adobe.com/exif/1.0/\"\n xmlns:photoshop=\"http://ns.adobe.com/photoshop/1.0/\"\n xmlns:xmp=\"http://ns.adobe.com/xap/1.0/\"\n xmlns:tiff=\"http://ns.adobe.com/tiff/1.0/\"\n xmlns:dc=\"http://purl.org/dc/elements/1.1/\">\n <exif:UserComment>Screenshot</exif:User",
"has_embedded_thumbnail": false
},
"exif_pillow": {
"ResolutionUnit": 2.0,
"ExifOffset": 146.0,
"ImageDescription": "Screenshot",
"Orientation": 1.0,
"DateTime": "2026:05:02 10:04:44",
"XResolution": 144.0,
"YResolution": 144.0
},
"exif_exifread": {
"Image ImageDescription": "Screenshot",
"Image Orientation": "Horizontal (normal)",
"Image XResolution": "144",
"Image YResolution": "144",
"Image ResolutionUnit": "Pixels/Inch",
"Image DateTime": "2026:05:02 10:04:44",
"Image ExifOffset": "146",
"EXIF DateTimeOriginal": "2026:05:02 10:04:44",
"EXIF UserComment": "Screenshot",
"EXIF ColorSpace": "sRGB",
"EXIF ExifImageWidth": "1284",
"EXIF ExifImageLength": "2778"
},
"iptc": {},
"xmp": {
"description": "Screenshot",
"_xmp_length_bytes": 909
}
},
{
"filesystem": {
"file_name": "2026-05-18 06.22.37.jpg",
"file_path": "U:\\PycharmProjects\\FotkyBuzalkovi\\demo_fotky\\2026-05-18 06.22.37.jpg",
"file_size_bytes": 9331138,
"file_size_mb": 8.9,
"mtime": "2026-05-18T06:22:37",
"ctime": "2026-05-19T06:21:53.390486",
"extension": ".jpg"
},
"hashes": {
"sha256_file": "9b9395396fd7893cdcdc69703a9e8e331bd93ce64da53ef9b5b25f3d786036ed",
"sha256_pixels": "47d95e29f8972b2d4d8f4f28b42a335bac4a629248486bc2ad1694467d1d4630",
"phash": "edcc9e48e832b5a4",
"dhash": "a2e2c68383d6d002",
"ahash": "f8f8f3f1f0600080",
"whash": "f8f8fbf1f06000f0"
},
"pillow": {
"format": "JPEG",
"mode": "RGB",
"width": 4032,
"height": 3024,
"megapixels": 12.19,
"has_transparency": false,
"dpi": [
"72.0",
"72.0"
],
"icc_profile_present": true,
"exif_present": true,
"xmp_snippet": "<?xpacket begin=\"\" id=\"W5M0MpCehiHzreSzNTczkc9d\"?> <x:xmpmeta xmlns:x=\"adobe:ns:meta/\" x:xmptk=\"XMP Core 6.0.0\"> <rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"> <rdf:Description rdf:about=\"\" xmlns:exif=\"http://ns.adobe.com/exif/1.0/\" xmlns:exifEX=\"http://cipa.jp/exif/1.0/\" xmlns:tiff=\"http://ns.adobe.com/tiff/1.0/\" xmlns:photoshop=\"http://ns.adobe.com/photoshop/1.0/\" xmlns:xmp=\"http://ns.adobe.com/xap/1.0/\" xmlns:mwg-rs=\"http://www.metadataworkinggroup.com/schemas/regions/\" ",
"has_embedded_thumbnail": false
},
"exif_pillow": {
"ResolutionUnit": 2.0,
"ExifOffset": 220.0,
"Make": "Apple",
"Model": "iPhone 13 Pro Max",
"Software": "26.4.2",
"Orientation": 6.0,
"DateTime": "2026:05:18 06:22:37",
"XResolution": 72.0,
"YResolution": 72.0,
"HostComputer": "iPhone 13 Pro Max"
},
"exif_exifread": {
"Image Make": "Apple",
"Image Model": "iPhone 13 Pro Max",
"Image Orientation": "Rotated 90 CW",
"Image XResolution": "72",
"Image YResolution": "72",
"Image ResolutionUnit": "Pixels/Inch",
"Image Software": "26.4.2",
"Image DateTime": "2026:05:18 06:22:37",
"Image HostComputer": "iPhone 13 Pro Max",
"Image ExifOffset": "220",
"Thumbnail JPEGInterchangeFormat": "2776",
"Thumbnail JPEGInterchangeFormatLength": "7602",
"EXIF ExposureTime": "1/50",
"EXIF FNumber": "3/2",
"EXIF ExposureProgram": "Program Normal",
"EXIF ISOSpeedRatings": "200",
"EXIF ExifVersion": "0232",
"EXIF DateTimeOriginal": "2026:05:18 06:22:37",
"EXIF DateTimeDigitized": "2026:05:18 06:22:37",
"EXIF OffsetTime": "+02:00",
"EXIF OffsetTimeOriginal": "+02:00",
"EXIF OffsetTimeDigitized": "+02:00",
"EXIF ComponentsConfiguration": "YCbCr",
"EXIF ShutterSpeedValue": "48307/8559",
"EXIF ApertureValue": "27767/23734",
"EXIF BrightnessValue": "22485/14578",
"EXIF ExposureBiasValue": "0",
"EXIF MeteringMode": "Pattern",
"EXIF Flash": "Flash did not fire, compulsory flash mode",
"EXIF FocalLength": "57/10",
"EXIF SubjectArea": "[1000, 1528, 190, 191]",
"EXIF MakerNote": "[65, 112, 112, 108, 101, 32, 105, 79, 83, 0, 0, 1, 77, 77, 0, 59, 0, 1, 0, 9, ... ]",
"EXIF SubSecTimeOriginal": "375",
"EXIF SubSecTimeDigitized": "375",
"EXIF FlashPixVersion": "0100",
"EXIF ColorSpace": "Uncalibrated",
"EXIF ExifImageWidth": "4032",
"EXIF ExifImageLength": "3024",
"EXIF SensingMethod": "One-chip color area",
"EXIF SceneType": "Directly Photographed",
"EXIF ExposureMode": "Auto Exposure",
"EXIF WhiteBalance": "Auto",
"EXIF FocalLengthIn35mmFilm": "26",
"EXIF SceneCaptureType": "Standard",
"EXIF LensSpecification": "[299253/190607, 9, 3/2, 14/5]",
"EXIF LensMake": "Apple",
"EXIF LensModel": "iPhone 13 Pro Max back triple camera 5.7mm f/1.5",
"EXIF Tag 0xA460": "2",
"MakerNote MakerNoteVersion": "16",
"MakerNote Tag 0x0002": "[22, 2, 104, 2, 90, 1, 152, 0, 121, 0, 109, 0, 108, 0, 118, 0, 121, 0, 139, 0, ... ]",
"MakerNote Tag 0x0003": "[6, 7, 8, 85, 102, 108, 97, 103, 115, 85, 118, 97, 108, 117, 101, 89, 116, 105, 109, 101, ... ]",
"MakerNote AEStable": "Yes",
"MakerNote AETarget": "192",
"MakerNote AEAverage": "184",
"MakerNote AFStable": "Yes",
"MakerNote Tag 0x0008": "[653568683/78381056, 13267/125, 256/55]",
"MakerNote Tag 0x000C": "[2103323/437786648, 314292673/392696335]",
"MakerNote Tag 0x000D": "24",
"MakerNote Tag 0x000E": "0",
"MakerNote Tag 0x0010": "1",
"MakerNote Tag 0x0011": "4FAB-8319-C67E13D5DB53",
"MakerNote ImageCaptureType": "Scene",
"MakerNote Tag 0x0019": "8194",
"MakerNote Tag 0x001A": "-BB21-",
"MakerNote Tag 0x001F": "0",
"MakerNote Tag 0x0020": "497C-BF6F-D6B9ACA3BAEA",
"MakerNote Tag 0x0021": "2818048/0",
"MakerNote Tag 0x0023": "[344850434, -1100677120]",
"MakerNote Tag 0x0026": "3",
"MakerNote Tag 0x0027": "910503235/1177825837",
"MakerNote Tag 0x002B": "45D3-801F-A154352C61C6",
"MakerNote Tag 0x002D": "3476",
"MakerNote CameraType": "Back Normal",
"MakerNote Tag 0x002F": "50",
"MakerNote Tag 0x0030": "808506369/33752069",
"MakerNote Tag 0x0033": "12288",
"MakerNote Tag 0x0034": "5",
"MakerNote Tag 0x0035": "4",
"MakerNote Tag 0x0036": "179",
"MakerNote Tag 0x0037": "4",
"MakerNote Tag 0x0038": "201",
"MakerNote Tag 0x0039": "1",
"MakerNote Tag 0x003A": "133",
"MakerNote Tag 0x003B": "0",
"MakerNote Tag 0x003C": "4",
"MakerNote Tag 0x003D": "33",
"MakerNote Tag 0x0040": "[6, 6, 7, 81, 51, 81, 49, 81, 50, 81, 48, 16, 0, 34, 0, 0, 0, 0, 16, 1, ... ]",
"MakerNote Tag 0x0041": "0",
"MakerNote Tag 0x0042": "0",
"MakerNote Tag 0x0043": "0",
"MakerNote Tag 0x0044": "0",
"MakerNote Tag 0x0045": "0",
"MakerNote Tag 0x0046": "0",
"MakerNote Tag 0x0048": "569",
"MakerNote Tag 0x0049": "0",
"MakerNote Tag 0x004A": "2",
"MakerNote Tag 0x004D": "808505857/33752145",
"MakerNote Tag 0x004E": "[49, 81, 50, 16, 1, 162, 5, 10, 210, 6, 7, 8, 9, 83, 50, 46, 49, 83, 50, 46, ... ]",
"MakerNote Tag 0x004F": "[0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 4, 144, 245, 0, 2, 232, 143, 0, 0, 0, 9, 0]",
"MakerNote Tag 0x0052": "3",
"MakerNote Tag 0x0053": "0",
"MakerNote Tag 0x0055": "174",
"MakerNote Tag 0x0058": "1795",
"MakerNote Tag 0x0060": "6424",
"MakerNote Tag 0x0061": "26"
},
"iptc": {},
"xmp": {
"creator_tool": "26.4.2",
"create_date": "2026-05-18T06:22:37.375",
"modify_date": "2026-05-18T06:22:37",
"face_regions_count": 1,
"_xmp_length_bytes": 5345
}
},
{
"filesystem": {
"file_name": "2026-05-18 06.22.41.jpg",
"file_path": "U:\\PycharmProjects\\FotkyBuzalkovi\\demo_fotky\\2026-05-18 06.22.41.jpg",
"file_size_bytes": 8328001,
"file_size_mb": 7.94,
"mtime": "2026-05-18T06:22:41",
"ctime": "2026-05-19T06:21:46.033863",
"extension": ".jpg"
},
"hashes": {
"sha256_file": "e22b409fecfd997585b8bb16850c8568e876b780d54d091fc086803c5e884c80",
"sha256_pixels": "3fb2350a514b8840984fbb8e85e0aad834a670f14d01aef56ce07d1dbb1d6c62",
"phash": "e9cc9e496a32b5a4",
"dhash": "a2e2c68383d2d002",
"ahash": "f8f8f3f1f0600080",
"whash": "f8f8fbf1f16000b0"
},
"pillow": {
"format": "JPEG",
"mode": "RGB",
"width": 4032,
"height": 3024,
"megapixels": 12.19,
"has_transparency": false,
"dpi": [
"72.0",
"72.0"
],
"icc_profile_present": true,
"exif_present": true,
"xmp_snippet": "<?xpacket begin=\"\" id=\"W5M0MpCehiHzreSzNTczkc9d\"?> <x:xmpmeta xmlns:x=\"adobe:ns:meta/\" x:xmptk=\"XMP Core 6.0.0\"> <rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"> <rdf:Description rdf:about=\"\" xmlns:exif=\"http://ns.adobe.com/exif/1.0/\" xmlns:exifEX=\"http://cipa.jp/exif/1.0/\" xmlns:tiff=\"http://ns.adobe.com/tiff/1.0/\" xmlns:photoshop=\"http://ns.adobe.com/photoshop/1.0/\" xmlns:xmp=\"http://ns.adobe.com/xap/1.0/\" xmlns:mwg-rs=\"http://www.metadataworkinggroup.com/schemas/regions/\" ",
"has_embedded_thumbnail": false
},
"exif_pillow": {
"ResolutionUnit": 2.0,
"ExifOffset": 220.0,
"Make": "Apple",
"Model": "iPhone 13 Pro Max",
"Software": "26.4.2",
"Orientation": 6.0,
"DateTime": "2026:05:18 06:22:41",
"XResolution": 72.0,
"YResolution": 72.0,
"HostComputer": "iPhone 13 Pro Max"
},
"exif_exifread": {
"Image Make": "Apple",
"Image Model": "iPhone 13 Pro Max",
"Image Orientation": "Rotated 90 CW",
"Image XResolution": "72",
"Image YResolution": "72",
"Image ResolutionUnit": "Pixels/Inch",
"Image Software": "26.4.2",
"Image DateTime": "2026:05:18 06:22:41",
"Image HostComputer": "iPhone 13 Pro Max",
"Image ExifOffset": "220",
"Thumbnail JPEGInterchangeFormat": "2776",
"Thumbnail JPEGInterchangeFormatLength": "7639",
"EXIF ExposureTime": "1/50",
"EXIF FNumber": "3/2",
"EXIF ExposureProgram": "Program Normal",
"EXIF ISOSpeedRatings": "200",
"EXIF ExifVersion": "0232",
"EXIF DateTimeOriginal": "2026:05:18 06:22:41",
"EXIF DateTimeDigitized": "2026:05:18 06:22:41",
"EXIF OffsetTime": "+02:00",
"EXIF OffsetTimeOriginal": "+02:00",
"EXIF OffsetTimeDigitized": "+02:00",
"EXIF ComponentsConfiguration": "YCbCr",
"EXIF ShutterSpeedValue": "48307/8559",
"EXIF ApertureValue": "27767/23734",
"EXIF BrightnessValue": "5765/3682",
"EXIF ExposureBiasValue": "0",
"EXIF MeteringMode": "Pattern",
"EXIF Flash": "Flash did not fire, compulsory flash mode",
"EXIF FocalLength": "57/10",
"EXIF SubjectArea": "[1025, 1438, 190, 191]",
"EXIF MakerNote": "[65, 112, 112, 108, 101, 32, 105, 79, 83, 0, 0, 1, 77, 77, 0, 59, 0, 1, 0, 9, ... ]",
"EXIF SubSecTimeOriginal": "023",
"EXIF SubSecTimeDigitized": "023",
"EXIF FlashPixVersion": "0100",
"EXIF ColorSpace": "Uncalibrated",
"EXIF ExifImageWidth": "4032",
"EXIF ExifImageLength": "3024",
"EXIF SensingMethod": "One-chip color area",
"EXIF SceneType": "Directly Photographed",
"EXIF ExposureMode": "Auto Exposure",
"EXIF WhiteBalance": "Auto",
"EXIF FocalLengthIn35mmFilm": "26",
"EXIF SceneCaptureType": "Standard",
"EXIF LensSpecification": "[299253/190607, 9, 3/2, 14/5]",
"EXIF LensMake": "Apple",
"EXIF LensModel": "iPhone 13 Pro Max back triple camera 5.7mm f/1.5",
"EXIF Tag 0xA460": "2",
"MakerNote MakerNoteVersion": "16",
"MakerNote Tag 0x0002": "[9, 2, 186, 2, 164, 1, 174, 0, 132, 0, 109, 0, 107, 0, 118, 0, 120, 0, 136, 0, ... ]",
"MakerNote Tag 0x0003": "[6, 7, 8, 85, 102, 108, 97, 103, 115, 85, 118, 97, 108, 117, 101, 89, 116, 105, 109, 101, ... ]",
"MakerNote AEStable": "Yes",
"MakerNote AETarget": "192",
"MakerNote AEAverage": "187",
"MakerNote AFStable": "Yes",
"MakerNote Tag 0x0008": "[-1233846271/1143537664, -1825/49, 64/187]",
"MakerNote Tag 0x000C": "[16790593/909130039, 1093741891/1127760685]",
"MakerNote Tag 0x000D": "24",
"MakerNote Tag 0x000E": "0",
"MakerNote Tag 0x0010": "1",
"MakerNote Tag 0x0011": "4345-8E58-D5B765E42693",
"MakerNote ImageCaptureType": "Scene",
"MakerNote Tag 0x0019": "8194",
"MakerNote Tag 0x001A": "-3ED5-",
"MakerNote Tag 0x001F": "0",
"MakerNote Tag 0x0020": "42CB-8A14-2D09F1435647",
"MakerNote Tag 0x0021": "2228224/0",
"MakerNote Tag 0x0023": "[344850436, -1787625472]",
"MakerNote Tag 0x0026": "3",
"MakerNote Tag 0x0027": "1178873142/875704621",
"MakerNote Tag 0x002B": "4B9E-8FE9-F6739C66DC97",
"MakerNote Tag 0x002D": "3476",
"MakerNote CameraType": "Back Normal",
"MakerNote Tag 0x002F": "50",
"MakerNote Tag 0x0030": "808506369/33752069",
"MakerNote Tag 0x0033": "12288",
"MakerNote Tag 0x0034": "5",
"MakerNote Tag 0x0035": "4",
"MakerNote Tag 0x0036": "180",
"MakerNote Tag 0x0037": "4",
"MakerNote Tag 0x0038": "203",
"MakerNote Tag 0x0039": "1",
"MakerNote Tag 0x003A": "133",
"MakerNote Tag 0x003B": "0",
"MakerNote Tag 0x003C": "4",
"MakerNote Tag 0x003D": "66",
"MakerNote Tag 0x0040": "[6, 6, 7, 81, 51, 81, 49, 81, 50, 81, 48, 16, 0, 34, 0, 0, 0, 0, 16, 1, ... ]",
"MakerNote Tag 0x0041": "0",
"MakerNote Tag 0x0042": "0",
"MakerNote Tag 0x0043": "0",
"MakerNote Tag 0x0044": "0",
"MakerNote Tag 0x0045": "0",
"MakerNote Tag 0x0046": "0",
"MakerNote Tag 0x0048": "569",
"MakerNote Tag 0x0049": "0",
"MakerNote Tag 0x004A": "2",
"MakerNote Tag 0x004D": "808505857/33752145",
"MakerNote Tag 0x004E": "[49, 81, 50, 16, 1, 162, 5, 10, 210, 6, 7, 8, 9, 83, 50, 46, 49, 83, 50, 46, ... ]",
"MakerNote Tag 0x004F": "[0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 4, 144, 245, 0, 2, 232, 143, 0, 0, 0, 9, 0]",
"MakerNote Tag 0x0052": "3",
"MakerNote Tag 0x0053": "0",
"MakerNote Tag 0x0055": "185",
"MakerNote Tag 0x0058": "1795",
"MakerNote Tag 0x0060": "10127",
"MakerNote Tag 0x0061": "26"
},
"iptc": {},
"xmp": {
"creator_tool": "26.4.2",
"create_date": "2026-05-18T06:22:41.023",
"modify_date": "2026-05-18T06:22:41",
"face_regions_count": 1,
"_xmp_length_bytes": 5345
}
},
{
"filesystem": {
"file_name": "2026-05-18 13.54.47.jpg",
"file_path": "U:\\PycharmProjects\\FotkyBuzalkovi\\demo_fotky\\2026-05-18 13.54.47.jpg",
"file_size_bytes": 3149514,
"file_size_mb": 3.0,
"mtime": "2026-05-18T13:54:47",
"ctime": "2026-05-19T06:21:40.360916",
"extension": ".jpg"
},
"hashes": {
"sha256_file": "be41557d3ef6822c24a00905e65ad9fba5950bf03ed5c2a434d25c893ed0a87d",
"sha256_pixels": "417d6fc06052eba388922d61af72674becb044b8650f2ac528a59aa3109d0408",
"phash": "f8124da5f87a0e27",
"dhash": "0b926d3902230203",
"ahash": "000000dcfffffbf8",
"whash": "000000dcfffff9f8"
},
"pillow": {
"format": "JPEG",
"mode": "RGB",
"width": 4032,
"height": 3024,
"megapixels": 12.19,
"has_transparency": false,
"dpi": [
"72.0",
"72.0"
],
"icc_profile_present": true,
"exif_present": true,
"has_embedded_thumbnail": false
},
"exif_pillow": {
"ResolutionUnit": 2.0,
"ExifOffset": 220.0,
"Make": "Apple",
"Model": "iPhone 13 Pro Max",
"Software": "26.4.2",
"Orientation": 6.0,
"DateTime": "2026:05:18 13:54:46",
"XResolution": 72.0,
"YResolution": 72.0,
"HostComputer": "iPhone 13 Pro Max"
},
"exif_exifread": {
"Image Make": "Apple",
"Image Model": "iPhone 13 Pro Max",
"Image Orientation": "Rotated 90 CW",
"Image XResolution": "72",
"Image YResolution": "72",
"Image ResolutionUnit": "Pixels/Inch",
"Image Software": "26.4.2",
"Image DateTime": "2026:05:18 13:54:46",
"Image HostComputer": "iPhone 13 Pro Max",
"Image ExifOffset": "220",
"EXIF ExposureTime": "1/100",
"EXIF FNumber": "3/2",
"EXIF ExposureProgram": "Program Normal",
"EXIF ISOSpeedRatings": "40",
"EXIF DateTimeOriginal": "2026:05:18 13:54:46",
"EXIF DateTimeDigitized": "2026:05:18 13:54:46",
"EXIF OffsetTime": "+02:00",
"EXIF OffsetTimeOriginal": "+02:00",
"EXIF OffsetTimeDigitized": "+02:00",
"EXIF ShutterSpeedValue": "135889/20452",
"EXIF ApertureValue": "27767/23734",
"EXIF BrightnessValue": "99413/19450",
"EXIF ExposureBiasValue": "0",
"EXIF MeteringMode": "Pattern",
"EXIF Flash": "Flash did not fire, compulsory flash mode",
"EXIF FocalLength": "57/10",
"EXIF SubjectArea": "[2014, 1508, 2218, 1328]",
"EXIF MakerNote": "[65, 112, 112, 108, 101, 32, 105, 79, 83, 0, 0, 1, 77, 77, 0, 58, 0, 1, 0, 9, ... ]",
"EXIF SubSecTimeOriginal": "334",
"EXIF SubSecTimeDigitized": "334",
"EXIF ColorSpace": "Uncalibrated",
"EXIF ExifImageWidth": "4032",
"EXIF ExifImageLength": "3024",
"EXIF SensingMethod": "One-chip color area",
"EXIF SceneType": "Directly Photographed",
"EXIF ExposureMode": "Auto Exposure",
"EXIF WhiteBalance": "Auto",
"EXIF FocalLengthIn35mmFilm": "26",
"EXIF LensSpecification": "[299253/190607, 9, 3/2, 14/5]",
"EXIF LensMake": "Apple",
"EXIF LensModel": "iPhone 13 Pro Max back triple camera 5.7mm f/1.5",
"EXIF Tag 0xA460": "2",
"MakerNote MakerNoteVersion": "16",
"MakerNote Tag 0x0002": "[9, 1, 5, 1, 252, 0, 245, 0, 237, 0, 223, 0, 199, 0, 177, 0, 163, 0, 136, 0, ... ]",
"MakerNote Tag 0x0003": "[6, 7, 8, 85, 102, 108, 97, 103, 115, 85, 118, 97, 108, 117, 101, 85, 101, 112, 111, 99, ... ]",
"MakerNote AEStable": "Yes",
"MakerNote AETarget": "207",
"MakerNote AEAverage": "202",
"MakerNote AFStable": "Yes",
"MakerNote Tag 0x0008": "[-1352269823/1435631616, 22289/49, 128/101]",
"MakerNote Tag 0x000C": "[1048576/1061, 536888888/959919927]",
"MakerNote Tag 0x000D": "24",
"MakerNote Tag 0x000E": "0",
"MakerNote Tag 0x0010": "1",
"MakerNote ImageCaptureType": "Photo",
"MakerNote Tag 0x0019": "2",
"MakerNote Tag 0x001F": "0",
"MakerNote Tag 0x0020": "4C30-A38C-5D8C18006FEF",
"MakerNote Tag 0x0021": "2621440/0",
"MakerNote Tag 0x0023": "[9043971, -445775872]",
"MakerNote Tag 0x0026": "3",
"MakerNote Tag 0x0027": "61983868/46144959",
"MakerNote Tag 0x0028": "1",
"MakerNote Tag 0x002B": "4C1B-ADDB-46C891A19178",
"MakerNote Tag 0x002D": "6004",
"MakerNote CameraType": "Back Normal",
"MakerNote Tag 0x002F": "143",
"MakerNote Tag 0x0030": "17549364/151570847",
"MakerNote Tag 0x0033": "4096",
"MakerNote Tag 0x0034": "4",
"MakerNote Tag 0x0035": "3",
"MakerNote Tag 0x0036": "2044",
"MakerNote Tag 0x0037": "4",
"MakerNote Tag 0x0038": "19",
"MakerNote Tag 0x0039": "0",
"MakerNote Tag 0x003A": "0",
"MakerNote Tag 0x003B": "0",
"MakerNote Tag 0x003C": "4",
"MakerNote Tag 0x003D": "11",
"MakerNote Tag 0x003F": "1",
"MakerNote Tag 0x0041": "0",
"MakerNote Tag 0x0042": "0",
"MakerNote Tag 0x0043": "0",
"MakerNote Tag 0x0044": "0",
"MakerNote Tag 0x0045": "0",
"MakerNote Tag 0x0046": "0",
"MakerNote Tag 0x0048": "19",
"MakerNote Tag 0x0049": "100",
"MakerNote Tag 0x004A": "2",
"MakerNote Tag 0x004D": "808505857/33752145",
"MakerNote Tag 0x004E": "[49, 81, 50, 16, 1, 162, 5, 10, 210, 6, 7, 8, 9, 83, 50, 46, 49, 83, 50, 46, ... ]",
"MakerNote Tag 0x004F": "[0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 144, 245, 0, 2, 232, 143, 0, 0, 0, 9, 0, 0]",
"MakerNote Tag 0x0052": "3",
"MakerNote Tag 0x0053": "1",
"MakerNote Tag 0x0055": "0",
"MakerNote Tag 0x0058": "1795",
"MakerNote Tag 0x0060": "2856",
"MakerNote Tag 0x0061": "26"
},
"iptc": {
"IPTC(1, 90)": "\u001b%G",
"IPTC(2, 0)": "\u0000\u0002",
"IPTC(2, 63)": "135446",
"IPTC(2, 62)": "20260518",
"DateCreated": "20260518",
"TimeCreated": "135446"
},
"xmp": {}
},
{
"filesystem": {
"file_name": "2026-05-18 14.10.59.jpg",
"file_path": "U:\\PycharmProjects\\FotkyBuzalkovi\\demo_fotky\\2026-05-18 14.10.59.jpg",
"file_size_bytes": 304048,
"file_size_mb": 0.29,
"mtime": "2026-05-18T14:10:59",
"ctime": "2026-05-19T06:21:38.476009",
"extension": ".jpg"
},
"hashes": {
"sha256_file": "a4b20aa73cbc2fe845f12709ccc7e1d227e8fc1c84605a538e86f4a00b899754",
"sha256_pixels": "5b5e19daae775d21822891aef4558ae2c241bf082dfb54ae62cd0be1a045f223",
"phash": "c7226934de856937",
"dhash": "e74fc3ec6c3fc663",
"ahash": "0000217eb683fff9",
"whash": "000060feb6c3fff9"
},
"pillow": {
"format": "JPEG",
"mode": "RGB",
"width": 1153,
"height": 2048,
"megapixels": 2.36,
"has_transparency": false,
"dpi": null,
"icc_profile_present": false,
"exif_present": false,
"has_embedded_thumbnail": false
},
"exif_pillow": {},
"exif_exifread": {},
"iptc": {},
"xmp": {}
}
]
-38
View File
@@ -1,38 +0,0 @@
import psycopg2
import sys
try:
conn = psycopg2.connect(
host="192.168.1.76",
port=5432,
user="vladimir.buzalka",
password="Vlado7309208104++",
database="postgres"
)
cursor = conn.cursor()
cursor.execute("SELECT version();")
version = cursor.fetchone()
print("[OK] PostgreSQL pripojeni uspesne!")
print(f"Verze: {version[0][:100]}")
# Test MongoDB
try:
from pymongo import MongoClient
mongo_conn = MongoClient("mongodb://localhost:27017/", serverSelectionTimeoutMS=2000)
mongo_conn.admin.command('ping')
print("[OK] MongoDB dostupny")
except Exception as e:
print(f"[WARN] MongoDB: {str(e)[:50]}")
# Test Redis
try:
import redis
redis_conn = redis.Redis(host='localhost', port=6379, socket_connect_timeout=2)
redis_conn.ping()
print("[OK] Redis dostupny")
except Exception as e:
print(f"[WARN] Redis: {str(e)[:50]}")
conn.close()
except Exception as e:
print(f"[ERROR] PostgreSQL: {e}")
-58
View File
@@ -1,58 +0,0 @@
from pymongo import MongoClient
from pymongo.errors import ServerSelectionTimeoutError
try:
client = MongoClient(
"mongodb://192.168.1.76:27017/",
serverSelectionTimeoutMS=5000,
connectTimeoutMS=5000
)
# Test pripojeni
client.admin.command('ping')
print("[OK] MongoDB pripojeni uspesne!")
# Zobraz info
print(f"Server info: {client.server_info()}")
# Vytvor databazi
db = client['fotky_buzalkovi']
print(f"[OK] Databaze 'fotky_buzalkovi' vytvorena/existuje")
# Vytvor kolekce s validaci
db.create_collection(
"photos",
validator={
"$jsonSchema": {
"bsonType": "object",
"required": ["file_name", "file_path"],
"properties": {
"file_name": {"bsonType": "string"},
"file_path": {"bsonType": "string"},
"file_hash": {"bsonType": "string"},
"camera": {"bsonType": "string"},
"taken_at": {"bsonType": "date"},
"width": {"bsonType": "int"},
"height": {"bsonType": "int"},
"file_size": {"bsonType": "int"},
"exif": {"bsonType": "object"},
"tags": {"bsonType": "array"}
}
}
}
)
print("[OK] Kolekce 'photos' vytvorena")
# Vytvor indexy
db.photos.create_index("file_hash", unique=True)
db.photos.create_index("taken_at")
db.photos.create_index("camera")
db.photos.create_index("tags")
print("[OK] Indexy vytvoreny")
client.close()
except ServerSelectionTimeoutError as e:
print(f"[ERROR] Timeout - MongoDB neni dostupny: {e}")
except Exception as e:
print(f"[ERROR] {e}")