'use strict'; import Manifest from '../src/Manifest.js'; import Sequence from '../src/Sequence.js'; import Canvas from '../src/Canvas.js'; import Image from '../src/Image.js'; import * as fs from 'fs'; /** * @typedef {Obj} */ /** * Generate a manifest object to serve * @param {string} manifestId */ export default async function generateManifest(manifestId) { const IIIF_API_VERSION = process.env.IIIF_API_VERSION; const BASE_URL = process.env.BASE_URL; let manifest = new Manifest(IIIF_API_VERSION, BASE_URL); manifest.generateID(manifestId); manifest = await populateCanvases( manifest, await getImageList(manifestId), manifestId ); return manifest.toObject(); } /** * @param {string} manifestId */ async function getImageList(manifestId) { let folderName = manifestId.replace(/pherc-(\d+)-(\w+)$/, function (_match, g1, g2) { return `PHerc_${g1}_${g2.toUpperCase()}`; }); folderName += '_iiif'; return await fs.promises.readdir(`${process.env.IMAGES_DIR}/${folderName}`); } /** * @todo Read height & width from info.json * @param {Manifest} manifest * @param {string[]} images List of image filenames from folder * @returns {Manifest} */ async function populateCanvases(manifest, images, manifestId) { const IIIF_API_VERSION = process.env.IIIF_API_VERSION; const BASE_URL = process.env.BASE_URL; const sequence = new Sequence(BASE_URL); // There's only one sequence sequence.generateID(manifestId, 0); for (let img of images) { let canvas = new Canvas(IIIF_API_VERSION, BASE_URL); const canvasName = img.split('_')[3].replace(/\.[\w\d]{2,3}$/,''); canvas.generateID(manifestId, canvasName); canvas.setLabel(`${manifestId}-${canvasName.toLowerCase()}`); let image = new Image(canvas.id); image.generateID(process.env.IMAGE_SERVER_URL, img); const imgSize = await getImageSize(image.id); image.setSize(imgSize.height, imgSize.width); canvas.setThumbnail( imgSize.thumb.height, imgSize.thumb.width, image.id ); canvas.addImage(image); sequence.addCanvas(canvas); } manifest.addSequence(sequence); return manifest; } /** * @todo Read height & width from info.json * @param {string} imageId The image's id as a URL to the image server * @returns {{width: number, height: number, thumb: {width: number, height: number}}} */ async function getImageSize(imageId) { let infoURL = imageId.replace(/full.*$/,'info.json'); const res = await fetch(infoURL); let size = {}; if (res.ok) { const infoJson = await res.json(); const maxSize = infoJson.sizes[infoJson.sizes.length - 1]; size.height = maxSize.height; size.width = maxSize.width; size.thumb = { width: infoJson.sizes[1].width, height: infoJson.sizes[1].height, } } return size; }