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 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"
Vus : 965
Publié par Zanko : 16