Compare commits
13 Commits
8cae67dde9
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 2629dd832c | |||
| 2ceb4be24f | |||
| 615e9595cf | |||
| 8bdbfd8b93 | |||
| ab81c71b7d | |||
| 8315bddba6 | |||
| 278e40439d | |||
| 0629b4a616 | |||
| 516df5809c | |||
| eb8bf3ed38 | |||
| 34e7b33357 | |||
| 7f7c74c288 | |||
| 83e524aee3 |
@@ -1,9 +1,15 @@
|
||||
ytdll
|
||||
updateall.sh
|
||||
update_bullseye2buster.sh
|
||||
check_sha256.sh
|
||||
generate_playlist.sh
|
||||
generate_playlist_fp.php
|
||||
check_smart.sh
|
||||
convertMKV.sh
|
||||
castopod_update.sh
|
||||
mkv_extract.sh
|
||||
podcast_convertImage.sh
|
||||
random_music_player.sh
|
||||
play_tophaire.sh
|
||||
generate_playlist.sh
|
||||
convertPDF.sh
|
||||
check_domain_cert.sh
|
||||
convertMKV.sh
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
castopod_update.1.md
|
||||
convertPDF.1.md
|
||||
play_tophoraire.1.md
|
||||
convertPDF.1.md
|
||||
castopod_update.1.md
|
||||
random_music_player.1.md
|
||||
playlist_gen.1.md
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
playlist_gen.1
|
||||
random_music_player.1
|
||||
play_tophoraire.1
|
||||
convertPDF.1
|
||||
castopod_update.1
|
||||
convertPDF.1
|
||||
play_tophoraire.1
|
||||
|
||||
3
.config/files_local-share-ytdll
Normal file
3
.config/files_local-share-ytdll
Normal file
@@ -0,0 +1,3 @@
|
||||
definitionsTables.json
|
||||
lib
|
||||
config.json
|
||||
4
.config/files_local-share-ytdll-lib
Normal file
4
.config/files_local-share-ytdll-lib
Normal file
@@ -0,0 +1,4 @@
|
||||
UpdateManager.php
|
||||
Config.php
|
||||
TableManager.php
|
||||
Database.php
|
||||
@@ -8,7 +8,10 @@ Le script modifie également le chemin d'accès (PATH) de l'utilisateur ainsi qu
|
||||
Pour utiliser ces scripts, suivez ces étapes :
|
||||
|
||||
1. Clonez ce dépôt Git.
|
||||
`git clone https://git.abonnel.fr/cedricAbonnel/scripts-bash.git`
|
||||
|
||||
2. Exécutez le script en utilisant la commande `./install.sh`.
|
||||
Le script copiera les fichiers du programme, les pages d'aide et les paramètres dans votre dossier personnel. Il est possible qu'un compte `sudo `soit requis pour l'installation de binaires externes.
|
||||
|
||||
Toutes les opérations et les messages d'erreur sont enregistrés dans un fichier journal (`~/log/a5l-scripts_bash-<date et heure de l'instant>-<PID>.log`) situé dans le répertoire personnel de l'utilisateur. Le journal inclut la date, l'heure et les détails de chaque opération.
|
||||
|
||||
|
||||
62
install.sh
62
install.sh
@@ -5,6 +5,9 @@
|
||||
|
||||
# Description : Script d'installation des exécutables dans le répertoire '~/.local'"
|
||||
|
||||
# Version 07.07.24
|
||||
# - Ajout du traitement de share/ytdll et share/ytdll/lib
|
||||
|
||||
# Version 23.12.1.3
|
||||
# - Amélioration des logs
|
||||
# - process_deployment_files optmisie les opérations de déployement
|
||||
@@ -85,15 +88,25 @@ process_deployment_files() {
|
||||
# Récupérer des fichiers installés
|
||||
fileslist_local=$(cat "$file_desc")
|
||||
|
||||
# Utilisez la commande rsync pour copier les fichiers
|
||||
# Copie des fichiers listés dans $file_desc
|
||||
log "Copie des fichiers listés dans $file_desc."
|
||||
|
||||
# Copier les fichiers en supprimant les extensions
|
||||
for file in $fileslist_local; do
|
||||
cp -v "$source/$file" "$destination/" 2>&1 | while read -r line; do
|
||||
# debut Supprimer l'extension du nom de fichier si c'est un Bash Script
|
||||
file_type=$(file -b "$source/$file")
|
||||
if [[ "$file_type" == *"Bourne-Again shell script"* ]]; then
|
||||
log "$file est un fichier Bash."
|
||||
file_dest="${file%.*}"
|
||||
log "Nom de fichier sans extension : $file_dest"
|
||||
else
|
||||
file_dest="${file}"
|
||||
fi
|
||||
# fin
|
||||
cp -v "$source/$file" "$destination/$file_dest" 2>&1 | while read -r line; do
|
||||
log "- $line"
|
||||
done
|
||||
add_uninstall "$destination/$file"
|
||||
add_uninstall "$destination/$file_dest"
|
||||
done
|
||||
else
|
||||
error "Le fichier '$file_desc' n'existe pas. Votre dépôt Git local n'est pas complet ou quelque chose s'est mal passé."
|
||||
@@ -121,6 +134,45 @@ purge_old_logs
|
||||
|
||||
|
||||
|
||||
#### .local/share/ytdll ####
|
||||
|
||||
## Declarations ##
|
||||
|
||||
# Spécifier le chemin du répertoire destination
|
||||
destination_dir="$HOME/.local/share/ytdll"
|
||||
|
||||
# Spécifier le chemin du répertoire du dépôt Git local
|
||||
source_dir="local/share/ytdll"
|
||||
|
||||
file_local_desc=.config/files_local-share-ytdll
|
||||
|
||||
## Traitement ##
|
||||
log "## Debut du traitement pour $destination_dir"
|
||||
|
||||
process_deployment_files "$destination_dir" "$source_dir" "$file_local_desc"
|
||||
|
||||
|
||||
|
||||
#### .local/share/ytdll/lib ####
|
||||
|
||||
## Declarations ##
|
||||
|
||||
# Spécifier le chemin du répertoire destination
|
||||
destination_dir="$HOME/.local/share/ytdll/lib"
|
||||
|
||||
# Spécifier le chemin du répertoire du dépôt Git local
|
||||
source_dir="local/share/ytdll/lib"
|
||||
|
||||
file_local_desc=.config/files_local-share-ytdll-lib
|
||||
|
||||
## Traitement ##
|
||||
log "## Debut du traitement pour $destination_dir"
|
||||
|
||||
process_deployment_files "$destination_dir" "$source_dir" "$file_local_desc"
|
||||
|
||||
|
||||
|
||||
|
||||
#### .local/share/doc ####
|
||||
|
||||
## Declarations ##
|
||||
@@ -145,7 +197,7 @@ process_deployment_files "$destination_dir" "$source_dir" "$file_local_desc"
|
||||
|
||||
## Declarations ##
|
||||
|
||||
# Spécifier le chemin du répertoire ~/.local/bin
|
||||
# Spécifier le chemin du répertoire
|
||||
destination_dir="$HOME/.local/share/man"
|
||||
|
||||
# Spécifier le chemin du répertoire du dépôt Git local
|
||||
@@ -173,7 +225,7 @@ process_deployment_files "$destination_dir" "$source_dir" "$file_local_desc"
|
||||
|
||||
## Declarations ##
|
||||
|
||||
# Spécifier le chemin du répertoire ~/.local/bin
|
||||
# Spécifier le chemin du répertoire
|
||||
destination_dir="$HOME/.local/bin"
|
||||
|
||||
# Spécifier le chemin du répertoire du dépôt Git local
|
||||
|
||||
28
local/bin/check_sha256.sh
Executable file
28
local/bin/check_sha256.sh
Executable file
@@ -0,0 +1,28 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Vérifie si le bon nombre d'arguments est fourni
|
||||
if [ "$#" -ne 2 ]; then
|
||||
echo "Usage: $0 <expected_hash> <file_path>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
expected_hash=$1
|
||||
file_path=$2
|
||||
|
||||
# Vérifie si le fichier existe
|
||||
if [ ! -f "$file_path" ]; then
|
||||
echo "Error: File $file_path does not exist."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Calculer le hash SHA-256 du fichier et le comparer avec le hash attendu
|
||||
echo "$expected_hash $file_path" | sha256sum -c - > /dev/null 2>&1
|
||||
|
||||
# Vérifier le code de sortie de sha256sum
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "Hash match: OK"
|
||||
exit 0
|
||||
else
|
||||
echo "Hash match: FAILED"
|
||||
exit 1
|
||||
fi
|
||||
99
local/bin/check_smart.sh
Executable file
99
local/bin/check_smart.sh
Executable file
@@ -0,0 +1,99 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Fonction de hachage SHA-256
|
||||
hash_serial() {
|
||||
echo -n "$1" | sha256sum | awk '{print $1}'
|
||||
}
|
||||
|
||||
# Fonction pour exécuter le script avec sudo
|
||||
run_with_sudo() {
|
||||
sudo "$0" "$@"
|
||||
exit $?
|
||||
}
|
||||
|
||||
# Envoi des infos
|
||||
send_tracker() {
|
||||
# Envoyer les données au site checksmart.abonnel.fr via HTTP POST avec la date et l'heure
|
||||
status_disk=$1
|
||||
date_time=$(date "+%Y-%m-%d %H:%M:%S")
|
||||
echo "Envoi des données sur smartctl.abonnel.fr"
|
||||
curl -d "serial_number=$hashed_serial&data=$status_disk&date_time=$date_time" https://checksmart.abonnel.fr/api/submit
|
||||
echo -e "\n"
|
||||
}
|
||||
|
||||
# Vérifier si l'utilisateur a les privilèges sudo
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
echo "Ce script nécessite des privilèges sudo. Tentative de relance avec sudo..."
|
||||
run_with_sudo "$@"
|
||||
fi
|
||||
|
||||
|
||||
# Vérifier si smartctl est installé
|
||||
if ! command -v smartctl &> /dev/null; then
|
||||
echo "Le programme smartctl n'est pas installé sur ce système."
|
||||
|
||||
# Vérifier quel gestionnaire de paquets est utilisé
|
||||
if command -v apt &> /dev/null; then
|
||||
read -p "Voulez-vous installer smartmontools avec apt ? (O/N) " choice
|
||||
if [[ "$choice" =~ ^[oO] ]]; then
|
||||
apt install smartmontools
|
||||
else
|
||||
echo "Installation annulée."
|
||||
exit 1
|
||||
fi
|
||||
elif command -v yum &> /dev/null; then
|
||||
read -p "Voulez-vous installer smartmontools avec yum ? (O/N) " choice
|
||||
if [[ "$choice" =~ ^[oO] ]]; then
|
||||
yum install smartmontools
|
||||
else
|
||||
echo "Installation annulée."
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "Gestionnaire de paquets non pris en charge. Veuillez installer smartmontools manuellement."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
# Numéro de série du disque
|
||||
serial_number=$(smartctl -i /dev/sda | grep "Serial Number" | awk '{print $3}')
|
||||
hashed_serial=$(hash_serial "$serial_number")
|
||||
|
||||
# Récupérer la liste des disques
|
||||
disks=$(lsblk -o NAME -n -d)
|
||||
|
||||
|
||||
# Parcourir tous les disques et vérifier l'état SMART
|
||||
for disk in $disks; do
|
||||
# Date et heure actuelles
|
||||
|
||||
echo "----------------------------------------------"
|
||||
# Utiliser smartctl pour vérifier si le disque prend en charge SMART
|
||||
if smartctl -i /dev/$disk > /dev/null 2>&1; then
|
||||
echo "Vérification de l'état SMART pour le disque $disk :"
|
||||
output=$(smartctl -H /dev/$disk)
|
||||
if [[ "$output" =~ "PASSED" ]]; then
|
||||
status="OK"
|
||||
else
|
||||
status="En panne"
|
||||
fi
|
||||
echo "État : $status"
|
||||
|
||||
#echo "Lancement d'un scan pour la prochaine passe."
|
||||
#smartctl -t long "/dev/$disk"
|
||||
|
||||
status_disk=$(smartctl -a /dev/$disk)
|
||||
send_tracker "$status_disk"
|
||||
|
||||
else
|
||||
echo "Le périphérique $disk ne prend pas en charge SMART et est exclu de la vérification."
|
||||
echo "----------------------------------------------"
|
||||
fi
|
||||
done
|
||||
|
||||
# URL de consultation des informations
|
||||
url="https://checksmart.abonnel.fr/?hs=$hashed_serial"
|
||||
|
||||
# Afficher un message pour indiquer que les données sont consultables
|
||||
echo "Consultez les informations à l'adresse : $url"
|
||||
@@ -113,7 +113,7 @@ echo -e "==> Traitement des vidéos en cours...\n"|tee -a $logFile
|
||||
# Replace the file type
|
||||
out_file=$(echo "$in_file"|sed "s/\(.*\.\)$input_file_type/\1$output_file_type/g")
|
||||
|
||||
echo -e "\n [NFO] Output $out_file\n"|tee -a $logFile
|
||||
echo -e "\n [NFO] Output \"$out_file\"\n"|tee -a $logFile
|
||||
|
||||
if [ "$in_file" != "$out_file" ]; then
|
||||
|
||||
@@ -220,7 +220,8 @@ echo -e "==> Traitement des vidéos en cours...\n"|tee -a $logFile
|
||||
# cmd_exec="${cmd_exec} -map 0:v -map 0:a? -map 0:s?"
|
||||
cmd_exec="${cmd_exec} -map 0"
|
||||
# cmd_exec="${cmd_exec} -c:a libvorbis -qscale:a 4"
|
||||
cmd_exec="${cmd_exec} -c:a aac -b:a 128k -ac 2 -af loudnorm=I=-18:TP=-1:LRA=11:print_format=summary"
|
||||
# cmd_exec="${cmd_exec} -c:a aac -b:a 128k -ac 2 -af loudnorm=I=-18:TP=-1:LRA=11:print_format=summary"
|
||||
cmd_exec="${cmd_exec} -c:a eac3 -b:a 256k -ac 2 -af loudnorm=I=-18:TP=-1:LRA=11:print_format=summary"
|
||||
cmd_exec="${cmd_exec} -c:v libx264"
|
||||
cmd_exec="${cmd_exec} -filter:v \"${vf_option}\""
|
||||
cmd_exec="${cmd_exec} ${color_params}"
|
||||
@@ -229,8 +230,9 @@ echo -e "==> Traitement des vidéos en cours...\n"|tee -a $logFile
|
||||
cmd_exec="${cmd_exec} -preset slower"
|
||||
cmd_exec="${cmd_exec} -bf 5"
|
||||
cmd_exec="${cmd_exec} -crf ${param2} -b:v $bitrate -pix_fmt yuv420p -maxrate $maxrate -bufsize $bufsize"
|
||||
# cmd_exec="${cmd_exec} -crf 23 -maxrate 3000k -bufsize 6000k -b:v 3000k -pix_fmt yuv420p"
|
||||
cmd_exec="${cmd_exec} -profile:v high -level 4.2"
|
||||
# cmd_exec="${cmd_exec} -crf 23 -maxrate 4500k -bufsize 6000k -b:v 3000k -pix_fmt yuv420p"
|
||||
# cmd_exec="${cmd_exec} -profile:v high -level 4.2"
|
||||
cmd_exec="${cmd_exec} -profile:v main -level 4.1 -tune film"
|
||||
cmd_exec="${cmd_exec} -movflags +faststart"
|
||||
cmd_exec="${cmd_exec} -tune fastdecode+zerolatency"
|
||||
cmd_exec="${cmd_exec} -max_muxing_queue_size 1024 -ss 00:00:00 -t $duration"
|
||||
@@ -238,13 +240,16 @@ echo -e "==> Traitement des vidéos en cours...\n"|tee -a $logFile
|
||||
cmd_exec="${cmd_exec} \"${out_file}\""
|
||||
|
||||
|
||||
echo "touch \"${out_file}.process\"">> ${listFileName}
|
||||
echo ${cmd_exec}>> ${listFileName}
|
||||
echo "rm \"${out_file}.process\"">> ${listFileName}
|
||||
echo "touch \"${out_file}.processed\"">> ${listFileName}
|
||||
|
||||
echo -e "\n ==> On indique le fichier traité et le résultat dans un log"|tee -a $logFile
|
||||
cmd_exec="echo -e \"\\\"${in_file}\\\" > \\\"${out_file}\\\"\">> ~/rsbConvert.log"
|
||||
echo ${cmd_exec}>> ${listFileName}
|
||||
|
||||
echo -e "\n ==> Finished $out_file"|tee -a $logFile
|
||||
echo -e "\n ==> Finished \"$out_file\""|tee -a $logFile
|
||||
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -7,17 +7,32 @@ date_format=$(date +"%Y%m%d_%H%M%S")
|
||||
|
||||
# Fonction pour afficher l'utilisation du script
|
||||
usage() {
|
||||
echo "Utilisation : $0 [-n <nombre de fichiers>] [-d <répertoire>] [-o <fichier de sortie>]"
|
||||
echo "Utilisation : $0 [-EU] [-n <nombre de fichiers>] [-d <répertoire>] [-o <fichier de sortie>]"
|
||||
echo "Options :"
|
||||
echo " -n <nombre de fichiers> : Nombre de fichiers à inclure dans le M3U"
|
||||
echo " -d <répertoire> : Répertoire à scanner (y compris les sous-répertoires)"
|
||||
echo " -o <fichier de sortie> : Nom du fichier M3U de sortie"
|
||||
echo " -E : Recherche des doublons basée sur l'empreinte auditive"
|
||||
echo " -U : Mise à jour de la base de données"
|
||||
exit 1
|
||||
}
|
||||
|
||||
|
||||
# Temps de début d'exécution
|
||||
start_time=$(date +%s)
|
||||
|
||||
# search_type
|
||||
search_type="S" # standard
|
||||
|
||||
# Analyse des options de ligne de commande
|
||||
while getopts "n:d:o:" opt; do
|
||||
while getopts "n:d:o:EU" opt; do
|
||||
case $opt in
|
||||
E)
|
||||
search_type="E" # empreintes identiques
|
||||
;;
|
||||
U)
|
||||
search_type="U" # mise à jour de la base
|
||||
;;
|
||||
n)
|
||||
num_files=$OPTARG
|
||||
;;
|
||||
@@ -34,6 +49,14 @@ while getopts "n:d:o:" opt; do
|
||||
esac
|
||||
done
|
||||
|
||||
|
||||
# Définition du dossier des paramètres
|
||||
CONFIG_DIR=${HOME}/.config/cedrix/generate_playlist
|
||||
if [ ! -d "$CONFIG_DIR" ]; then
|
||||
mkdir -p ${CONFIG_DIR}
|
||||
fi
|
||||
|
||||
|
||||
# Vérifier si le fichier user-dirs.dirs existe
|
||||
if [[ -f ~/.config/user-dirs.dirs ]]; then
|
||||
# Charger les variables depuis le fichier user-dirs.dirs
|
||||
@@ -43,14 +66,14 @@ if [[ -f ~/.config/user-dirs.dirs ]]; then
|
||||
if [[ -v XDG_MUSIC_DIR ]]; then
|
||||
# Le répertoire XDG_MUSIC_DIR existe
|
||||
mkdir -p "$XDG_MUSIC_DIR/playlists"
|
||||
output_file="$XDG_MUSIC_DIR/playlists/playlist_${date_format}_${num_files}.m3u"
|
||||
output_file="$XDG_MUSIC_DIR/playlists/playlist_${date_format}.m3u"
|
||||
else
|
||||
# La variable XDG_MUSIC_DIR n'est pas définie
|
||||
output_file="$HOME/playlist_${date_format}_${num_files}.m3u"
|
||||
output_file="$HOME/playlist_${date_format}.m3u"
|
||||
fi
|
||||
else
|
||||
# Le fichier user-dirs.dirs n'existe pas
|
||||
output_file="$HOME/playlist_${date_format}_${num_files}.m3u"
|
||||
output_file="$HOME/playlist_${date_format}.m3u"
|
||||
fi
|
||||
|
||||
|
||||
@@ -60,9 +83,14 @@ if [ ! -d "$directory" ]; then
|
||||
usage
|
||||
fi
|
||||
|
||||
# Création d'un fichier temporaire pour stocker la liste des fichiers audio avec leur date de création
|
||||
# Création d'un fichier temporaire pour stocker la liste des fichiers audio
|
||||
temp_file=$(mktemp)
|
||||
echo "Recherche en cours des fichiers audios dans \"$directory\""
|
||||
|
||||
count=0
|
||||
|
||||
# Si l'option -E est spécifiée, rechercher les doublons basés sur l'empreinte auditive
|
||||
if [ "$search_type" == "S" ]; then
|
||||
echo "Recherche en cours des $num_files derniers fichiers audios dans \"$directory\""
|
||||
find "$directory" -type f \( -name "*.mp3" -o -name "*.opus" -o -name "*.ogg" -o -name "*.m4a" \) -exec stat --format="%Z %n" {} + > "$temp_file"
|
||||
|
||||
echo "Nombre de fichiers audios trouvé dans $directory : "$(wc -l "$temp_file")
|
||||
@@ -71,7 +99,118 @@ echo "Nombre de fichiers audios trouvé dans $directory : "$(wc -l "$temp_file")
|
||||
sort -n -r -o "$temp_file" "$temp_file"
|
||||
head -n "$num_files" "$temp_file" | awk '{print $2}' > "$output_file"
|
||||
|
||||
# Suppression du fichier temporaire
|
||||
rm "$temp_file"
|
||||
elif [ "$search_type" == "E" ]; then
|
||||
# Code pour rechercher les doublons basés sur l'empreinte auditive
|
||||
echo "Option -E spécifiée : Recherche des doublons basés sur l'empreinte auditive. Veuillez patienter ..."
|
||||
|
||||
echo "Le fichier M3U a été créé avec les $num_files fichiers audio les plus récents dans le répertoire $directory : $output_file"
|
||||
# Chemin de la base de données SQLite
|
||||
db_file=${CONFIG_DIR}/database.sqlite
|
||||
|
||||
# Requête SQL pour récupérer les fichiers avec des empreintes identiques
|
||||
query="SELECT acoustid, GROUP_CONCAT(file_id) AS file_ids, COUNT(*) AS count
|
||||
FROM metadata
|
||||
GROUP BY acoustid
|
||||
HAVING count > 1;"
|
||||
|
||||
# Exécuter la requête SQL et afficher les résultats
|
||||
sqlite3 "$db_file" "$query"| while IFS='|' read -r acoustid file_ids count; do
|
||||
echo "Empreinte digitale ID : $acoustid"
|
||||
echo "Fichiers associés : $file_ids"
|
||||
echo "Nombre de fichiers : $count"
|
||||
echo "-------------------------"
|
||||
done
|
||||
|
||||
exit
|
||||
|
||||
elif [ "$search_type" == "U" ]; then
|
||||
# Code pour rechercher les doublons basés sur l'empreinte auditive
|
||||
echo "Mise à jour de la base de données. Le traitement peut être un peu long. Veuillez patienter ..."
|
||||
|
||||
# Vérifier si fpcalc est installé et l'installer si nécessaire
|
||||
if ! command -v fpcalc &>/dev/null; then
|
||||
echo "Téléchargement de fpcalc..."
|
||||
mkdir -p "$HOME/.local/bin"
|
||||
wget -O /tmp/chromaprint.tar.gz https://github.com/acoustid/chromaprint/releases/download/v1.5.1/chromaprint-fpcalc-1.5.1-linux-x86_64.tar.gz
|
||||
tar -xzf /tmp/chromaprint.tar.gz -C "$HOME/.local/bin" --strip-components=1
|
||||
rm /tmp/chromaprint.tar.gz
|
||||
chmod +x "$HOME/.local/bin/fpcalc"
|
||||
echo "fpcalc installé avec succès."
|
||||
fi
|
||||
|
||||
|
||||
# Vérifier si PHP est installé
|
||||
if ! command -v php &>/dev/null; then
|
||||
echo "PHP n'est pas installé. Installation en cours..."
|
||||
if command -v dnf &>/dev/null; then
|
||||
sudo dnf install -y php
|
||||
elif command -v apt &>/dev/null; then
|
||||
sudo apt install -y php
|
||||
elif command -v yum &>/dev/null; then
|
||||
sudo yum install -y php
|
||||
else
|
||||
echo "Système de gestion de paquets non pris en charge."
|
||||
exit 1
|
||||
fi
|
||||
echo "PHP installé avec succès."
|
||||
fi
|
||||
|
||||
# Vérifier si SQLite pour PHP est installé
|
||||
if ! php -m | grep -q "sqlite3"; then
|
||||
echo "SQLite pour PHP n'est pas installé. Installation en cours..."
|
||||
if command -v dnf &>/dev/null; then
|
||||
sudo dnf install -y php-sqlite3
|
||||
elif command -v apt &>/dev/null; then
|
||||
sudo apt install -y php-sqlite3
|
||||
elif command -v yum &>/dev/null; then
|
||||
sudo yum install -y php-sqlite3
|
||||
else
|
||||
echo "Système de gestion de paquets non pris en charge."
|
||||
exit 1
|
||||
fi
|
||||
echo "SQLite pour PHP installé avec succès."
|
||||
fi
|
||||
|
||||
# Chemin de la base de données SQLite
|
||||
db_file=${CONFIG_DIR}/database.sqlite
|
||||
|
||||
# Chemin complet du script PHP
|
||||
php_script="$(dirname "$0")/generate_playlist_fp.php"
|
||||
|
||||
# Appeler le script PHP avec les paramètres appropriés
|
||||
php "$php_script" "$directory" "$db_file"
|
||||
|
||||
|
||||
fi
|
||||
|
||||
echo -e " and more...\n"
|
||||
|
||||
# Suppression du fichier temporaire
|
||||
rm -v "$temp_file"
|
||||
|
||||
|
||||
|
||||
# ajout du nombre de fichiers de la playlist dans le nom du fichier
|
||||
num_files_real=$(wc -l $output_file)
|
||||
|
||||
# Extraire le nom de fichier sans l'extension
|
||||
filename_without_extension="${output_file%.*}"
|
||||
|
||||
# Extraire l'extension du fichier
|
||||
extension="${original_file##*.}"
|
||||
|
||||
# Construire le nouveau nom de fichier avec num_files_real ajouté avant l'extension
|
||||
output_new_file="${filename_without_extension}_${num_files_real}.${extension}"
|
||||
|
||||
mv -v "${output_file}" "${output_new_file}"
|
||||
|
||||
|
||||
echo "Le fichier M3U a été créé avec les $num_files_real fichiers audio les plus récents dans le répertoire $directory : $output_file"
|
||||
|
||||
|
||||
# Temps de fin d'exécution
|
||||
end_time=$(date +%s)
|
||||
|
||||
# Calcul du temps écoulé
|
||||
execution_time=$((end_time - start_time))
|
||||
|
||||
echo "Temps d'exécution: $execution_time secondes"
|
||||
|
||||
217
local/bin/generate_playlist_fp.php
Normal file
217
local/bin/generate_playlist_fp.php
Normal file
@@ -0,0 +1,217 @@
|
||||
<?php
|
||||
|
||||
// Fonction pour calculer le fingerprint d'un fichier audio
|
||||
function calculate_fingerprint($file) {
|
||||
$return_code = 0;
|
||||
|
||||
$file_bash = str_replace(['$'], ['\$'], $file);
|
||||
|
||||
exec("fpcalc -json \"$file_bash\" 2>&1", $output, $return_code);
|
||||
// Vérifier s'il y a eu une erreur lors de l'exécution de la commande
|
||||
if ($return_code !== 0) {
|
||||
// Enregistrer l'erreur dans un fichier journal par exemple
|
||||
error_log("Erreur lors du calcul du fingerprint pour le fichier \"$file_bash\" : " . implode("\n", $output));
|
||||
return null; // Retourner null pour indiquer une erreur
|
||||
}
|
||||
|
||||
// Traitement de la réponse
|
||||
$result = json_decode(implode('', $output), true);
|
||||
|
||||
// Vérifier si le résultat est valide
|
||||
if (isset($result['fingerprint'])) {
|
||||
return $result['fingerprint']; // Retourner le fingerprint
|
||||
} else {
|
||||
// Enregistrer un message d'erreur dans le journal
|
||||
error_log("Réponse invalide lors du calcul du fingerprint pour le fichier $file : " . implode("\n", $output));
|
||||
return null; // Retourner null en cas de réponse invalide
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function getTagValue($metadataInFile, $tagKey) {
|
||||
// Vérifier si la clé existe dans le tableau et retourner sa valeur si c'est le cas
|
||||
if (isset($metadataInFile['streams'][0]['tags'][$tagKey])) {
|
||||
return $metadataInFile['streams'][0]['tags'][$tagKey];
|
||||
} else {
|
||||
// Retourner null si la clé n'existe pas
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Fonction pour extraire les métadonnées d'un fichier audio
|
||||
function extract_metadata($file) {
|
||||
|
||||
# Extraire les métadonnées avec ffprobe
|
||||
$ffprobe_output = shell_exec("ffprobe -hide_banner -loglevel fatal -show_error -show_format -show_streams -print_format json \"$file\"");
|
||||
|
||||
// Décoder la sortie JSON
|
||||
$metadataInFile = json_decode($ffprobe_output, true);
|
||||
|
||||
// Vérifier si les métadonnées contiennent les tags
|
||||
if (isset($metadataInFile['streams'][0]['tags'])) {
|
||||
|
||||
|
||||
// Extraire les metadonnées
|
||||
$metadata['ARTIST'] = getTagValue($metadataInFile, 'ARTIST');
|
||||
$metadata['TITLE'] = getTagValue($metadataInFile, 'TITLE');
|
||||
$metadata['ALBUM'] = getTagValue($metadataInFile, 'ALBUM');
|
||||
$metadata['ACOUSTID'] = getTagValue($metadataInFile, 'ACOUSTID_ID');
|
||||
$metadata['duration'] = isset($metadataInFile['format']['duration']) ? (float)$metadataInFile['format']['duration'] : null;
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (isset($metadata)) {
|
||||
return $metadata;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
// Vérifier si le nombre de paramètres est correct
|
||||
if ($argc != 3) {
|
||||
die("Usage: php scan_files.php <directory> <database>\n");
|
||||
}
|
||||
|
||||
$directory = $argv[1];
|
||||
$db_file = $argv[2];
|
||||
|
||||
// Vérifier si le dossier existe
|
||||
if (!is_dir($directory)) {
|
||||
die("Le dossier spécifié n'existe pas.\n");
|
||||
}
|
||||
|
||||
// Vérifier si la base de données existe, sinon la créer
|
||||
if (!file_exists($db_file)) {
|
||||
echo "La base de données n'existe pas. Création en cours...\n";
|
||||
$db = new PDO("sqlite:$db_file");
|
||||
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||
|
||||
// Créer les tables
|
||||
$db->exec("CREATE TABLE IF NOT EXISTS files (
|
||||
id INTEGER PRIMARY KEY,
|
||||
file_path TEXT UNIQUE,
|
||||
first_referenced DATETIME,
|
||||
last_updated DATETIME
|
||||
)");
|
||||
$db->exec("CREATE TABLE IF NOT EXISTS fingerprints (
|
||||
id INTEGER PRIMARY KEY,
|
||||
file_id INTEGER UNIQUE,
|
||||
fingerprint TEXT,
|
||||
FOREIGN KEY (file_id) REFERENCES files(id)
|
||||
)");
|
||||
$db->exec("CREATE TABLE IF NOT EXISTS metadata (
|
||||
file_id INTEGER PRIMARY KEY,
|
||||
artist TEXT,
|
||||
title TEXT,
|
||||
album TEXT,
|
||||
duration REAL,
|
||||
acoustid TEXT,
|
||||
FOREIGN KEY (file_id) REFERENCES files(id)
|
||||
)");
|
||||
|
||||
// Création de la table system_info si elle n'existe pas déjà
|
||||
$db->exec("CREATE TABLE IF NOT EXISTS system_info (
|
||||
id INTEGER PRIMARY KEY,
|
||||
version INTEGER NOT NULL
|
||||
)");
|
||||
|
||||
// Insertion des données de version
|
||||
$version = "1";
|
||||
$insert_version_sql = "INSERT INTO system_info (version) VALUES (:version)";
|
||||
$stmt = $db->prepare($insert_version_sql);
|
||||
$stmt->bindParam(':version', $version, PDO::PARAM_STR);
|
||||
$stmt->execute();
|
||||
|
||||
echo "Base de données créée avec succès.\n";
|
||||
} else {
|
||||
// Connexion à la base de données SQLite
|
||||
$db = new PDO("sqlite:$db_file");
|
||||
}
|
||||
|
||||
// Préparation de la requête d'insertion des fichiers
|
||||
$insert_file_stmt = $db->prepare("INSERT INTO files (file_path, first_referenced, last_updated) VALUES (:file_path, DATETIME('now'), DATETIME('now'))");
|
||||
|
||||
// Préparer la requête SQL d'insertion ou de mise à jour des empreintes digitales
|
||||
$insert_fingerprint_sql = "INSERT INTO fingerprints (file_id, fingerprint)
|
||||
VALUES (:file_id, :fingerprint)
|
||||
ON CONFLICT(file_id) DO UPDATE
|
||||
SET fingerprint = :fingerprint";
|
||||
|
||||
$insert_fingerprint_stmt = $db->prepare($insert_fingerprint_sql);
|
||||
|
||||
// Préparer la requête SQL d'insertion ou de mise à jour des métadonnées
|
||||
$insert_metadata_sql = "INSERT INTO metadata (file_id, artist, title, album, acoustid, duration)
|
||||
VALUES (:file_id, :artist, :title, :album, :acoustid, :duration)
|
||||
ON CONFLICT(file_id) DO UPDATE
|
||||
SET artist = :artist,
|
||||
title = :title,
|
||||
album = :album,
|
||||
acoustid = :acoustid,
|
||||
duration = :duration";
|
||||
|
||||
$insert_metadata_stmt = $db->prepare($insert_metadata_sql);
|
||||
|
||||
$count = 0; // Initialisation du compteur
|
||||
|
||||
// Parcourir les fichiers audio
|
||||
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory));
|
||||
foreach ($iterator as $file) {
|
||||
|
||||
$file_bash = escapeshellarg($file);
|
||||
|
||||
if ($file->isFile() && in_array($file->getExtension(), ['mp3', 'opus', 'ogg', 'm4a'])) {
|
||||
|
||||
if ($count % 10 == 0) {
|
||||
echo "\rProgress: $count files processed\n";
|
||||
}
|
||||
|
||||
$file_path = $file->getPathname();
|
||||
|
||||
// Vérifier si le fichier existe déjà dans la base de données
|
||||
$result = $db->query("SELECT id FROM files WHERE file_path = " . $db->quote($file_path));
|
||||
$file_id = $result->fetchColumn();
|
||||
|
||||
if (!$file_id) {
|
||||
// Insérer le fichier dans la base de données
|
||||
$insert_file_stmt->execute([':file_path' => $file_path]);
|
||||
$file_id = $db->lastInsertId();
|
||||
|
||||
// Calculer le fingerprint du fichier
|
||||
// $fingerprint = calculate_fingerprint($file_path);
|
||||
|
||||
// Insérer le fingerprint dans la base de données
|
||||
// $insert_fingerprint_stmt->execute([':file_id' => $file_id, ':fingerprint' => $fingerprint]);
|
||||
|
||||
} else {
|
||||
// Mettre à jour la date de dernière mise à jour du fichier
|
||||
$db->exec("UPDATE files SET last_updated = DATETIME('now') WHERE id = $file_id");
|
||||
}
|
||||
|
||||
|
||||
// Extraire les métadonnées du fichier audio
|
||||
$metadata = extract_metadata($file_path);
|
||||
|
||||
// Insérer les métadonnées dans la base de données
|
||||
$insert_metadata_stmt->execute([
|
||||
':file_id' => $file_id,
|
||||
':artist' => isset($metadata['ARTIST']) ? $metadata['ARTIST'] : null,
|
||||
':title' => isset($metadata['TITLE']) ? $metadata['TITLE'] : null,
|
||||
':album' => isset($metadata['ALBUM']) ? $metadata['ALBUM'] : null,
|
||||
':acoustid' => isset($metadata['ACOUSTID']) ? $metadata['ACOUSTID'] : null,
|
||||
':duration' => isset($metadata['duration']) ? (int)$metadata['duration'] : null
|
||||
]);
|
||||
|
||||
$count++;
|
||||
}
|
||||
}
|
||||
|
||||
// Fermer la connexion à la base de données
|
||||
$db = null;
|
||||
|
||||
echo "Terminé.\n";
|
||||
|
||||
?>
|
||||
149
local/bin/setup_server_debian.sh
Executable file
149
local/bin/setup_server_debian.sh
Executable file
@@ -0,0 +1,149 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Vérifier si le script est exécuté en root
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
echo "Ce script doit être exécuté en tant que root."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
### Fonction pour mettre à jour le système
|
||||
update_system() {
|
||||
echo "Mise à jour du système..."
|
||||
apt update && apt upgrade -y
|
||||
}
|
||||
|
||||
### Fonction pour installer sudo s'il n'est pas déjà présent
|
||||
install_sudo() {
|
||||
if command -v sudo &>/dev/null; then
|
||||
echo "Sudo est déjà installé."
|
||||
else
|
||||
echo "Installation de sudo..."
|
||||
apt install -y sudo
|
||||
fi
|
||||
}
|
||||
|
||||
### Fonction pour ajouter un utilisateur administrateur
|
||||
add_admin_user() {
|
||||
# Vérifier s'il existe déjà un utilisateur autre que root
|
||||
EXISTING_USER=$(awk -F: '$3 >= 1000 && $3 < 60000 {print $1; exit}' /etc/passwd)
|
||||
|
||||
if [[ -n "$EXISTING_USER" ]]; then
|
||||
echo "Un utilisateur ($EXISTING_USER) existe déjà sur le système."
|
||||
read -p "Voulez-vous ajouter un autre utilisateur administrateur ? (o/N) " ADD_NEW_USER
|
||||
if [[ ! "$ADD_NEW_USER" =~ ^[Oo]$ ]]; then
|
||||
echo "Aucun nouvel utilisateur ajouté."
|
||||
return
|
||||
fi
|
||||
fi
|
||||
|
||||
read -p "Entrez le nom du nouvel utilisateur : " NEW_USER
|
||||
|
||||
# Vérifier si l'utilisateur existe déjà
|
||||
if id "$NEW_USER" &>/dev/null; then
|
||||
echo "L'utilisateur $NEW_USER existe déjà."
|
||||
else
|
||||
adduser "$NEW_USER"
|
||||
echo "Utilisateur $NEW_USER créé."
|
||||
fi
|
||||
|
||||
# Vérifier si l'utilisateur est dans le groupe sudo
|
||||
if groups "$NEW_USER" | grep -q "\bsudo\b"; then
|
||||
echo "$NEW_USER est déjà dans le groupe sudo."
|
||||
else
|
||||
usermod -aG sudo "$NEW_USER"
|
||||
echo "$NEW_USER ajouté au groupe sudo."
|
||||
fi
|
||||
# Vérifier si les permissions sudo sont déjà définies
|
||||
if [ -f "/etc/sudoers.d/$NEW_USER" ]; then
|
||||
echo "Les permissions sudo sont déjà configurées pour $NEW_USER."
|
||||
else
|
||||
echo "$NEW_USER ALL=(ALL) NOPASSWD:ALL" > "/etc/sudoers.d/$NEW_USER"
|
||||
chmod 0440 "/etc/sudoers.d/$NEW_USER"
|
||||
echo "Configuration sudo appliquée pour $NEW_USER."
|
||||
fi
|
||||
|
||||
# Demander si on veut ajouter une clé SSH
|
||||
read -p "Voulez-vous ajouter une clé SSH pour $NEW_USER ? (o/N) " ADD_SSH
|
||||
if [[ "$ADD_SSH" =~ ^[Oo]$ ]]; then
|
||||
SSH_DIR="/home/$NEW_USER/.ssh"
|
||||
AUTH_KEYS="$SSH_DIR/authorized_keys"
|
||||
|
||||
# Créer le dossier .ssh s'il n'existe pas
|
||||
if [ ! -d "$SSH_DIR" ]; then
|
||||
mkdir -p "$SSH_DIR"
|
||||
chown "$NEW_USER:$NEW_USER" "$SSH_DIR"
|
||||
chmod 700 "$SSH_DIR"
|
||||
echo "Dossier .ssh créé pour $NEW_USER."
|
||||
fi
|
||||
|
||||
read -p "Collez la clé publique SSH : " SSH_KEY
|
||||
|
||||
# Vérifier si la clé est déjà présente
|
||||
if grep -qxF "$SSH_KEY" "$AUTH_KEYS" 2>/dev/null; then
|
||||
echo "Cette clé SSH est déjà ajoutée."
|
||||
else
|
||||
echo "$SSH_KEY" >> "$AUTH_KEYS"
|
||||
chown "$NEW_USER:$NEW_USER" "$AUTH_KEYS"
|
||||
chmod 600 "$AUTH_KEYS"
|
||||
echo "Clé SSH ajoutée pour $NEW_USER."
|
||||
fi
|
||||
else
|
||||
echo "Aucune clé SSH ajoutée."
|
||||
fi
|
||||
}
|
||||
|
||||
### Fonction pour configurer SSH de manière sécurisée
|
||||
configure_ssh() {
|
||||
if grep -q "^PermitRootLogin no" /etc/ssh/sshd_config; then
|
||||
echo "La connexion root SSH est déjà désactivée."
|
||||
else
|
||||
echo "Désactivation de la connexion root via SSH..."
|
||||
sed -i 's/^#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
|
||||
sed -i 's/^PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
|
||||
systemctl restart ssh
|
||||
echo "Sécurisation SSH appliquée."
|
||||
fi
|
||||
}
|
||||
|
||||
### Fonction pour installer et configurer Fail2Ban
|
||||
install_fail2ban() {
|
||||
if dpkg -l | grep -q "^ii fail2ban"; then
|
||||
echo "Fail2Ban est déjà installé."
|
||||
else
|
||||
echo "Installation de Fail2Ban..."
|
||||
apt install -y fail2ban
|
||||
fi
|
||||
}
|
||||
|
||||
### Fonction pour configurer les locales en français UTF-8
|
||||
configure_locales() {
|
||||
echo "Configuration des locales en français UTF-8..."
|
||||
apt install -y locales
|
||||
|
||||
# Vérifier si fr_FR.UTF-8 est déjà activé
|
||||
if locale -a | grep -q "fr_FR.utf8"; then
|
||||
echo "Les locales en fr_FR.UTF-8 sont déjà activées."
|
||||
else
|
||||
sed -i 's/# fr_FR.UTF-8 UTF-8/fr_FR.UTF-8 UTF-8/' /etc/locale.gen
|
||||
locale-gen
|
||||
fi
|
||||
|
||||
# Appliquer les variables locales si nécessaire
|
||||
if grep -q "LANG=fr_FR.UTF-8" /etc/default/locale; then
|
||||
echo "Les variables locales sont déjà configurées."
|
||||
else
|
||||
update-locale LANG=fr_FR.UTF-8 LANGUAGE=fr_FR.UTF-8 LC_ALL=fr_FR.UTF-8
|
||||
echo "Variables locales mises à jour."
|
||||
fi
|
||||
}
|
||||
|
||||
### SECTION PRINCIPALE : Activer/Désactiver les options ici
|
||||
update_system
|
||||
install_sudo
|
||||
add_admin_user
|
||||
configure_ssh
|
||||
install_fail2ban
|
||||
configure_locales
|
||||
|
||||
echo "Installation et configuration de base terminées."
|
||||
echo "Vous pouvez maintenant vous connecter avec l'utilisateur : $NEW_USER"
|
||||
77
local/bin/update_bullseye2buster.sh
Normal file
77
local/bin/update_bullseye2buster.sh
Normal file
@@ -0,0 +1,77 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Fonction pour vérifier si une ligne existe déjà dans un fichier
|
||||
line_exists() {
|
||||
grep -Fq "$1" "$2"
|
||||
}
|
||||
|
||||
# Vérifie si le système est sous Buster
|
||||
check_buster() {
|
||||
if grep -Fq "buster" /etc/os-release; then
|
||||
echo "Le système est sous Buster."
|
||||
return 0
|
||||
else
|
||||
echo "Le système n'est pas sous Buster."
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Vérifie si non-free-firmware est configuré
|
||||
check_non_free_firmware() {
|
||||
if grep -Eq "non-free-firmware" /etc/apt/sources.list /etc/apt/sources.list.d/*; then
|
||||
echo "Le dépôt non-free-firmware est déjà configuré."
|
||||
return 0
|
||||
else
|
||||
echo "Le dépôt non-free-firmware n'est pas configuré."
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Met à jour les sources.list pour passer de Buster à Bullseye ou une version ultérieure
|
||||
update_sources() {
|
||||
local new_codename="$1"
|
||||
sed -i.bak -e "s/buster/$new_codename/g" /etc/apt/sources.list /etc/apt/sources.list.d/*
|
||||
echo "Mise à jour de /etc/apt/sources.list et /etc/apt/sources.list.d/* pour passer à $new_codename."
|
||||
}
|
||||
|
||||
# Ajoute non-free-firmware aux sources.list si nécessaire
|
||||
add_non_free_firmware() {
|
||||
if ! check_non_free_firmware; then
|
||||
if check_buster; then
|
||||
# Ajouter non-free-firmware pour la version Bookworm ou ultérieure
|
||||
sed -i.bak -e '/deb .*main/ s/$/ contrib non-free non-free-firmware/' /etc/apt/sources.list /etc/apt/sources.list.d/*
|
||||
echo "Ajout de non-free-firmware aux dépôts."
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Main script
|
||||
echo "Mise à jour de votre système Debian..."
|
||||
|
||||
# Mettre à jour le système dans sa version actuelle
|
||||
sudo apt-get update
|
||||
sudo apt-get upgrade -y
|
||||
sudo apt-get full-upgrade -y
|
||||
|
||||
# Vérifier si des sauvegardes ont été effectuées (cette étape est manuelle)
|
||||
|
||||
# Mise à jour des sources.list
|
||||
if check_buster; then
|
||||
update_sources "bullseye"
|
||||
add_non_free_firmware
|
||||
fi
|
||||
|
||||
# Nettoyer et mettre à jour les listes de paquets
|
||||
sudo apt-get clean
|
||||
sudo apt-get update
|
||||
|
||||
# Effectuer la mise à niveau majeure
|
||||
sudo apt-get upgrade -y
|
||||
sudo apt-get full-upgrade -y
|
||||
|
||||
# Supprimer les paquets non nécessaires
|
||||
sudo apt-get autoremove -y
|
||||
|
||||
# Redémarrer le système
|
||||
echo "Redémarrage du système pour appliquer les changements..."
|
||||
sudo shutdown -r now
|
||||
189
local/bin/updateall.sh
Executable file
189
local/bin/updateall.sh
Executable file
@@ -0,0 +1,189 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Variables pour les codes de couleur ANSI
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Mise à jour des machines présentes dans .ssh/config avec choix d'ignorer certaines.
|
||||
|
||||
# Fonction pour mettre à jour avec apt
|
||||
update_with_apt() {
|
||||
echo -e " - Mise à jour avec apt sur $1 \n"
|
||||
ssh -tt "$1" '
|
||||
sudo apt -y -q clean &&
|
||||
sudo apt -y -q update &&
|
||||
sudo apt -y -q full-upgrade &&
|
||||
sudo apt -y -q autoremove
|
||||
'
|
||||
echo -e "\n"
|
||||
}
|
||||
|
||||
# Fonction pour mettre à jour avec dnf
|
||||
update_with_dnf() {
|
||||
echo -e " - Mise à jour avec dnf sur $1 \n"
|
||||
ssh -tt "$1" 'sudo dnf check-update && sudo dnf upgrade -y'
|
||||
echo -e "\n"
|
||||
}
|
||||
|
||||
|
||||
# Déclaration d'une fonction pour récupérer les alias à partir du fichier ~/.ssh/config
|
||||
get_ssh_aliases() {
|
||||
# Parcours du fichier ~/.ssh/config et récupération du premier Host (excluant "*")
|
||||
awk 'tolower($1) == "host" && $2 != "*" && !seen[$2]++ {print $2}' ~/.ssh/config
|
||||
|
||||
# Parcours des fichiers dans le dossier ~/.ssh/include et récupération du premier Host (excluant "*")
|
||||
for include_file in ~/.ssh/include/*; do
|
||||
awk 'tolower($1) == "host" && $2 != "*" && !seen[$2]++ {print $2}' "$include_file"
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
check_keyinstall() {
|
||||
local machine="$1"
|
||||
local uniqkey="$2"
|
||||
local uniqkey_file="/etc/cedrix_updateall"
|
||||
|
||||
echo -n " - Vérification d'une mise à jour déjà effectuée sur "$machine" : "
|
||||
|
||||
if ! timeout 5 ssh "$machine" '[ -f "$uniqkey_file" ]'; then
|
||||
echo -e "${GREEN}mise à jour à faire.${NC}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
if timeout 5 ssh "$machine" "grep -q '$uniqkey' $uniqkey_file"; then
|
||||
echo -e "${RED}mise à jour déjà faite.${NC}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
timeout 5 ssh "$machine" "sudo rm "$uniqkey_file""
|
||||
echo -e "${GREEN}mise à jour à faire et clé à modifier.${NC}"
|
||||
return 0
|
||||
}
|
||||
|
||||
|
||||
create_installkey() {
|
||||
local machine="$1"
|
||||
local uniqkey="$2"
|
||||
local uniqkey_file="/etc/cedrix_updateall"
|
||||
|
||||
echo -n " - Indiquer à $machine que le script est passé ... "
|
||||
# Si la clé unique n'est pas présente, la déposer dans le fichier
|
||||
echo "$uniqkey" | timeout 5 ssh "$machine" "sudo su -c \"cat > $uniqkey_file\""
|
||||
result="$?"
|
||||
|
||||
if [ $result -eq 0 ]; then
|
||||
echo -e "${GREEN}OK${NC}"
|
||||
else
|
||||
echo -e "${RED}une erreur est survenue. Désactivation des prochaines mise à jour.${NC}"
|
||||
|
||||
fi
|
||||
|
||||
return
|
||||
|
||||
}
|
||||
|
||||
# Fonction pour récupérer la valeur de /etc/os-release
|
||||
get_os_release() {
|
||||
ssh "$1" 'grep "^PRETTY_NAME=" /etc/os-release' | cut -d'=' -f2 | tr -d \"
|
||||
}
|
||||
|
||||
|
||||
update_machine () {
|
||||
local machine="$1"
|
||||
|
||||
# recupérer le nom de l'OS
|
||||
os_name=$(get_os_release "$machine")
|
||||
echo -e " - Système d'exploitation : ${GREEN}$os_name${NC}"
|
||||
|
||||
echo -n " - Détection du gestionnaire de mise à jour ... "
|
||||
|
||||
if timeout 5 ssh "$machine" which apt > /dev/null 2>&1; then
|
||||
echo -e "${GREEN}apt${NC}"
|
||||
update_with_apt "$machine"
|
||||
elif timeout 5 ssh "$machine" which dnf > /dev/null 2>&1; then
|
||||
echo -e "${GREEN}dnf${NC}"
|
||||
update_with_dnf "$machine"
|
||||
else
|
||||
echo " ${RED} non détecté${NC}"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
|
||||
confirm_update() {
|
||||
local machine="$1"
|
||||
read -p " - Executer la mise à jour pour $machine ? (o/n) " choice
|
||||
if [ "$choice" = "o" ]; then
|
||||
echo "$machine 1" >> ~/.config/updateall-hosts
|
||||
else
|
||||
echo "$machine 0" >> ~/.config/updateall-hosts
|
||||
continue
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
check_host() {
|
||||
local machine="$1"
|
||||
|
||||
echo -n " - Check host "
|
||||
# Vérifier la résolution du nom d'hôte
|
||||
if ssh "$machine" hostname > /dev/null 2>&1; then
|
||||
echo -e "... ${GREEN}OK${NC}"
|
||||
return 1
|
||||
else
|
||||
echo -e "... ${RED}KO${NC}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
|
||||
# Générer une clé unique
|
||||
uniqkey=$(uuidgen)
|
||||
echo "Clé d'installation : $uniqkey"
|
||||
|
||||
# Récupérer les alias SSH
|
||||
machines=($(get_ssh_aliases))
|
||||
|
||||
# Parcourir la liste des machines
|
||||
|
||||
for machine in "${machines[@]}"; do
|
||||
# Vérification si le nom de machine est présent dans le fichier .config/updateall-hosts
|
||||
echo -e "\n"
|
||||
echo -n " >> $machine "
|
||||
|
||||
if grep -q "^$machine " ~/.config/updateall-hosts; then
|
||||
status=$(grep "^$machine " ~/.config/updateall-hosts | awk '{print $2}')
|
||||
if [ "$status" = "1" ]; then
|
||||
echo -e "${GREEN}connue${NC}"
|
||||
|
||||
check_host "$machine"
|
||||
machine_online="$?"
|
||||
|
||||
if [ "$machine_online" -eq 1 ]; then
|
||||
check_keyinstall "$machine" "$uniqkey"
|
||||
keyinstall_present="$?"
|
||||
if [ "$keyinstall_present" -eq 0 ]; then
|
||||
update_machine "$machine"
|
||||
create_installkey "$machine" "$uniqkey"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
echo -e "${RED}ignorée${NC}"
|
||||
fi
|
||||
else
|
||||
if [ "$machine_online" -eq 1 ]; then
|
||||
echo -e "${RED}vue pour la 1re fois${NC}"
|
||||
|
||||
check_host "$machine"
|
||||
machine_online="$?"
|
||||
|
||||
confirm_update "$machine"
|
||||
update_machine "$machine"
|
||||
create_installkey "$machine" "$uniqkey"
|
||||
fi
|
||||
fi
|
||||
|
||||
done
|
||||
|
||||
164
local/bin/ytdll
Executable file
164
local/bin/ytdll
Executable file
@@ -0,0 +1,164 @@
|
||||
#!/usr/bin/env php
|
||||
|
||||
<?php
|
||||
|
||||
// Auteur : Cédrix pour a5l.fr
|
||||
// Projet : scripts-bash/ytdll
|
||||
|
||||
// Télécharger les pistes audios ajoutées récemment
|
||||
// depuis des chaines Youtubes
|
||||
|
||||
// Version 2024.07.07-14.31
|
||||
// Version initiale
|
||||
|
||||
/*
|
||||
Création de la base de données
|
||||
Linux Debian 12 / PostGres 16
|
||||
|
||||
Suivez les instructions suivantes pour créer
|
||||
votre base de données et tous les éléments
|
||||
associés.
|
||||
|
||||
-- Connectez-vous en tant qu'utilisateur ayant des privilèges suffisants
|
||||
-- depuis le compte root
|
||||
sudo su - postgres
|
||||
|
||||
-- Modification du fichier pg_hba
|
||||
nano /etc/postgresql/16/main/ph_hba.conf
|
||||
-- modifier la ligne
|
||||
local all all peer
|
||||
-- avec la valeur suivante
|
||||
local all all trust
|
||||
|
||||
-- avec le compte root redémarrez postgres
|
||||
systemctl restart postgresql
|
||||
|
||||
-- Connectez-vous en tant qu'utilisateur ayant des privilèges suffisants
|
||||
-- depuis le compte root
|
||||
sudo su - postgres
|
||||
|
||||
-- Connection au requeteur
|
||||
psql
|
||||
|
||||
-- Créer un nouveau role
|
||||
CREATE ROLE r_ytdll WITH LOGIN PASSWORD 'changeme';
|
||||
|
||||
-- Créer la base de données
|
||||
CREATE DATABASE b_ytdll OWNER r_ytdll;
|
||||
|
||||
-- Connectez-vous à la base de données b_ytdll :
|
||||
\c b_ytdll
|
||||
|
||||
-- Créez un nouveau schéma
|
||||
CREATE SCHEMA s_ytdll AUTHORIZATION r_ytdll;
|
||||
|
||||
|
||||
-- Accorder tous les privilèges sur le schéma à l'utilisateur
|
||||
GRANT ALL PRIVILEGES ON SCHEMA s_ytdll TO r_ytdll;
|
||||
|
||||
-- Accorder des privilèges sur les tables et séquences existantes et futures
|
||||
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA s_ytdll TO r_ytdll;
|
||||
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA s_ytdll TO r_ytdll;
|
||||
ALTER DEFAULT PRIVILEGES IN SCHEMA s_ytdll GRANT ALL PRIVILEGES ON TABLES TO r_ytdll;
|
||||
ALTER DEFAULT PRIVILEGES IN SCHEMA s_ytdll GRANT ALL PRIVILEGES ON SEQUENCES TO r_ytdll;
|
||||
|
||||
-- Schéma s_ytdll par défaut
|
||||
SET search_path TO s_ytdll;
|
||||
\d
|
||||
ALTER ROLE r_ytdll SET search_path TO s_ytdll;
|
||||
ALTER DATABASE b_ytdll SET search_path TO s_ytdll;
|
||||
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
// -- GESTION DES PRE REQUIS --
|
||||
// Vérifier si l'extension pgsql est chargée
|
||||
if (!extension_loaded('pgsql')) {
|
||||
die("L'extension PHP 'pgsql' n'est pas installée. Veuillez l'installer avant de continuer.\n");
|
||||
}
|
||||
|
||||
// Chemin du HOME
|
||||
$homeDir = getenv('HOME');
|
||||
|
||||
// Configuration de l'autoloader
|
||||
spl_autoload_register(function ($class) use ($homeDir) {
|
||||
$baseDir = $homeDir . '/.local/share/ytdll/lib/';
|
||||
$file = $baseDir . str_replace('\\', '/', $class) . '.php';
|
||||
|
||||
if (file_exists($file)) {
|
||||
require $file;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// -- GESTION DE LA CONFIGURATION PRIMAIRE --
|
||||
|
||||
function getUserInput($prompt) {
|
||||
echo $prompt;
|
||||
return trim(fgets(STDIN));
|
||||
}
|
||||
|
||||
function createConfigFile($configPath, $templatePath) {
|
||||
// Vérifie si le fichier de configuration existe
|
||||
if (!file_exists($configPath)) {
|
||||
// Copie le fichier de modèle
|
||||
if (!copy($templatePath, $configPath)) {
|
||||
die("Échec de la copie du fichier de configuration modèle.\n");
|
||||
}
|
||||
|
||||
|
||||
// Demande à l'utilisateur de saisir les valeurs nécessaires
|
||||
$databaseHost = getUserInput("Veuillez saisir le host de la base de données : ");
|
||||
$databaseName = getUserInput("Veuillez saisir le nom de la base de données : ");
|
||||
$databaseUser = getUserInput("Veuillez saisir l'utilisateur de la base de données : ");
|
||||
$databasePassword = getUserInput("Veuillez saisir le mot de passe de la base de données : ");
|
||||
|
||||
// Lit le fichier de modèle
|
||||
$configContent = file_get_contents($configPath);
|
||||
|
||||
// Remplace les valeurs par défaut par les valeurs saisies par l'utilisateur
|
||||
$configArray = [
|
||||
'database' => [
|
||||
'host' => $databaseHost,
|
||||
'dbname' => $databaseName,
|
||||
'user' => $databaseUser,
|
||||
'password' => $databasePassword
|
||||
]
|
||||
];
|
||||
|
||||
// Encode en JSON
|
||||
$jsonConfig = json_encode($configArray, JSON_PRETTY_PRINT);
|
||||
|
||||
// Écrit le fichier de configuration JSON
|
||||
file_put_contents($configPath, $jsonConfig);
|
||||
|
||||
echo "Le fichier de configuration a été créé avec succès.\n";
|
||||
}
|
||||
}
|
||||
|
||||
// Appel de la fonction pour créer le fichier de configuration
|
||||
$configPath = $homeDir . '/.config/fr.a5l.ytdll.json';
|
||||
$templatePath = $homeDir . '/.local/share/ytdll/config.php';
|
||||
createConfigFile($configPath, $templatePath);
|
||||
|
||||
|
||||
|
||||
|
||||
// -- DEBUT --
|
||||
// Lit le fichier de configuration primaire
|
||||
$configContent = file_get_contents($configPath);
|
||||
// Décode le JSON en tableau associatif
|
||||
$config = json_decode($configContent, true);
|
||||
// Initialiser la connexion à la base de données
|
||||
$database = new Database($config['database']);
|
||||
unset($config);
|
||||
// Initialiser au gestionnaire de configuration
|
||||
$configManager = new Config($database);
|
||||
|
||||
|
||||
|
||||
// -- GESTION DES VERSIONS de TABLE --
|
||||
$updateManager = new UpdateManager($configManager, $pdo);
|
||||
$updateManager->manageVersionTables();
|
||||
@@ -1,20 +1,23 @@
|
||||
\
|
||||
|
||||
# NOM
|
||||
|
||||
castopod_update - Mise à jour de CASTOPOD
|
||||
|
||||
# SYNOPSIS
|
||||
|
||||
**castopod_update** [OPTION]
|
||||
castopod_update
|
||||
|
||||
# DESCRIPTION
|
||||
|
||||
Le script **castopod_update** permet de mettre à jour le dossier Web de CASTOPOD en utilisant le fichier de mise à jour au format ZIP fourni.
|
||||
Le script **castopod_update** permet de mettre à jour le dossier Web de
|
||||
CASTOPOD en utilisant le fichier de mise à jour au format ZIP fourni.
|
||||
|
||||
## OPTIONS
|
||||
# OPTIONS
|
||||
|
||||
- Aucune option n'est nécessaire pour exécuter le script.
|
||||
Aucune option n'est nécessaire pour exécuter le script.
|
||||
|
||||
## CONFIGURATION
|
||||
# CONFIGURATION
|
||||
|
||||
Le script a sa propre configuration qui n'est pas modifiable.
|
||||
|
||||
@@ -22,15 +25,19 @@ Le dossier Web de CASTOPOD doit être nommé `castopod`.
|
||||
|
||||
Le script doit être positionné au même niveau que le dossier Web de CASTOPOD.
|
||||
|
||||
Le dossier `save_castopod` contient une copie des données de CASTOPOD, qui est rafraîchie au début de l'exécution du script. S'il n'existe pas, il sera créé.
|
||||
Le dossier `save_castopod` contient une copie des données de CASTOPOD, qui est
|
||||
rafraîchie au début de l'exécution du script. S'il n'existe pas, il sera créé.
|
||||
|
||||
L'archive de mise à jour doit être spécifiquement nommée `castopod*.zip` et doit être positionnée au même niveau que le script et le dossier Web de CASTOPOD.
|
||||
L'archive de mise à jour doit être spécifiquement nommée `castopod*.zip` et
|
||||
doit être positionnée au même niveau que le script et le dossier Web de
|
||||
CASTOPOD.
|
||||
|
||||
Le script utilise `php8.1` pour effectuer des tâches de maintenance.
|
||||
|
||||
## PRÉREQUIS
|
||||
# PRÉREQUIS
|
||||
|
||||
Téléchargez l'archive de mise à jour disponible sur le site https://castopod.org/.
|
||||
Téléchargez l'archive de mise à jour disponible sur le site
|
||||
https://castopod.org/.
|
||||
|
||||
# EXEMPLES
|
||||
|
||||
@@ -40,23 +47,26 @@ Pour exécuter le script sans aucune option :
|
||||
castopod_update
|
||||
```
|
||||
|
||||
# AUTEURS
|
||||
|
||||
Cédric Abonnel - \<canl.sb2023@acemail.fr>
|
||||
|
||||
# VERSIONS
|
||||
|
||||
Version 23.12.1
|
||||
- Messages des logs améliorés avec plus de détails lors de l'utilisation de 'cp'.
|
||||
-23.12.14
|
||||
: Suppression de l'archive TAR du dossier `save_castopod`.
|
||||
|
||||
Version 23.12.14
|
||||
- Suppression de l'archive TAR du dossier `save_castopod`.
|
||||
-23.12.1
|
||||
: Messages des logs améliorés avec plus de détails lors de l'utilisation de
|
||||
`cp`.
|
||||
|
||||
|
||||
## AUTEUR
|
||||
# RAPPORT D'ERREURS
|
||||
|
||||
Ce script a été créé par Cédric Abonnel.
|
||||
|
||||
## RAPPORT D'ERREURS
|
||||
|
||||
Pour signaler des erreurs ou des problèmes : https://git.abonnel.fr/cedricAbonnel/scripts-bash
|
||||
Pour signaler des erreurs ou des problèmes :
|
||||
https://git.abonnel.fr/cedricAbonnel/scripts-bash
|
||||
|
||||
# REMARQUES
|
||||
|
||||
Ce script est fourni tel quel, sans aucune garantie. Vous êtes libre de le modifier et de le distribuer selon les termes de la licence applicable.
|
||||
Ce script est fourni tel quel, sans aucune garantie. Vous êtes libre de le
|
||||
modifier et de le distribuer selon les termes de la licence applicable.
|
||||
@@ -1,23 +1,39 @@
|
||||
convertPDF(1) - Compresse des fichiers PDF pour gagner en volume et génère le résultat d'un OCR
|
||||
|
||||
## SYNOPSIS
|
||||
**convertPDF**
|
||||
# NOM
|
||||
|
||||
## DESCRIPTION
|
||||
Ce script convertit des fichiers PDF en d'autres formats tels que JPG, TXT, et PDF en utilisant des outils comme `pdftocairo`, `pdftotext`, `tesseract`, et `convert`.
|
||||
convertPDF - Compresse des fichiers PDF pour gagner en volume et génère le résultat d'un OCR
|
||||
|
||||
## COMPATIBILITÉ
|
||||
# SYNOPSIS
|
||||
|
||||
convertPDF
|
||||
|
||||
# DESCRIPTION
|
||||
|
||||
Ce script convertit des fichiers PDF en d'autres formats tels que JPG, TXT, et
|
||||
PDF en utilisant des outils comme `pdftocairo`, `pdftotext`, `tesseract`, et
|
||||
`convert`.
|
||||
|
||||
# COMPATIBILITÉ
|
||||
|
||||
Ce script est compatible avec les fichiers PDF (Portable Document Format).
|
||||
|
||||
## EXEMPLE
|
||||
# EXEMPLES
|
||||
|
||||
Convertir plusieurs fichiers PDF présent dans le dossier et sous-dossiers courants :
|
||||
```
|
||||
convertPDF
|
||||
```
|
||||
|
||||
## AUTEUR
|
||||
Ce script a été créé par Cédric Abonnel.
|
||||
# VERSIONS
|
||||
|
||||
## RAPPORT D'ERREURS
|
||||
Pour signaler des erreurs ou des problèmes : https://git.abonnel.fr/cedricAbonnel/scripts-bash
|
||||
-23.12.1
|
||||
: Version originale
|
||||
|
||||
# AUTEURS
|
||||
|
||||
Cédric Abonnel - \<canl.sb2023@acemail.fr>
|
||||
|
||||
# RAPPORT D'ERREURS
|
||||
|
||||
Pour signaler des erreurs ou des problèmes :
|
||||
https://git.abonnel.fr/cedricAbonnel/scripts-bash
|
||||
|
||||
@@ -1,33 +1,30 @@
|
||||
\
|
||||
|
||||
# NOM
|
||||
|
||||
top_horaire - Gestion du jingle et de l'annonce de l'heure
|
||||
|
||||
# SYNOPSIS
|
||||
|
||||
**top_horaire** [OPTION]
|
||||
top_horaire
|
||||
|
||||
# DESCRIPTION
|
||||
|
||||
Le script **top_horaire** permet de gérer la lecture d'un jingle en arrière-plan suivi de l'annonce de l'heure actuelle en utilisant espeak-ng.
|
||||
Le script **top_horaire** permet de gérer la lecture d'un jingle en
|
||||
arrière-plan suivi de l'annonce de l'heure actuelle en utilisant espeak-ng.
|
||||
|
||||
## OPTIONS
|
||||
# OPTIONS
|
||||
|
||||
- Aucune option n'est requise pour exécuter le script.
|
||||
Aucune option n'est requise pour exécuter le script.
|
||||
|
||||
## CONFIGURATION
|
||||
# CONFIGURATION
|
||||
|
||||
Le script peut lire la configuration à partir d'un fichier de configuration situé dans le répertoire `~/.config/`. Si le fichier de configuration n'existe pas, il sera créé avec un commentaire indiquant la date de création.
|
||||
|
||||
## CONFIGURATION DU CHEMIN DU JINGLE
|
||||
|
||||
Le chemin du jingle est configuré par la variable `jingle_tophoraire`. Si cette variable n'est pas définie dans le fichier de configuration, elle sera initialisée avec le chemin par défaut du jingle.
|
||||
|
||||
## LECTURE DU JINGLE EN ARRIÈRE-PLAN
|
||||
|
||||
Une fois le chemin du jingle configuré, le script utilise la commande `paplay` pour lire le jingle en arrière-plan.
|
||||
|
||||
## ANNONCE DE L'HEURE ACTUELLE
|
||||
|
||||
Le script obtient l'heure actuelle et crée un message d'annonce contenant l'heure. Il utilise ensuite la commande `espeak-ng` pour annoncer l'heure en français.
|
||||
|
||||
# EXEMPLES
|
||||
@@ -38,10 +35,17 @@ Pour exécuter le script sans aucune option :
|
||||
top_horaire
|
||||
```
|
||||
|
||||
## AUTEUR
|
||||
Ce script a été créé par Cédric Abonnel.
|
||||
# AUTEURS
|
||||
|
||||
Cédric Abonnel - \<canl.sb2023@acemail.fr>
|
||||
|
||||
# VERSIONS
|
||||
|
||||
-23.12.1
|
||||
: Version originale
|
||||
|
||||
# RAPPORT D'ERREURS
|
||||
|
||||
## RAPPORT D'ERREURS
|
||||
Pour signaler des erreurs ou des problèmes : https://git.abonnel.fr/cedricAbonnel/scripts-bash
|
||||
|
||||
# VOIR AUSSI
|
||||
|
||||
@@ -1,32 +1,43 @@
|
||||
# playlist_gen(1) - Génère une playlist M3U à partir de fichiers audio
|
||||
\
|
||||
|
||||
## SYNOPSIS
|
||||
# NOM
|
||||
|
||||
**playlist_gen** [-n \<nombre de fichiers\>] [-d \<répertoire\>] [-o \<fichier de sortie\>]
|
||||
playlist_gen - Génère une playlist M3U à partir de fichiers audio
|
||||
|
||||
## DESCRIPTION
|
||||
# SYNOPSIS
|
||||
|
||||
**playlist_gen** est un script Bash qui permet de générer une playlist M3U à partir de fichiers audio situés dans un répertoire spécifié.
|
||||
playlist_gen [-n \<nombre de fichiers\>] [-d \<répertoire\>] [-o \<fichier de sortie\>]
|
||||
|
||||
## OPTIONS
|
||||
# DESCRIPTION
|
||||
|
||||
- **-n \<nombre de fichiers\>** : Spécifie le nombre de fichiers à inclure dans la playlist. Par défaut, le nombre de fichiers est 100.
|
||||
playlist_gen est un script Bash qui permet de générer une playlist M3U à partir
|
||||
de fichiers audio situés dans un répertoire spécifié.
|
||||
|
||||
- **-d \<répertoire\>** : Spécifie le répertoire à scanner pour les fichiers audio. Par défaut, le répertoire actuel est utilisé.
|
||||
# OPTIONS
|
||||
|
||||
- **-o \<fichier de sortie\>** : Spécifie le nom du fichier M3U de sortie. Par défaut, le fichier est créé dans le répertoire de la musique de l'utilisateur.
|
||||
-n
|
||||
: Spécifie le nombre de fichiers à inclure dans la playlist. Par défaut, le
|
||||
nombre de fichiers est 100.
|
||||
|
||||
## UTILISATION
|
||||
-d
|
||||
: Spécifie le répertoire à scanner pour les fichiers audio. Par défaut, le
|
||||
répertoire actuel est utilisé.
|
||||
|
||||
-o
|
||||
: Spécifie le nom du fichier M3U de sortie. Par défaut, le fichier est créé
|
||||
dans le répertoire de la musique de l'utilisateur.
|
||||
|
||||
# UTILISATION
|
||||
|
||||
```
|
||||
playlist_gen -n 50 -d /chemin/vers/repertoire -o playlist.m3u
|
||||
```
|
||||
|
||||
## COMPATIBILITÉ
|
||||
# COMPATIBILITÉ
|
||||
|
||||
Ce script est compatible avec les fichiers audio aux formats MP3, Opus, Ogg et M4A.
|
||||
|
||||
## EXEMPLES
|
||||
# EXEMPLES
|
||||
|
||||
1. Générer une playlist M3U à partir du répertoire de musique par défaut de l'utilisateur :
|
||||
|
||||
@@ -40,11 +51,16 @@ Ce script est compatible avec les fichiers audio aux formats MP3, Opus, Ogg et M
|
||||
playlist_gen -n 25 -d /chemin/vers/repertoire
|
||||
```
|
||||
|
||||
## AUTEUR
|
||||
# AUTEURS
|
||||
|
||||
Ce script a été écrit par Cédric Abonnel.
|
||||
Cédric Abonnel - \<canl.sb2023@acemail.fr>
|
||||
|
||||
## RAPPORTS D'ERREURS
|
||||
# VERSIONS
|
||||
|
||||
-23.12.1
|
||||
: Version originale
|
||||
|
||||
# RAPPORTS D'ERREURS
|
||||
|
||||
Pour signaler des erreurs ou des problèmes : https://git.abonnel.fr/cedricAbonnel/scripts-bash
|
||||
|
||||
|
||||
@@ -1,39 +1,64 @@
|
||||
random_music_player(1) - Lecteur de musique aléatoire en ligne de commande
|
||||
\
|
||||
|
||||
## Synopsis
|
||||
**random_music_player** [OPTIONS]
|
||||
# NOM
|
||||
|
||||
## Description
|
||||
Le script **random_music_player** est un lecteur de musique aléatoire en ligne de commande qui lit des fichiers audio à partir d'un répertoire spécifié.
|
||||
random_music_player - Lecteur de musique aléatoire en ligne de commande
|
||||
|
||||
## Options
|
||||
- Aucune option n'est requise.
|
||||
# SYNOPSIS
|
||||
|
||||
random_music_player \[options\]
|
||||
|
||||
# DESCRIPTION
|
||||
|
||||
Le script **random_music_player** est un lecteur de musique aléatoire en ligne
|
||||
de commande qui lit des fichiers audio à partir d'un répertoire spécifié.
|
||||
|
||||
# OPTIONS
|
||||
|
||||
Aucune option n'est requise.
|
||||
|
||||
# CONFIGURATION
|
||||
|
||||
Le script utilise un fichier de configuration situé à
|
||||
`~/.config/random_music_player`. Si ce fichier de configuration n'existe pas,
|
||||
il sera créé avec les paramètres par défaut suivants :
|
||||
|
||||
## Configuration
|
||||
Le script utilise un fichier de configuration situé à `~/.config/random_music_player`. Si ce fichier de configuration n'existe pas, il sera créé avec les paramètres par défaut suivants :
|
||||
```shell
|
||||
# Fichier de configuration créé [date de création]
|
||||
path_music_files=~/Music
|
||||
volume=0.06
|
||||
```
|
||||
|
||||
Vous pouvez éditer ce fichier de configuration pour personnaliser les réglages du lecteur de musique.
|
||||
Vous pouvez éditer ce fichier de configuration pour personnaliser les réglages
|
||||
du lecteur de musique.
|
||||
|
||||
## Utilisation
|
||||
Pour utiliser le lecteur de musique aléatoire, exécutez simplement le script sans aucune option. Il sélectionnera au hasard un fichier audio à partir du répertoire spécifié dans le fichier de configuration et le lira.
|
||||
# UTILISATION
|
||||
|
||||
Pour utiliser le lecteur de musique aléatoire, exécutez simplement le script
|
||||
sans aucune option. Il sélectionnera au hasard un fichier audio à partir du
|
||||
répertoire spécifié dans le fichier de configuration et le lira.
|
||||
|
||||
```shell
|
||||
random_music_player
|
||||
```
|
||||
|
||||
## Exemple
|
||||
# EXEMPLE
|
||||
|
||||
```shell
|
||||
$ random_music_player
|
||||
```
|
||||
|
||||
## Auteur
|
||||
Ce script a été créé par Cédric Abonnel.
|
||||
# VERSIONS
|
||||
|
||||
## Rapport d'erreurs
|
||||
Pour signaler des erreurs ou des problèmes : https://git.abonnel.fr/cedricAbonnel/scripts-bash
|
||||
-23.12.1
|
||||
: Version originale
|
||||
|
||||
# AUTEURS
|
||||
|
||||
Cédric Abonnel - \<canl.sb2023@acemail.fr>
|
||||
|
||||
# RAPPORT D'ERREUR
|
||||
|
||||
Pour signaler des erreurs ou des problèmes :
|
||||
https://git.abonnel.fr/cedricAbonnel/scripts-bash
|
||||
|
||||
|
||||
@@ -16,21 +16,25 @@
|
||||
.\}
|
||||
.TH "" "" "" "" ""
|
||||
.hy
|
||||
.PP
|
||||
.PD 0
|
||||
.P
|
||||
.PD
|
||||
.SH NOM
|
||||
.PP
|
||||
castopod_update - Mise à jour de CASTOPOD
|
||||
.SH SYNOPSIS
|
||||
.PP
|
||||
\f[B]castopod_update\f[R] [OPTION]
|
||||
castopod_update
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
Le script \f[B]castopod_update\f[R] permet de mettre à jour le dossier
|
||||
Web de CASTOPOD en utilisant le fichier de mise à jour au format ZIP
|
||||
fourni.
|
||||
.SS OPTIONS
|
||||
.IP \[bu] 2
|
||||
.SH OPTIONS
|
||||
.PP
|
||||
Aucune option n\[cq]est nécessaire pour exécuter le script.
|
||||
.SS CONFIGURATION
|
||||
.SH CONFIGURATION
|
||||
.PP
|
||||
Le script a sa propre configuration qui n\[cq]est pas modifiable.
|
||||
.PP
|
||||
@@ -49,7 +53,7 @@ script et le dossier Web de CASTOPOD.
|
||||
.PP
|
||||
Le script utilise \f[V]php8.1\f[R] pour effectuer des tâches de
|
||||
maintenance.
|
||||
.SS PRÉREQUIS
|
||||
.SH PRÉREQUIS
|
||||
.PP
|
||||
Téléchargez l\[cq]archive de mise à jour disponible sur le site
|
||||
https://castopod.org/.
|
||||
@@ -62,17 +66,18 @@ Pour exécuter le script sans aucune option :
|
||||
castopod_update
|
||||
\f[R]
|
||||
.fi
|
||||
.SH AUTEURS
|
||||
.PP
|
||||
Cédric Abonnel - <canl.sb2023\[at]acemail.fr>
|
||||
.SH VERSIONS
|
||||
.PP
|
||||
Version 23.12.1 - Messages des logs améliorés avec plus de détails lors
|
||||
de l\[cq]utilisation de `cp'.
|
||||
.PP
|
||||
Version 23.12.14 - Suppression de l\[cq]archive TAR du dossier
|
||||
\f[V]save_castopod\f[R].
|
||||
.SS AUTEUR
|
||||
.PP
|
||||
Ce script a été créé par Cédric Abonnel.
|
||||
.SS RAPPORT D\[cq]ERREURS
|
||||
.TP
|
||||
-23.12.14
|
||||
Suppression de l\[cq]archive TAR du dossier \f[V]save_castopod\f[R].
|
||||
.TP
|
||||
-23.12.1
|
||||
Messages des logs améliorés avec plus de détails lors de
|
||||
l\[cq]utilisation de \f[V]cp\f[R].
|
||||
.SH RAPPORT D\[cq]ERREURS
|
||||
.PP
|
||||
Pour signaler des erreurs ou des problèmes :
|
||||
https://git.abonnel.fr/cedricAbonnel/scripts-bash
|
||||
|
||||
@@ -16,29 +16,34 @@
|
||||
.\}
|
||||
.TH "" "" "" "" ""
|
||||
.hy
|
||||
.SH NOM
|
||||
.PP
|
||||
convertPDF(1) - Compresse des fichiers PDF pour gagner en volume et
|
||||
génère le résultat d\[cq]un OCR
|
||||
.SS SYNOPSIS
|
||||
convertPDF - Compresse des fichiers PDF pour gagner en volume et génère
|
||||
le résultat d\[cq]un OCR
|
||||
.SH SYNOPSIS
|
||||
.PP
|
||||
\f[B]convertPDF\f[R]
|
||||
.SS DESCRIPTION
|
||||
convertPDF
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
Ce script convertit des fichiers PDF en d\[cq]autres formats tels que
|
||||
JPG, TXT, et PDF en utilisant des outils comme \f[V]pdftocairo\f[R],
|
||||
\f[V]pdftotext\f[R], \f[V]tesseract\f[R], et \f[V]convert\f[R].
|
||||
.SS COMPATIBILITÉ
|
||||
.SH COMPATIBILITÉ
|
||||
.PP
|
||||
Ce script est compatible avec les fichiers PDF (Portable Document
|
||||
Format).
|
||||
.SS EXEMPLE
|
||||
.SH EXEMPLES
|
||||
.PP
|
||||
Convertir plusieurs fichiers PDF présent dans le dossier et
|
||||
sous-dossiers courants : \f[V]convertPDF\f[R]
|
||||
.SS AUTEUR
|
||||
.SH VERSIONS
|
||||
.TP
|
||||
-23.12.1
|
||||
Version originale
|
||||
.SH AUTEURS
|
||||
.PP
|
||||
Ce script a été créé par Cédric Abonnel.
|
||||
.SS RAPPORT D\[cq]ERREURS
|
||||
Cédric Abonnel - <canl.sb2023\[at]acemail.fr>
|
||||
.SH RAPPORT D\[cq]ERREURS
|
||||
.PP
|
||||
Pour signaler des erreurs ou des problèmes :
|
||||
https://git.abonnel.fr/cedricAbonnel/scripts-bash
|
||||
|
||||
@@ -16,38 +16,39 @@
|
||||
.\}
|
||||
.TH "" "" "" "" ""
|
||||
.hy
|
||||
.PP
|
||||
.PD 0
|
||||
.P
|
||||
.PD
|
||||
.SH NOM
|
||||
.PP
|
||||
top_horaire - Gestion du jingle et de l\[cq]annonce de l\[cq]heure
|
||||
.SH SYNOPSIS
|
||||
.PP
|
||||
\f[B]top_horaire\f[R] [OPTION]
|
||||
top_horaire
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
Le script \f[B]top_horaire\f[R] permet de gérer la lecture d\[cq]un
|
||||
jingle en arrière-plan suivi de l\[cq]annonce de l\[cq]heure actuelle en
|
||||
utilisant espeak-ng.
|
||||
.SS OPTIONS
|
||||
.IP \[bu] 2
|
||||
.SH OPTIONS
|
||||
.PP
|
||||
Aucune option n\[cq]est requise pour exécuter le script.
|
||||
.SS CONFIGURATION
|
||||
.SH CONFIGURATION
|
||||
.PP
|
||||
Le script peut lire la configuration à partir d\[cq]un fichier de
|
||||
configuration situé dans le répertoire \f[V]\[ti]/.config/\f[R].
|
||||
Si le fichier de configuration n\[cq]existe pas, il sera créé avec un
|
||||
commentaire indiquant la date de création.
|
||||
.SS CONFIGURATION DU CHEMIN DU JINGLE
|
||||
.PP
|
||||
Le chemin du jingle est configuré par la variable
|
||||
\f[V]jingle_tophoraire\f[R].
|
||||
Si cette variable n\[cq]est pas définie dans le fichier de
|
||||
configuration, elle sera initialisée avec le chemin par défaut du
|
||||
jingle.
|
||||
.SS LECTURE DU JINGLE EN ARRIÈRE-PLAN
|
||||
.PP
|
||||
Une fois le chemin du jingle configuré, le script utilise la commande
|
||||
\f[V]paplay\f[R] pour lire le jingle en arrière-plan.
|
||||
.SS ANNONCE DE L\[cq]HEURE ACTUELLE
|
||||
.PP
|
||||
Le script obtient l\[cq]heure actuelle et crée un message d\[cq]annonce
|
||||
contenant l\[cq]heure.
|
||||
@@ -62,10 +63,14 @@ Pour exécuter le script sans aucune option :
|
||||
top_horaire
|
||||
\f[R]
|
||||
.fi
|
||||
.SS AUTEUR
|
||||
.SH AUTEURS
|
||||
.PP
|
||||
Ce script a été créé par Cédric Abonnel.
|
||||
.SS RAPPORT D\[cq]ERREURS
|
||||
Cédric Abonnel - <canl.sb2023\[at]acemail.fr>
|
||||
.SH VERSIONS
|
||||
.TP
|
||||
-23.12.1
|
||||
Version originale
|
||||
.SH RAPPORT D\[cq]ERREURS
|
||||
.PP
|
||||
Pour signaler des erreurs ou des problèmes :
|
||||
https://git.abonnel.fr/cedricAbonnel/scripts-bash
|
||||
|
||||
@@ -16,42 +16,47 @@
|
||||
.\}
|
||||
.TH "" "" "" "" ""
|
||||
.hy
|
||||
.SH playlist_gen(1) - Génère une playlist M3U à partir de fichiers audio
|
||||
.SS SYNOPSIS
|
||||
.PP
|
||||
\f[B]playlist_gen\f[R] [-n <nombre de fichiers>] [-d <répertoire>] [-o
|
||||
<fichier de sortie>]
|
||||
.SS DESCRIPTION
|
||||
.PD 0
|
||||
.P
|
||||
.PD
|
||||
.SH NOM
|
||||
.PP
|
||||
\f[B]playlist_gen\f[R] est un script Bash qui permet de générer une
|
||||
playlist M3U à partir de fichiers audio situés dans un répertoire
|
||||
spécifié.
|
||||
.SS OPTIONS
|
||||
.IP \[bu] 2
|
||||
\f[B]-n <nombre de fichiers>\f[R] : Spécifie le nombre de fichiers à
|
||||
inclure dans la playlist.
|
||||
playlist_gen - Génère une playlist M3U à partir de fichiers audio
|
||||
.SH SYNOPSIS
|
||||
.PP
|
||||
playlist_gen [-n <nombre de fichiers>] [-d <répertoire>] [-o <fichier de
|
||||
sortie>]
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
playlist_gen est un script Bash qui permet de générer une playlist M3U à
|
||||
partir de fichiers audio situés dans un répertoire spécifié.
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
-n
|
||||
Spécifie le nombre de fichiers à inclure dans la playlist.
|
||||
Par défaut, le nombre de fichiers est 100.
|
||||
.IP \[bu] 2
|
||||
\f[B]-d <répertoire>\f[R] : Spécifie le répertoire à scanner pour les
|
||||
fichiers audio.
|
||||
.TP
|
||||
-d
|
||||
Spécifie le répertoire à scanner pour les fichiers audio.
|
||||
Par défaut, le répertoire actuel est utilisé.
|
||||
.IP \[bu] 2
|
||||
\f[B]-o <fichier de sortie>\f[R] : Spécifie le nom du fichier M3U de
|
||||
sortie.
|
||||
.TP
|
||||
-o
|
||||
Spécifie le nom du fichier M3U de sortie.
|
||||
Par défaut, le fichier est créé dans le répertoire de la musique de
|
||||
l\[cq]utilisateur.
|
||||
.SS UTILISATION
|
||||
.SH UTILISATION
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
playlist_gen -n 50 -d /chemin/vers/repertoire -o playlist.m3u
|
||||
\f[R]
|
||||
.fi
|
||||
.SS COMPATIBILITÉ
|
||||
.SH COMPATIBILITÉ
|
||||
.PP
|
||||
Ce script est compatible avec les fichiers audio aux formats MP3, Opus,
|
||||
Ogg et M4A.
|
||||
.SS EXEMPLES
|
||||
.SH EXEMPLES
|
||||
.IP "1." 3
|
||||
Générer une playlist M3U à partir du répertoire de musique par défaut de
|
||||
l\[cq]utilisateur :
|
||||
@@ -74,10 +79,14 @@ playlist_gen -n 25 -d /chemin/vers/repertoire
|
||||
\f[R]
|
||||
.fi
|
||||
.RE
|
||||
.SS AUTEUR
|
||||
.SH AUTEURS
|
||||
.PP
|
||||
Ce script a été écrit par Cédric Abonnel.
|
||||
.SS RAPPORTS D\[cq]ERREURS
|
||||
Cédric Abonnel - <canl.sb2023\[at]acemail.fr>
|
||||
.SH VERSIONS
|
||||
.TP
|
||||
-23.12.1
|
||||
Version originale
|
||||
.SH RAPPORTS D\[cq]ERREURS
|
||||
.PP
|
||||
Pour signaler des erreurs ou des problèmes :
|
||||
https://git.abonnel.fr/cedricAbonnel/scripts-bash
|
||||
|
||||
@@ -17,20 +17,24 @@
|
||||
.TH "" "" "" "" ""
|
||||
.hy
|
||||
.PP
|
||||
random_music_player(1) - Lecteur de musique aléatoire en ligne de
|
||||
commande
|
||||
.SS Synopsis
|
||||
.PD 0
|
||||
.P
|
||||
.PD
|
||||
.SH NOM
|
||||
.PP
|
||||
\f[B]random_music_player\f[R] OPTIONS
|
||||
.SS Description
|
||||
random_music_player - Lecteur de musique aléatoire en ligne de commande
|
||||
.SH SYNOPSIS
|
||||
.PP
|
||||
random_music_player [options]
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
Le script \f[B]random_music_player\f[R] est un lecteur de musique
|
||||
aléatoire en ligne de commande qui lit des fichiers audio à partir
|
||||
d\[cq]un répertoire spécifié.
|
||||
.SS Options
|
||||
.IP \[bu] 2
|
||||
.SH OPTIONS
|
||||
.PP
|
||||
Aucune option n\[cq]est requise.
|
||||
.SS Configuration
|
||||
.SH CONFIGURATION
|
||||
.PP
|
||||
Le script utilise un fichier de configuration situé à
|
||||
\f[V]\[ti]/.config/random_music_player\f[R].
|
||||
@@ -47,7 +51,7 @@ volume=0.06
|
||||
.PP
|
||||
Vous pouvez éditer ce fichier de configuration pour personnaliser les
|
||||
réglages du lecteur de musique.
|
||||
.SS Utilisation
|
||||
.SH UTILISATION
|
||||
.PP
|
||||
Pour utiliser le lecteur de musique aléatoire, exécutez simplement le
|
||||
script sans aucune option.
|
||||
@@ -59,17 +63,21 @@ spécifié dans le fichier de configuration et le lira.
|
||||
random_music_player
|
||||
\f[R]
|
||||
.fi
|
||||
.SS Exemple
|
||||
.SH EXEMPLE
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
$ random_music_player
|
||||
\f[R]
|
||||
.fi
|
||||
.SS Auteur
|
||||
.SH VERSIONS
|
||||
.TP
|
||||
-23.12.1
|
||||
Version originale
|
||||
.SH AUTEURS
|
||||
.PP
|
||||
Ce script a été créé par Cédric Abonnel.
|
||||
.SS Rapport d\[cq]erreurs
|
||||
Cédric Abonnel - <canl.sb2023\[at]acemail.fr>
|
||||
.SH RAPPORT D\[cq]ERREUR
|
||||
.PP
|
||||
Pour signaler des erreurs ou des problèmes :
|
||||
https://git.abonnel.fr/cedricAbonnel/scripts-bash
|
||||
|
||||
9
local/share/ytdll/config.json
Normal file
9
local/share/ytdll/config.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"database": {
|
||||
"host": "changeme",
|
||||
"dbname": "changeme",
|
||||
"user": "changeme",
|
||||
"password": "changeme"
|
||||
}
|
||||
|
||||
}
|
||||
38
local/share/ytdll/definitionsTables.json
Normal file
38
local/share/ytdll/definitionsTables.json
Normal file
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"definition_number": 1,
|
||||
"versions": [
|
||||
{
|
||||
"version" : "2024.07.07-14.31",
|
||||
"comment" : "Version initiale"
|
||||
}
|
||||
],
|
||||
"author": "Cédrix pour a5l.fr",
|
||||
"project": "scripts-bash/ytdll",
|
||||
"tables": [
|
||||
{
|
||||
"name": "config",
|
||||
"columns": [
|
||||
{"name": "id", "type": "SERIAL PRIMARY KEY"},
|
||||
{"name": "key", "type": "VARCHAR(255)"},
|
||||
{"name": "value", "type": "VARCHAR(255)"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "feed_metadata",
|
||||
"columns": [
|
||||
{"name": "channel_id", "type": "VARCHAR(255) PRIMARY KEY"},
|
||||
{"name": "author_name", "type": "VARCHAR(255)"},
|
||||
{"name": "author_uri", "type": "VARCHAR(255)"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "entry_metadata",
|
||||
"columns": [
|
||||
{"name": "video_id", "type": "VARCHAR(255) PRIMARY KEY"},
|
||||
{"name": "channel_id", "type": "VARCHAR(255)"},
|
||||
{"name": "title", "type": "VARCHAR(255)"},
|
||||
{"name": "author_name", "type": "VARCHAR(255)"}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
91
local/share/ytdll/lib/Config.php
Normal file
91
local/share/ytdll/lib/Config.php
Normal file
@@ -0,0 +1,91 @@
|
||||
<?php
|
||||
|
||||
// Auteur : Cédrix pour a5l.fr
|
||||
// Projet : scripts-bash/ytdll
|
||||
|
||||
// Version 2024.07.07-14.31
|
||||
// Version initiale
|
||||
|
||||
|
||||
class Config {
|
||||
private $pdo;
|
||||
private $database;
|
||||
|
||||
public function __construct(Database $database) {
|
||||
$this->database = $database;
|
||||
$this->pdo = $this->database->getPDO();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set or update the version in the config table.
|
||||
*
|
||||
* @param string $version The version to set.
|
||||
* @return bool True on success, false on failure.
|
||||
*/
|
||||
public function setVersionDefinitionsTables($version) {
|
||||
try {
|
||||
$stmt = $this->pdo->prepare("
|
||||
INSERT INTO config (key, value)
|
||||
VALUES ('versionDefinitionsTables', :version)
|
||||
ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value
|
||||
");
|
||||
$stmt->execute(['version' => $version]);
|
||||
} catch (PDOException $e) {
|
||||
// Log the error or handle it appropriately
|
||||
error_log('Error setting version: ' . $e->getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current version from the config table.
|
||||
*
|
||||
* @return string|null The current version or null if not set.
|
||||
*/
|
||||
public function getVersionDefinitionsTables() {
|
||||
try {
|
||||
|
||||
$stmt = $this->pdo->prepare("SELECT value FROM config WHERE key = 'versionDefinitionsTables'");
|
||||
$stmt->execute();
|
||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
return $row ? $row['value'] : null;
|
||||
} catch (PDOException $e) {
|
||||
error_log("Database error: " . $e->getMessage());
|
||||
// Return a default value or null
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the current path Definitions Tables from the config table.
|
||||
*
|
||||
* @return string The current version or default path if not set.
|
||||
*/
|
||||
public function getPathDefinitionsTablesFile() {
|
||||
$defaultPath = getenv('HOME') . "/.local/share/ytdll/definitionsTables.json";
|
||||
return $defaultPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify database privileges by attempting to create and drop a test table.
|
||||
*
|
||||
* @return bool True if privileges are sufficient, false otherwise.
|
||||
*/
|
||||
public function verifyPrivileges() {
|
||||
try {
|
||||
$tableManager = new TableManager($this->database);
|
||||
$tableManager->createTable('test_table', [
|
||||
['name' => 'id', 'type' => 'SERIAL PRIMARY KEY'],
|
||||
['name' => 'name', 'type' => 'VARCHAR(255)']
|
||||
]);
|
||||
$tableManager->dropTable('test_table');
|
||||
return true;
|
||||
} catch (PDOException $e) {
|
||||
error_log("Erreur sur les privilèges d'accès à la base de données : " . $e->getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
26
local/share/ytdll/lib/Database.php
Normal file
26
local/share/ytdll/lib/Database.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
class Database {
|
||||
private $pdo;
|
||||
|
||||
public function __construct($config) {
|
||||
$dsn = "pgsql:host={$config['host']};dbname={$config['dbname']}";
|
||||
try {
|
||||
$this->pdo = new PDO($dsn, $config['user'], $config['password'], [
|
||||
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
|
||||
]);
|
||||
} catch (PDOException $e) {
|
||||
die('Connection failed: ' . $e->getMessage());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public function getDefaultSchema() {
|
||||
$query = "SELECT current_schema()";
|
||||
$stmt = $this->pdo->query($query);
|
||||
return $stmt->fetchColumn();
|
||||
}
|
||||
|
||||
public function getPDO() {
|
||||
return $this->pdo;
|
||||
}
|
||||
}
|
||||
116
local/share/ytdll/lib/TableManager.php
Normal file
116
local/share/ytdll/lib/TableManager.php
Normal file
@@ -0,0 +1,116 @@
|
||||
<?php
|
||||
|
||||
// Auteur : Cédrix pour a5l.fr
|
||||
// Projet : scripts-bash/ytdll
|
||||
|
||||
// Version 2024.07.07-14.31
|
||||
// Version initiale
|
||||
|
||||
|
||||
class TableManager {
|
||||
private $pdo;
|
||||
private $database;
|
||||
|
||||
// SGBD PostGreSQL 16
|
||||
|
||||
public function __construct(Database $database) {
|
||||
$this->database = $database;
|
||||
$this->pdo = $this->database->getPDO();
|
||||
}
|
||||
|
||||
public function getTableColumns($tableName) {
|
||||
if (!$this->tableExists($tableName)) {
|
||||
return []; // Retourne un tableau vide si la table n'existe pas
|
||||
}
|
||||
|
||||
$query = "SELECT column_name, data_type FROM information_schema.columns WHERE table_name = :table_name AND table_schema = :table_schema";
|
||||
$stmt = $this->pdo->prepare($query);
|
||||
$stmt->execute([
|
||||
':table_name' => $tableName
|
||||
]);
|
||||
return $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
}
|
||||
|
||||
private function tableExists($tableName) {
|
||||
$schema = $this->database->getDefaultSchema();
|
||||
|
||||
$query = "SELECT COUNT(*) FROM information_schema.tables WHERE table_name = :table_name AND table_schema = :table_schema";
|
||||
$stmt = $this->pdo->prepare($query);
|
||||
echo "Vérification de l'existence de la table : $tableName\n";
|
||||
$stmt->execute([
|
||||
':table_name' => $tableName,
|
||||
':table_schema' => $schema
|
||||
]);
|
||||
return $stmt->fetchColumn() > 0;
|
||||
}
|
||||
|
||||
public function processTables($tables) {
|
||||
foreach ($tables as $table) {
|
||||
$this->processTable($table);
|
||||
}
|
||||
}
|
||||
|
||||
private function processTable($table) {
|
||||
$tableName = $table['name'];
|
||||
$columns = $table['columns'];
|
||||
$existingColumns = $this->getTableColumns($tableName);
|
||||
|
||||
if (empty($existingColumns) && !$this->tableExists($tableName)) {
|
||||
$this->createTable($tableName, $columns);
|
||||
return;
|
||||
}
|
||||
|
||||
$existingColumnsMap = [];
|
||||
foreach ($existingColumns as $column) {
|
||||
$existingColumnsMap[$column['column_name']] = $column['data_type'];
|
||||
}
|
||||
|
||||
foreach ($columns as $column) {
|
||||
$columnName = $column['name'];
|
||||
$columnType = $column['type'];
|
||||
|
||||
if (isset($existingColumnsMap[$columnName])) {
|
||||
if ($existingColumnsMap[$columnName] !== $columnType) {
|
||||
$this->alterColumnType($tableName, $columnName, $columnType);
|
||||
}
|
||||
unset($existingColumnsMap[$columnName]);
|
||||
} else {
|
||||
$this->addColumn($tableName, $columnName, $columnType);
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($existingColumnsMap as $columnName => $columnType) {
|
||||
$this->dropColumn($tableName, $columnName);
|
||||
}
|
||||
}
|
||||
|
||||
public function createTable($tableName, $columns) {
|
||||
$columnsSql = [];
|
||||
foreach ($columns as $column) {
|
||||
$columnsSql[] = "{$column['name']} {$column['type']}";
|
||||
}
|
||||
$columnsSql = implode(", ", $columnsSql);
|
||||
$sql = "CREATE TABLE $tableName ($columnsSql)";
|
||||
$this->pdo->exec($sql);
|
||||
}
|
||||
|
||||
public function dropTable($tableName) {
|
||||
$sql = "DROP TABLE IF EXISTS $tableName";
|
||||
$this->pdo->exec($sql);
|
||||
}
|
||||
|
||||
private function alterColumnType($tableName, $columnName, $columnType) {
|
||||
$sql = "ALTER TABLE $tableName ALTER COLUMN $columnName TYPE $columnType USING $columnName::$columnType";
|
||||
$this->pdo->exec($sql);
|
||||
}
|
||||
|
||||
private function addColumn($tableName, $columnName, $columnType) {
|
||||
$sql = "ALTER TABLE $tableName ADD COLUMN $columnName $columnType";
|
||||
$this->pdo->exec($sql);
|
||||
}
|
||||
|
||||
private function dropColumn($tableName, $columnName) {
|
||||
$sql = "ALTER TABLE $tableName DROP COLUMN $columnName";
|
||||
$this->pdo->exec($sql);
|
||||
}
|
||||
}
|
||||
48
local/share/ytdll/lib/UpdateManager.php
Normal file
48
local/share/ytdll/lib/UpdateManager.php
Normal file
@@ -0,0 +1,48 @@
|
||||
<?PHP
|
||||
|
||||
// Auteur : Cédrix pour a5l.fr
|
||||
// Projet : scripts-bash/ytdll
|
||||
|
||||
// Version 2024.07.07-14.31
|
||||
// Version initiale
|
||||
|
||||
class UpdateManager {
|
||||
private $pdo;
|
||||
private $database;
|
||||
|
||||
public function __construct($database) {
|
||||
$this->database = $database;
|
||||
$this->pdo = $this->database->getPDO();
|
||||
|
||||
}
|
||||
|
||||
public function manageVersionTables() {
|
||||
$configManager = new Config($this->database);
|
||||
// Obtenir le numéro de version dans le fichier de définitions de table
|
||||
$definitionsTablesFile = json_decode(file_get_contents($configManager->getPathDefinitionsTablesFile()), true);
|
||||
$newDefinitionNumber = $definitionsTablesFile['definition_number'];
|
||||
|
||||
// Obtenir le numéro de version des Tables en base
|
||||
$currentDefinitionNumber = $configManager->getVersionDefinitionsTables();
|
||||
|
||||
if ($currentDefinitionNumber !== null) {
|
||||
echo 'Version not set or an error occurred.';
|
||||
$currentDefinitionNumber = 0;
|
||||
}
|
||||
|
||||
$tables = $definitionsTablesFile['tables'];
|
||||
|
||||
if ($newDefinitionNumber > $currentDefinitionNumber) {
|
||||
$tableManager = new TableManager($this->database);
|
||||
$tableManager->processTables($tables);
|
||||
$configManager->setVersionDefinitionsTables($newDefinitionNumber);
|
||||
if ($currentDefinitionNumber == 0) {
|
||||
echo "Tables created successfully.";
|
||||
} else {
|
||||
echo "Tables updated successfully from $currentDefinitionNumber to $newDefinitionNumber.";
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
39
prep.sh
39
prep.sh
@@ -1,5 +1,16 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script Bash - prep.sh
|
||||
# Auteur : Cédric Abonnel
|
||||
|
||||
# Description : Prépare les fichiers de DOC et listing.
|
||||
|
||||
# Version 07.07.24
|
||||
# - Ajout du traitement de ytdll
|
||||
|
||||
# Version 23.12.14
|
||||
# - Modification du traitement des résumés des DOC. La fonctionnalité n'est pas encore accessible.
|
||||
|
||||
|
||||
# Spécifier le chemin du fichier journal
|
||||
log_dir="$HOME/log"
|
||||
@@ -40,6 +51,7 @@ ls local/bin/ -c1 >.config/files_local-bin
|
||||
# 1. Lister des fichiers dans local/share/doc
|
||||
# 2. Générer les fichiers man dans local/share/man
|
||||
# 3. Lister des fichiers dans local/share/man
|
||||
# 4. Lister des fichiers dans local/share/ytdll et share/ytdll/lib
|
||||
|
||||
# Spécifier le chemin du répertoire du dépôt Git local
|
||||
source_dir="local/share/doc"
|
||||
@@ -105,13 +117,36 @@ fi
|
||||
log "Lister les fichiers présents dans local/share/man"
|
||||
ls local/share/man/ -c1 >.config/files_local-share-man
|
||||
|
||||
log "Lister les fichiers présents dans local/share/ytdll"
|
||||
ls local/share/ytdll/ -c1 >.config/files_local-share-ytdll
|
||||
|
||||
log "Lister les fichiers présents dans local/share/ytdll/lib"
|
||||
ls local/share/ytdll/lib/ -c1 >.config/files_local-share-ytdll-lib
|
||||
|
||||
########
|
||||
# Résumé des DOC
|
||||
|
||||
## Résumé des DOC
|
||||
|
||||
for fichier in local/share/doc/*.md; do
|
||||
echo "Résumé pour $fichier :"
|
||||
awk '/DESCRIPTION/{flag=1; next} /^$/{flag=0} flag' "$fichier"
|
||||
description_found=0
|
||||
empty_line_encountered=false
|
||||
description_started=0
|
||||
|
||||
while IFS= read -r ligne; do
|
||||
if [ "$description_found" -eq 1 ] && [ "$description_started" -eq 1 ] && [ -n "$ligne" ]; then
|
||||
echo "$ligne"
|
||||
elif [ "$description_found" -eq 1 ] && [ "$description_started" -eq 0 ] && [ -n "$ligne" ]; then
|
||||
echo "$ligne"
|
||||
description_started=1
|
||||
elif [ "$description_found" -eq 1 ] && [ "$description_started" -eq 1 ] && [ ! -n "$ligne" ]; then
|
||||
break
|
||||
elif [ "$ligne" = "# DESCRIPTION" ]; then
|
||||
description_found=1
|
||||
fi
|
||||
|
||||
done < "$fichier"
|
||||
|
||||
echo "..."
|
||||
done
|
||||
|
||||
|
||||
Reference in New Issue
Block a user