onClick={() => { const args = ['overwrite_original'] _.forEach(this.state.metadata, (v, k) => { switch (k) { case 'Description': args.push(`${k}=${v.replace(/(?:\r\n|\r|\n)/g, '<br />')}`) break case 'Date': if (v) { args.push(`${k}=${v}`) } break default: args.push(`${k}=${v}`) } }) ep._executeCommand(this.state.choosenFile.absolute, args).then((res) => { console.log('ep write response', res) if (res.error === '1 image files updated') { this.setState({ message: 'Metadata saved', choosenFileDirty: false, }) } else { this.setState({ message: JSON.stringify(res), }) } }) }}
onClick={() => { let leave = true if (this.state.choosenFileDirty) { leave = confirm('You have unsaved changes, do you want to leave?') } if (leave) { this.setState({ choosenFile: file, choosenFileDirty: false, message: null, }) // exif(file.absolute, (err, metadata) => this.setState({ metadata })) ep.readMetadata(file.absolute).then((res) => { console.log('ep metadata', res) // Clean up metadata const metadata = { Caption: _.get(res, 'data[0].Caption', ''), Type: _.get(res, 'data[0].Type', ''), Description: _.get(res, 'data[0].Description', '').replace(/<br \/>/g, '\n'), Date: _.get(res, 'data[0].Date'), } console.log(metadata) this.setState({ metadata }) }) } }}
module.exports.tagFiles = async function tagFiles( files, {cachePath, force, offline, skipBackup}, ) { let ep; try { cache.open(cachePath); ep = new exiftool.ExiftoolProcess(); trace('Spawning exiftool'); await ep.open(); for (let file of files) { trace(`Sending ${file} to exiftool`); // `-n` in order to get decimal lat/lon // `-File:all` to get info from everything in directory const results = await ep.readMetadata(file, ['n', '-File:all']); if (results.error) { console.error(results.error); // console.log(results) // continue; } for (const data of results.data) { if (!containsGeotags(data)) { verbose(`Skipping ${data.SourceFile} since it has no geotags`); continue; } const geoInfo = await getGeoInfo(data, {cache, offline}); // Write tags const writeData = {}; 'Country State City Location'.split(' ').forEach(field => { if (force || !(field in data)) { const value = geoInfo[field.toLowerCase()]; if (value) { writeData[`MWG:${field}`] = value; } else { trace( `${data.SourceFile} does not have field ${ field } but no value available`, ); } } else { trace(`${data.SourceFile} already has field ${field}`); } }); if (Object.keys(writeData).length) { trace(`Writing metadata to ${data.SourceFile} %j`, writeData); const writeInfo = await ep.writeMetadata( data.SourceFile, writeData, skipBackup ? ['overwrite_original'] : [], ); trace(`Metadata write output ${writeInfo}`); } else { trace(`No metadata to write to ${data.SourceFile}`); } } } } finally { if (ep) { trace('Closing exiftool'); ep.close(); } cache.close(); } };
}).then(() => { return ep.close().then(() => { console.log('Closed exiftool'); }); });
ep.open().then((pid) => { console.log('Started exiftool process %s', pid); return ep.readMetadata('./images/').then((res) => { logData(res); }); }).then(() => {
const fs = require('fs'); const exiftool = require('node-exiftool'); const ep = new exiftool.ExiftoolProcess(); ep.open().then((pid) => { console.log('Started exiftool process %s', pid); return ep.readMetadata('./images/').then((res) => { logData(res); }); }).then(() => { return ep.close().then(() => { console.log('Closed exiftool'); }); }); let logData = (exifData) => { let fileInfo = []; // Transform the data to remove all but the info we care about exifData.data.forEach((datum) => { let info = { fileName: datum.FileName, fStop: datum.FNumber, shutterSpeed: datum.ShutterSpeed, iso: datum.ISO, focalLength: datum.FocalLength.replace(' ', '') } fileInfo.push(info); });
import _ from 'lodash' import DatePicker from 'react-datepicker' import moment from 'moment' import Fuse from 'fuse.js' import exiftool from 'node-exiftool' import Textarea from 'react-textarea-autosize' import chokidar from 'chokidar' import TextHighlight from './TextHighlight' import { rhythm } from '../utils/typography' require('react-datepicker/dist/react-datepicker.css') const config = require('dot-file-config')('.metadata-editor') const ep = new exiftool.ExiftoolProcess('/usr/local/bin/exiftool') ep.open() .then((pid) => { console.log('Started exiftool process %s', pid) }) .catch((err) => console.log('error starting exiftool process', err)) const directory = config.data.directory const fuseOptions = { caseSensitive: false, shouldSort: true, tokenize: false, threshold: 0.2, location: 0, distance: 200,