91 lines
2.5 KiB
JavaScript
91 lines
2.5 KiB
JavaScript
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; |