Générer les miniatures à l'avance
Comme vous avez probablement eu l'occasion de le remarquer, il peut-être pénible d'attendre après la génération des miniatures de fichiers lors de l'ouverture d'un dossier contenant, par exemple, beaucoup d'images ou de vidéos, c'est pourquoi j'ai eu l'idée de les générer en avance, afin de gagner du temps lors de l'ouverture dudit dossier.
J'ai donc écrit un script qui va faire appel au thumbnailer (le programme chargé de la génération des miniatures) adapté et se charger de placer les miniatures dans le bon dossier.
Évidemment, cette approche présente l'inconvénient de déplacer le problème : c'est lorsque le script va s'exécuter que la charge de l'ordinateur augmentera, il convient donc si la machine s'en trouve trop ralentie de faire en sorte qu'il s'exécute lorsqu'on ne l'utilise pas (par exemple avec cron ou en modifiant le script pour qu'il utilise batch).
Le script respecte (ou essaye de respecter) la spécification Thumbnail Managing Standard de freedesktop.org (donc génère des miniatures qui seront reconnues par les applications GNOME, KDE...). Sous GNOME, il ira chercher les thumbnailers appropriés définis dans gconf (spécifier use_gconf=1). Il nécessite d'avoir installé python ainsi que ffmpegthumbnailer (sauf à utiliser les thumbnailers définis dans gconf, auquel cas ceux-ci doivent être installés).
Sous GNOME, il peut être nécessaire de modifier la valeur gconf /desktop/gnome/thumbnail_cache/maximum_size afin d'éviter que les miniatures ainsi générées ne soient effacées si elles dépassent la place allouée par défaut (car forcément en générant toutes les miniatures à l'avance ça prend un peu de place si on a beaucoup de fichiers). Par exemple pour définir la taille de ce cache à un Go (contre 512 Mo par défaut) :
gconftool-2 --set /desktop/gnome/thumbnail_cache/maximum_size --type int 1024
Pour désactiver complètement la limite, mettre la valeur à -1.
Ah oui : le script n'est pas très propre (comprendre carrément dégueulasse ) et probablement pas exempt de bugs... Celui qui veut réécrire ça en Python est le bienvenu .
#!/usr/bin/env bash path="/" generate_128px_thumbs=1 generate_256px_thumbs=1 use_gconf=1 generate_thumbnail() { path_hash=`echo "# -*- coding: UTF-8 -*- import hashlib, urllib print hashlib.md5(\\"file://\\" + urllib.quote(\\"$source_file\\")).hexdigest()" | python` [ -e "$HOME/.thumbnails/$size_dir/$path_hash.png" ] && return 0 [ -e "$HOME/.thumbnails/fail/$path_hash.png" ] && return 1 file_type=`file -b --mime-type "$source_file"` if [ $use_gconf -eq 1 ] then [ `echo $file_type | cut -d '/' -f 1` == "image" ] && file_type="image/x-pict" gconftool-2 --get /desktop/gnome/thumbnailers/`echo $file_type | sed -e "s#/#@#g"`/command | sed -e "s#%s#$size#g" | sed -e "s#%u#\\"$source_file\\"#g" | sed -e "s#%o#"$cache_dir/autothumb/$path_hash.$size"#g" | bash else case $file_type in video*) ffmpegthumbnailer -i "$source_file" -o "$cache_dir/autothumb/$path_hash.$size" -s $size ;; image*) ffmpegthumbnailer -i "$source_file" -o "$cache_dir/autothumb/$path_hash.$size" -s $size ;; *) echo "No thumbnailer defined for $file_type" ;; esac fi if [ $? -eq 0 ] && [ -e "$cache_dir/autothumb/$path_hash.$size" ] then mv "$cache_dir/autothumb/$path_hash.$size" "$HOME/.thumbnails/$size_dir/$path_hash.png" chmod 0600 "$HOME/.thumbnails/$size_dir/$path_hash.png" else [ -e "$cache_dir/autothumb/$path_hash.$size" ] && rm "$cache_dir/autothumb/$path_hash.$size" touch "$HOME/.thumbnails/fail/autothumb/$path_hash.png" return 1 fi } if [ "$XDG_CACHE_HOME" ] then cache_dir="$XDG_CACHE_HOME" else cache_dir="$HOME/.cache" fi for dir in \\ "$HOME/.thumbnails/normal" \\ "$HOME/.thumbnails/large" \\ "$HOME/.thumbnails/fail/autothumb" \\ "$cache_dir/autothumb" do if [ ! -e $dir ] then mkdir -p $dir chmod 0700 $dir fi done find "$path" -iname "*" | while read source_file do if [ $generate_128px_thumbs -eq 1 ] then size=128 size_dir=normal generate_thumbnail fi if [ $generate_256px_thumbs -eq 1 ] then size=256 size_dir=large generate_thumbnail fi done rm -r "$cache_dir/autothumb"