Personal-Website/gatsby/gatsby-node.js

64 lines
1.5 KiB
JavaScript

const fs = require('fs');
const util = require('util')
const { read } = require('fast-exif');
const iptc = require('node-iptc');
const readFile = util.promisify(fs.readFile)
function convertDMSToDD(dms, positiveDirection) {
const res = dms
.map((item, i) => {
return item / Math.pow(60, i);
})
.reduce((a, b) => a + b);
return positiveDirection ? res : -res;
}
function transformMetaToNodeData(exifData, iptcData) {
const gps = { longitude: null, latitude: null };
if (exifData) {
if (
exifData.gps &&
exifData.gps.GPSLongitude &&
exifData.gps.GPSLatitude
) {
gps.longitude = convertDMSToDD(
exifData.gps.GPSLongitude,
exifData.gps.GPSLongitudeRef === 'E'
);
gps.latitude = convertDMSToDD(
exifData.gps.GPSLatitude,
exifData.gps.GPSLatitudeRef === 'N'
);
}
}
return {
exif: exifData?.exif,
gps,
meta: {
dateTaken: exifData?.exif?.DateTimeOriginal
},
iptc: iptcData || undefined
};
}
exports.onCreateNode = async function ({ node, getNode, actions }) {
const { createNodeField } = actions;
if (node.internal.type === 'ImageSharp') {
const parent = getNode(node.parent);
const file = await readFile(parent.absolutePath)
const iptcData = iptc(file)
const exifData = await read(parent.absolutePath)
createNodeField({
node,
name: 'imageMeta',
value: transformMetaToNodeData(exifData, iptcData)
});
}
}