This commit is contained in:
		| @@ -9,6 +9,7 @@ | |||||||
|   const iso = (d: string | Date) => { |   const iso = (d: string | Date) => { | ||||||
|     if(!d) return "" |     if(!d) return "" | ||||||
|     const v = toDate(d); |     const v = toDate(d); | ||||||
|  |     if(!v) return "" | ||||||
|     return isNaN(v.getTime()) ? "" : v.toISOString(); |     return isNaN(v.getTime()) ? "" : v.toISOString(); | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -12,6 +12,7 @@ Unsortierte Bilder aus unserer Wanderung durch die Picos de Europa. | |||||||
|  |  | ||||||
| import Image from "@components/Image.astro"; | import Image from "@components/Image.astro"; | ||||||
| import ImageGallery from "@components/ImageGallery.svelte" | import ImageGallery from "@components/ImageGallery.svelte" | ||||||
|  | import ImageSlider from "@components/ImageSlider.svelte" | ||||||
|  |  | ||||||
| <ImageGallery client:load/> | <ImageGallery client:load/> | ||||||
|  |  | ||||||
| @@ -24,9 +25,11 @@ import image1 from "images/20250527_125228.jpg" | |||||||
| import image16 from "images/PXL_20250527_101057540.MP.jpg" | import image16 from "images/PXL_20250527_101057540.MP.jpg" | ||||||
| import image17 from "images/PXL_20250527_100728883.jpg" | import image17 from "images/PXL_20250527_100728883.jpg" | ||||||
|  |  | ||||||
| <Image alt="" src={image1} alt="Bild einer Kuh auf einer Wiese vor dem Meer"/> | <ImageSlider title="Wanderung" client:load> | ||||||
| <Image alt="" src={image17} alt="Person auf flysch gestein vor einer Höhle am Meer"/> |   <Image src={image1} alt="Bild einer Kuh auf einer Wiese vor dem Meer"/> | ||||||
| <Image alt="" src={image16} alt="Bild von Person in einer Höhle aus der man das Meer sieht"/> |   <Image src={image17} alt="Person auf flysch gestein vor einer Höhle am Meer"/> | ||||||
|  |   <Image src={image16} alt="Bild von Person in einer Höhle aus der man das Meer sieht"/> | ||||||
|  | </ImageSlider> | ||||||
|  |  | ||||||
| ## 28. May | ## 28. May | ||||||
|  |  | ||||||
| @@ -35,8 +38,10 @@ Erster Wandertag | |||||||
| import image15 from "images/PXL_20250528_121633744.MP.jpg" | import image15 from "images/PXL_20250528_121633744.MP.jpg" | ||||||
| import image19 from "images/20250528_164715.jpg" | import image19 from "images/20250528_164715.jpg" | ||||||
|  |  | ||||||
| <Image alt="" src={image15} alt="15"/> | <ImageSlider title="Wanderung" client:load> | ||||||
| <Image alt="" src={image19} alt="19"/> |   <Image src={image15} alt="Wir nach den ersten 300 Metern"/> | ||||||
|  |   <Image src={image19} alt="Viele Bergziegen die gerne das Salz von der Haut lecken"/> | ||||||
|  | </ImageSlider> | ||||||
|  |  | ||||||
| ## 29. May | ## 29. May | ||||||
|  |  | ||||||
| @@ -47,8 +52,7 @@ import image12 from "images/PXL_20250530_082919731.jpg" | |||||||
| import image13 from "images/PXL_20250529_201559403.jpg" | import image13 from "images/PXL_20250529_201559403.jpg" | ||||||
|  |  | ||||||
| <video src={videoUrl1} controls alt=""/> | <video src={videoUrl1} controls alt=""/> | ||||||
| <Image alt="" src={image12} alt="12"/> | <Image alt="" src={image12} alt="Endlich am Refugio angekommen"/> | ||||||
| <Image alt="" src={image13} alt="13"/> |  | ||||||
|  |  | ||||||
| ## 30-31. May | ## 30-31. May | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
| import { rgbaToThumbHash } from "thumbhash"; | import { rgbaToThumbHash } from "thumbhash"; | ||||||
| import ExifReader from "exifreader"; | import ExifReader from "exifreader"; | ||||||
| import type { ImageMetadata } from "astro"; | import type { ImageMetadata } from "astro"; | ||||||
|  | import { readFile } from "node:fs/promises"; | ||||||
| import sharp from "sharp"; | import sharp from "sharp"; | ||||||
|  |  | ||||||
| export async function generateThumbHash( | export async function generateThumbHash( | ||||||
| @@ -72,23 +73,26 @@ const allowedExif = [ | |||||||
| ]; | ]; | ||||||
|  |  | ||||||
| export async function getExifData(image: ImageMetadata) { | export async function getExifData(image: ImageMetadata) { | ||||||
|   if (image.format === "svg") return undefined; // SVGs don't have EXIF data") |   if (image.format === "svg") return undefined; // SVGs don't have EXIF data | ||||||
|   const imagePath = (image as ImageMetadata & { fsPath: string }).fsPath ?? |   const imagePath = (image as ImageMetadata & { fsPath: string }).fsPath ?? | ||||||
|     image.src; |     image.src; | ||||||
|  |  | ||||||
|   if (!imagePath) return undefined; |   if (!imagePath) return undefined; | ||||||
|  |  | ||||||
|   try { |   try { | ||||||
|     let buffer: ArrayBuffer; |     let buffer: ArrayBufferLike; | ||||||
|     if (imagePath.startsWith("https://") || imagePath.startsWith("http://")) { |     if (imagePath.startsWith("https://") || imagePath.startsWith("http://")) { | ||||||
|       const res = await fetch(imagePath); |       const res = await fetch(imagePath); | ||||||
|       buffer = await res.arrayBuffer(); |       buffer = await res.arrayBuffer(); | ||||||
|     } else { |     } else { | ||||||
|       buffer = await sharp(imagePath).toBuffer() as unknown as ArrayBuffer; |       const b = await readFile(imagePath); | ||||||
|  |       buffer = b.buffer; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     const tags = await ExifReader.load(buffer, { async: true }); |     const tags = await ExifReader.load(buffer, { async: true }); | ||||||
|  |  | ||||||
|  |     if (!buffer) return undefined; | ||||||
|  |  | ||||||
|     const out: Record<string, any> = {}; |     const out: Record<string, any> = {}; | ||||||
|     let hasExif = false; |     let hasExif = false; | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user