Thumbnails
Enabling Thumbnailers
On minimal / custom desktop environments thumbnails in file explorers may not work by default. For example:
- GNOME environments with the option
services.gnome.core-utilities.enable = false;
- Custom environments built from ground-up using window managers like sway or hyperland
Save yourself hours of troubleshooting!!
Thumbnailers may already be installed in your system as dependencies of image/video applications but are not activated.
Run cd /run/current-system/sw/share/thumbnailers && ls
to list installed thumbnailers. If relevant .thumbnailer files are present and we still don't have thumbnails in our file explorer then we may need to activate them by updating symlinks to share/thumbnailers
# configuration.nix
{
environment.pathsToLink = [
"share/thumbnailers"
];
}
Enable Video Thumbnails
To enable thumbnails for video files use ffmpeg-headless
to decode videos and fmpegthumbnailer
to generate thumbnails.
Thumbnails for the following MimeTypes are enabled: video/jpeg; video/mp4; video/mpeg; video/quicktime; video/x-ms-asf; video/x-ms-wm; video/x-ms-wmv; video/x-ms-asx; video/x-ms-wmx; video/x-ms-wvx; video/x-msvideo; video/x-flv; video/x-matroska; application/x-matroska; application/mxf; video/3gp; video/3gpp; video/dv; video/divx; video/fli; video/flv; video/mp2t; video/mp4v-es; video/msvideo; video/ogg; video/vivo; video/vnd.avi; video/vnd.divx; video/vnd.mpegurl; video/vnd.rn-realvideo; application/vnd.rn-realmedia; video/vnd.vivo; video/webm; video/x-anim; video/x-avi; video/x-flc; video/x-fli; video/x-flic; video/x-m4v; video/x-mpeg; video/x-mpeg2; video/x-nsv; video/x-ogm+ogg; video/x-theora+ogg.
# configuration.nix
{ pkgs, ... }:
{
environment.systemPackages = with pkgs; [
ffmpeg-headless
ffmpegthumbnailer
];
# 'ffmpegthumbnailer.thumbnailer' is created in '/run/current-system/sw/share/thumbnailers'
}
Enable Image Thumbnails
To enable thumbnails for image files use gdk-pixbuf
to decode images and generate thumbnails.
Thumbnails for the following MimeTypes are enabled: image/png; image/jpeg; image/bmp; image/x-bmp; image/x-MS-bmp; image/gif; image/x-icon; image/x-ico; image/x-win-bitmap; image/vnd.microsoft.icon; application/ico; image/ico; image/icon; text/ico; image/x-portable-anymap; image/x-portable-bitmap; image/x-portable-graymap; image/x-portable-pixmap; image/tiff; image/x-xpixmap; image/x-xbitmap; image/x-tga; image/x-icns; image/x-quicktime; image/qtif.
# configuration.nix
{ pkgs, ... }:
{
environment.systemPackages = with pkgs; [
gdk-pixbuf
];
# 'gdk-pixbuf-thumbnailer.thumbnailer' is created in '/run/current-system/sw/share/thumbnailers'
}
Enable HEIF Image Thumbnails
To enable thumbnails for HEIF image format use libheif
to decode HEIF images and libheif.out
to generate thumbnails.
Thumbnails for the following MimeTypes are enabled: image/heif; image/avif.
# configuration.nix
{ pkgs, ... }:
{
environment.systemPackages = with pkgs; [
libheif
libheif.out
];
# 'heif.thumbnailer' is created in '/run/current-system/sw/share/thumbnailers'
}
Enable RAW (Camera) Image Thumbnails
nufraw-thumbnailer
To enable thumbnails for camera RAW format use nufraw
to decode RAW images and nufraw-thumbnailer
to generate thumbnails.
Thumbnails for the following MimeTypes are enabled: image/x-canon-cr2;image/x-canon-crw;image/x-minolta-mrw;image/x-nikon-nef;image/x-pentax-pef;image/x-panasonic-rw2;image/x-panasonic-raw2;image/x-samsung-srw;image/x-olympus-orf;image/x-sony-arw.
# configuration.nix
{ pkgs, ... }:
{
environment.systemPackages = with pkgs; [
nufraw
nufraw-thumbnailer
];
# 'nufraw.thumbnailer' is created in '/run/current-system/sw/share/thumbnailers'
}
nufraw-thumbnailer
- creates thumbnails using the embedded 'jpeg' in the camera raw files. (
--noexif
) - does not respect the EXIF metadata. (
--embedded-image
)
Output of cat /run/current-system/sw/share/thumbnailers/nufraw.thumbnailer
:
[Thumbnailer Entry]
TryExec=/nix/store/piss9dl8i5xnfm5yagdffgxycm8lsqpl-nufraw-0.43-3/bin/nufraw-batch
Exec=/nix/store/piss9dl8i5xnfm5yagdffgxycm8lsqpl-nufraw-0.43-3/bin/nufraw-batch --silent --size %s --out-type=png --noexif --output=%o --embedded-image %i
MimeType=image/x-canon-cr2;image/x-canon-crw;image/x-minolta-mrw;image/x-nikon-nef;image/x-pentax-pef;image/x-panasonic-rw2;image/x-panasonic-raw2;image/x-samsung-srw;image/x-olympus-orf;image/x-sony-arw
Additional cameras[1] beyond those listed in the stock nufraw.thumbnailer
file are also supported. The following additional MimeTypes are supported: image/x-adobe-dng; image/x-dcraw; image/x-fuji-raf; image/x-kodak-dcr; image/x-kodak-k25; image/x-kodak-kdc; image/x-nikon-nrw; image/x-panasonic-raw; image/x-sigma-x3f; image/x-sony-srf; image/x-sony-sr2
Eg: Generate thumbnails from 'raw' data (not 'embedded jpeg') + respect EXIF (eg: rotation) metadata + add support for additional camera formats
# configuration.nix
{ pkgs, ... }:
{
environment.systemPackages = [
nufraw
nufraw-thumbnailer
# Thumbnails form 'raw' data and include EXIF tags for Adobe-DNG images
(writeTextDir "share/thumbnailers/my-custom-nufraw.thumbnailer" ''
[Thumbnailer Entry]
TryExec=nufraw-batch
Exec=nufraw-batch --silent --size %s --out-type=png --output=%o %i
MimeType=image/x-adobe-dng;image/x-dng;
'';)
# MimeTypes not listed here but listed in the default nufraw.thumbnailer will continue displaying
# thumbnails generated form the 'embedded jpeg' without the EXIF metadata
];
}
gdk-pixbuf thumbnailer
The gdk-pixbuf thumbnailer can also generate thumbnails (from 'embedded jpeg') for RAW camera image formats. It cannot decode 'raw' image data but can read the 'embedded jpeg'.
# configuration.nix
{ pkgs, ... }:
{
environment.systemPackages = [
gdk-pixbuf
(writeTextDir "share/thumbnailers/my-custom-nufraw.thumbnailer" ''
[Thumbnailer Entry]
TryExec=gdk-pixbuf-thumbnailer
Exec=gdk-pixbuf-thumbnailer -s %s %u %o
MimeType=image/x-adobe-dng;image/x-dng;image/x-canon-cr2;image/x-canon-crw;image/x-cr2;image/x-crw;
'';)
];
}
Creating Custom Thumbnailers
Most package mangers accept the Thumbnail Managing Standard, by using it you can create your own thumbnailer for any file format, this can be done by:
- First you need to figure out how to create a
.png
image from a file in the desired format. - Create a
.thumbnailer
file in$XDG_DATA_DIRS/thumbnailers
. - Restart your thumbnailer service (This is specific to each file manager) and test if it's working.
Example
You could create a thumbnailer for Krita's .kra
file format like so:
.kra
are zip files, with a preview stored at /preview.png
, we can use unzip to extract the preview:
unzip -p robot-squirrel.kra preview.png > robot-squirrel.png
Create a .thumbnailer
file in any $XDG_DATA_DIRS/thumbnailers
directory.
# $HOME/.local/share/thumbnailers/kra.thumbnailer
[Thumbnailer Entry]
Exec=sh -c "unzip -p %i preview.png > %o"
MimeType=application/x-krita;
Restart your thumbnailer service (This is specific to each file manager) and test if it's working.
After you have a working definition, you can make it reproducible like so:
# configuration.nix
{ pkgs, ... }: {
environment.systemPackages = [
(
pkgs.writeTextFile {
# This can be anything, it's just the name of the derivation in the nix store
name = "krita-thumbnailer";
# This is the important part, the path under which this will be installed
destination = "/share/thumbnailers/kra.thumbnailer";
# The contents of your thumbnailer, don't forget to specify the full path to executables
text = ''
[Thumbnailer Entry]
Exec=sh -c "${pkgs.unzip}/bin/unzip -p %i preview.png > %o"
MimeType=application/x-krita;
'';
}
)
];
}