import * as fs from 'fs'; import Manifest from './Manifest.js'; import Sequence from './Sequence.js'; import Canvas from './Canvas.js'; import Image from './Image.js'; const Common = {}; /** * @param {string} manifestId */ Common.getImageList = async function (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}`); } /** * @param {string} imageId The image's id as a URL to the image server * @returns {{width: number, height: number, thumb: {width: number, height: number}}} */ Common.getImageSize = async function (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; } /** * Get image name for given canvas * @param {Canvas} canvas */ Common.getImageName = async function (canvas) { const images = await this.getImageList(canvas.resourceId); return images.filter(i => i.includes(canvas.name))[0]; } /** * @param {Manifest} manifest The manifest object * @param {string[]} images List of image filenames from folder * @returns {Manifest} */ Common.populateCanvases = async function (manifest, images) { 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(manifest.resourceId, 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(manifest.resourceId, canvasName); canvas.setLabel(`${manifest.resourceId}-${canvasName.toLowerCase()}`); let image = new Image(canvas.id); image.generateID(process.env.IMAGE_SERVER_URL, img); const imgSize = await this.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; } export default Common;