Major redesign: white nav, project lightbox with gallery + before/after slider

- Nav: white background, logo image (MarszalekLogoGrau.jpg) replaces text
- Projekte: removed filter bar (Alle/Wohnen/etc.), plain grid
- Lightbox: click any project to open modal with full image gallery,
  thumbnail strip, description, keyboard/touch navigation
- Before/after drag slider for 5 renovation projects:
  Sanierung, Landhaus, Winzerhaus Neusiedlersee, Dachausbau,
  Winzerhaus 14. Jhdt.
- Downloaded 108 extra gallery images locally (no CDN dependency)
- Über uns: removed Herbert Marszalek, Florian more prominent
- CLAUDE.md updated to reflect all changes

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-26 16:21:01 +02:00
parent 2b4eb2943b
commit 7a66ba3244
112 changed files with 763 additions and 147 deletions

View File

@@ -21,6 +21,12 @@ node generate-favicons.js
``` ```
Reads `favicon.svg` and exports `favicon-16x16.png`, `favicon-32x32.png`, and `apple-touch-icon.png` via puppeteer. Run this whenever `favicon.svg` changes. Reads `favicon.svg` and exports `favicon-16x16.png`, `favicon-32x32.png`, and `apple-touch-icon.png` via puppeteer. Run this whenever `favicon.svg` changes.
### Download gallery images from old site
```
node download-gallery-images.js
```
Downloads all extra project gallery images from `old.marszalekarchitekten.at` into `images/`. Safe to re-run — skips files that already exist.
### Build and run via Docker ### Build and run via Docker
``` ```
docker compose up --build -d # build image and start on port 8082 docker compose up --build -d # build image and start on port 8082
@@ -36,7 +42,7 @@ npm install
``` ```
index.html ← entire website (HTML + CSS + JS) index.html ← entire website (HTML + CSS + JS)
images/ ← all portfolio photos, self-hosted (15 JPEGs) images/ ← all portfolio photos, self-hosted (120+ JPEGs)
favicon.svg ← master favicon (M monogram, green #99cc00 bg) favicon.svg ← master favicon (M monogram, green #99cc00 bg)
favicon-16x16.png ← ┐ favicon-16x16.png ← ┐
favicon-32x32.png ← ├ generated from favicon.svg via generate-favicons.js favicon-32x32.png ← ├ generated from favicon.svg via generate-favicons.js
@@ -44,6 +50,7 @@ apple-touch-icon.png ← ┘
infosheet-template.html ← HTML source rendered to PDF by Puppeteer infosheet-template.html ← HTML source rendered to PDF by Puppeteer
generate-pdf.js ← Node script: opens template in Chrome → exports A4 PDF generate-pdf.js ← Node script: opens template in Chrome → exports A4 PDF
generate-favicons.js ← Node script: renders favicon.svg → PNG at 3 sizes generate-favicons.js ← Node script: renders favicon.svg → PNG at 3 sizes
download-gallery-images.js ← Node script: fetches gallery images from old WP site
marszalek-architekten-infosheet.pdf ← pre-generated output; committed to repo marszalek-architekten-infosheet.pdf ← pre-generated output; committed to repo
nginx.conf ← caching, gzip, PDF download header nginx.conf ← caching, gzip, PDF download header
Dockerfile ← nginx:alpine; copies all static assets Dockerfile ← nginx:alpine; copies all static assets
@@ -54,18 +61,38 @@ docker-compose.yml ← single service, host port 8082 → cont
`infosheet-template.html` is a self-contained 2-page A4 HTML document (mm units, `print-color-adjust: exact`, `page-break-after: always` between pages). `generate-pdf.js` loads it via a `file:///` URL in headless Chrome, waits 1.5 s for Google Fonts, then calls `page.pdf()`. The output PDF is committed — Docker does **not** regenerate it at build time. `infosheet-template.html` is a self-contained 2-page A4 HTML document (mm units, `print-color-adjust: exact`, `page-break-after: always` between pages). `generate-pdf.js` loads it via a `file:///` URL in headless Chrome, waits 1.5 s for Google Fonts, then calls `page.pdf()`. The output PDF is committed — Docker does **not** regenerate it at build time.
### Website structure ### Website structure
`index.html` is a single-page site with five anchor-linked sections: `#home` (hero), `#projekte` (portfolio grid with JS category filter), `#leistungen` (services), `#ueber-uns` (team), `#kontakt` (contact + Google Maps iframe + PDF download banner). Portfolio images are served from the local `images/` folder — **do not revert to the WordPress CDN URLs**, as the WordPress server blocks hotlinking on mobile. Google Fonts (Cormorant Garamond + Inter) are the only remaining external dependency. `index.html` is a single-page site with five anchor-linked sections:
- **`#home`** — hero with full-viewport background photo
- **`#projekte`** — 3-column portfolio grid; clicking a card opens the lightbox
- **`#leistungen`** — services (2-column grid)
- **`#ueber-uns`** — single team member (Florian Marszalek)
- **`#kontakt`** — contact details + Google Maps iframe + PDF download banner
All images are served from the local `images/` folder — **do not use WordPress CDN URLs**, as the WordPress server blocks hotlinking on mobile.
### Project lightbox
Clicking any `.p-item[data-project]` in the portfolio grid opens a modal (`#lightbox`). All project data (title, description, image list, optional before/after pair) lives in the `projects` object in the inline `<script>`. The lightbox has:
- A main image stage with `` / `` arrow navigation and keyboard arrow-key support
- A scrollable thumbnail strip
- A **before/after comparison slider** (`#ba-section`) shown only for projects that define `beforeAfter: { before, after }` — currently 5 renovation projects: Sanierung, Landhaus, Winzerhaus Neusiedlersee, Dachausbau, Winzerhaus 14. Jhdt.
To add a new project: add a `.p-item` card with `data-project="slug"` in the HTML grid, and add a matching entry to the `projects` JS object.
### Navigation
The nav bar has a **white** (`#ffffff`) background with the logo image (`images/MarszalekLogoGrau.jpg`). The green accent (`#99cc00`) is used only in the PDF header and favicon — not in the nav.
### Third-party integrations ### Third-party integrations
- **Analytics**: Matomo at `analytics.stranto.com`, site ID `3` — snippet is in `<head>` of `index.html`. - **Analytics**: Matomo at `analytics.stranto.com`, site ID `3` — snippet in `<head>` of `index.html`.
- **Map**: Google Maps iframe embed (no API key) in the `#kontakt` section, centred on `48.1176923, 16.2631144` (Elisabethstraße 14, Perchtoldsdorf). - **Map**: Google Maps iframe embed (no API key) in `#kontakt`, centred on `48.1176923, 16.2631144` (Elisabethstraße 14, Perchtoldsdorf).
- **Fonts**: Google Fonts (Cormorant Garamond + Inter) — the only remaining external dependency.
### Brand colours ### Brand colours
- Green accent: `#99cc00` nav bar background, PDF header, favicon background - Green accent: `#99cc00` — PDF header, favicon background
- Near-black: `#0f0f0f` — body text, footer, favicon M lettermark - Near-black: `#0f0f0f` — body text, footer, favicon M lettermark
- Grey-mid: `#999` used for secondary labels; defined as `--grey-mid` in `index.html` - Grey-mid: `#999` — secondary labels; CSS var `--grey-mid`
## Deployment (Portainer) ## Deployment (Portainer)
Stack points at `https://git.stranto.com/cgasser/web_marszalekarchitekten`, branch `master`. Site is available on the host at port **8082**. Stack points at `https://git.stranto.com/cgasser/web_marszalekarchitekten`, branch `master`. Site is available on the host at port **8082**.
When content changes: edit `index.html` and/or `infosheet-template.html`, regenerate the PDF with `node generate-pdf.js`, commit all changed files, and redeploy the stack in Portainer. When content changes: edit `index.html` and/or `infosheet-template.html`, regenerate the PDF with `node generate-pdf.js`, commit all changed files (including any new images), and redeploy the stack in Portainer.

241
download-gallery-images.js Normal file
View File

@@ -0,0 +1,241 @@
/**
* Downloads all extra gallery images for project lightbox.
* Images are saved to images/ with the base filename (size suffix stripped).
*/
const https = require('https');
const http = require('http');
const fs = require('fs');
const path = require('path');
const DEST = path.join(__dirname, 'images');
// [localFilename, primaryURL, fallbackURL]
const images = [
// ── Urbane Gartenoase (2021/12) ─────────────────────────────────────────
['ArminKueche.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2021/12/ArminKueche.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2021/12/ArminKueche-1024x685.jpg'],
['ArminGartenBeton.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2021/12/ArminGartenBeton.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2021/12/ArminGartenBeton-1024x684.jpg'],
['Klavier.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2021/12/Klavier.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2021/12/Klavier-1024x681.jpg'],
['ArminEinfahrt.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2021/12/ArminEinfahrt.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2021/12/ArminEinfahrt-1024x684.jpg'],
['Parkplatz.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2021/12/Parkplatz.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2021/12/Parkplatz-1024x684.jpg'],
['RminStiege.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2021/12/RminStiege.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2021/12/RminStiege-1024x683.jpg'],
// ── Kleinwohnhaus (2019/01) ──────────────────────────────────────────────
['DSF5433-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2019/01/DSF5433-HDR.jpg', null],
['DSF5084-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2019/01/DSF5084-HDR.jpg', null],
['DSF5524-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2019/01/DSF5524-HDR.jpg', null],
['DSF5447-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2019/01/DSF5447-HDR.jpg', null],
['DSF5475-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2019/01/DSF5475-HDR.jpg', null],
['DSF5154-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2019/01/DSF5154-HDR.jpg', null],
['DSF4895.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2019/01/DSF4895.jpg', null],
['DSF5231-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2019/01/DSF5231-HDR.jpg', null],
['DSF5424-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2019/01/DSF5424-HDR.jpg', null],
['DSF5212.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2019/01/DSF5212.jpg', null],
['DSF5417-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2019/01/DSF5417-HDR.jpg', null],
['DSF5319.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2019/01/DSF5319.jpg', null],
['DSF5406-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2019/01/DSF5406-HDR.jpg', null],
['DSF5112-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2019/01/DSF5112-HDR.jpg', null],
// ── Gründerzeitwohnung (2018/01) ─────────────────────────────────────────
['DSF4058-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2018/01/DSF4058-HDR.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2018/01/DSF4058-HDR-1024x683.jpg'],
['DSF4083-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2018/01/DSF4083-HDR.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2018/01/DSF4083-HDR-1024x683.jpg'],
['DSF4034-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2018/01/DSF4034-HDR.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2018/01/DSF4034-HDR-1024x683.jpg'],
['DSF4048-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2018/01/DSF4048-HDR.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2018/01/DSF4048-HDR-1024x683.jpg'],
['DSF4135-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2018/01/DSF4135-HDR.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2018/01/DSF4135-HDR-1024x683.jpg'],
['DSF4051-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2018/01/DSF4051-HDR.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2018/01/DSF4051-HDR-1024x683.jpg'],
['DSF4019-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2018/01/DSF4019-HDR.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2018/01/DSF4019-HDR-1024x683.jpg'],
['DSF4066-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2018/01/DSF4066-HDR.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2018/01/DSF4066-HDR-1024x683.jpg'],
// ── Ordination Innere Medizin (2018/01) ──────────────────────────────────
['DSF3689.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2018/01/DSF3689.jpg', null],
['DSF3702.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2018/01/DSF3702.jpg', null],
['DSF3680.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2018/01/DSF3680.jpg', null],
['DSF3790-2.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2018/01/DSF3790-2.jpg', null],
['DSF3719.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2018/01/DSF3719.jpg', null],
['DSF3800.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2018/01/DSF3800.jpg', null],
['DSF3770.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2018/01/DSF3770.jpg', null],
['DSF3722.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2018/01/DSF3722.jpg', null],
['276_vh_2.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2018/01/276_vh_2.jpg', null],
['DSF3731.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2018/01/DSF3731.jpg', null],
// ── Villa mit Aussicht (2017/05) ──────────────────────────────────────────
['DSF7950-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF7950-HDR.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF7950-HDR-1024x683.jpg'],
['DSF7926-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF7926-HDR.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF7926-HDR-1024x742.jpg'],
['DSF7887-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF7887-HDR.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF7887-HDR-1024x825.jpg'],
['DSF8103-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF8103-HDR.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF8103-HDR-1024x742.jpg'],
['DSF8096.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF8096.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF8096-1024x690.jpg'],
['DSF8091-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF8091-HDR.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF8091-HDR-1024x709.jpg'],
['DSF8086-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF8086-HDR.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF8086-HDR-1024x725.jpg'],
['DSF7930-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF7930-HDR.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF7930-HDR-1024x683.jpg'],
['DSF8058-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF8058-HDR.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF8058-HDR-1024x659.jpg'],
['DSF8049-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF8049-HDR.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF8049-HDR-1024x683.jpg'],
['DSF8023-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF8023-HDR.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF8023-HDR-683x1024.jpg'],
['DSF8020-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF8020-HDR.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF8020-HDR-1024x683.jpg'],
['DSF8007-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF8007-HDR.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF8007-HDR-1024x762.jpg'],
['DSF7989-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF7989-HDR.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF7989-HDR-1024x684.jpg'],
['DSF7980-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF7980-HDR.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF7980-HDR-1024x683.jpg'],
// ── Modern, offen, viel Glas (2017/05) ───────────────────────────────────
['DSF9330.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF9330.jpg', null],
['DSF9343-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF9343-HDR.jpg', null],
['DSF9316-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF9316-HDR.jpg', null],
['DSF9305-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF9305-HDR.jpg', null],
['DSF9278-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF9278-HDR.jpg', null],
['DSF9266-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF9266-HDR.jpg', null],
['DSF9148-HDR.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/05/DSF9148-HDR.jpg', null],
// ── Alles Aussicht! (2017/04) ─────────────────────────────────────────────
['259_2.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/259_2.jpg', null],
['259_3.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/259_3.jpg', null],
['259_4.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/259_4.jpg', null],
['259_5.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/259_5.jpg', null],
['259_6.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/259_6.jpg', null],
// ── Landhaus (2017/04) ────────────────────────────────────────────────────
['258_1.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/258_1.jpg', null],
['258_4.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/258_4.jpg', null],
['258_5.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/258_5.jpg', null],
['258_6.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/258_6.jpg', null],
['258_7.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/258_7.jpg', null],
['258_9.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/258_9.jpg', null],
['258_10.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/258_10.jpg', null],
// ── Winzerhaus Neusiedlersee (2017/04) ───────────────────────────────────
['228_2.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/228_2.jpg', null],
['228_4.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/228_4.jpg', null],
['228_5.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/228_5.jpg', null],
['228_6.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/228_6.jpg', null],
['228_7.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/228_7.jpg', null],
// ── Dachausbau Denkmalschutz (2017/04) ─────────────────────────────────
['205_1.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/205_1.jpg', null],
['205_3_compa.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/205_3_compa.jpg', null],
['205_5.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/205_5.jpg', null],
['205_7.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/205_7.jpg', null],
// ── Siegfried Ludwig Halle (2017/09) ─────────────────────────────────────
['222_5.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/09/222_5.jpg', null],
['222_6.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/09/222_6.jpg', null],
['222_7.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/09/222_7.jpg', null],
['222_12.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/09/222_12.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2017/09/222_12-1024x680.jpg'],
['222_14.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/09/222_14.jpg', null],
['222_18.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/09/222_18.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2017/09/222_18-1024x680.jpg'],
['222_20.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/09/222_20.jpg', null],
['222_23.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/09/222_23.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2017/09/222_23-1024x680.jpg'],
['222_27.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/09/222_27.jpg', null],
['222_28.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/09/222_28.jpg', null],
['222_34.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/09/222_34.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2017/09/222_34-1024x680.jpg'],
['222_39.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/09/222_39.jpg', null],
['222_41.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/09/222_41.jpg', null],
['222_42.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/09/222_42.jpg', null],
['222_44.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/09/222_44.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2017/09/222_44-1024x680.jpg'],
['222_6-1.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/09/222_6-1.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2017/09/222_6-1-1024x680.jpg'],
['222_7-1.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/09/222_7-1.jpg',
'https://old.marszalekarchitekten.at/wp-content/uploads/2017/09/222_7-1-1024x681.jpg'],
// ── Freizeitanlage (2017/04) ──────────────────────────────────────────────
['198_1.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/198_1.jpg', null],
['198_4.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/198_4.jpg', null],
['198_6.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/198_6.jpg', null],
// ── Winzerhaus 14. Jhdt. (2017/04) ───────────────────────────────────────
['203_1.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/203_1.jpg', null],
['203_3.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/203_3.jpg', null],
['203_4.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/203_4.jpg', null],
['203_6.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/203_6.jpg', null],
['203_7.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/203_7.jpg', null],
// ── Wohnhaus (2017/04) ────────────────────────────────────────────────────
['194_1.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/194_1.jpg', null],
// ── Sanierung (2017/04) ───────────────────────────────────────────────────
['174_2.jpg', 'https://old.marszalekarchitekten.at/wp-content/uploads/2017/04/174_2.jpg', null],
];
function download(url, dest) {
return new Promise((resolve, reject) => {
const file = fs.createWriteStream(dest);
const mod = url.startsWith('https') ? https : http;
mod.get(url, { headers: { 'User-Agent': 'Mozilla/5.0' } }, res => {
if (res.statusCode === 301 || res.statusCode === 302) {
file.destroy();
fs.unlinkSync(dest);
download(res.headers.location, dest).then(resolve).catch(reject);
return;
}
if (res.statusCode !== 200) {
file.destroy();
try { fs.unlinkSync(dest); } catch (_) {}
reject(new Error(`HTTP ${res.statusCode}`));
return;
}
res.pipe(file);
file.on('finish', () => file.close(resolve));
file.on('error', err => { fs.unlinkSync(dest); reject(err); });
}).on('error', err => { try { fs.unlinkSync(dest); } catch (_) {} reject(err); });
});
}
async function run() {
let ok = 0, skipped = 0, failed = 0;
for (const [filename, primary, fallback] of images) {
const dest = path.join(DEST, filename);
if (fs.existsSync(dest)) { process.stdout.write(` skip ${filename}\n`); skipped++; continue; }
try {
await download(primary, dest);
process.stdout.write(` ok ${filename} (primary)\n`);
ok++;
} catch (e1) {
if (fallback) {
try {
await download(fallback, dest);
process.stdout.write(` ok ${filename} (fallback)\n`);
ok++;
} catch (e2) {
process.stdout.write(` FAIL ${filename}: ${e2.message}\n`);
failed++;
}
} else {
process.stdout.write(` FAIL ${filename}: ${e1.message}\n`);
failed++;
}
}
}
console.log(`\nDone: ${ok} downloaded, ${skipped} skipped, ${failed} failed`);
}
run().catch(console.error);

BIN
images/174_2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 685 KiB

BIN
images/194_1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 605 KiB

BIN
images/198_1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 545 KiB

BIN
images/198_4.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 453 KiB

BIN
images/198_6.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 652 KiB

BIN
images/203_1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 696 KiB

BIN
images/203_3.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 644 KiB

BIN
images/203_4.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 625 KiB

BIN
images/203_6.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 727 KiB

BIN
images/203_7.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 563 KiB

BIN
images/205_1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 430 KiB

BIN
images/205_3_compa.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 631 KiB

BIN
images/205_5.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 467 KiB

BIN
images/205_7.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 480 KiB

BIN
images/222_12.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 836 KiB

BIN
images/222_14.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 705 KiB

BIN
images/222_18.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 351 KiB

BIN
images/222_20.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 392 KiB

BIN
images/222_23.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 KiB

BIN
images/222_27.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

BIN
images/222_28.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

BIN
images/222_34.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 514 KiB

BIN
images/222_39.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

BIN
images/222_41.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 KiB

BIN
images/222_42.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

BIN
images/222_44.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 776 KiB

BIN
images/222_5.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 281 KiB

BIN
images/222_6-1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 KiB

BIN
images/222_6.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 KiB

BIN
images/222_7-1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

BIN
images/222_7.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

BIN
images/228_2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 266 KiB

BIN
images/228_4.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

BIN
images/228_5.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 504 KiB

BIN
images/228_6.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 KiB

BIN
images/228_7.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 333 KiB

BIN
images/258_1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 507 KiB

BIN
images/258_10.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 MiB

BIN
images/258_4.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 710 KiB

BIN
images/258_5.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 551 KiB

BIN
images/258_6.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 474 KiB

BIN
images/258_7.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 276 KiB

BIN
images/258_9.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 KiB

BIN
images/259_2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

BIN
images/259_3.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

BIN
images/259_4.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

BIN
images/259_5.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 242 KiB

BIN
images/259_6.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

BIN
images/276_vh_2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 KiB

BIN
images/ArminEinfahrt.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 MiB

BIN
images/ArminGartenBeton.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 MiB

BIN
images/ArminKueche.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 MiB

BIN
images/DSF3680.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 398 KiB

BIN
images/DSF3689.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 303 KiB

BIN
images/DSF3702.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 342 KiB

BIN
images/DSF3719.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 KiB

BIN
images/DSF3722.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 334 KiB

BIN
images/DSF3731.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 KiB

BIN
images/DSF3770.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 387 KiB

BIN
images/DSF3790-2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 KiB

BIN
images/DSF3800.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 KiB

BIN
images/DSF4019-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 KiB

BIN
images/DSF4034-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 KiB

BIN
images/DSF4048-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 KiB

BIN
images/DSF4051-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 KiB

BIN
images/DSF4058-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 KiB

BIN
images/DSF4066-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 KiB

BIN
images/DSF4083-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 KiB

BIN
images/DSF4135-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 KiB

BIN
images/DSF4895.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 KiB

BIN
images/DSF5084-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

BIN
images/DSF5112-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 719 KiB

BIN
images/DSF5154-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 940 KiB

BIN
images/DSF5212.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 358 KiB

BIN
images/DSF5231-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 KiB

BIN
images/DSF5319.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 325 KiB

BIN
images/DSF5406-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 KiB

BIN
images/DSF5417-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 KiB

BIN
images/DSF5424-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 437 KiB

BIN
images/DSF5433-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 KiB

BIN
images/DSF5447-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 388 KiB

BIN
images/DSF5475-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 421 KiB

BIN
images/DSF5524-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 563 KiB

BIN
images/DSF7887-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

BIN
images/DSF7926-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

BIN
images/DSF7930-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

BIN
images/DSF7950-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

BIN
images/DSF7980-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

BIN
images/DSF7989-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

BIN
images/DSF8007-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

BIN
images/DSF8020-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

BIN
images/DSF8023-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

BIN
images/DSF8049-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

BIN
images/DSF8058-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

BIN
images/DSF8086-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

BIN
images/DSF8091-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

BIN
images/DSF8096.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

BIN
images/DSF8103-HDR.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Some files were not shown because too many files have changed in this diff Show More