#1 Le 15/07/2024, à 17:36
- lynn
Poster une image facilement avec imgup
Bonjour,
Imgup utilise les services suivants :
freeimage.host
ImgBB
Cloudinary
Ça fonctionne via le terminal (Ex. ./imgup image.png) ou en l'utilisant avec Nautilus Script. Nécessite l'installation des paquets jq et curl. Ne pas oublier de rendre le script exécutable.
Zenity, qui est installé par défaut sur la plupart des distributions, est optionnel pour celles et ceux qui ne travaillent qu'en ligne de commande. Le reste des informations est noté en début de script.
N'hésitez pas à commenter ou proposer des idées pour améliorer/corriger le script.
#!/bin/bash
# imgup version 0.3.5 by lynn (08/19/2024)
# Licence: Free, very free...
#
# Allows you to upload photos to these hosting services:
# -> https://freeimage.host
# -> https://imgbb.com
# -> https://cloudinary.com
#
# REQUIRES: cURL, jq
# Optional : zenity
#
# USAGE: ./imgup or ./imgup image.png or by using nautilus scripts method (zenity package required).
# Links can be saved in a text file wherever you want. Home directory is chosen by default.
#
# IMAGE FORMATS:
# Most image formats are supported, include PDF (except freeimage.host). Visit the host's website for
# more information.
# Be warned readability of text in hosted pdf files may differ from the original file.
#
# TO KNOWN:
# To be able to upload to these hosting sites, it is necessary to have an API key for each site. To
# date, there is a free API key for FreeImage available on their site. ImgBB et Cloudinary provides
# free API key but registration is needed.
# Terms and conditions of use of the different hosts available on their respective sites.
#
# I am not affiliated with the above-mentioned sites directly or indirectly.
# Loading configuration file
load_config() {
config_file="$HOME/.img_upload_config"
if [ -f "$config_file" ]
then
chmod 600 "$config_file"
. "$config_file"
fi
# Set default output file if not defined
output_file=${OUTPUT_FILE:-$HOME/uploaded_images_links.txt}
}
# Function to display an information message or error
display_message() {
message_type="$1"
message="$2"
if [ "$use_zenity" = "true" ]
then
case $message_type in
"info")
zenity --info \
--width="300" \
--height="200" \
--text="$message"
;;
"error")
zenity --error \
--width="300" \
--height="200" \
--text="$message"
;;
*)
zenity --error \
--width="300" \
--height="200" \
--text="Unsupported message type: $message_type"
;;
esac
else
case $message_type in
"info")
printf '%s\n' "INFORMATION: $message"
;;
"error")
printf '%s\n' "ERROR: $message" >&2
;;
*)
printf '%s\n' "Unsupported message type: $message_type" >&2
;;
esac
fi
}
# Function to check dependencies
check_dependencies() {
required_progs="zenity curl jq"
missing_dependencies="false"
# If zenity called but not installed
for prog in $required_progs
do
if [ "$prog" = "zenity" ] && [ "$use_zenity" != "true" ]
then
continue
fi
# Check necessary dependencies
if ! hash "$prog" >/dev/null 2>&1
then
if [ "$prog" = "zenity" ]
then
$(command -v xterm) -T "Zenity package is missing" -fa 'Monospace' -fs 12 \
-e "dialog --msgbox \"Using this script graphically requires the installation of 'zenity' package.\" 8 45"
exit 1
else
missing_dependencies="true"
fi
fi
done
if [ "$missing_dependencies" = "true" ]
then
display_message "error" "Required dependencies are missing. «jq» and «curl» must be installed."
exit 1
fi
}
# Function to ask question
ask_question() {
question="$1"
default_answer="$2"
if [ "$use_zenity" = "true" ]
then
zenity --question \
--text="$question"
return $?
else
while :
do
printf '%s ' "$question (Default $default_answer):"
read -r yn
yn=${yn:-$default_answer}
case $yn in
[Yy]*)
return 0
;;
[Nn]*)
return 1
;;
*)
printf '%s\n' "Please answer yes or no."
;;
esac
done
fi
}
# Function to get user input
get_input() {
if [ "$use_zenity" = "true" ]
then
zenity --entry \
--title="$1" \
--text="$2" \
--entry-text ""
else
printf '%s ' "$2" > /dev/tty
read -r input < /dev/tty
printf '%s\n' "$input"
fi
}
# Function for choosing a hosting service
choose_hosting_service() {
while :
do
if [ "$use_zenity" = "true" ]
then
hosting_service=$(zenity --list \
--title="Hosting Service and Settings" \
--text="What do you want to do?" \
--column="Service" \
--ok-label="Accept" \
--cancel-label="Cancel" \
--width="560" \
--height="390" \
"FreeImageHost" \
"ImgBB" \
"Cloudinary" \
"Settings" \
"Quit")
else
printf '%s\n' "Choose an Image Hosting Service:"
printf '%s\n' "1) FreeImageHost"
printf '%s\n' "2) ImgBB"
printf '%s\n' "3) Cloudinary"
printf '%s\n' "4) Settings"
printf '%s\n' "5) Quit"
printf '%s ' "Enter your choice (1-5):"
read -r choice
case "$choice" in
1)
hosting_service="FreeImageHost"
;;
2)
hosting_service="ImgBB"
;;
3)
hosting_service="Cloudinary"
;;
4)
hosting_service="Settings"
;;
5)
hosting_service="Quit"
;;
*)
hosting_service=""
;;
esac
fi
case $hosting_service in
"FreeImageHost"|"ImgBB"|"Cloudinary")
if [ "$hosting_service" = "Cloudinary" ]
then
if [ -z "$Cloudinary_CLOUD_NAME" ] || [ -z "$Cloudinary_API_KEY" ] || [ -z "$Cloudinary_API_SECRET" ] || [ -z "$Cloudinary_UPLOAD_PRESETS" ]
then
display_message "info" "Cloudinary requires Cloud Name, API Key, API Secret and Upload Presets Name."
configure_api_keys_for "Cloudinary"
load_config
fi
fi
# Checking if the file is a PDF and the service is FreeImageHost
if [ "$is_pdf" = "true" ] && [ "$hosting_service" = "FreeImageHost" ]
then
display_message "error" "You have selected a PDF file, which is not supported by FreeImageHost. Try ImgBB or Cloudinary."
else
# Updating or adding hosting service in configuration file
if grep -q "^HOSTING_SERVICE=" "$config_file" 2>/dev/null
then
sed -i "s/^HOSTING_SERVICE=.*/HOSTING_SERVICE=$hosting_service/" "$config_file"
else
printf '%s\n' "HOSTING_SERVICE=$hosting_service" >> "$config_file"
fi
# Checking the presence of the API key and configuring if missing
case $hosting_service in
"FreeImageHost")
if [ -z "$FreeImageHost_API_KEY" ]
then
display_message "info" "An API key is required for FreeImageHost."
configure_api_keys_for "FreeImageHost"
load_config
fi
;;
"ImgBB")
if [ -z "$ImgBB_API_KEY" ]
then
display_message "info" "An API key is required for ImgBB."
configure_api_keys_for "ImgBB"
load_config
fi
;;
*)
load_config
;;
esac
break
fi
;;
"Settings")
configure_api_keys
;;
"Quit")
exit 1
;;
*)
display_message "error" "No hosting service selected. The script will now end."
exit 1
;;
esac
done
}
# Function to configure API keys for a specific host
configure_api_keys_for() {
service="$1"
stored_key=$(grep "^${service}_API_KEY=" "$config_file" | cut -d '=' -f 2)
# Centralized function to update or add configuration
update_config() {
key_name="$1"
value="$2"
if grep -q "^${key_name}=" "$config_file"
then
sed -i "s/^${key_name}=.*/${key_name}=$value/" "$config_file"
else
printf '%s\n' "${key_name}=$value" >> "$config_file"
fi
}
# Handle Cloudinary with custom menu
if [ "$service" = "Cloudinary" ]
then
if [ "$use_zenity" = "true" ]
then
action=$(zenity --list \
--title="Cloudinary Settings" \
--text="Choose an option for Cloudinary" \
--column="Option" \
--ok-label="Accept" \
--cancel-label="Cancel" \
--width="560" \
--height="390" \
"Manage Credentials" \
"Previous Screen" \
"Quit")
else
printf '%s\n' "Choose an option for Cloudinary:"
printf '%s\n' "1) Manage Credentials"
printf '%s\n' "2) Previous Screen"
printf '%s\n' "3) Quit"
printf '%s ' "Enter your choice (1-3):"
read -r action_choice
case $action_choice in
1)
action="Manage Credentials"
;;
2)
action="Previous Screen"
;;
3)
action="Quit"
;;
*)
display_message "error" "Invalid choice. Please try again."
configure_api_keys_for "$service"
return
;;
esac
fi
case $action in
"Manage Credentials")
manage_cloudinary_creds
;;
"Previous Screen")
configure_api_keys
;;
"Quit")
exit 1
;;
*)
display_message "error" "Invalid choice. Please try again."
configure_api_keys_for "$service"
;;
esac
return
fi
# Handle other services as before
if [ -n "$stored_key" ]
then
if [ "$use_zenity" = "true" ]
then
action=$(zenity --list \
--title="Existing API key" \
--text="An API key is already configured for $service. What do you want to do?" \
--column="Service" \
--ok-label="Accept" \
--cancel-label="Cancel" \
--width="560" \
--height="390" \
"Change API key" \
"Delete existing key" \
"Previous screen" \
"Quit")
else
printf '%s\n' "An API key is already configured for $service. What do you want to do?"
printf '%s\n' "1) Change API key"
printf '%s\n' "2) Delete existing key"
printf '%s\n' "3) Previous screen"
printf '%s\n' "4) Quit"
printf '%s ' "Enter your choice (1-4):"
read -r action_choice
case $action_choice in
1)
action="Change API key"
;;
2)
action="Delete existing key"
;;
3)
action="Previous screen"
;;
4)
action="Quit"
;;
*)
display_message "error" "Invalid choice. Please try again."
configure_api_keys_for "$service"
return
;;
esac
fi
case $action in
"Change API key")
stored_key=$(get_input "Enter API key for $service" "Please enter the API key:")
if [ -z "$stored_key" ]
then
display_message "error" "The API key cannot be empty. Please try again."
configure_api_keys_for "$service"
return
fi
update_config "${service}_API_KEY" "$stored_key"
;;
"Delete existing key")
sed -i "/^${service}_API_KEY=/d" "$config_file"
display_message "info" "The existing API key for $service has been deleted."
unset "${service}_API_KEY"
;;
"Previous screen")
configure_api_keys
;;
"Quit")
exit 1
;;
*)
display_message "error" "Invalid choice. Please try again."
configure_api_keys_for "$service"
;;
esac
else
stored_key=$(get_input "Enter API key for $service" "Please enter the API key:")
if [ -z "$stored_key" ]
then
display_message "error" "The API key cannot be empty. Please try again."
configure_api_keys_for "$service"
return
fi
update_config "${service}_API_KEY" "$stored_key"
load_config
upload_image
fi
}
# Function to configure API keys
configure_api_keys() {
if [ "$use_zenity" = "true" ]
then
chosen_service=$(zenity --list \
--title="Configuring API Keys" \
--text="Choose the service to configure the API key for:" \
--column="Service" \
--ok-label="Accept" \
--cancel-label="Cancel" \
--width="560" \
--height="390" \
"FreeImageHost" \
"ImgBB" \
"Cloudinary" \
"Previous screen" \
"Quit")
else
printf '%s\n' "Choose the service to configure the API key for:"
printf '%s\n' "1) FreeImageHost"
printf '%s\n' "2) ImgBB"
printf '%s\n' "3) Cloudinary"
printf '%s\n' "4) Previous screen"
printf '%s\n' "5) Quit"
printf '%s ' "Enter your choice (1-5):"
read -r service_choice
case $service_choice in
1)
chosen_service="FreeImageHost"
;;
2)
chosen_service="ImgBB"
;;
3)
chosen_service="Cloudinary"
;;
4)
chosen_service="Previous screen"
;;
5)
chosen_service="Quit"
;;
*)
chosen_service=""
;;
esac
fi
case $chosen_service in
"FreeImageHost"|"ImgBB"|"Cloudinary")
configure_api_keys_for "$chosen_service"
;;
"Previous screen")
return
;;
"Quit")
exit 1
;;
*)
display_message "error" "Invalid choice. The script will now end."
exit 1
;;
esac
}
manage_cloudinary_creds() {
while :
do
if [ "$use_zenity" = "true" ]
then
cred_option=$(zenity --list \
--title="Manage Cloudinary Credentials" \
--text="Select the credential to manage" \
--column="Credential" \
--ok-label="Accept" \
--cancel-label="Cancel" \
--width="560" \
--height="390" \
"Cloud Name" \
"API Key" \
"API Secret" \
"Upload Presets" \
"Return to Main Menu")
else
printf '%s\n' "Manage Cloudinary Credentials:"
printf '%s\n' "1) Cloud Name"
printf '%s\n' "2) API Key"
printf '%s\n' "3) API Secret"
printf '%s\n' "4) Upload Presets"
printf '%s\n' "5) Return to Main Menu"
printf '%s ' "Enter your choice (1-5):"
read -r cred_choice
case $cred_choice in
1)
cred_option="Cloud Name"
;;
2)
cred_option="API Key"
;;
3)
cred_option="API Secret"
;;
4)
cred_option="Upload Presets"
;;
5)
cred_option="Return to Main Menu"
;;
*)
display_message "error" "Invalid choice. Please try again."
continue
;;
esac
fi
case $cred_option in
"Cloud Name")
current_value=$(grep "^Cloudinary_CLOUD_NAME=" "$config_file" | cut -d '=' -f 2)
cloud_name=$(get_input "Cloudinary Cloud Name" "Please enter the Cloudinary Cloud Name (current: $current_value):")
if [ -z "$cloud_name" ]
then
display_message "info" "No change made. Current Cloud Name remains: $current_value"
else
update_config "Cloudinary_CLOUD_NAME" "$cloud_name"
fi
;;
"API Key")
current_value=$(grep "^Cloudinary_API_KEY=" "$config_file" | cut -d '=' -f 2)
api_key=$(get_input "Cloudinary API Key" "Please enter the Cloudinary API Key (current: $current_value):")
if [ -z "$api_key" ]
then
display_message "info" "No change made. Current API Key remains: $current_value"
else
update_config "Cloudinary_API_KEY" "$api_key"
fi
;;
"API Secret")
current_value=$(grep "^Cloudinary_API_SECRET=" "$config_file" | cut -d '=' -f 2)
api_secret=$(get_input "Cloudinary API Secret" "Please enter the Cloudinary API Secret (current: $current_value):")
if [ -z "$api_secret" ]
then
display_message "info" "No change made. Current API Secret remains: $current_value"
else
update_config "Cloudinary_API_SECRET" "$api_secret"
fi
;;
"Upload Presets")
current_value=$(grep "^Cloudinary_UPLOAD_PRESETS=" "$config_file" | cut -d '=' -f 2)
upload_presets=$(get_input "Cloudinary Upload Presets" "Please enter the Cloudinary Upload Presets (current: $current_value):")
if [ -z "$upload_presets" ]
then
display_message "info" "No change made. Current Upload Presets remain: $current_value"
else
update_config "Cloudinary_UPLOAD_PRESETS" "$upload_presets"
fi
;;
"Return to Main Menu")
return
;;
*)
display_message "error" "Invalid choice. Please try again."
;;
esac
done
}
# Function to choose an image file
choose_image_file() {
while :
do
if [ "$use_zenity" = "true" ]
then
image_path=$(zenity --file-selection \
--title="Choose an image file" \
--file-filter="Images (JPG, PNG, BMP, GIF, TIFF, WEBP, HEIC, PDF) | \
*.png *.jpg *.jpeg *.gif *.pdf" 2>/dev/null)
else
printf '%s ' "Enter the path to an image file:"
read -r -e image_path
fi
if [ -z "$image_path" ]
then
display_message "error" "No files selected. The script will now end."
exit 1
fi
# Convert to absolute path
image_path=$(realpath "$image_path" 2>/dev/null || printf "")
if [ -f "$image_path" ]
then
if validate_image "$image_path"
then
if [ "$HOSTING_SERVICE" = "FreeImageHost" ] || [ "$HOSTING_SERVICE" = "Cloudinary" ] && [ "${image_path##*.}" = "pdf" ]
then
display_message "error" "You have selected a PDF file, which is not supported by FreeImageHost. Try ImgBB or Cloudinary."
choose_hosting_service
else
return 0
fi
fi
else
display_message "error" "The file does not exist."
fi
done
}
# Function to validate image format
validate_image() {
image="$1"
file_type=$(file -b --mime-type "$image")
case $file_type in
image/*)
return 0
;;
application/pdf)
is_pdf="true"
return 0
;;
*)
display_message "error" "Invalid file type: $image. Only JPG, PNG, BMP, GIF, TIFF, WEBP, HEIC, and PDF files are allowed."
return 1
;;
esac
}
# Function to upload image
upload_image() {
case $hosting_service in
"FreeImageHost")
response=$(curl -s -F "key=$FreeImageHost_API_KEY" -F "action=upload" -F "source=@$image_path" "https://freeimage.host/api/1/upload")
upload_response=$(printf '%s\n' "$response" | jq -r '
"URL:\n\(.image.url)\n\n" +
"Viewer URL:\n\(.image.url_viewer)\n\n" +
"Thumbnail:\n\(.image.thumb.url)\n\n" +
"BBCode:\n[img]\(.image.url)[/img]\n\n" +
"BBCode Thumbnail:\n[url=\(.image.url)][img]\(.image.thumb.url)[/img][/url]\n\n" +
"HTML:\n<img src=\"\(.image.url)\" />\n\n" +
"Markdown:\n![\(.image.url)](\(.image.url))"
')
;;
"ImgBB")
response=$(curl -s -F "key=$ImgBB_API_KEY" -F "image=@$image_path" "https://api.imgbb.com/1/upload")
upload_response=$(printf '%s\n' "$response" | jq -r '
"URL:\n\(.data.url)\n\n" +
"Viewer URL:\n\(.data.display_url)\n\n" +
"Thumbnail:\n\(.data.thumb.url)\n\n" +
"BBCode:\n[img]\(.data.url)[/img]\n\n" +
"BBCode Thumbnail:\n[url=\(.data.url)][img]\(.data.thumb.url)[/img][/url]\n\n" +
"HTML:\n<img src=\"\(.data.url)\" />\n\n" +
"Markdown:\n![\(.data.url)](\(.data.url))"
')
;;
"Cloudinary")
cloud_name="$Cloudinary_CLOUD_NAME"
api_key="$Cloudinary_API_KEY"
api_secret="$Cloudinary_API_SECRET"
upload_presets="$Cloudinary_UPLOAD_PRESETS"
response=$(curl -s -X POST "https://api.cloudinary.com/v1_1/$cloud_name/image/upload" \
-u "$api_key:$api_secret" \
-F "file=@$image_path" \
-F "upload_preset=$upload_presets")
secure_url=$(printf '%s' "$response" | jq -r '.secure_url')
thumbnail_url=$(printf '%s' "$secure_url" | sed 's/upload/upload\/w_150,h_150,c_thumb/')
upload_response=$(printf '%s\n' "$response" | jq -r --arg thumb_url "$thumbnail_url" '
"URL:\n\(.secure_url)\n\n" +
"Viewer URL:\n\(.url)\n\n" +
"Thumbnail 150x150:\n\($thumb_url)\n\n" +
"BBCode:\n[img]\(.secure_url)[/img]\n\n" +
"BBCode Thumbnail 150x150:\n[url=\(.secure_url)][img]\($thumb_url)[/img][/url]\n\n" +
"HTML:\n<img src=\"\(.secure_url)\" />\n\n" +
"Markdown:\n![\(.secure_url)](\(.secure_url))"
')
;;
*)
display_message "error" "Unrecognized image hosting service."
exit 1
;;
esac
# Show successful upload message
if [ "$use_zenity" = "true" ]
then
zenity --info \
--title="Upload successful" \
--text="$upload_response" \
--width=600 \
--height=550 \
--ok-label="Close"
else
printf '%s\n' "Upload successful:"
printf '%s\n' "$upload_response"
fi
# Save links
if ask_question "Do you want to save these links to a file to reuse them later" "yes"
then
if [ ! -f "$output_file" ]
then
if [ "$use_zenity" = "true" ]
then
output_file=$(zenity --file-selection \
--save --confirm-overwrite \
--title="Save Links File" \
--filename="$HOME/uploaded_images_links.txt")
else
printf '%s ' "Enter a file path to save the links (default: $output_file):"
read -r -e chosen_file
if [ -d "$chosen_file" ]
then
output_file="$chosen_file/uploaded_images_links.txt"
else
output_file=${chosen_file:-$output_file}
fi
fi
fi
# Convert relative path to absolute path
output_file=$(realpath "$output_file" 2>/dev/null || printf "")
# Verify that the path is valid and exists
if [ -z "$output_file" ] || [ ! -d "$(dirname "$output_file")" ]
then
display_message "error" "Invalid path or directory does not exist. Falling back to default path: $HOME/uploaded_images_links.txt"
output_file="$HOME/uploaded_images_links.txt"
fi
# Save file path in configuration file
if grep -q "^OUTPUT_FILE=" "$config_file"
then
sed -i "s|^OUTPUT_FILE=.*|OUTPUT_FILE=$output_file|" "$config_file"
else
printf '%s\n' "OUTPUT_FILE=$output_file" >> "$config_file"
fi
timestamp=$(date +"%Y-%m-%d %H:%M:%S")
save_text="File: $image_path
Date of recording: $timestamp
Hosted by: $HOSTING_SERVICE
$upload_response
-------------------------
"
printf '%s\n' "$save_text" >> "$output_file"
display_message "info" "The links have been saved to the file $output_file"
fi
# Ask if you want to upload another image
if ask_question "Do you want to upload another image?" "no"
then
choose_image_file
choose_hosting_service
upload_image
else
exit 0
fi
}
# Load functions in order
main() {
check_dependencies
load_config
if [ -n "$image_path" ]
then
image_path=$(printf "$image_path" | xargs)
if validate_image "$image_path"
then
choose_hosting_service
upload_image
else
choose_image_file
choose_hosting_service
upload_image
fi
else
choose_image_file
choose_hosting_service
upload_image
fi
}
use_zenity="false"
# '-z' allows you to launch the script from the terminal but using zenity or with nautilus script method
case $1 in
"-z")
use_zenity="true"
if [ -n "$2" ]
then
image_path="$2"
fi
;;
*)
if [ -n "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" ]
then
use_zenity="true"
image_path="$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"
else
image_path=$(realpath -q "$*")
fi
;;
esac
# Calling main function
main
Dernière modification par lynn (Le 20/08/2024, à 15:27)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#2 Le 15/07/2024, à 17:53
- alrito
Re : Poster une image facilement avec imgup
Bonjour,
Il faut aussi installer curl si on ne l'a pas.
sudo apt install curl
Hors ligne
#3 Le 15/07/2024, à 20:14
- Watael
Re : Poster une image facilement avec imgup
la fonction n'a a priori pas d'intérêt.
read url urlViewer urlThumb < <(echo $response | jq -r '.image|.url,.url_viewer,.thumb.url') # /!\ renommage de certaines variables
les variables après le jq n'ont pas grand intérêt.
UUOC!
après avoir vérifier qu'il y a un argument au script, il faut aussi vérifier que l'argument est un fichier de type image.
read ftype < <(file --brief --mime-type "$1") test "${ftype%/*}" = 'image' || { >&2 echo "\"$1\" n'est pas une image"; exit 1;}
Edit: correction parenthèse manquante sur read url...
Dernière modification par Watael (Le 16/07/2024, à 19:53)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#4 Le 16/07/2024, à 14:35
- lynn
Re : Poster une image facilement avec imgup
Edit : Script mis à jour en #1
Dernière modification par lynn (Le 17/08/2024, à 12:45)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#5 Le 16/07/2024, à 19:51
- Watael
Re : Poster une image facilement avec imgup
pourquoi certaines variables crient-elles LEUR NOM ?
grep pour traiter une ligne, c'est moyen moins
elif ! [[ $(file --brief --mime-type) =~ image ]] #je ne mets pas de guillemets ici, parce qu'il sont facultatifs. then
read url urlViewer urlThumb < <(echo $response | jq -r '.image|.url,.url_viewer,.thumb.url') #correction parenthèse finale manquante
je ne vois pas pourquoi tu tortures le shell autrement.
printf -v timestamp '%(%d/%m/%Y %H:%M:%S)T' -1
et hop! une commande externe de plus en moins.
le fichier de sauvegarde gagnerait (pour un traitement automatisé ultérieur) à être un CSV.
Dernière modification par Watael (Le 16/07/2024, à 19:54)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#6 Le 17/07/2024, à 18:26
- lynn
Re : Poster une image facilement avec imgup
Edit : Script mis à jour en #1
Dernière modification par lynn (Le 17/08/2024, à 12:45)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#7 Le 17/07/2024, à 19:03
- Watael
Re : Poster une image facilement avec imgup
le shebang ne peut pas être /bin/sh, parce que le script utilise des fonctionnalités avancées de bash.
case "$nomVar" les guillemets sont ici aussi très facultatifs.
tu as remanié zenity-text pour utiliser jq, c'est bien.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#8 Le 17/07/2024, à 21:11
- lynn
Re : Poster une image facilement avec imgup
Edit : Script mis à jour en #1
Dernière modification par lynn (Le 17/08/2024, à 12:45)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#9 Le 17/07/2024, à 21:34
- Watael
Re : Poster une image facilement avec imgup
Doit-on considérer les commandes externes comme zenity, curl ou jq comme des fonctionnalités avancées de bash..!?
non, ce sont des commandes externes.
je parlais du printf, entre autres substitution de processus (<(...)), crochets doubles...
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#10 Le 18/07/2024, à 18:29
- lynn
Re : Poster une image facilement avec imgup
Edit : Script mis à jour en #1
Dernière modification par lynn (Le 17/08/2024, à 12:46)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#11 Le 20/07/2024, à 14:16
- lynn
Re : Poster une image facilement avec imgup
Edit : Script mis à jour en #1
Dernière modification par lynn (Le 17/08/2024, à 12:46)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#12 Le 04/08/2024, à 19:51
- lynn
Re : Poster une image facilement avec imgup
Edit : Script mis à jour en #1
Dernière modification par lynn (Le 17/08/2024, à 12:47)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#13 Le 04/08/2024, à 21:08
- Watael
Re : Poster une image facilement avec imgup
main() ne sert à rien.
pas son code !c'est mettre le code dans une fonction qui ne sert à rien.
les guillemets dans les cas d'un case sont très facultatifs, s'il ne contiennent pas de caractère figurant dans l'IFS. et puis, c'est moche.
quand je fais une fonction "erreur" je mets le type de message en premier puis le message; je trouve ça plus facile pour voir ce que va faire la fonction
display_message 'msgType' 'contenu du message'
check_dependencies() devrait être une boucle sur un tableau défini au début du script et qui contient la liste des programmes indispensables.
#!/bin/bash neededProgs=( zenity curl jq ) #... checkDeps() for p in "${neededProgs[@]}"; do hash "$p" &>/dev/null || { display message error "$p n'est pas installé"; exit 1;}; done
if [ "$use_zenity" = "true" ] && hash zenity >/dev/null 2>&1
tu as déjà vérifé que zenity est installé !
...
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#14 Le 04/08/2024, à 21:57
- lynn
Re : Poster une image facilement avec imgup
Bonjour watael,
Merci pour tes commentaires toujours très appréciés.
zenity est optionnel dans cette nouvelle version. Sur certaines distributions, zenity n'est pas installé par défaut et même si il est installé, par défaut ou non, certains utilisateurs ne voudront peut-être pas l'utiliser... Mais c'est vrai que la fonction check_dependencies méritera d'être revue.
En soit, le fait de mettre en place une fonction pour main n'est pas obligatoire mais je trouve ça plus simple pour mon organisation de travail. Enfin, pour moi, c'est plus clair.
Je verrais pour les modifications prochainement. Merci encore pour tes retours.
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#15 Le 04/08/2024, à 23:19
- tycooon
Re : Poster une image facilement avec imgup
Bon travail !!
La key api IMGBB après inscription du compte est elle longue à venir. je l'attends toujours au bout de 30 mm
Est ce habituelle ? mais pas de souci l'autre est immédiate.
J'avais oublié : le script placé dans nautilus script, poster des images devient un jeu d'enfants, et avec zenety je vais ouvrir un parc d’attraction
Merci.
Dernière modification par tycooon (Le 05/08/2024, à 01:17)
Hors ligne
#16 Le 05/08/2024, à 16:04
- lynn
Re : Poster une image facilement avec imgup
Merci pour tes retours @tycooon.
Pour la clé API d'IMGBB, je ne pourrais pas te dire. Personnellement, après inscription, je l'avais à disposition aussitôt.
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#17 Le 07/08/2024, à 16:40
- lynn
Re : Poster une image facilement avec imgup
Une petite mise à jour.
-> Le chemin complet de l'image téléversée sera enregistré dans le fichier d'enregistrement des liens.
-> Ajout du nom de l'hébergeur utilisé lors de l'envoi de l'image dans le fichier d'enregistrement des liens.
-> Si zenity n'est pas installé et que le script est lancé graphiquement, on se sert de dialog pour afficher un message d'erreur.
-> Diverses petites corrections de code et d'information.
Edit : Script mis à jour en #1
Dernière modification par lynn (Le 17/08/2024, à 12:48)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#18 Le 07/08/2024, à 18:06
- Watael
Re : Poster une image facilement avec imgup
à quoi sert le shift dans les case $1 in -z (à la fin) ?
man readlink* préconise d'utiliser realpath...
plutôt que while <true>, je ferais until <test condition à atteindre>
--
*
realpath(1) is a better command for canonicalization functionality.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#19 Le 07/08/2024, à 20:51
- lynn
Re : Poster une image facilement avec imgup
à quoi sert le shift dans les case $1 in -z (à la fin) ?
le shift ne sert à rien !
Ça m'a d'ailleurs permis d'ajouter une modif si on lance le script en ligne de commande dans ce style
./imgup -z /chemin/vers/une/image.png
si l'image est valide, ça ouvrira directement la fenêtre pour sélectionner un hébergeur plutôt que le sélecteur d'image... ça paraît plus logique !
La correction est effective en #17
Edit : Utilisation de realpath à la place de readlink. Ça fait la même chose à priori, quelle serait la vraie différence ? Code plus moderne, plus propre ?
Dernière modification par lynn (Le 07/08/2024, à 20:55)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#20 Le 09/08/2024, à 10:21
- lynn
Re : Poster une image facilement avec imgup
Une petite mise à jour :
-> Plus besoin de renseigner dans le script le chemin et le nom du fichier d'enregistrement des liens (pour qui ne voulait pas du nom/chemin par défaut). Une demande sera faite à la partie sauvegarder les liens dans un fichier. Ce nom et localisation seront conservés dans le fichier de configuration afin que les prochains enregistrements se fasse au même endroit. Bien sur, si l'utilisateur supprime ou déplace son fichier d'enregistrement, une nouvelle demande sera faite au prochain lancement du script.
Si on valide sans rien choisir, l'enregistrement des liens se fera dans un fichier nommé uploaded_images_links.txt situé à la racine du répertoire personnel.
En ligne de commande, si par erreur, on valide sur un répertoire sans préciser de fichier, l'enregistrement se fera dans le répertoire validé avec le nom de fichier suivant : uploaded_images_links.txt.
-> Corrections mineures
Edit : Script mis à jour en #1
Dernière modification par lynn (Le 17/08/2024, à 12:48)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#21 Le 09/08/2024, à 10:43
- Watael
Re : Poster une image facilement avec imgup
validConfigKeys='^(HOSTING_SERVICE|FreeImageHost_API_KEY|IMGBB_API_KEY|OUTPUT_FILE)$'
while IFS='=' read key value
do
[[ $key =~ $validConfigKeys ]] && export "$key=$value"
done < "$configFile"
mais pourquoi pas simplement : test -f "$configFile" && . "$configFile" || { >&2 echo "erreur dans le fichier de configuration."; exit 1;} ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#22 Le 09/08/2024, à 16:57
- lynn
Re : Poster une image facilement avec imgup
Donc on importe tout le fichier de conf sans filtrer ?
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#23 Le 09/08/2024, à 17:20
- Watael
Re : Poster une image facilement avec imgup
c'est ce que fait .bashrc avec .bash_aliases, par exemple :
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#24 Le 09/08/2024, à 18:00
- lynn
Re : Poster une image facilement avec imgup
Ok, c'est modifié.
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#25 Le 13/08/2024, à 21:41
- lynn
Re : Poster une image facilement avec imgup
Allez hop, une nouvelle mise à jour avec un nouvel hébergeur : Cloudinary. Il faut s'inscrire également pour pouvoir poster mais il existe un plan gratuit.
N'hésitez à faire des remontées ou des suggestions.
Edit : Script mis à jour en #1
Dernière modification par lynn (Le 17/08/2024, à 12:49)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne