Skip to content
blitzview-orgPublic

About

Lua port of ExifTool

Topics

Resources

Contributing

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

lexiftool

CI

lexiftool is a Lua port of ExifTool by Phil Harvey (the Image::ExifTool Perl library and the exiftool command-line application). It reads and writes metadata in the same file formats, with the same tag names, the same options and the same output.

The port is structural: every Image::ExifTool::X module has a counterpart lexiftool.X (lib/Image/ExifTool/X.pm ↔ src/lexiftool/X.lua) with the same tag tables, the same function names and the same code order, so it can be kept in step with upstream releases by reading the two side by side. Perl built-ins are reached through a small facade (src/lexiftool/perl.lua) that keeps Perl's semantics.

Download

To try it out without installing anything: prebuilt executables for Linux, Windows and macOS -- unzip and run (Linux x86-64 with glibc 2.17 or newer, macOS 11 or newer, Windows x64; see Standalone executables).

Status

  • Tracks ExifTool 13.59 (vendor/exiftool, a git submodule of the upstream repository).
  • Reading and writing are ported; the command-line tool lexiftool accepts exiftool's command lines and produces byte-identical output for them.
  • The ported upstream test suite (vendor/exiftool/t/*.t → src/test/) passes on Lua 5.4 and 5.5.
  • What cannot behave identically -- mainly user-supplied Perl code such as config files and -if/-p expressions beyond the supported subset -- is listed in doc/differences.md. exiftool config files are read as far as they are data; for code there is a config file written in Lua (doc/configuration.md).

Installation

lexiftool needs Lua 5.4 or 5.5 and a few LuaRocks modules, five of which bind C libraries that have to be present first (see C libraries below):

Rock Purpose C library
lpcre PCRE2 regex engine behind the perl facade libpcre2-8
carray mutable byte buffers --
luafilesystem file system access --
compress.zlib compressed data (Compress::Zlib, IO::*::*flate) zlib
digest MD5 and SHA-2 digests (Digest::MD5/SHA) --
compress.brotli Brotli-compressed metadata (IO::*::Brotli) libbrotlidec/-enc
compress.lzma compressed 7z headers (Compress::Raw::Lzma) liblzma
compress.bzip2 Rawzor metadata (IO::Uncompress::Bunzip2) libbz2
cipher.aes AES-encrypted PDF documents --
cipher.rc4 RC4-encrypted PDF documents --

All of them are required. The rock also builds the port's own small C module lexiftool.sys, which needs nothing but the C runtime.

With LuaRocks

luarocks --lua-version 5.4 install lexiftool     # or --lua-version 5.5;
                                                 # add --local for ~/.luarocks
lexiftool -ver -v

This installs the library (require('lexiftool'), see doc/api.md) and the command-line tool lexiftool into the rock tree's bin/ directory, together with all dependencies. With --local, put ~/.luarocks/bin on your PATH. lexiftool -ver -v lists the Lua libraries it found in place of exiftool's optional Perl modules.

The rock runs from the Lua sources; the precompiled bytecode of a source checkout (make bytecode, a faster start) is not part of it yet.

lpcre, carray, digest, the compress.* and the cipher.* rocks are published on luarocks.org, so the luarocks install lexiftool command above pulls them in automatically; only if one of them is ever missing there would it need installing from its source repository first (luarocks make rockspecs/<name>-scm-0.rockspec in a clone of github.com/osch/lua-<name>, for compress.* of github.com/osch/lua-compress, for cipher.* of github.com/osch/lua-cipher), then lexiftool itself from this checkout (luarocks make rockspecs/lexiftool-scm-0.rockspec).

C libraries

The headers and libraries of PCRE2, Brotli, zlib, liblzma (XZ Utils) and libbz2, the Lua headers and a C compiler:

Platform Command
Arch / Manjaro pacman -S lua luarocks pcre2 brotli zlib xz bzip2 base-devel
Debian / Ubuntu apt install lua5.4 liblua5.4-dev luarocks libpcre2-dev libbrotli-dev zlib1g-dev liblzma-dev libbz2-dev build-essential
Fedora dnf install lua lua-devel luarocks pcre2-devel brotli-devel zlib-devel xz-devel bzip2-devel gcc
macOS (Homebrew) brew install lua luarocks pcre2 brotli xz bzip2 (zlib comes with the system)
Windows (vcpkg) vcpkg install pcre2 brotli zlib liblzma bzip2 (with a Lua and LuaRocks set up for MSVC or MinGW)

When LuaRocks does not find a library by itself (typically Homebrew on Apple Silicon or vcpkg), point it at the installation prefix, e.g.

luarocks install lpcre    PCRE2_DIR=$(brew --prefix pcre2)
luarocks install compress.brotli BROTLIDEC_DIR=$(brew --prefix brotli) BROTLIENC_DIR=$(brew --prefix brotli)
luarocks install compress.zlib   ZLIB_DIR=$(brew --prefix zlib)          # optional on macOS
luarocks install compress.lzma   LZMA_DIR=$(brew --prefix xz)
luarocks install compress.bzip2  BZIP2_DIR=$(brew --prefix bzip2)        # keg-only in Homebrew
luarocks install lpcre    PCRE2_DIR=C:\vcpkg\installed\x64-windows     # likewise BROTLIDEC_DIR/BROTLIENC_DIR, ZLIB_DIR, LZMA_DIR, BZIP2_DIR

Standalone executables

For a quick try without Lua or LuaRocks: single-file executables that contain a Lua 5.5 interpreter, all lexiftool modules, the Geolocation database and the C modules listed above (statically linked, with PCRE2, zlib and Brotli), for Linux, Windows and macOS -- see Download above, or directly the releases page. Each zip holds a lexiftool/ folder with the executable, LICENSE, LICENSE-THIRD-PARTY and the license texts of all built-in components (licenses/).

Requirements:

  • Linux: x86-64 with glibc 2.17 or newer (RHEL/CentOS 7, Debian 8, Ubuntu 14.04 and everything newer); not on musl systems such as Alpine -- install the rock there.
  • macOS: 11 or newer, x86-64 and Apple Silicon.
  • Windows: x64.

The executables are not signed: macOS asks for confirmation on the first start (or run xattr -d com.apple.quarantine lexiftool/lexiftool), Windows SmartScreen may warn. They are built reproducibly with podman on Linux (make windows, make macos, make linux); see standalone/README.md.

From the sources

git clone --recurse-submodules https://github.com/blitzview-org/lexiftool.git lexiftool
cd lexiftool
luarocks --lua-version 5.4 --local install carray       # likewise luafilesystem,
                                                          # digest, lpcre,
                                                          # compress.zlib,
                                                          # compress.brotli,
                                                          # compress.lzma,
                                                          # compress.bzip2,
                                                          # cipher.aes,
                                                          # cipher.rc4
make sys          # builds build/<5.4|5.5>/lexiftool/sys.so
make bytecode     # optional: precompiled modules for faster start-up
./lexiftool -ver -v

./lexiftool is the command-line entry point and runs from the checkout; it finds its modules under src/ and the C modules under build/. The library can also be used directly: put src/ on package.path and build/<version>/ on package.cpath, then require('lexiftool') (see doc/api.md).

The rockspecs are in rockspecs/; after adding, removing or renaming a module, lua rockspecs/update_modules.lua regenerates their module lists.

Development

make check        # C modules, test suite (Lua 5.4 + 5.5), luacheck, parity checks
make test         # the ported upstream test suite only (under a de_DE locale,
                  # see CONTRIBUTING.md; TEST_LOCALE=C to run it under "C")
make verify       # structural parity of the port against vendor/exiftool
make test-cli     # CLI golden comparison against Perl exiftool (report-only,
                  # see doc/cli-tests.md)
make test-corpus  # the same comparison over exiftool.org's sample images,
                  # fetched on demand, never committed (doc/cli-tests.md)

The tests and the parity checks need the vendor/exiftool submodule (its t/ directory holds the test images and expected outputs). The rules the port follows are in CONTRIBUTING.md and doc/conventions.md.

License

lexiftool is distributed under the same terms as ExifTool and Perl itself: the Artistic License or the GNU General Public License, version 1 or later. See LICENSE; third-party components are listed in LICENSE-THIRD-PARTY.

About

Lua port of ExifTool

Topics

Resources

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Contributors

Languages