As I have lots of photos on my machine, thumbnails start to consume considerable amount of space on the disk.
Another problem, is that gnome-raw-thumbnailer isn't enabled in Ubuntu (Natty, Oneiric) by default anymore, so my raw photos don't get thumbnailed in Nautilus. And, if I enable it manually, thumbnails of vertical photos don't show with the correct orientation.
So, I have researched a bit the freedesktop thumbnail spec, gnome thumbnailer spec and how Shotwell stores its thumbnails and came up with a shell script that reuses Shotwell thumbnails for Nautilus.
Save the script below as /usr/bin/shotwell-raw-thumbnailer
#!/bin/bash input=$1 output=$2 if [ -z $output ]; then echo "Usage: $0 input output" exit 1 fi file=`echo -n ${input##file://} | perl -pe 's/%([0-9a-f]{2})/sprintf("%s", pack("H2",$1))/eig'` md5=`echo -n $input | md5sum | awk '{print $1}'` shotwell_id=`sqlite3 ~/.shotwell/data/photo.db "select id from PhotoTable where filename = '$file'"` if [ -z $shotwell_id ]; then gnome-raw-thumbnailer $input $output exit fi thumb=`printf ~/.shotwell/thumbs/thumbs128/thumb%016x.jpg $shotwell_id` if [ \! -e $thumb ]; then gnome-raw-thumbnailer $input $output exit fi replaceWithLink() { sleep 1 ln -sf $thumb ~/.thumbnails/normal/$md5.png } # gnome-thumbnail-factory doesn't support links cp $thumb $output # however, linked thumbnails work, so replace them after a delay replaceWithLink &
In order to make it work, you then need to register it as a thumbnailer in Gnome, put this to /usr/share/thumbnailers/shotwell.thumbnailer
[Thumbnailer Entry] Exec=/usr/bin/shotwell-raw-thumbnailer %u %o MimeType=image/x-3fr;image/x-adobe-dng;image/x-arw;image/x-bay;image/x-canon-cr2;image/x-canon-crw;image/x-cap;image/x-cr2;image/x-crw;image/x-dcr;image/x-dcraw;image/x-dcs;image/x-dng;image/x-drf;image/x-eip;image/x-erf;image/x-fff;image/x-fuji-raf;image/x-iiq;image/x-k25;image/x-kdc;image/x-mef;image/x-minolta-mrw;image/x-mos;image/x-mrw;image/x-nef;image/x-nikon-nef;image/x-nrw;image/x-olympus-orf;image/x-orf;image/x-panasonic-raw;image/x-pef;image/x-pentax-pef;image/x-ptx;image/x-pxn;image/x-r3d;image/x-raf;image/x-raw;image/x-rw2;image/x-rwl;image/x-rwz;image/x-sigma-x3f;image/x-sony-arw;image/x-sony-sr2;image/x-sony-srf;image/x-sr2;image/x-srf;image/x-x3f;
So, what does this script do?
- When Gnome (or Nautilus) needs a thumbnail, it runs this script
- The script checks if the image has an entry in the Shotwell database (~/.shotwell/data/photo.db)
- Then it checks if Shotwell has a thumbnail for it (in ~/.shotwell/thumbs)
- If yes, the script returns the already generated thumbnail to Gnome - no generation needed, so it works much faster
- If Shotwell doesn't have the thumbnail, the call is delegated to gnome-raw-thumbnailer that generates a new thumbnail, the old-fashioned way
- If Shotwell's thumbnail was used, the script will asynchronously replace the thumbnail in ~/.thumbnails with the link to Shotwell's file, avoiding a copy on the disk
The last step is the one that saves disk space. Unfortunately, it is not possible to return a link right away to Gnome - it can't read it for some reason. However, by putting a link directly under ~/.thumbnails later works perfectly, even if we put a .jpg file under the name of .png (as required by a spec). Png is actually a worse choice for thumbnailing of photos due to its lossless compression, so the disk savings are more than twofold with this script.