Générer les miniatures à l'avance

Portrait de Zanko
Version imprimablePDF version

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 Evil ) et probablement pas exempt de bugs... Celui qui veut réécrire ça en Python est le bienvenu Happy.


#!/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"

Portrait de Spip

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 ?

Portrait de Zanko

Si, entre autres. There is more than one way to do it...

Portrait de PhiX

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 ­-*­

Portrait de Zanko

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

Le contenu de ce champ ne sera pas montré publiquement.
  • Balises HTML autorisées : <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • You can enable syntax highlighting of source code with the following tags: .
  • Les smileys textuels seront remplacés par des smileys graphiques.

Plus d'informations sur les options de formatage