User:Habst/getKbr.js

// nodejs script to get kbr.de newspaper scans

import { writeFile } from 'node:fs/promises'

import { Readable } from 'node:stream'

import sharp from 'sharp';

import fs from 'fs';

const prefix = 'https://viewerd.kbr.be/display/N/JB735/1925/03/04/01/zoomtiles/KB_JB735_1925-03-04_01-00004/';

const page = '3';

const imageWidth = 768;

const imageHeight = 768;

const gridCols = 7; // 6 + 1

const gridRows = 9; // 8 + 1

for (let col = 0; col < gridCols; col++) {

for (let row = 0; row < gridRows; row++) {

const fname = `${page}-${col}-${row}.jpg`;

if (fs.existsSync(`data/${fname}`)) continue;

const url = prefix + fname;

console.log(url);

const r = await fetch(url);

const body = Readable.fromWeb(r.body);

await writeFile(`data/${fname}`, body);

}

}

const finalWidth = gridCols * imageWidth;

const finalHeight = gridRows * imageHeight;

function prepareImages() {

const images = [];

for (let row = 0; row < gridRows; row++) {

for (let col = 0; col < gridCols; col++) {

const filename = `data/${page}-${col}-${row}.jpg`;

images.push({

input: filename,

top: row * imageHeight,

left: col * imageWidth,

});

}

}

console.group(images.length);

return images;

}

sharp({

create: {

width: finalWidth,

height: finalHeight,

channels: 4, // RGBA

background: { r: 0, g: 0, b: 0, alpha: 0 },

}

})

.composite(prepareImages())

.toFile('result.jpg', (err, info) => {

if (err) throw err;

console.log('Image saved:', info);

});