65 lines
1.5 KiB
JavaScript
65 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') {
|
|
console.log(node)
|
|
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)
|
|
});
|
|
}
|
|
} |