Genererar -s (800px) och -m (1600px) vid sidan av befintlig 3000px-fil. En nedladdning fran Immich -> tre storlekar. Befintliga 82 bilder backfillade. Original (27-70 MB/st, ~4 GB totalt) ligger INTE i repot utan hamtas live via original-proxyn pa /download/original, skyddad av losenord + kontroll att assetet faktiskt bar portfolio-taggen.
33 lines
1.1 KiB
JavaScript
33 lines
1.1 KiB
JavaScript
// Engangsjobb: skapa -s (800px) och -m (1600px) for redan synkade portfolio-bilder.
|
|
// Kallan ar den befintliga 3000px-filen i repot - ingen ny nedladdning fran Immich.
|
|
import fs from "node:fs";
|
|
import path from "node:path";
|
|
import sharp from "sharp";
|
|
|
|
const DIR = "src/assets/images/portfolio";
|
|
const SIZES = [{ suffix: "-s", dim: 800 }, { suffix: "-m", dim: 1600 }];
|
|
const QUALITY = 88;
|
|
|
|
const files = fs.readdirSync(DIR).filter(
|
|
(f) => /^immich-[0-9a-f-]{36}-/i.test(f) && /\.jpg$/i.test(f) && !/-[sm]\.jpg$/i.test(f)
|
|
);
|
|
console.log(`hittade ${files.length} large-bilder`);
|
|
|
|
let skapade = 0, hoppade = 0;
|
|
for (const f of files) {
|
|
const src = path.join(DIR, f);
|
|
const base = src.replace(/\.jpg$/i, "");
|
|
for (const { suffix, dim } of SIZES) {
|
|
const dest = `${base}${suffix}.jpg`;
|
|
if (fs.existsSync(dest)) { hoppade++; continue; }
|
|
await sharp(src)
|
|
.rotate()
|
|
.resize(dim, dim, { fit: "inside", withoutEnlargement: true })
|
|
.withMetadata()
|
|
.jpeg({ quality: QUALITY })
|
|
.toFile(dest);
|
|
skapade++;
|
|
}
|
|
}
|
|
console.log(`klart: ${skapade} skapade, ${hoppade} fanns redan`);
|