163 lines
4.2 KiB
Bash
163 lines
4.2 KiB
Bash
|
#!/bin/bash
|
||
|
|
||
|
# Récupération du chemin (passé en argument, sinon le dossier courant)
|
||
|
# et transformatio en chemin web (/ correspondra donc au docroot).
|
||
|
webpath="$(echo "${1:-$PWD}" | sed "s#^$root/##g")"
|
||
|
|
||
|
# Si jamais le path obtenu est celui de la racine, on vide la variable
|
||
|
# (pas très safe en cas de répétition de l'arborescence)
|
||
|
[[ "$webpath" =~ ^$root ]] && unset webpath
|
||
|
|
||
|
# Couleur de logs juste parce que c'est joli
|
||
|
blue=$(tput setaf 4)
|
||
|
green=$(tput setaf 2)
|
||
|
reset=$(tput sgr0)
|
||
|
|
||
|
# Annonce du début du traitement
|
||
|
echo "${blue}Start${reset} /$webpath"
|
||
|
|
||
|
# Déplacement dans le dossier à traiter
|
||
|
cd "${root}/${webpath}"
|
||
|
|
||
|
# Définition des différentes parties de la page
|
||
|
header() {
|
||
|
cat <<DELIM
|
||
|
<!DOCTYPE html>
|
||
|
<html lang=fr>
|
||
|
<head>
|
||
|
<title>Index de ${1}</title>
|
||
|
<meta charset="utf-8"/>
|
||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
|
<link rel="stylesheet" type="text/css" href="/.assets/style.css">
|
||
|
</head>
|
||
|
<body>
|
||
|
<h2>Index de ${2}</h2>
|
||
|
<table id="maintable">
|
||
|
<tr>
|
||
|
<th onclick="sortTable(0)">Nom</th>
|
||
|
<th onclick="sortTable(1)">Taille</th>
|
||
|
<th onclick="sortTable(2)">Dernière modification</th>
|
||
|
<th onclick="sortTable(3)">Type / Aperçu</th>
|
||
|
</tr>
|
||
|
DELIM
|
||
|
}
|
||
|
|
||
|
row() {
|
||
|
cat <<DELIM
|
||
|
<tr>
|
||
|
<td><a href="${1}">${1}</a></td>
|
||
|
<td class="right-align" data-kbytes="${2}">${3}</td>
|
||
|
<td class="right-align">${4}</td>
|
||
|
<td>${5}</td>
|
||
|
</tr>
|
||
|
DELIM
|
||
|
}
|
||
|
|
||
|
footer() {
|
||
|
cat <<DELIM
|
||
|
</table>
|
||
|
<script src="/.assets/sort.js"></script>
|
||
|
</body>
|
||
|
</html>
|
||
|
DELIM
|
||
|
}
|
||
|
|
||
|
# Génération du header
|
||
|
# Le navpath est le chemin indiqué en haut de la page, qui permet de remonter
|
||
|
# dans l'arborescence
|
||
|
navpath="<a href=\"/\">files.breizh.pm</a>/"
|
||
|
tmp="/"
|
||
|
|
||
|
oldIFS=$IFS
|
||
|
IFS=/
|
||
|
|
||
|
for folder in $webpath
|
||
|
do
|
||
|
tmp+="$folder/"
|
||
|
navpath+="<a href=\"$tmp\">$folder</a>/"
|
||
|
done
|
||
|
|
||
|
IFS=$oldIFS
|
||
|
|
||
|
# Insertion du header dans le fichier
|
||
|
header "$webpath" "$navpath" > index.html
|
||
|
|
||
|
# Génération du tableau
|
||
|
|
||
|
preload=metadata # type de préchargement des fichiers audio
|
||
|
mkdir -p "$cache" # création du dossier de cache
|
||
|
|
||
|
# Pour chaque fichier ou dossier
|
||
|
for i in *
|
||
|
do
|
||
|
# Initialisation
|
||
|
unset lastmodif kbytes size thumbname mimetype
|
||
|
|
||
|
# Exclusion(s), relative(s) ou absolue(s)
|
||
|
if [[ "$i" == "index.html" ]] \
|
||
|
|| [[ "$(realpath "$i")" =~ ^$root/p ]] \
|
||
|
|| [[ "$(realpath "$i")" =~ ^$root/robots.txt ]]
|
||
|
then
|
||
|
continue
|
||
|
fi
|
||
|
|
||
|
# Date de dernière modif
|
||
|
lastmodif="$(stat -c "%y" "$i" | cut -d':' -f-2)"
|
||
|
|
||
|
# Taille des fichier (ignoré pour les répertoires)
|
||
|
if [[ -d "$i" ]]
|
||
|
then
|
||
|
kbytes=0
|
||
|
size="-"
|
||
|
else
|
||
|
kbytes="$(du "$i" | cut -f1)"
|
||
|
size="$(du -h "$i" | cut -f1)"
|
||
|
fi
|
||
|
|
||
|
# Hardcodage de types MIME mal détectés
|
||
|
[[ "$i" =~ .mp3$ ]] && mimetype="audio/mpeg"
|
||
|
|
||
|
# Détection automatique du type MIME si non hardcodé
|
||
|
[[ -z "$mimetype" ]] && mimetype="$(file --mime-type -b -e ascii -e compress -e tar -e cdf "$i")"
|
||
|
|
||
|
# Traitements spécifiques selon le type
|
||
|
case $mimetype in
|
||
|
audio/*)
|
||
|
# Pour l'audio, ajout d'un lecteur
|
||
|
type="<audio controls preload=\"$preload\"><source src=\"$i\" type=\"$mimetype\">$mimetype</audio>";;
|
||
|
image/*)
|
||
|
# Pour les images, une miniature de 60px de haut est créée
|
||
|
thumbname="$(md5sum <<<$(readlink -f "$i") | cut -d' ' -f1)-${i// /_}" # Nom sur base d'un hash pour éviter les conflits
|
||
|
|
||
|
# Si la miniature n'est pas déjà présente et que l'image est assez petite (et que c'est pas un GIF)
|
||
|
if [[ ! -f "${cache}/${thumbname}" ]] && [[ ${kbytes} -le 20480 ]] && [[ ! "$i" =~ .gif$ ]]
|
||
|
then
|
||
|
# Création de la miniature
|
||
|
convert "${i}" -strip -thumbnail 'x60>' "${cache}/${thumbname}"
|
||
|
fi
|
||
|
|
||
|
# Si une miniature est présente, on l'affiche
|
||
|
if [[ -f "${cache}/${thumbname}" ]]
|
||
|
then
|
||
|
type="<img src=\"/.thumbnails/${thumbname}\" alt=\"$mimetype\" />"
|
||
|
# Sinon on affiche uniquement le type
|
||
|
else
|
||
|
type="$mimetype"
|
||
|
fi
|
||
|
;;
|
||
|
*)
|
||
|
# Pour les autres fichiers, le type est affiché
|
||
|
type="$mimetype";;
|
||
|
esac
|
||
|
|
||
|
# Insertion de la ligne du tableau correspondant au fichier en cours de traitement
|
||
|
row "$i" "$kbytes" "$size" "$lastmodif" "$type" >> index.html
|
||
|
done
|
||
|
|
||
|
# Insertion du pied de page, pour terminer la page
|
||
|
footer >> index.html
|
||
|
|
||
|
# Annonce de la fin du traitement
|
||
|
echo "${green}Done${reset} /$webpath"
|
||
|
|