Compare commits
27 Commits
9cfa91532b
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 2629dd832c | |||
| 2ceb4be24f | |||
| 615e9595cf | |||
| 8bdbfd8b93 | |||
| ab81c71b7d | |||
| 8315bddba6 | |||
| 278e40439d | |||
| 0629b4a616 | |||
| 516df5809c | |||
| eb8bf3ed38 | |||
| 34e7b33357 | |||
| 7f7c74c288 | |||
| 83e524aee3 | |||
| 8cae67dde9 | |||
| 91588d842e | |||
| bd0dbf5bde | |||
| bb001830e4 | |||
| 9dc0dcea7f | |||
| 52581030f8 | |||
| 6b67f264e6 | |||
| 2349139ced | |||
| 2a64bc6d01 | |||
| e7f4ff842e | |||
| fe642e74ec | |||
| 8cd6407721 | |||
| 11ce999181 | |||
| 03a2e899a3 |
@@ -1,7 +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
|
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
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
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 :
|
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.
|
||||||
|
|
||||||
@@ -23,9 +26,11 @@ Le dossier `local/share/man/man1` contient la documentation de chaque script au
|
|||||||
Le script `uninstall.sh` permet de supprimer tous les fichiers précédemment copiés avec le script `install.sh`, en se basant sur le fichier utilisateur `~/.config/a5l_scripts-bash_uninstall-list`.
|
Le script `uninstall.sh` permet de supprimer tous les fichiers précédemment copiés avec le script `install.sh`, en se basant sur le fichier utilisateur `~/.config/a5l_scripts-bash_uninstall-list`.
|
||||||
|
|
||||||
# Licence
|
# Licence
|
||||||
Ce travail est sous licence [Creative Commons Attribution-ShareAlike 4.0 International License][cc-by-sa].
|
Ce travail est sous licence [Creative Commons Attribution-ShareAlike 4.0 International License][cc-by-sa] par Cédric Abonnel.
|
||||||
|
|
||||||
[![CC BY-SA 4.0][cc-by-sa-image]][cc-by-sa]
|
[![CC BY-SA 4.0][cc-by-sa-image]][cc-by-sa]
|
||||||
|
|
||||||
[cc-by-sa]: http://creativecommons.org/licenses/by-sa/4.0/
|
[cc-by-sa]: http://creativecommons.org/licenses/by-sa/4.0/
|
||||||
[cc-by-sa-image]: https://licensebuttons.net/l/by-sa/4.0/88x31.png
|
[cc-by-sa-image]: https://licensebuttons.net/l/by-sa/4.0/88x31.png
|
||||||
|
|
||||||
|
Test
|
||||||
214
install.sh
214
install.sh
@@ -1,5 +1,24 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Script Bash - install.sh
|
||||||
|
# Auteur : Cédric Abonnel
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# Version 23.12.1.2
|
||||||
|
# - Fonctionnalité de purge des logs ajoutée.
|
||||||
|
|
||||||
|
# Version 23.12.1.1
|
||||||
|
# - Messages des logs améliorés avec plus de détail avec 'cp'.
|
||||||
|
|
||||||
|
|
||||||
# Spécifier le chemin du fichier journal
|
# Spécifier le chemin du fichier journal
|
||||||
log_dir="$HOME/log"
|
log_dir="$HOME/log"
|
||||||
log_file="${log_dir}/a5l-scripts_bash-$(date '+%Y%m%d-%H%M%S')-$$.log"
|
log_file="${log_dir}/a5l-scripts_bash-$(date '+%Y%m%d-%H%M%S')-$$.log"
|
||||||
@@ -14,8 +33,10 @@ error() {
|
|||||||
|
|
||||||
# Fonction pour enregistrer les messages de journal
|
# Fonction pour enregistrer les messages de journal
|
||||||
log() {
|
log() {
|
||||||
|
if [ -n "$1" ]; then
|
||||||
echo "$(date '+%Y-%m-%d %H:%M:%S') - $$ - $1" >> "$log_file"
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - $$ - $1" >> "$log_file"
|
||||||
echo "$1"
|
echo "$1"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
create_dir() {
|
create_dir() {
|
||||||
@@ -43,17 +64,112 @@ add_uninstall() {
|
|||||||
if ! grep -q "$fichier_a_supprimer" "$uninstall_list"; then
|
if ! grep -q "$fichier_a_supprimer" "$uninstall_list"; then
|
||||||
# Ajouter le fichier à uninstall_list
|
# Ajouter le fichier à uninstall_list
|
||||||
echo "$fichier_a_supprimer" >> "$uninstall_list"
|
echo "$fichier_a_supprimer" >> "$uninstall_list"
|
||||||
|
log "- Le fichier '$fichier_a_supprimer' ajouté à la liste de fichiers installés"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
## Fonction de Traitement ##
|
||||||
|
process_deployment_files() {
|
||||||
|
local destination="$1"
|
||||||
|
local source="$2"
|
||||||
|
local file_desc="$3"
|
||||||
|
|
||||||
|
log "### Déploiement des fichiers pour $destination"
|
||||||
|
|
||||||
|
# S'assurer que le répertoire de destination existe, sinon, le créer
|
||||||
|
create_dir "$destination"
|
||||||
|
|
||||||
|
# Copier sélectivement les fichiers du dépôt Git local vers $destination en préservant la structure
|
||||||
|
log "Vérification de l'existence de '$file_desc'"
|
||||||
|
|
||||||
|
# Vérifier si le fichier "$file_desc" existe
|
||||||
|
if [ -e "$file_desc" ]; then
|
||||||
|
# Récupérer des fichiers installés
|
||||||
|
fileslist_local=$(cat "$file_desc")
|
||||||
|
|
||||||
|
# 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
|
||||||
|
# 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_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é."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Affiche un message de confirmation
|
||||||
|
log "Les fichiers du dépôt Git local ont été copiés vers $destination_dir avec succès."
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
purge_old_logs(){
|
||||||
|
find "$log_dir" -type f -name "a5l-scripts_bash-*.log" -mtime +10 -exec rm {} \;
|
||||||
|
find "$log_dir" -type f -name "a5l-scripts_bash_prep-*.log" -mtime +10 -exec rm {} \;
|
||||||
|
}
|
||||||
|
|
||||||
log "Debut du script"
|
log "Debut du script"
|
||||||
|
|
||||||
## Post traitement : log
|
## Post traitement : log
|
||||||
|
|
||||||
|
|
||||||
# S'assurer que le répertoire de destination existe, sinon, le créer
|
# S'assurer que le répertoire de destination existe, sinon, le créer
|
||||||
create_dir "${log_dir}"
|
create_dir "${log_dir}"
|
||||||
|
|
||||||
|
# Purger les les logs
|
||||||
|
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"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -70,33 +186,9 @@ source_dir="local/share/doc"
|
|||||||
file_local_desc=.config/files_local-share-doc
|
file_local_desc=.config/files_local-share-doc
|
||||||
|
|
||||||
## Traitement ##
|
## Traitement ##
|
||||||
|
log "## Debut du traitement pour $destination_dir"
|
||||||
|
|
||||||
log "Debut du Traitement pour $destination_dir"
|
process_deployment_files "$destination_dir" "$source_dir" "$file_local_desc"
|
||||||
|
|
||||||
|
|
||||||
# S'assurer que le répertoire de destination existe, sinon, le créer
|
|
||||||
create_dir "$destination_dir"
|
|
||||||
|
|
||||||
log " _ Traitement des fichiers à copier dans $destination_dir"
|
|
||||||
# Copier sélectivement les fichiers du dépôt Git local vers ~/.local/bin en préservant la structure
|
|
||||||
# Vérifier si le fichier "$file_local_desc" existe
|
|
||||||
if [ -e "$file_local_desc" ]; then
|
|
||||||
# Récupérer des fichiers installés
|
|
||||||
fileslist_local=$(cat "$file_local_desc")
|
|
||||||
|
|
||||||
# Utilisez la commande rsync pour copier les fichiers
|
|
||||||
log " Copie des fichiers listés dans $file_local_desc"
|
|
||||||
|
|
||||||
# Copier les fichiers en supprimant les extensions
|
|
||||||
for file in $fileslist_local; do
|
|
||||||
cp -v "$source_dir/$file" "$destination_dir/" || error "Impossible de copier $source_dir/$file vers $destination_dir/"
|
|
||||||
add_uninstall "$destination_dir/$file"
|
|
||||||
done
|
|
||||||
|
|
||||||
else
|
|
||||||
error "Le fichier '$file_local_desc' n'existe pas. Votre dépôt Git local n'est pas complet ou quelque chose s'est mal passé."
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -105,7 +197,7 @@ fi
|
|||||||
|
|
||||||
## 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
|
||||||
@@ -113,45 +205,19 @@ source_dir="local/share/man"
|
|||||||
|
|
||||||
file_local_desc=.config/files_local-share-man
|
file_local_desc=.config/files_local-share-man
|
||||||
|
|
||||||
|
|
||||||
## Traitement ##
|
## Traitement ##
|
||||||
|
log "## Debut du traitement pour $destination_dir"
|
||||||
|
|
||||||
log "Debut du Traitement pour $destination_dir"
|
log "### Debut du Traitement pour la gestion du PATH avec $destination_dir"
|
||||||
|
|
||||||
# S'assurer que le répertoire de destination existe, sinon, le créer
|
|
||||||
create_dir "$destination_dir"
|
|
||||||
|
|
||||||
# Vérifier si le répertoire destination est déjà dans le PATH
|
# Vérifier si le répertoire destination est déjà dans le PATH
|
||||||
if [[ ! ":$(manpath):" == *":$destination_dir:"* ]]; then
|
if [[ ! ":$(manpath):" == *":$destination_dir:"* ]]; then
|
||||||
# Ajouter le répertoire destination au PATH dans le fichier de configuration de session de l'utilisateur
|
# Ajouter le répertoire destination au PATH dans le fichier de configuration de session de l'utilisateur
|
||||||
echo 'export MANPATH="$(manpath):'"$destination_dir"'"' >> ~/.bashrc
|
echo 'export MANPATH="$(manpath):'"$destination_dir"'"' >> ~/.bashrc
|
||||||
source ~/.bashrc
|
source ~/.bashrc
|
||||||
log " _ $destination_dir a été ajouté au MANPATH dans le fichier de configuration de session de l'utilisateur."
|
log " $destination_dir a été ajouté au MANPATH dans le fichier de configuration de session de l'utilisateur."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log " _ Traitement des fichiers à copier dans $destination_dir"
|
process_deployment_files "$destination_dir" "$source_dir" "$file_local_desc"
|
||||||
# Copier sélectivement les fichiers du dépôt Git local
|
|
||||||
# Vérifier si le fichier "$file_local_desc" existe
|
|
||||||
if [ -e "$file_local_desc" ]; then
|
|
||||||
# Récupérer des fichiers installés
|
|
||||||
fileslist_local=$(cat "$file_local_desc")
|
|
||||||
|
|
||||||
# Utilisez la commande rsync pour copier les fichiers
|
|
||||||
log " Copie des fichiers listés dans $file_local_desc"
|
|
||||||
|
|
||||||
# Copier les fichiers en supprimant les extensions
|
|
||||||
for file in $fileslist_local; do
|
|
||||||
cp -v "$source_dir/$file" "$destination_dir/man1/" || error "Impossible de fichier $source_dir/$file vers $destination_dir/man1/"
|
|
||||||
add_uninstall "$destination_dir/man1/$file"
|
|
||||||
done
|
|
||||||
|
|
||||||
else
|
|
||||||
error "Le fichier '$file_local_desc' n'existe pas. Votre dépôt Git local n'est pas complet ou quelque chose s'est mal passé."
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -159,7 +225,7 @@ fi
|
|||||||
|
|
||||||
## 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
|
||||||
@@ -168,40 +234,22 @@ source_dir="local/bin"
|
|||||||
file_local_desc=.config/files_local-bin
|
file_local_desc=.config/files_local-bin
|
||||||
|
|
||||||
## Traitement ##
|
## Traitement ##
|
||||||
|
log "## Debut du traitement pour $destination_dir"
|
||||||
log "Debut du Traitement pour $destination_dir"
|
|
||||||
|
|
||||||
# S'assurer que le répertoire de destination existe, sinon, le créer
|
# S'assurer que le répertoire de destination existe, sinon, le créer
|
||||||
create_dir "$destination_dir"
|
create_dir "$destination_dir"
|
||||||
|
|
||||||
|
log "### Debut du Traitement pour la gestion du PATH avec $destination_dir"
|
||||||
# Vérifier si le répertoire destination est déjà dans le PATH
|
# Vérifier si le répertoire destination est déjà dans le PATH
|
||||||
if [[ ! ":$PATH:" == *":$destination_dir:"* ]]; then
|
if [[ ! ":$PATH:" == *":$destination_dir:"* ]]; then
|
||||||
# Ajouter le répertoire destination au PATH dans le fichier de configuration de session de l'utilisateur
|
# Ajouter le répertoire destination au PATH dans le fichier de configuration de session de l'utilisateur
|
||||||
echo 'export PATH="$PATH:'"$destination_dir"'"' >> ~/.bashrc
|
echo 'export PATH="$PATH:'"$destination_dir"'"' >> ~/.bashrc
|
||||||
source ~/.bashrc
|
source ~/.bashrc
|
||||||
log " _ $destination_dir a été ajouté au PATH dans le fichier de configuration de session de l'utilisateur."
|
log " $destination_dir a été ajouté au PATH dans le fichier de configuration de session de l'utilisateur."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log " _ Traitement des fichiers à copier dans $destination_dir"
|
## Traitement ##
|
||||||
# Copier sélectivement les fichiers du dépôt Git local vers ~/.local/bin en préservant la structure
|
process_deployment_files "$destination_dir" "$source_dir" "$file_local_desc"
|
||||||
# Vérifier si le fichier "$file_local_desc" existe
|
|
||||||
if [ -e "$file_local_desc" ]; then
|
|
||||||
# Récupérer des fichiers installés
|
|
||||||
fileslist_local=$(cat "$file_local_desc")
|
|
||||||
|
|
||||||
# Utilisez la commande rsync pour copier les fichiers
|
log "## Fin du script. Bonne continuation."
|
||||||
log " Copie des fichiers"
|
|
||||||
|
|
||||||
# Copier les fichiers en supprimant les extensions
|
|
||||||
for file in $fileslist_local; do
|
|
||||||
new_name="${file%.*}" # Supprimer l'extension
|
|
||||||
cp -v "$source_dir/$file" "$destination_dir/$new_name" || error "Impossible de fichier $source_dir/$file vers $destination_dir/$new_nam"
|
|
||||||
add_uninstall "$destination_dir/$new_name"
|
|
||||||
done
|
|
||||||
|
|
||||||
else
|
|
||||||
error "Le fichier $file_local_desc n'existe pas. Votre dépôt Git local n'est pas complet ou quelque chose s'est mal passé."
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Affiche un message de confirmation
|
|
||||||
log "Les fichiers du dépôt Git local ont été copiés vers $destination_dir avec succès."
|
|
||||||
|
|||||||
@@ -1,27 +1,19 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Obtenir la date et l'heure actuelles
|
# Script Bash - castopod_update.sh
|
||||||
current_date=$(date +%Y%m%d_%H%M%S)
|
# Auteur : Cédric Abonnel
|
||||||
|
|
||||||
|
# Description : Script de mise à jour Castopod
|
||||||
|
|
||||||
|
# Version 23.12.14
|
||||||
|
|
||||||
# Definitions
|
# Definitions
|
||||||
archive_save="save_castopod.tar"
|
|
||||||
rep_save="save_castopod"
|
rep_save="save_castopod"
|
||||||
sources_save=("castopod/public/media" "castopod/.env")
|
sources_save=("castopod/public/media" "castopod/.env")
|
||||||
|
php_bin="/usr/bin/php8.1"
|
||||||
|
castopod_root="castopod"
|
||||||
|
|
||||||
|
|
||||||
# Vérifier la présence d'une archive TAR
|
|
||||||
if [ -e "$archive_save" ]; then
|
|
||||||
|
|
||||||
echo "Démarrer l'extraction de l'archive TAR"
|
|
||||||
pv "$archive_save" | tar xf -
|
|
||||||
rm "$archive_save"
|
|
||||||
|
|
||||||
echo "Extraction terminée."
|
|
||||||
else
|
|
||||||
echo "Aucune archive TAR '$archive_save' trouvée. Pas de sauvegarde précédente trouvée."
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo " -- "
|
echo " -- "
|
||||||
|
|
||||||
# Synchroniser les fichiers sources avec le dossier de sauvegarde
|
# Synchroniser les fichiers sources avec le dossier de sauvegarde
|
||||||
@@ -38,25 +30,53 @@ for source in "${sources_save[@]}"; do
|
|||||||
rsync -a "$source" "$rep_save/"
|
rsync -a "$source" "$rep_save/"
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# LEGACY 23.12.14 : Suppression de l'archive TAR si elle existe. Elle n'est plus gérée.
|
||||||
|
archive_file="save_castopod.tar"
|
||||||
|
|
||||||
|
if [ -f "$archive_file" ]; then
|
||||||
|
echo "L'archive $archive_file n'est plus gérée par le script. Seul le dossier 'save_castopod' est pris en compte."
|
||||||
|
rm -v "$archive_file"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
echo " -- "
|
echo " -- "
|
||||||
|
|
||||||
# Vérifier la présence de l'archive ZIP
|
# Vérifier la présence de l'archive ZIP
|
||||||
if [[ -n $(ls castopod*.zip 2>/dev/null) ]]; then
|
if [[ -n $(ls castopod*.zip 2>/dev/null) ]]; then
|
||||||
|
|
||||||
# Supprimer tous les fichiers et dossiers, sauf .env et public/media
|
|
||||||
find castopod/ -not -name '.env' -not -path 'castopod/public/media/*' -delete
|
|
||||||
|
|
||||||
# Extraire le fichier ZIP présent dans le dossier courant
|
# Supprimer tous les fichiers et dossiers, sauf ceux présents dans sources_save
|
||||||
unzip -o -q castopod*.zip
|
## Construire la commande find à partir du tableau sources_save
|
||||||
|
find_command="find \"$castopod_root/\" "
|
||||||
|
for source in "${sources_save[@]}"; do
|
||||||
|
if [ -d "$source" ]; then
|
||||||
|
### Si c'est un dossier, exclure tous les fichiers et sous-dossiers sous ce dossier
|
||||||
|
find_command+=" -type d -path \"$source\" -prune -o "
|
||||||
|
elif [ -f "$source" ]; then
|
||||||
|
### Si c'est un fichier, exclure ce fichier spécifique
|
||||||
|
find_command+=" -not -name \"$(basename "$source")\" -o "
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
find_command+=" -delete"
|
||||||
|
|
||||||
|
## Exécuter la commande find
|
||||||
|
eval "$find_command"
|
||||||
|
|
||||||
|
|
||||||
|
# Extraire le fichier ZIP de mise à jour présent dans le dossier courant
|
||||||
|
echo "Mise à jour en cours de déploiement ... "
|
||||||
|
unzip -o -q castopod*.zip && echo " ... terminée."
|
||||||
|
|
||||||
|
|
||||||
# Désactiver l'archive en renommant les fichiers ZIP en ajoutant ".old" à leur nom
|
# Désactiver l'archive en renommant les fichiers ZIP en ajoutant ".old" à leur nom
|
||||||
|
echo "Désactivation de l'archive de mise à jour."
|
||||||
for file in castopod*.zip; do
|
for file in castopod*.zip; do
|
||||||
mv "$file" "${file}.old"
|
mv "$file" "${file}.old"
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
||||||
# Mettre à jour le schéma de la base de données
|
# Mettre à jour le schéma de la base de données
|
||||||
/usr/bin/php8.1 castopod/spark castopod:database-update
|
"$php_bin" castopod/spark castopod:database-update
|
||||||
|
|
||||||
|
|
||||||
else
|
else
|
||||||
@@ -65,23 +85,3 @@ fi
|
|||||||
|
|
||||||
echo " -- "
|
echo " -- "
|
||||||
|
|
||||||
|
|
||||||
# Créer une nouvelle archive compressée à partir du répertoire de sauvegarde et supprimer le répertoire
|
|
||||||
|
|
||||||
if [ -e "$rep_save/" ]; then
|
|
||||||
|
|
||||||
echo "Création de l'archive en cours '$archive_save'"
|
|
||||||
# Créer l'archive avec tar et afficher la progression
|
|
||||||
tar -cf - ./"$rep_save"/ -P | pv -s $(du -sb ./"$rep_save"/ | awk '{print $1}') > "$archive_save"
|
|
||||||
echo "Création de l'archive terminée."
|
|
||||||
echo " -- "
|
|
||||||
|
|
||||||
# Supprimer le répertoire avec une barre de progression
|
|
||||||
echo "Suppression du répertoire en cours '$rep_save/'"
|
|
||||||
rm -vrf "$rep_save/" | pv -l -s $(du -a "$rep_save/" 2>/dev/null | wc -l) > /dev/null
|
|
||||||
echo "Suppression du répertoire terminée."
|
|
||||||
else
|
|
||||||
echo "Le répertoire '$rep_save/' n'existe pas. Interruption de l'opération."
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo " -- "
|
|
||||||
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
|
# 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 "touch \"${out_file}.process\"">> ${listFileName}
|
||||||
echo ${cmd_exec}>> ${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
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
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";
|
||||||
|
|
||||||
|
?>
|
||||||
35
local/bin/podcast_convertImage.sh
Executable file
35
local/bin/podcast_convertImage.sh
Executable file
@@ -0,0 +1,35 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Vérifier si ImageMagick est installé
|
||||||
|
if ! command -v convert &> /dev/null; then
|
||||||
|
echo "ImageMagick n'est pas installé. Veuillez l'installer."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Vérifier si l'argument de l'image est fourni
|
||||||
|
if [ $# -eq 0 ]; then
|
||||||
|
echo "Usage: $0 <image_source>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Récupérer le nom du fichier source
|
||||||
|
image_source="$1"
|
||||||
|
|
||||||
|
# Vérifier si le fichier source existe
|
||||||
|
if [ ! -f "$image_source" ]; then
|
||||||
|
echo "Le fichier source '$image_source' n'existe pas."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Utiliser la commande "file" pour vérifier le type de fichier
|
||||||
|
if ! file "$image_source" | grep -q "image"; then
|
||||||
|
echo "Le fichier '$image_source' n'a pas l'air d'être une image. Je tente le coup quand même."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Enlever l'extension du nom de fichier
|
||||||
|
filename_no_extension="${image_source%.*}"
|
||||||
|
|
||||||
|
# Redimensionner l'image en 1400x1400 pixels et la convertir en JPG
|
||||||
|
convert "$image_source" -resize 1400x1400 "${filename_no_extension}.jpg"
|
||||||
|
|
||||||
|
echo "L'image a été redimensionnée en 1400x1400 pixels et enregistrée en tant que '${filename_no_extension}.jpg'."
|
||||||
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();
|
||||||
72
local/share/doc/castopod_update.1.md
Normal file
72
local/share/doc/castopod_update.1.md
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
\
|
||||||
|
|
||||||
|
# NOM
|
||||||
|
|
||||||
|
castopod_update - Mise à jour de CASTOPOD
|
||||||
|
|
||||||
|
# SYNOPSIS
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
# OPTIONS
|
||||||
|
|
||||||
|
Aucune option n'est nécessaire pour exécuter le script.
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
|
||||||
|
Le script a sa propre configuration qui n'est pas modifiable.
|
||||||
|
|
||||||
|
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éé.
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
Téléchargez l'archive de mise à jour disponible sur le site
|
||||||
|
https://castopod.org/.
|
||||||
|
|
||||||
|
# EXEMPLES
|
||||||
|
|
||||||
|
Pour exécuter le script sans aucune option :
|
||||||
|
|
||||||
|
```
|
||||||
|
castopod_update
|
||||||
|
```
|
||||||
|
|
||||||
|
# AUTEURS
|
||||||
|
|
||||||
|
Cédric Abonnel - \<canl.sb2023@acemail.fr>
|
||||||
|
|
||||||
|
# VERSIONS
|
||||||
|
|
||||||
|
-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`.
|
||||||
|
|
||||||
|
|
||||||
|
# RAPPORT D'ERREURS
|
||||||
|
|
||||||
|
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.
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
88
local/share/man/castopod_update.1
Normal file
88
local/share/man/castopod_update.1
Normal 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.
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
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
|
#!/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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user