Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

@uswriting/exiftool

6over31.2kApache-2.01.0.5TypeScript support: included

ExifTool powered by WebAssembly to extract and write metadata from files in browsers and Node.js environments using zeroperl

exiftool, metadata, exif, iptc, xmp, wasm, webassembly, browser, node, universal, files, images, documents, media, zeroperl

readme

@uswriting/exiftool

ExifTool (13.30) powered by WebAssembly to extract and write metadata from files in browsers and Node.js environments using zeroperl.

Installation

npm install @uswriting/exiftool

Description

This package provides a WebAssembly-based implementation of ExifTool that works in both browser and Node.js environments. It leverages zeroperl to execute ExifTool without requiring any native binaries or system dependencies.

Usage

Basic Usage

import { parseMetadata } from '@uswriting/exiftool';

// Browser usage with File API
document.querySelector('input[type="file"]').addEventListener('change', async (event) => {
  const file = event.target.files[0];
  const result = await parseMetadata(file);

  if (result.success) {
    console.log(result.data);
  } else {
    console.error('Error:', result.error);
  }
});

Writing Metadata

import { writeMetadata } from '@uswriting/exiftool';

const result = await writeMetadata(file, {
  'Author': 'John Doe',
  'Title': 'My Photo',
  'Keywords': 'nature,photography'
});

if (result.success) {
  // result.data contains the modified file as Uint8Array
  const modifiedBlob = new Blob([result.data]);
}

Extracting Specific Metadata

import { parseMetadata } from '@uswriting/exiftool';

const result = await parseMetadata(file, {
  args: ['-Author', '-CreateDate', '-Make', '-Model']
});

if (result.success) {
  console.log(result.data);
}

JSON Output

import { parseMetadata } from '@uswriting/exiftool';

const result = await parseMetadata(file, {
  args: ['-json', '-n'],
  transform: (data) => JSON.parse(data)
});

if (result.success) {
  // Typed access to properties
  console.log(result.data); // { ... }
}

Important Notes

  • In browser environments, pass the File object directly from file inputs. Do not convert it to an ArrayBuffer or Uint8Array.
  • This package uses asynchronous web APIs for file processing which allows handling files over 2GB without loading them entirely into memory.
  • ExifTool is executed entirely within the browser or Node.js environment - no server requests are made for metadata extraction.

API Reference

parseMetadata()

async function parseMetadata<TReturn = string>(
  file: Binaryfile | File,
  options: ExifToolOptions<TReturn> = {}
): Promise<ExifToolOutput<TReturn>>

Parameters

  • file: Either a browser File object or a Binaryfile object with name and data properties.
  • options: Configuration options for the metadata extraction.

writeMetadata()

async function writeMetadata(
  file: Binaryfile | File,
  tags: ExifTags,
  options: ExifToolOptions = {}
): Promise<ExifToolOutput<ArrayBuffer>>

Parameters

  • file: Either a browser File object or a Binaryfile object with name and data properties.
  • tags: Object containing metadata tags to write, where keys are tag names and values are tag values.
  • options: Configuration options for the write operation.

Return Value

Returns a Promise that resolves to an ExifToolOutput object:

type ExifToolOutput<TOutput> =
  | {
      success: true;
      data: TOutput;
      error: string;
      exitCode: 0;
    }
  | {
      success: false;
      data: undefined;
      error: string;
      exitCode: number | undefined;
    };

License

Apache License, Version 2.0