Compare commits

...

14 Commits

Author SHA1 Message Date
2629dd832c ajout de setup_server_debian.sh 2025-03-03 08:47:52 +01:00
2ceb4be24f correction dans la détection de l'os de updateall.sh 2024-07-05 22:54:50 +02:00
615e9595cf Récupérer le nom de l'OS dans updateall.sh 2024-07-05 22:45:11 +02:00
8bdbfd8b93 trop de modifications 2024-07-05 22:29:55 +02:00
ab81c71b7d add 'updateall' script 2024-02-09 00:06:28 +01:00
8315bddba6 Correction des nom des fichiers qui n'étaient pas protégés. 2024-01-16 22:25:21 +01:00
278e40439d Les scripts conservaient leur extension sh lors de la copie.
Ce qui n'était pas voulu.
2024-01-09 08:47:07 +01:00
0629b4a616 Dans convertMKV : Un fichier est créé pour savoir
si le fichier est en cours de traitement (process) ou traité (processed)
 Changes to be committed:
	modified:   local/bin/convertMKV.sh
2023-12-23 17:20:32 +01:00
516df5809c amélioration des paramètres ffmpeg dans convertMKV 2023-12-23 17:13:51 +01:00
eb8bf3ed38 Uniformisation des documentations 2023-12-14 21:29:06 +01:00
34e7b33357 Uniformisation des pages manuels
Changes to be committed:
	modified:   .config/files_local-share-doc
	modified:   .config/files_local-share-man
	modified:   local/share/doc/castopod_update.1.md
	modified:   local/share/doc/convertPDF.1.md
	modified:   local/share/doc/play_tophoraire.1.md
	modified:   local/share/doc/playlist_gen.1.md
	modified:   local/share/doc/random_music_player.1.md
	modified:   local/share/man/castopod_update.1
	modified:   local/share/man/convertPDF.1
	modified:   local/share/man/play_tophoraire.1
	modified:   local/share/man/playlist_gen.1
	modified:   local/share/man/random_music_player.1
	modified:   prep.sh
2023-12-14 21:27:49 +01:00
7f7c74c288 Précisions sur git clone apportée dans README
cedricAbonnel/scripts-bash#4
2023-12-14 17:29:52 +01:00
83e524aee3 Détail dans README concernant install.sh
cedricAbonnel/scripts-bash#5
2023-12-14 17:27:50 +01:00
8cae67dde9 Changes to be committed:
modified:   .config/files_local-bin
	modified:   .config/files_local-share-doc
	modified:   .config/files_local-share-man
	new file:   local/share/man/castopod_update.1

Mise à jour des fichiers de paramétrage et manuel
2023-12-14 17:19:58 +01:00
33 changed files with 1854 additions and 168 deletions

View File

@@ -1,9 +1,15 @@
podcast_convertImage.sh ytdll
updateall.sh
update_bullseye2buster.sh
check_sha256.sh
generate_playlist.sh
generate_playlist_fp.php
check_smart.sh
convertMKV.sh
castopod_update.sh castopod_update.sh
mkv_extract.sh
podcast_convertImage.sh
random_music_player.sh random_music_player.sh
play_tophaire.sh play_tophaire.sh
mkv_extract.sh
generate_playlist.sh
convertPDF.sh convertPDF.sh
check_domain_cert.sh check_domain_cert.sh
convertMKV.sh

View File

@@ -1,4 +1,5 @@
convertPDF.1.md
play_tophoraire.1.md play_tophoraire.1.md
convertPDF.1.md
castopod_update.1.md
random_music_player.1.md random_music_player.1.md
playlist_gen.1.md playlist_gen.1.md

View File

@@ -1,4 +1,5 @@
playlist_gen.1 playlist_gen.1
random_music_player.1 random_music_player.1
play_tophoraire.1 castopod_update.1
convertPDF.1 convertPDF.1
play_tophoraire.1

View File

@@ -0,0 +1,3 @@
definitionsTables.json
lib
config.json

View File

@@ -0,0 +1,4 @@
UpdateManager.php
Config.php
TableManager.php
Database.php

View File

