greek-manifests/controllers/manifest.mjs

106 lines
2.7 KiB
JavaScript

'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;
}