#1 Le 19/09/2010, à 11:21
- cracolinux
[Script] Générateur de galeries photo «GGalerie»
EDIT : Cette version est vieille et sale, voir plus loin ...
Je vous présente ce script de génération de galeries photo largement inspiré d'un tuto du «Site du zéro».
Installation :
1-Copier le script dans un fichier vide et le rendre exécutable (chmod u+x)
2-Placer le fichier obtenu dans un répertoire du PATH (→ cf http://doc.ubuntu-fr.org/variables_d_environnement)
Utilisation :
Deux choix :
-GGalerie /ledossier/en/question [enter]
ou
-GGalerie [enter] puis renseignement du dossier à traiter
Rendu
On obtient un fichier «supergalerie.html» à la racine du dossier traité.
#!/bin/bash
IFS='
'
########################################################
#Acquisition chemin si pas déjà en argument#############
########################################################
if [[ $# = 1 ]]
then
chemin=$1
else
read -p "Chemin voulu:" chemin
fi
########################################################
#PARTIE 1###############################################
########################################################
###########generation de la liste de repertoire#########
########################################################
find "$chemin" -type d > "$chemin"/rep.txt
########################################################
########################################################
#PARTIE 2###############################################
########################################################
###########creation des dossiers mini et galerie.html###
########################################################
while read line
do
cd "$line"
ls *.jpg || ls *.JPG
if [[ "$?" = 0 ]] # si il y a du jpeg
then #alors
if [ ! -d miniatures ] ## si il n'y pas de dossier mini
then #alors
mkdir miniatures # on cree le dossier mini
fi ## is
# En-tête HTML
echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
<title>Ma galerie</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
a img { border:0; }
</style>
</head>
<body><p>' > galerie.html
fi
# Génération des miniatures et de la page
for image in $(ls *.jpg *.JPG)
do
convert "$image" -thumbnail '200x200>' miniatures/"$image"
echo '<a href="'$image'"><img src="miniatures/'$image'" alt="" /></a> ' >> galerie.html
done
# Pied de page HTML
if [ -f galerie.html ]
then
echo '</p>
</body>
</html>' >> galerie.html
fi
done < "$chemin"/rep.txt
###########################################
#PARTIE 3##################################
###########################################
##########le fichier final#################
###########################################
find "$chemin" -type f -name "galerie.html" > "$chemin"/supergal.txt
echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
<title>Ma galerie</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
a img { border:0; }
</style>
</head>
<body><p>' > "$chemin"/supergalerie.html
while read line
do
#deb test partie une miniature au hasard
line2=$(echo $line | sed "s/galerie.html/miniatures\//")
line3=$(ls $(echo $line2) | sort -R | head -n1)
line4="$line2$line3"
#fin test
echo '<a href="'$line'"><img src="'$line4'" alt="" /></a>' >> "$chemin"/supergalerie.html
done < "$chemin"/supergal.txt
###########################################
####Nettoyage##############################
###########################################
rm "$chemin"/rep.txt
rm "$chemin"/supergal.txt
# sonnette
exit
à cela vient s'ajouter pour les feignants le script de nettoyage :
A utiliser dans le répertoire concerné.
#!/bin/bash
echo "Attention !!"
echo "a utiliser à la racine du répertoire concerné"
read -p "Continuer ? (y / n )" reponse
if [[ $reponse == "n" ]]
then
exit
fi
find . -type d -iname "miniatures" -exec rm -r {} \;
find . -type f -iname "galerie.html" -delete
find . -type f -iname "supergalerie.html" -delete
echo "done"
sleep 1
exit
Je compte sur vous pour les critiques constructives (ou pas) et les idées d'améliorations.
Faudrait que j'en fasse un script nautilus, mais je commence à rester de plus en plus sur les terminaux...
Dernière modification par cracolinux (Le 23/03/2012, à 23:15)
Hors ligne
#2 Le 19/09/2010, à 19:28
- cracolinux
Re : [Script] Générateur de galeries photo «GGalerie»
Alors, il pue mon script ?
Hors ligne
#3 Le 19/09/2010, à 19:51
- Atok
Re : [Script] Générateur de galeries photo «GGalerie»
Ben si tu pouvais nous montrer le résultat ça serait cool
Lisez libre ! :)
Hors ligne
#4 Le 19/09/2010, à 22:47
- sputnick
Re : [Script] Générateur de galeries photo «GGalerie»
Il te reste beaucoup à apprendre surtout si tu garde ces mauvaises habitudes.
- pas assez du quotes sur les variables, nul besoin de toucher à IFS ( servant à masquer ses erreurs )
- pas d'indentation
-
ls *.jpg || ls *.JPG
if [[ "$?" = 0 ]]
ca faisait longtemps que j'avais pas vu un truc aussi crade pour tester la présence de fichiers
-
for image in $(ls *.jpg *.JPG)
useless use of ls awards alors qu'un glob suffit
- pourquoi utiliser le XHTML alors que le HTML suffit ?
-
if [ ! -d miniatures ]; then mkdir
ah ben on mélange les tests [ ] et les tests [[ ]] et puis un simple mkdir -p aurait été bien plus simple et efficace
Alors, il pue mon script
Ta clairvoyance t’honore
Il existe un tunnel obscur dans la lumière infinie. Lao-Tseu
https://sputnick.fr
Hors ligne
#5 Le 20/09/2010, à 09:50
- cracolinux
Re : [Script] Générateur de galeries photo «GGalerie»
Ah ben merci pour la critique, maintenant comme tu t'en doutait, je te pose les questions qui vont avec :
for image in $(ls *.jpg *.JPG)
1-Comment je fais pour faire ça proprement avec un «glob» ? (→ boucle while )
2-Qu'est-ce qu'un «glob» (d'abord ) ? (→ c'est un truc proche d'une expression régulière, dur à expliquer, en fait...)
mkdir -p
1-En quoi mkdir -p peut il m'aider ? (→ crée un dossier sans erreur si il existe déjà )
2-Quel est l'inconvénient du xhtml par rapport au html ?
Je mélange les tests c'est vrai, je vais essayer de corriger ça et de faire plus propre.
Est-ce que tu as testé le script cependant ?
Quand penses-tu ? (du résultat, hein, je sais que le code pue grâce à ma clairvoyance..)
Merci à toi de ta réponse franche. Si tu peux m'aider à améliorer les choses, ce serait sympathique. Comme tu le dis, j'ai beaucoup à apprendre, c'est ce que je fais.
EDIT : auto-réponse après 1 an 1/2
Dernière modification par cracolinux (Le 11/03/2012, à 23:32)
Hors ligne
#6 Le 11/03/2012, à 22:39
- cracolinux
Re : [Script] Générateur de galeries photo «GGalerie»
Salut,
Je déterre mon propre post. J'ai un peu progressé depuis le temps alors j'essaye de refaire mes vieux scripts un peu plus proprement :
Voilà pour celui-ci :
#!/bin/bash
#=======================================================================
# Fichier: ggalerie
#
# Utilisation: ggalerie [répertoire de travail]
#
# Description: Ce script crée des miniatures à partir de fichiers
# jpeg et propose la visualisation de la galerie de
# photos correspondantes sous forme d'un fichier html.
#
# Le script propose également la suppression des
# galeries qu'il génere (nettoyage)
#
# Auteur: cracolinux
#=======================================================================
# modifier cette valeur pour faire varier la qualité des miniatures
# obtenues (max=100)
qualiteminiatures=50
#===Fonction============================================
# Nom: creation
# Description: crée la galerie photo à partir de la
# variable : ${chemin}
#=======================================================
creation (){
#--------------------------------------------------------------------
# création de /tmp/fichierjpg : liste des jpeg
# création de /tmp/fichierfinal : liste des sous répertoires
# de $chemin contenant des jpeg
#--------------------------------------------------------------------
find "$chemin" -type f -iname "*.jpg" | sort > /tmp/fichierjpg
while read line
do
dirname "$line" >> /tmp/fichierrepertoire
done < /tmp/fichierjpg
sort /tmp/fichierrepertoire | uniq > /tmp/fichierfinal
rm /tmp/fichierrepertoire
#--------------------------------------------------------------------
# création des dossiers miniatures
# creation des en-têtes de fichier «galerie.html»
#--------------------------------------------------------------------
while read line
do
mkdir -p "${line}/mini-atures"
echo ' <head>
<title>'"${line##*/}"'</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
a img { border:0; }
</style>
</head>' > "${line}"/galerie.html
done < /tmp/fichierfinal
#--------------------------------------------------------------------
# creation des miniatures avec convert, remplissage des fichiers
# «galerie.html» avec les liens correspondants
#--------------------------------------------------------------------
while read line
do
convert "$line" -thumbnail '200x200>' -quality ${qualiteminiatures} "${line%/*}/mini-atures/${line##*/}"
echo '<a href="'${line}'"><img src="mini-atures/'${line##*/}'" alt="" /></a> ' >> "${line%/*}"/galerie.html
done < /tmp/fichierjpg
#--------------------------------------------------------------------
# création du fichier final « $chemin/supergalerie.html »
# en-tête
#--------------------------------------------------------------------
echo ' <head>
<title>Ma galerie</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
a img { border:0; }
</style>
</head>' > "$chemin"/supergalerie.html
#--------------------------------------------------------------------
# une image au hasard pointant vers chaque fichier «galerie.html»
#--------------------------------------------------------------------
while read line
do
choix=$(ls "${line}/mini-atures" | sort -R | head -n 1)
echo '<a href="'"${line}"/galerie.html'">'"${line##*/}"'<img src="'"${line}/mini-atures/${choix}"'" alt="" /></a>' >> "$chemin"/supergalerie.html
done < /tmp/fichierfinal
rm /tmp/fichierfinal /tmp/fichierjpg # nettoyage
echo " →→ file://"$chemin"/supergalerie.html" # lien final
exit 0
}
#===Fonction====================================================
# Nom: suppression
# Description: supprime les fichiers généré par la fonction
# creation et présents dans ${chemin}
#===============================================================
suppression () {
# Affiche la proposition et attend confirmation
clear
find "$chemin" -type d -iname "mini-atures"
find "$chemin" -type f -iname "galerie.html"
find "$chemin" -type f -iname "supergalerie.html"
echo
read -p "vont etre supprimés, continuer ? (y / n )" reponse
# Nettoyage
if [[ $reponse == "y" || $reponse == "Y" ]] ; then
find "$chemin" -type d -iname "mini-atures" -exec rm -r {} \; 2> /dev/null
find "$chemin" -type f -iname "galerie.html" -delete 2> /dev/null
find "$chemin" -type f -iname "supergalerie.html" -delete 2> /dev/null
echo "Galerie supprimée"
exit 0
else
exit 1
fi
}
#==MAIN====
# Choix du répertoire de travail
if [[ $# = 1 ]] ; then
chemin=$1
else
read -p "Répertoire de travail : " chemin
fi
# Choix
echo "1 → Créer une galerie"
echo "2 → Supprimer une galerie"
read -p " : " choix
# Lancement de la fonction correspondant au choix
[[ $choix == "1" ]] && creation
[[ $choix == "2" ]] && suppression
exit 0
Vos commentaires sont les bienvenues, vos améliorations également !
Merci
EDIT : Réparation d'une erreur avec les fichiers contenant des espaces dans le nom ....
Dernière modification par cracolinux (Le 23/03/2012, à 23:09)
Hors ligne
#7 Le 11/03/2012, à 23:38
- sputnick
Re : [Script] Générateur de galeries photo «GGalerie»
Ya une chose rédhibitoire. L'indentation !
C'était déjà le cas dans le post #4 du 19/09/2010 à 22:47
Si tu partage tes travaux et qu'en plus tu demande de l'aide, aide toi et les autres pour présenter qq chose de lisible, l'indentation est fondamentale pour pouvoir comprendre rapidement le code. Sans cet effort, moi et d'autres n'auront pas envie d'aller plus loin. Je te dit ça parce que on est tous passé par là, et que cet aspect est fondamental pour communiquer efficacement et permettre la maintenance zen.
Un bon article sur les différents styles d’indentation sur wikipedia http://fr.wikipedia.org/wiki/Style_d%27indentation
( Les fonctions, si tu les ouvres, le code à l'interieur de la fonction doit être indenté. )
Je t'invite à éditer ton post
Il existe un tunnel obscur dans la lumière infinie. Lao-Tseu
https://sputnick.fr
Hors ligne
#8 Le 12/03/2012, à 00:25
- cracolinux
Re : [Script] Générateur de galeries photo «GGalerie»
Merci de ta remarque, tu as bien raison, je dois le reconnaître !
Je viens de faire la modification, j'espère que c'est plus lisible.
Hors ligne
#9 Le 12/03/2012, à 00:32
- sputnick
Re : [Script] Générateur de galeries photo «GGalerie»
Merci de ta remarque, tu as bien raison, je dois le reconnaître !
Je viens de faire la modification, j'espère que c'est plus lisible.
Ca commence mal :
function creation
{
find "$chemin" -type f -iname "*.jpg" > /tmp/fichierjpg
(...)
Toujours pas d'indentation malgré mes explications précises.
Et puis mettre le mot clef function n'est pas une erreur mais ça appartient au passé.
On utilise en général plutot
creation() {
# code ici
}
Il existe un tunnel obscur dans la lumière infinie. Lao-Tseu
https://sputnick.fr
Hors ligne
#10 Le 12/03/2012, à 00:44
- cracolinux
Re : [Script] Générateur de galeries photo «GGalerie»
ok, je modifie
Hors ligne
#11 Le 23/03/2012, à 23:08
- cracolinux
Re : [Script] Générateur de galeries photo «GGalerie»
sputnick : je commence enfin le python...l'indentation...
Hors ligne
#12 Le 23/03/2012, à 23:43
- sputnick
Re : [Script] Générateur de galeries photo «GGalerie»
Ah ben là t'a plus le choix, t'es direct obligé de prendre le bon plis
Il existe un tunnel obscur dans la lumière infinie. Lao-Tseu
https://sputnick.fr
Hors ligne