@@ -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 : Pour utiliser ces scripts, suivez ces étapes :
1. Clonez ce dépôt Git. 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`. 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. 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.

View File

@@ -5,6 +5,9 @@
# Description : Script d'installation des exécutables dans le répertoire '~/.local'" # 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 # Version 23.12.1.3
# - Amélioration des logs # - Amélioration des logs
# - process_deployment_files optmisie les opérations de déployement # - process_deployment_files optmisie les opérations de déployement
@@ -85,15 +88,25 @@ process_deployment_files() {
# Récupérer des fichiers installés # Récupérer des fichiers installés
fileslist_local=$(cat "$file_desc") 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." log "Copie des fichiers listés dans $file_desc."
# Copier les fichiers en supprimant les extensions # Copier les fichiers en supprimant les extensions
for file in $fileslist_local; do 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" log "- $line"
done done
add_uninstall "$destination/$file" add_uninstall "$destination/$file_dest"
done done
else 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é." 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 #### #### .local/share/doc ####
## Declarations ## ## Declarations ##
@@ -145,7 +197,7 @@ process_deployment_files "$destination_dir" "$source_dir" "$file_local_desc"
## Declarations ## ## Declarations ##
# Spécifier le chemin du répertoire ~/.local/bin # Spécifier le chemin du répertoire
destination_dir="$HOME/.local/share/man" destination_dir="$HOME/.local/share/man"
# Spécifier le chemin du répertoire du dépôt Git local # 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 ## ## Declarations ##
# Spécifier le chemin du répertoire ~/.local/bin # Spécifier le chemin du répertoire
destination_dir="$HOME/.local/bin" destination_dir="$HOME/.local/bin"
# Spécifier le chemin du répertoire du dépôt Git local # Spécifier le chemin du répertoire du dépôt Git local

28
local/bin/check_sha256.sh Executable file
View 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
View 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"

View File

@@ -113,7 +113,7 @@ echo -e "==> Traitement des vidéos en cours...\n"|tee -a $logFile
# Replace the file type # Replace the file type
out_file=$(echo "$in_file"|sed "s/\(.*\.\)$input_file_type/\1$output_file_type/g") 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 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:v -map 0:a? -map 0:s?"
cmd_exec="${cmd_exec} -map 0" cmd_exec="${cmd_exec} -map 0"
# cmd_exec="${cmd_exec} -c:a libvorbis -qscale:a 4" # 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} -c:v libx264"
cmd_exec="${cmd_exec} -filter:v \"${vf_option}\"" cmd_exec="${cmd_exec} -filter:v \"${vf_option}\""
cmd_exec="${cmd_exec} ${color_params}" 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} -preset slower"
cmd_exec="${cmd_exec} -bf 5" 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 ${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} -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 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} -movflags +faststart"
cmd_exec="${cmd_exec} -tune fastdecode+zerolatency" cmd_exec="${cmd_exec} -tune fastdecode+zerolatency"
cmd_exec="${cmd_exec} -max_muxing_queue_size 1024 -ss 00:00:00 -t $duration" 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}\"" cmd_exec="${cmd_exec} \"${out_file}\""
echo ${cmd_exec}>> ${listFileName} 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 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" cmd_exec="echo -e \"\\\"${in_file}\\\" > \\\"${out_file}\\\"\">> ~/rsbConvert.log"
echo ${cmd_exec}>> ${listFileName} echo ${cmd_exec}>> ${listFileName}
echo -e "\n ==> Finished $out_file"|tee -a $logFile echo -e "\n ==> Finished \"$out_file\""|tee -a $logFile
fi fi
fi fi

View File

@@ -7,17 +7,32 @@ date_format=$(date +"%Y%m%d_%H%M%S")
# Fonction pour afficher l'utilisation du script # Fonction pour afficher l'utilisation du script
usage() { 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 "Options :"
echo " -n <nombre de fichiers> : Nombre de fichiers à inclure dans le M3U" 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 " -d <répertoire> : Répertoire à scanner (y compris les sous-répertoires)"
echo " -o <fichier de sortie> : Nom du fichier M3U de sortie" 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 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 # 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 case $opt in
E)
search_type="E" # empreintes identiques
;;
U)
search_type="U" # mise à jour de la base
;;
n) n)
num_files=$OPTARG num_files=$OPTARG
;; ;;
@@ -34,6 +49,14 @@ while getopts "n:d:o:" opt; do
esac esac
done 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 # Vérifier si le fichier user-dirs.dirs existe
if [[ -f ~/.config/user-dirs.dirs ]]; then if [[ -f ~/.config/user-dirs.dirs ]]; then
# Charger les variables depuis le fichier user-dirs.dirs # 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 if [[ -v XDG_MUSIC_DIR ]]; then
# Le répertoire XDG_MUSIC_DIR existe # Le répertoire XDG_MUSIC_DIR existe
mkdir -p "$XDG_MUSIC_DIR/playlists" 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 else
# La variable XDG_MUSIC_DIR n'est pas définie # 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 fi
else else
# Le fichier user-dirs.dirs n'existe pas # 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 fi
@@ -60,18 +83,134 @@ if [ ! -d "$directory" ]; then
usage usage
fi 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) temp_file=$(mktemp)
echo "Recherche en cours des 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") count=0
# Création de la liste des fichiers audio les plus récents à partir du fichier temporaire # Si l'option -E est spécifiée, rechercher les doublons basés sur l'empreinte auditive
sort -n -r -o "$temp_file" "$temp_file" if [ "$search_type" == "S" ]; then
head -n "$num_files" "$temp_file" | awk '{print $2}' > "$output_file" 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")
# Création de la liste des fichiers audio les plus récents à partir du fichier temporaire
sort -n -r -o "$temp_file" "$temp_file"
head -n "$num_files" "$temp_file" | awk '{print $2}' > "$output_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 ..."
# 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 # Suppression du fichier temporaire
rm "$temp_file" rm -v "$temp_file"
echo "Le fichier M3U a été créé avec les $num_files fichiers audio les plus récents dans le répertoire $directory : $output_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"

View 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
View 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"

View 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
View 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
View 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();

View File

@@ -1,20 +1,23 @@
\
# NOM # NOM
castopod_update - Mise à jour de CASTOPOD castopod_update - Mise à jour de CASTOPOD
# SYNOPSIS # SYNOPSIS
**castopod_update** [OPTION] castopod_update
# DESCRIPTION # 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. 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 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. 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 # EXEMPLES
@@ -40,23 +47,26 @@ Pour exécuter le script sans aucune option :
castopod_update castopod_update
``` ```
# AUTEURS
Cédric Abonnel - \<canl.sb2023@acemail.fr>
# VERSIONS # VERSIONS
Version 23.12.1 -23.12.14
- Messages des logs améliorés avec plus de détails lors de l'utilisation de 'cp'. : Suppression de l'archive TAR du dossier `save_castopod`.
Version 23.12.14 -23.12.1
- Suppression de l'archive TAR du dossier `save_castopod`. : 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. Pour signaler des erreurs ou des problèmes :
https://git.abonnel.fr/cedricAbonnel/scripts-bash
## RAPPORT D'ERREURS
Pour signaler des erreurs ou des problèmes : https://git.abonnel.fr/cedricAbonnel/scripts-bash
# REMARQUES # 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.

View File

@@ -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 # NOM
**convertPDF**
## DESCRIPTION convertPDF - Compresse des fichiers PDF pour gagner en volume et génère le résultat d'un OCR
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É # 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). 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 : Convertir plusieurs fichiers PDF présent dans le dossier et sous-dossiers courants :
``` ```
convertPDF convertPDF
``` ```
## AUTEUR # VERSIONS
Ce script a été créé par Cédric Abonnel.
## RAPPORT D'ERREURS -23.12.1
Pour signaler des erreurs ou des problèmes : https://git.abonnel.fr/cedricAbonnel/scripts-bash : 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

View File

@@ -1,33 +1,30 @@
\
# NOM # NOM
top_horaire - Gestion du jingle et de l'annonce de l'heure top_horaire - Gestion du jingle et de l'annonce de l'heure
# SYNOPSIS # SYNOPSIS
**top_horaire** [OPTION] top_horaire
# DESCRIPTION # 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. 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. 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. 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. 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 # EXEMPLES
@@ -38,10 +35,17 @@ Pour exécuter le script sans aucune option :
top_horaire top_horaire
``` ```
## AUTEUR # AUTEURS
Ce script a été créé par Cédric Abonnel.
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 Pour signaler des erreurs ou des problèmes : https://git.abonnel.fr/cedricAbonnel/scripts-bash
# VOIR AUSSI # VOIR AUSSI

View File

@@ -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 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. 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 : 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 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 Pour signaler des erreurs ou des problèmes : https://git.abonnel.fr/cedricAbonnel/scripts-bash

View File

@@ -1,39 +1,64 @@
random_music_player(1) - Lecteur de musique aléatoire en ligne de commande \
## Synopsis # NOM
**random_music_player** [OPTIONS]
## Description random_music_player - Lecteur de musique aléatoire en ligne de commande
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 # SYNOPSIS
- Aucune option n'est requise.
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 ```shell
# Fichier de configuration créé [date de création] # Fichier de configuration créé [date de création]
path_music_files=~/Music path_music_files=~/Music
volume=0.06 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 # 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.
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 ```shell
random_music_player random_music_player
``` ```
## Exemple # EXEMPLE
```shell ```shell
$ random_music_player $ random_music_player
``` ```
## Auteur # VERSIONS
Ce script a été créé par Cédric Abonnel.
## Rapport d'erreurs -23.12.1
Pour signaler des erreurs ou des problèmes : https://git.abonnel.fr/cedricAbonnel/scripts-bash : 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

View File

@@ -0,0 +1,88 @@
.\" Automatically generated by Pandoc 3.1.3
.\"
.\" Define V font for inline verbatim, using C font in formats
.\" that render this, and otherwise B font.
.ie "\f[CB]x\f[]"x" \{\
. ftr V B
. ftr VI BI
. ftr VB B
. ftr VBI BI
.\}
.el \{\
. ftr V CR
. ftr VI CI
. ftr VB CB
. ftr VBI CBI
.\}
.TH "" "" "" "" ""
.hy
.PP
.PD 0
.P
.PD
.SH NOM
.PP
castopod_update - Mise à jour de CASTOPOD
.SH SYNOPSIS
.PP
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.
.SH OPTIONS
.PP
Aucune option n\[cq]est nécessaire pour exécuter le script.
.SH CONFIGURATION
.PP
Le script a sa propre configuration qui n\[cq]est pas modifiable.
.PP
Le dossier Web de CASTOPOD doit être nommé \f[V]castopod\f[R].
.PP
Le script doit être positionné au même niveau que le dossier Web de
CASTOPOD.
.PP
Le dossier \f[V]save_castopod\f[R] contient une copie des données de
CASTOPOD, qui est rafraîchie au début de l\[cq]exécution du script.
S\[cq]il n\[cq]existe pas, il sera créé.
.PP
L\[cq]archive de mise à jour doit être spécifiquement nommée
\f[V]castopod*.zip\f[R] et doit être positionnée au même niveau que le
script et le dossier Web de CASTOPOD.
.PP
Le script utilise \f[V]php8.1\f[R] pour effectuer des tâches de
maintenance.
.SH PRÉREQUIS
.PP
Téléchargez l\[cq]archive de mise à jour disponible sur le site
https://castopod.org/.
.SH EXEMPLES
.PP
Pour exécuter le script sans aucune option :
.IP
.nf
\f[C]
castopod_update
\f[R]
.fi
.SH AUTEURS
.PP
Cédric Abonnel - <canl.sb2023\[at]acemail.fr>
.SH VERSIONS
.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
.SH REMARQUES
.PP
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.

View File

@@ -16,29 +16,34 @@
.\} .\}
.TH "" "" "" "" "" .TH "" "" "" "" ""
.hy .hy
.SH NOM
.PP .PP
convertPDF(1) - Compresse des fichiers PDF pour gagner en volume et convertPDF - Compresse des fichiers PDF pour gagner en volume et génère
génère le résultat d\[cq]un OCR le résultat d\[cq]un OCR
.SS SYNOPSIS .SH SYNOPSIS
.PP .PP
\f[B]convertPDF\f[R] convertPDF
.SS DESCRIPTION .SH DESCRIPTION
.PP .PP
Ce script convertit des fichiers PDF en d\[cq]autres formats tels que 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], 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]. \f[V]pdftotext\f[R], \f[V]tesseract\f[R], et \f[V]convert\f[R].
.SS COMPATIBILITÉ .SH COMPATIBILITÉ
.PP .PP
Ce script est compatible avec les fichiers PDF (Portable Document Ce script est compatible avec les fichiers PDF (Portable Document
Format). Format).
.SS EXEMPLE .SH EXEMPLES
.PP .PP
Convertir plusieurs fichiers PDF présent dans le dossier et Convertir plusieurs fichiers PDF présent dans le dossier et
sous-dossiers courants : \f[V]convertPDF\f[R] sous-dossiers courants : \f[V]convertPDF\f[R]
.SS AUTEUR .SH VERSIONS
.TP
-23.12.1
Version originale
.SH AUTEURS
.PP .PP
Ce script a été créé par Cédric Abonnel. Cédric Abonnel - <canl.sb2023\[at]acemail.fr>
.SS RAPPORT D\[cq]ERREURS .SH RAPPORT D\[cq]ERREURS
.PP .PP
Pour signaler des erreurs ou des problèmes : Pour signaler des erreurs ou des problèmes :
https://git.abonnel.fr/cedricAbonnel/scripts-bash https://git.abonnel.fr/cedricAbonnel/scripts-bash

View File

@@ -16,38 +16,39 @@
.\} .\}
.TH "" "" "" "" "" .TH "" "" "" "" ""
.hy .hy
.PP
.PD 0
.P
.PD
.SH NOM .SH NOM
.PP .PP
top_horaire - Gestion du jingle et de l\[cq]annonce de l\[cq]heure top_horaire - Gestion du jingle et de l\[cq]annonce de l\[cq]heure
.SH SYNOPSIS .SH SYNOPSIS
.PP .PP
\f[B]top_horaire\f[R] [OPTION] top_horaire
.SH DESCRIPTION .SH DESCRIPTION
.PP .PP
Le script \f[B]top_horaire\f[R] permet de gérer la lecture d\[cq]un 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 jingle en arrière-plan suivi de l\[cq]annonce de l\[cq]heure actuelle en
utilisant espeak-ng. utilisant espeak-ng.
.SS OPTIONS .SH OPTIONS
.IP \[bu] 2 .PP
Aucune option n\[cq]est requise pour exécuter le script. Aucune option n\[cq]est requise pour exécuter le script.
.SS CONFIGURATION .SH CONFIGURATION
.PP .PP
Le script peut lire la configuration à partir d\[cq]un fichier de Le script peut lire la configuration à partir d\[cq]un fichier de
configuration situé dans le répertoire \f[V]\[ti]/.config/\f[R]. 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 Si le fichier de configuration n\[cq]existe pas, il sera créé avec un
commentaire indiquant la date de création. commentaire indiquant la date de création.
.SS CONFIGURATION DU CHEMIN DU JINGLE
.PP .PP
Le chemin du jingle est configuré par la variable Le chemin du jingle est configuré par la variable
\f[V]jingle_tophoraire\f[R]. \f[V]jingle_tophoraire\f[R].
Si cette variable n\[cq]est pas définie dans le fichier de 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 configuration, elle sera initialisée avec le chemin par défaut du
jingle. jingle.
.SS LECTURE DU JINGLE EN ARRIÈRE-PLAN
.PP .PP
Une fois le chemin du jingle configuré, le script utilise la commande 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. \f[V]paplay\f[R] pour lire le jingle en arrière-plan.
.SS ANNONCE DE L\[cq]HEURE ACTUELLE
.PP .PP
Le script obtient l\[cq]heure actuelle et crée un message d\[cq]annonce Le script obtient l\[cq]heure actuelle et crée un message d\[cq]annonce
contenant l\[cq]heure. contenant l\[cq]heure.
@@ -62,10 +63,14 @@ Pour exécuter le script sans aucune option :
top_horaire top_horaire
\f[R] \f[R]
.fi .fi
.SS AUTEUR .SH AUTEURS
.PP .PP
Ce script a été créé par Cédric Abonnel. Cédric Abonnel - <canl.sb2023\[at]acemail.fr>
.SS RAPPORT D\[cq]ERREURS .SH VERSIONS
.TP
-23.12.1
Version originale
.SH RAPPORT D\[cq]ERREURS
.PP .PP
Pour signaler des erreurs ou des problèmes : Pour signaler des erreurs ou des problèmes :
https://git.abonnel.fr/cedricAbonnel/scripts-bash https://git.abonnel.fr/cedricAbonnel/scripts-bash

View File

@@ -16,42 +16,47 @@
.\} .\}
.TH "" "" "" "" "" .TH "" "" "" "" ""
.hy .hy
.SH playlist_gen(1) - Génère une playlist M3U à partir de fichiers audio
.SS SYNOPSIS
.PP .PP
\f[B]playlist_gen\f[R] [-n <nombre de fichiers>] [-d <répertoire>] [-o .PD 0
<fichier de sortie>] .P
.SS DESCRIPTION .PD
.SH NOM
.PP .PP
\f[B]playlist_gen\f[R] est un script Bash qui permet de générer une playlist_gen - Génère une playlist M3U à partir de fichiers audio
playlist M3U à partir de fichiers audio situés dans un répertoire .SH SYNOPSIS
spécifié. .PP
.SS OPTIONS playlist_gen [-n <nombre de fichiers>] [-d <répertoire>] [-o <fichier de
.IP \[bu] 2 sortie>]
\f[B]-n <nombre de fichiers>\f[R] : Spécifie le nombre de fichiers à .SH DESCRIPTION
inclure dans la playlist. .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. Par défaut, le nombre de fichiers est 100.
.IP \[bu] 2 .TP
\f[B]-d <répertoire>\f[R] : Spécifie le répertoire à scanner pour les -d
fichiers audio. Spécifie le répertoire à scanner pour les fichiers audio.
Par défaut, le répertoire actuel est utilisé. Par défaut, le répertoire actuel est utilisé.
.IP \[bu] 2 .TP
\f[B]-o <fichier de sortie>\f[R] : Spécifie le nom du fichier M3U de -o
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 Par défaut, le fichier est créé dans le répertoire de la musique de
l\[cq]utilisateur. l\[cq]utilisateur.
.SS UTILISATION .SH UTILISATION
.IP .IP
.nf .nf
\f[C] \f[C]
playlist_gen -n 50 -d /chemin/vers/repertoire -o playlist.m3u playlist_gen -n 50 -d /chemin/vers/repertoire -o playlist.m3u
\f[R] \f[R]
.fi .fi
.SS COMPATIBILITÉ .SH COMPATIBILITÉ
.PP .PP
Ce script est compatible avec les fichiers audio aux formats MP3, Opus, Ce script est compatible avec les fichiers audio aux formats MP3, Opus,
Ogg et M4A. Ogg et M4A.
.SS EXEMPLES .SH EXEMPLES
.IP "1." 3 .IP "1." 3
Générer une playlist M3U à partir du répertoire de musique par défaut de Générer une playlist M3U à partir du répertoire de musique par défaut de
l\[cq]utilisateur : l\[cq]utilisateur :
@@ -74,10 +79,14 @@ playlist_gen -n 25 -d /chemin/vers/repertoire
\f[R] \f[R]
.fi .fi
.RE .RE
.SS AUTEUR .SH AUTEURS
.PP .PP
Ce script a été écrit par Cédric Abonnel. Cédric Abonnel - <canl.sb2023\[at]acemail.fr>
.SS RAPPORTS D\[cq]ERREURS .SH VERSIONS
.TP
-23.12.1
Version originale
.SH RAPPORTS D\[cq]ERREURS
.PP .PP
Pour signaler des erreurs ou des problèmes : Pour signaler des erreurs ou des problèmes :
https://git.abonnel.fr/cedricAbonnel/scripts-bash https://git.abonnel.fr/cedricAbonnel/scripts-bash

View File

@@ -17,20 +17,24 @@
.TH "" "" "" "" "" .TH "" "" "" "" ""
.hy .hy
.PP .PP
random_music_player(1) - Lecteur de musique aléatoire en ligne de .PD 0
commande .P
.SS Synopsis .PD
.SH NOM
.PP .PP
\f[B]random_music_player\f[R] OPTIONS random_music_player - Lecteur de musique aléatoire en ligne de commande
.SS Description .SH SYNOPSIS
.PP
random_music_player [options]
.SH DESCRIPTION
.PP .PP
Le script \f[B]random_music_player\f[R] est un lecteur de musique 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 aléatoire en ligne de commande qui lit des fichiers audio à partir
d\[cq]un répertoire spécifié. d\[cq]un répertoire spécifié.
.SS Options .SH OPTIONS
.IP \[bu] 2 .PP
Aucune option n\[cq]est requise. Aucune option n\[cq]est requise.
.SS Configuration .SH CONFIGURATION
.PP .PP
Le script utilise un fichier de configuration situé à Le script utilise un fichier de configuration situé à
\f[V]\[ti]/.config/random_music_player\f[R]. \f[V]\[ti]/.config/random_music_player\f[R].
@@ -47,7 +51,7 @@ volume=0.06
.PP .PP
Vous pouvez éditer ce fichier de configuration pour personnaliser les Vous pouvez éditer ce fichier de configuration pour personnaliser les
réglages du lecteur de musique. réglages du lecteur de musique.
.SS Utilisation .SH UTILISATION
.PP .PP
Pour utiliser le lecteur de musique aléatoire, exécutez simplement le Pour utiliser le lecteur de musique aléatoire, exécutez simplement le
script sans aucune option. script sans aucune option.
@@ -59,17 +63,21 @@ spécifié dans le fichier de configuration et le lira.
random_music_player random_music_player
\f[R] \f[R]
.fi .fi
.SS Exemple .SH EXEMPLE
.IP .IP
.nf .nf
\f[C] \f[C]
$ random_music_player $ random_music_player
\f[R] \f[R]
.fi .fi
.SS Auteur .SH VERSIONS
.TP
-23.12.1
Version originale
.SH AUTEURS
.PP .PP
Ce script a été créé par Cédric Abonnel. Cédric Abonnel - <canl.sb2023\[at]acemail.fr>
.SS Rapport d\[cq]erreurs .SH RAPPORT D\[cq]ERREUR
.PP .PP
Pour signaler des erreurs ou des problèmes : Pour signaler des erreurs ou des problèmes :
https://git.abonnel.fr/cedricAbonnel/scripts-bash https://git.abonnel.fr/cedricAbonnel/scripts-bash

View File

@@ -0,0 +1,9 @@
{
"database": {
"host": "changeme",
"dbname": "changeme",
"user": "changeme",
"password": "changeme"
}
}

View 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)"}
]
}
]
}

View 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;
}
}
}

View 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;
}
}

View 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);
}
}

View 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
View File

@@ -1,5 +1,16 @@
#!/bin/bash #!/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 # Spécifier le chemin du fichier journal
log_dir="$HOME/log" log_dir="$HOME/log"
@@ -40,6 +51,7 @@ ls local/bin/ -c1 >.config/files_local-bin
# 1. Lister des fichiers dans local/share/doc # 1. Lister des fichiers dans local/share/doc
# 2. Générer les fichiers man dans local/share/man # 2. Générer les fichiers man dans local/share/man
# 3. Lister des fichiers 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 # Spécifier le chemin du répertoire du dépôt Git local
source_dir="local/share/doc" source_dir="local/share/doc"
@@ -105,13 +117,36 @@ fi
log "Lister les fichiers présents dans local/share/man" log "Lister les fichiers présents dans local/share/man"
ls local/share/man/ -c1 >.config/files_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 for fichier in local/share/doc/*.md; do
echo "Résumé pour $fichier :" 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 "..." echo "..."
done done