public/js/util/imageHelpers.js (74 lines of code) (raw):
export function parseMimeType(mimeType) {
//Normalise Mime Types coming from the grid.
switch(mimeType) {
case "jpg":
return "image/jpeg";
case "png":
return "image/png";
}
return mimeType;
}
function getMetadata(metadata){
const credit = getCredit(metadata);
const {copyright, source, byline, suppliersReference} = metadata;
return {
credit,
copyright,
source,
photographer: byline,
suppliersReference
};
}
function getCredit(metadata) {
const imageType = metadata.imageType ? metadata.imageType : "Photograph";
const getName = (byline, source) => {
if (byline && source) {
if (byline === source) return byline;
else return `${byline}/${source}`;
} else return byline || source;
};
const name = getName(metadata.byline, metadata.source);
return name ? `${imageType}: ${name}` : null;
}
function parseAsset(asset, formattedMetadata) {
const {secureUrl, mimeType, size, dimensions} = asset;
const {credit, copyright, source, photographer, suppliersReference} = formattedMetadata;
return {
file: secureUrl,
mimeType: parseMimeType(mimeType),
size,
dimensions: {
width: dimensions.width,
height: dimensions.height
},
credit,
copyright,
source,
photographer,
suppliersReference
};
}
export function parseImageFromGridCrop(data) {
const cropData = data.crop.data;
const formattedMetadata = getMetadata(data.image.data.metadata);
return {
assets: cropData.assets.map(asset => parseAsset(asset, formattedMetadata)),
master: parseAsset(cropData.master, formattedMetadata),
mediaId: cropData.specification.uri
};
}
export function findSmallestAsset(assetsArray) {
return assetsArray.reduce((smallestAsset, newAsset) => {
if (newAsset.size < smallestAsset.size) {
return newAsset;
} else {
return smallestAsset;
}
});
}
export function findSmallestAssetAboveWidth(assetsArray, minSize = 250) {
// Grid provides various versions of a crop
// their widths are fixed and typically 140, 500, 1000, 2000px
// use the first one that's above `minSize` in width
// as the resolution is usually good enough for a simple preview
const usefulAssets = assetsArray.filter((asset) => asset.dimensions.width > minSize);
return findSmallestAsset(usefulAssets);
}
export function gridUrlFromApiUrl(url) {
return url.replace("https://api.media.", "https://media.");
}