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>
41
CLAUDE.md
@@ -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.
|
||||
|
||||
### 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
|
||||
```
|
||||
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)
|
||||
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-16x16.png ← ┐
|
||||
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
|
||||
generate-pdf.js ← Node script: opens template in Chrome → exports A4 PDF
|
||||
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
|
||||
nginx.conf ← caching, gzip, PDF download header
|
||||
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.
|
||||
|
||||
### 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
|
||||
- **Analytics**: Matomo at `analytics.stranto.com`, site ID `3` — snippet is 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).
|
||||
- **Analytics**: Matomo at `analytics.stranto.com`, site ID `3` — snippet in `<head>` of `index.html`.
|
||||
- **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
|
||||
- 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
|
||||
- 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)
|
||||
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
@@ -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
|
After Width: | Height: | Size: 685 KiB |
BIN
images/194_1.jpg
Normal file
|
After Width: | Height: | Size: 605 KiB |
BIN
images/198_1.jpg
Normal file
|
After Width: | Height: | Size: 545 KiB |
BIN
images/198_4.jpg
Normal file
|
After Width: | Height: | Size: 453 KiB |
BIN
images/198_6.jpg
Normal file
|
After Width: | Height: | Size: 652 KiB |
BIN
images/203_1.jpg
Normal file
|
After Width: | Height: | Size: 696 KiB |
BIN
images/203_3.jpg
Normal file
|
After Width: | Height: | Size: 644 KiB |
BIN
images/203_4.jpg
Normal file
|
After Width: | Height: | Size: 625 KiB |
BIN
images/203_6.jpg
Normal file
|
After Width: | Height: | Size: 727 KiB |
BIN
images/203_7.jpg
Normal file
|
After Width: | Height: | Size: 563 KiB |
BIN
images/205_1.jpg
Normal file
|
After Width: | Height: | Size: 430 KiB |
BIN
images/205_3_compa.jpg
Normal file
|
After Width: | Height: | Size: 631 KiB |
BIN
images/205_5.jpg
Normal file
|
After Width: | Height: | Size: 467 KiB |
BIN
images/205_7.jpg
Normal file
|
After Width: | Height: | Size: 480 KiB |
BIN
images/222_12.jpg
Normal file
|
After Width: | Height: | Size: 836 KiB |
BIN
images/222_14.jpg
Normal file
|
After Width: | Height: | Size: 705 KiB |
BIN
images/222_18.jpg
Normal file
|
After Width: | Height: | Size: 351 KiB |
BIN
images/222_20.jpg
Normal file
|
After Width: | Height: | Size: 392 KiB |
BIN
images/222_23.jpg
Normal file
|
After Width: | Height: | Size: 239 KiB |
BIN
images/222_27.jpg
Normal file
|
After Width: | Height: | Size: 111 KiB |
BIN
images/222_28.jpg
Normal file
|
After Width: | Height: | Size: 228 KiB |
BIN
images/222_34.jpg
Normal file
|
After Width: | Height: | Size: 514 KiB |
BIN
images/222_39.jpg
Normal file
|
After Width: | Height: | Size: 224 KiB |
BIN
images/222_41.jpg
Normal file
|
After Width: | Height: | Size: 307 KiB |
BIN
images/222_42.jpg
Normal file
|
After Width: | Height: | Size: 132 KiB |
BIN
images/222_44.jpg
Normal file
|
After Width: | Height: | Size: 776 KiB |
BIN
images/222_5.jpg
Normal file
|
After Width: | Height: | Size: 281 KiB |
BIN
images/222_6-1.jpg
Normal file
|
After Width: | Height: | Size: 291 KiB |
BIN
images/222_6.jpg
Normal file
|
After Width: | Height: | Size: 291 KiB |
BIN
images/222_7-1.jpg
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
images/222_7.jpg
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
images/228_2.jpg
Normal file
|
After Width: | Height: | Size: 266 KiB |
BIN
images/228_4.jpg
Normal file
|
After Width: | Height: | Size: 224 KiB |
BIN
images/228_5.jpg
Normal file
|
After Width: | Height: | Size: 504 KiB |
BIN
images/228_6.jpg
Normal file
|
After Width: | Height: | Size: 272 KiB |
BIN
images/228_7.jpg
Normal file
|
After Width: | Height: | Size: 333 KiB |
BIN
images/258_1.jpg
Normal file
|
After Width: | Height: | Size: 507 KiB |
BIN
images/258_10.jpg
Normal file
|
After Width: | Height: | Size: 5.0 MiB |
BIN
images/258_4.jpg
Normal file
|
After Width: | Height: | Size: 710 KiB |
BIN
images/258_5.jpg
Normal file
|
After Width: | Height: | Size: 551 KiB |
BIN
images/258_6.jpg
Normal file
|
After Width: | Height: | Size: 474 KiB |
BIN
images/258_7.jpg
Normal file
|
After Width: | Height: | Size: 276 KiB |
BIN
images/258_9.jpg
Normal file
|
After Width: | Height: | Size: 878 KiB |
BIN
images/259_2.jpg
Normal file
|
After Width: | Height: | Size: 148 KiB |
BIN
images/259_3.jpg
Normal file
|
After Width: | Height: | Size: 85 KiB |
BIN
images/259_4.jpg
Normal file
|
After Width: | Height: | Size: 125 KiB |
BIN
images/259_5.jpg
Normal file
|
After Width: | Height: | Size: 242 KiB |
BIN
images/259_6.jpg
Normal file
|
After Width: | Height: | Size: 198 KiB |
BIN
images/276_vh_2.jpg
Normal file
|
After Width: | Height: | Size: 420 KiB |
BIN
images/ArminEinfahrt.jpg
Normal file
|
After Width: | Height: | Size: 20 MiB |
BIN
images/ArminGartenBeton.jpg
Normal file
|
After Width: | Height: | Size: 18 MiB |
BIN
images/ArminKueche.jpg
Normal file
|
After Width: | Height: | Size: 12 MiB |
BIN
images/DSF3680.jpg
Normal file
|
After Width: | Height: | Size: 398 KiB |
BIN
images/DSF3689.jpg
Normal file
|
After Width: | Height: | Size: 303 KiB |
BIN
images/DSF3702.jpg
Normal file
|
After Width: | Height: | Size: 342 KiB |
BIN
images/DSF3719.jpg
Normal file
|
After Width: | Height: | Size: 368 KiB |
BIN
images/DSF3722.jpg
Normal file
|
After Width: | Height: | Size: 334 KiB |
BIN
images/DSF3731.jpg
Normal file
|
After Width: | Height: | Size: 314 KiB |
BIN
images/DSF3770.jpg
Normal file
|
After Width: | Height: | Size: 387 KiB |
BIN
images/DSF3790-2.jpg
Normal file
|
After Width: | Height: | Size: 380 KiB |
BIN
images/DSF3800.jpg
Normal file
|
After Width: | Height: | Size: 368 KiB |
BIN
images/DSF4019-HDR.jpg
Normal file
|
After Width: | Height: | Size: 420 KiB |
BIN
images/DSF4034-HDR.jpg
Normal file
|
After Width: | Height: | Size: 371 KiB |
BIN
images/DSF4048-HDR.jpg
Normal file
|
After Width: | Height: | Size: 302 KiB |
BIN
images/DSF4051-HDR.jpg
Normal file
|
After Width: | Height: | Size: 261 KiB |
BIN
images/DSF4058-HDR.jpg
Normal file
|
After Width: | Height: | Size: 316 KiB |
BIN
images/DSF4066-HDR.jpg
Normal file
|
After Width: | Height: | Size: 404 KiB |
BIN
images/DSF4083-HDR.jpg
Normal file
|
After Width: | Height: | Size: 288 KiB |
BIN
images/DSF4135-HDR.jpg
Normal file
|
After Width: | Height: | Size: 352 KiB |
BIN
images/DSF4895.jpg
Normal file
|
After Width: | Height: | Size: 406 KiB |
BIN
images/DSF5084-HDR.jpg
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
BIN
images/DSF5112-HDR.jpg
Normal file
|
After Width: | Height: | Size: 719 KiB |
BIN
images/DSF5154-HDR.jpg
Normal file
|
After Width: | Height: | Size: 940 KiB |
BIN
images/DSF5212.jpg
Normal file
|
After Width: | Height: | Size: 358 KiB |
BIN
images/DSF5231-HDR.jpg
Normal file
|
After Width: | Height: | Size: 366 KiB |
BIN
images/DSF5319.jpg
Normal file
|
After Width: | Height: | Size: 325 KiB |
BIN
images/DSF5406-HDR.jpg
Normal file
|
After Width: | Height: | Size: 363 KiB |
BIN
images/DSF5417-HDR.jpg
Normal file
|
After Width: | Height: | Size: 350 KiB |
BIN
images/DSF5424-HDR.jpg
Normal file
|
After Width: | Height: | Size: 437 KiB |
BIN
images/DSF5433-HDR.jpg
Normal file
|
After Width: | Height: | Size: 488 KiB |
BIN
images/DSF5447-HDR.jpg
Normal file
|
After Width: | Height: | Size: 388 KiB |
BIN
images/DSF5475-HDR.jpg
Normal file
|
After Width: | Height: | Size: 421 KiB |
BIN
images/DSF5524-HDR.jpg
Normal file
|
After Width: | Height: | Size: 563 KiB |
BIN
images/DSF7887-HDR.jpg
Normal file
|
After Width: | Height: | Size: 98 KiB |
BIN
images/DSF7926-HDR.jpg
Normal file
|
After Width: | Height: | Size: 167 KiB |
BIN
images/DSF7930-HDR.jpg
Normal file
|
After Width: | Height: | Size: 126 KiB |
BIN
images/DSF7950-HDR.jpg
Normal file
|
After Width: | Height: | Size: 188 KiB |
BIN
images/DSF7980-HDR.jpg
Normal file
|
After Width: | Height: | Size: 140 KiB |
BIN
images/DSF7989-HDR.jpg
Normal file
|
After Width: | Height: | Size: 118 KiB |
BIN
images/DSF8007-HDR.jpg
Normal file
|
After Width: | Height: | Size: 117 KiB |
BIN
images/DSF8020-HDR.jpg
Normal file
|
After Width: | Height: | Size: 81 KiB |
BIN
images/DSF8023-HDR.jpg
Normal file
|
After Width: | Height: | Size: 122 KiB |
BIN
images/DSF8049-HDR.jpg
Normal file
|
After Width: | Height: | Size: 97 KiB |
BIN
images/DSF8058-HDR.jpg
Normal file
|
After Width: | Height: | Size: 157 KiB |
BIN
images/DSF8086-HDR.jpg
Normal file
|
After Width: | Height: | Size: 128 KiB |
BIN
images/DSF8091-HDR.jpg
Normal file
|
After Width: | Height: | Size: 113 KiB |
BIN
images/DSF8096.jpg
Normal file
|
After Width: | Height: | Size: 73 KiB |
BIN
images/DSF8103-HDR.jpg
Normal file
|
After Width: | Height: | Size: 86 KiB |