コード例 #1
0
ファイル: Home.js プロジェクト: KyleAMathews/metadata-editor
 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),
       })
     }
   })
 }}
コード例 #2
0
ファイル: Home.js プロジェクト: KyleAMathews/metadata-editor
 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 })
     })
   }
 }}
コード例 #3
0
ファイル: geo-rename.js プロジェクト: fortes/edocoeg
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();
  }
};
コード例 #4
0
ファイル: exif.js プロジェクト: balmainctf/photos.daneden.me
}).then(() => {
  return ep.close().then(() => {
    console.log('Closed exiftool');
  });
});
コード例 #5
0
ファイル: exif.js プロジェクト: balmainctf/photos.daneden.me
ep.open().then((pid) => {
  console.log('Started exiftool process %s', pid);
  return ep.readMetadata('./images/').then((res) => {
    logData(res);
  });
}).then(() => {
コード例 #6
0
ファイル: exif.js プロジェクト: balmainctf/photos.daneden.me
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);
  });
コード例 #7
0
ファイル: Home.js プロジェクト: KyleAMathews/metadata-editor
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,