leibowitz
Experimental Common Lisp object storage abstraction for Unix file systems
leibowitz/lib/thumbnailer/README.md
Download raw file: lib/thumbnailer/README.md
A file thumbnailing library for Common Lisp
===========================================
A simple thumbnail generation library with support for caching on the
file system. It works by shelling out Imagemagick, mutool (provided
by mupdf) and ffmpeg and should in theory work for all files with
`video/*` or `image/*` mime types, as well as `audio/*` files with
embedded cover art. The only audio format I've found so far that
don't work are flacs with ffmpeg 6.1.1. It also works for pdf,
postscript, epub, mobi, cbz, and theoretically supports fb2, fb3, and
xps though I haven't had the chance to test those yet. Additionally
it supports a handful of Microsoft office formats — these require that
you have LibreOffice installed as ImageMagick calls it under the hood
to convert them to pdf.
In order to use it, install ffmpeg (for best results make sure it's
been compiled with support for patent-encumbered codecs), mupdf,
ImageMagick, and optionally LibreOffice, then clone this repo
somewhere quicklisp can find it, and finally `(ql:quickload
:thumbnailer)`.
Once I've satisfied every criterion on the following roadmap I'll
seperate this project into its own repository and publish it on
quicklisp.
Usage
-----
A typically use-case to generate thumbnails with a specific directory
for your application's cache will probably look something like this:
```lisp
(handler-case
(let ((thumbnailer:*thumbnail-cache-dir* #P"my/apps/thumbnail/cache"))
(thumbnailer:get-thumbnail #P"path/to/some/file.ext" "mime/type"))
(thumbnailer:unsupported-file-type ())
(thumbnailer:thumbnail-creation-failed ()))
```
Catching `thumbnailer:unsupported-file-type` and
`thumbnailer:thumbnail-creation-failed` like this will silently skip
unsupported or mangled files. If your ImageMagick, ffmpeg, or mutool
executables are not in your `$PATH`, you can set the
`thumbnailer:*ffmpeg-exe*`, `thumbnailer:*imagemagick-exe*`, or
`*thumbnailer:*mutool-exe*` accordingly.
Roadmap
-------
Required before I submit to quicklisp:
- [X] Support images
- [X] Support video
- [ ] Make sure more exotic animated images like apng and animated
webp are supported by imagemagick, if not detect them and use
ffmpeg or something instead
- [X] Don't hardcode the default `thumbnailer:*thumbnail-cache-dir*`
under `/tmp/` then verify Windows and OSX support.
- [X] Verify support for audio with embedded cover art
- [ ] Verify support for audio WITHOUT embedded cover art
- [X] Support PDF and Postscript
- [ ] Support plain text
- [X] Support MOBI, CBZ, and other ebook formats
- [ ] Verify that fb2, fb3, and xps files actually work.
- [ ] Optionally fall back to looking for generic file icons using the
OS/DE appropriate mechanisms, optionally respecting the user's
theme.
- [ ] Have a configurable way of handling executable files; should
they all get the same generic thumbnail or should it be by mime
type?
Cool but optional features:
- [ ] Figure out a way to portably infer the mime type so the user
doesn't need to pass it all the time. Parsing the output of
file(1) isn't portable and building the existing CL libmagic
bindings on quicklisp invariably results in a mess of CFFI
errors. The *right* way to do this is to reimplement magic as a
CL library, but that would be very difficult and time
consuming.
- [ ] Optionally support directory thumbnails showing previews of the
contents.
- [ ] Optionally support little thumbnail badges to show, eg, the logo
of the programming language used in a text file. License
permitting, we could steal these from the [treemacs
project](https://github.com/Alexander-Miller/treemacs/tree/master/icons/default).
- [X] Maybe support MS Office, LibreOffice, and other fancy formats.
- [ ] Maybe optionally support previews for weirder things like
torrents, tarballs, and zip archives?
- [ ] Imagemagick doesn't seem to support rtf (text/rtf) or odp
(application/vnd.oasis.opendocument.presentation), which seems
odd to me since for docx, doc, and pptx support it shells out to
a headless libreoffice for pdf export. I imagine this would be
easy to fix upstream.
Derivative work:
- [ ] Use this library to implement a provider for the FreeDesktop
thumbnail DBUS protocol?