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"












L'idée est très interessante.
Pour ce qui concerne la charge crée par le script, ça ne peut pas être résolu avec nice et ionice ?
Si, entre autres. There is more than one way to do it...
Dans la définition de la fonction generate_thumbnail() :
Il est écrit : path_hash=`echo "# * coding: UTF-8 *
Au lieu de : path_hash=`echo "# -*- coding: UTF-8 -*
Effectivement, cependant ça ne semble pas changer quoi que ce soit au problème des fichiers avec caractères accentués.
Poster un nouveau commentaire