Jump to content

Thumbnails: Difference between revisions

From Official NixOS Wiki
Crazivik (talk | contribs)
consolidated repeated code from various code blocks into a single block in new 'troubleshooting sub-sesction'
Joshbuker (talk | contribs)
Update RAW thumbnail recommendations and use `pkgs.` instead of `with pkgs;`
Line 33: Line 33:
{
{


   environment.systemPackages = with pkgs; [
   environment.systemPackages = [
     ffmpeg-headless
     pkgs.ffmpeg-headless
     ffmpegthumbnailer
     pkgs.ffmpegthumbnailer
   ];
   ];


Line 53: Line 53:
{
{


   environment.systemPackages = with pkgs; [  
   environment.systemPackages = [  
     gdk-pixbuf
     pkgs.gdk-pixbuf
   ];
   ];


Line 71: Line 71:
{
{


   environment.systemPackages = with pkgs; [  
   environment.systemPackages = [  
     libheif
     pkgs.libheif
     libheif.out
     pkgs.libheif.out
   ];
   ];


Line 84: Line 84:


==== nufraw-thumbnailer ====
==== nufraw-thumbnailer ====
{{Warning|nufraw has not been updated since March 2nd, 2020, and may be insecure.}}
To enable thumbnails for camera RAW format use <code>nufraw</code> to decode RAW images and <code>nufraw-thumbnailer</code> to generate thumbnails.
To enable thumbnails for camera RAW format use <code>nufraw</code> to decode RAW images and <code>nufraw-thumbnailer</code> to generate thumbnails.


Line 92: Line 93:
{
{


   environment.systemPackages = with pkgs; [  
   environment.systemPackages = [  
     nufraw
     pkgs.nufraw
     nufraw-thumbnailer
     pkgs.nufraw-thumbnailer
   ];
   ];


Line 119: Line 120:
Eg: Generate thumbnails from 'raw' data (not 'embedded jpeg') + respect EXIF (eg: rotation) metadata + add support for additional camera formats
Eg: Generate thumbnails from 'raw' data (not 'embedded jpeg') + respect EXIF (eg: rotation) metadata + add support for additional camera formats


<syntaxhighlight lang="nix">
<syntaxhighlight lang="nix"># configuration.nix
# configuration.nix
{ pkgs, ... }:
{ pkgs, ... }:


Line 126: Line 126:


   environment.systemPackages = [
   environment.systemPackages = [
     nufraw
     pkgs.nufraw
     nufraw-thumbnailer
     pkgs.nufraw-thumbnailer
     # Thumbnails form 'raw' data and include EXIF tags for Adobe-DNG images
     # Thumbnails form 'raw' data and include EXIF tags for Adobe-DNG images
     (writeTextDir "share/thumbnailers/my-custom-nufraw.thumbnailer" ''
     (pkgs.writeTextFile {
      [Thumbnailer Entry]
      name = "my-custom-nufraw-thumbnailer";
      TryExec=nufraw-batch
      destination = "/share/thumbnailers/my-custom-nufraw.thumbnailer";
      Exec=nufraw-batch --silent --size %s --out-type=png --output=%o %i
      text = ''
      MimeType=image/x-adobe-dng;image/x-dng;
        [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
     # MimeTypes not listed here but listed in the default nufraw.thumbnailer will continue displaying
       # thumbnails generated form the 'embedded jpeg' without the EXIF metadata
       # thumbnails generated form the 'embedded jpeg' without the EXIF metadata
   ];
   ];


}
}</syntaxhighlight>
</syntaxhighlight>


==== gdk-pixbuf thumbnailer ====
==== gdk-pixbuf thumbnailer ====
Line 152: Line 155:


   environment.systemPackages = [
   environment.systemPackages = [
     gdk-pixbuf
     pkgs.gdk-pixbuf
     (writeTextDir "share/thumbnailers/my-custom-nufraw.thumbnailer" ''
    # Allow gdk-pixbuf to thumbnail RAW photos by extracting the embedded jpeg
      [Thumbnailer Entry]
     (pkgs.writeTextFile {
      TryExec=gdk-pixbuf-thumbnailer
      name = "raw-embedded-jpeg-thumbnailer";
      Exec=gdk-pixbuf-thumbnailer -s %s %u %o
      destination = "/share/thumbnailers/raw-embedded-jpeg.thumbnailer";
      MimeType=image/x-adobe-dng;image/x-dng;image/x-canon-cr2;image/x-canon-crw;image/x-cr2;image/x-crw;
      text = ''
    '';)
        [Thumbnailer Entry]
        TryExec=gdk-pixbuf-thumbnailer
        Exec=gdk-pixbuf-thumbnailer -s %s %u %o
        MimeType=image/x-canon-crw;image/x-canon-cr2;image/x-canon-cr3;image/x-adobe-dng;image/x-dng;
      '';
    })
    # Other MimeTypes that include embedded jpeg may work as well (e.g. Nikon .nef, Sony .arf, etc)
    # Test other formats by adding them above
   ];
   ];



Revision as of 18:00, 2 December 2025

☶︎
This article or section needs to be expanded. Further information may be found in the related discussion page. Please consult the pedia article metapage for guidelines on contributing.

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 = [
    pkgs.ffmpeg-headless
    pkgs.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 = [ 
    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 = [ 
    pkgs.libheif
    pkgs.libheif.out
  ];

  # 'heif.thumbnailer' is created in '/run/current-system/sw/share/thumbnailers'

}

Enable RAW (Camera) Image Thumbnails

nufraw-thumbnailer

⚠︎
Warning: nufraw has not been updated since March 2nd, 2020, and may be insecure.

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 = [ 
    pkgs.nufraw
    pkgs.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 = [
    pkgs.nufraw
    pkgs.nufraw-thumbnailer
    # Thumbnails form 'raw' data and include EXIF tags for Adobe-DNG images
    (pkgs.writeTextFile {
      name = "my-custom-nufraw-thumbnailer";
      destination = "/share/thumbnailers/my-custom-nufraw.thumbnailer";
      text = ''
        [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 = [
    pkgs.gdk-pixbuf
    # Allow gdk-pixbuf to thumbnail RAW photos by extracting the embedded jpeg
    (pkgs.writeTextFile {
      name = "raw-embedded-jpeg-thumbnailer";
      destination = "/share/thumbnailers/raw-embedded-jpeg.thumbnailer";
      text = ''
        [Thumbnailer Entry]
        TryExec=gdk-pixbuf-thumbnailer
        Exec=gdk-pixbuf-thumbnailer -s %s %u %o
        MimeType=image/x-canon-crw;image/x-canon-cr2;image/x-canon-cr3;image/x-adobe-dng;image/x-dng;
      '';
    })
    # Other MimeTypes that include embedded jpeg may work as well (e.g. Nikon .nef, Sony .arf, etc)
    # Test other formats by adding them above
  ];

}

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:

  1. First you need to figure out how to create a .png image from a file in the desired format.
  2. Create a .thumbnailer file in $XDG_DATA_DIRS/thumbnailers.
  3. 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;
        '';
      }
    )
  ];
}