#1 Le 15/07/2024, à 16:36
- lynn
Poster une image facilement avec imgup
Bonjour,
Imgup utilise les services suivants :
freeimage.host
ImgBB
Cloudinary
Imgur
Ça fonctionne via le terminal (Ex. ./imgup -i 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.4.0 by lynn (09/12/2024)
# Licence: Free, very free...
#
# Allows you to upload photos to these hosting services:
# -> https://freeimage.host
# -> https://imgbb.com
# -> https://cloudinary.com
# -> https://imgur.com
#
# REQUIRES: cURL, jq
# Optional : zenity
#
# USAGE: ./imgup -i /path/to/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, even PDF files for some hosts. Visit their respective sites about this.
# Be warned uploading pdf files can take a long time and readability may be different 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 one. To
# date, there is a free API key for FreeImage available on their site and without registration. ImgBB,
# Cloudinary and Imgur 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.
# Help function
display_help() {
printf "Usage: %s [-z] [-i <image_path>] [-h]
-z Use Zenity for dialogs
-i <image_path> Specify the path to the image
-h Display this help message\n\n" "$0"
exit 1
}
# Loading configuration file
load_config() {
config_file="$HOME/.img_upload_config"
if [ -f "$config_file" ]
then
chmod 600 "$config_file"
. "$config_file"
fi
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 [ -z "$message_type" ]
then
printf '%s\n' "$message"
return
fi
if [ "$use_zenity" = "true" ]
then
case $message_type in
"info")
zenity --info \
--width="300" \
--height="200" \
--ok-label="Ok" \
--text="$message"
;;
"error")
zenity --error \
--width="300" \
--height="200" \
--ok-label="Ok" \
--text="$message"
;;
*)
zenity --error \
--width="300" \
--height="200" \
--ok-label="Ok" \
--text="Unsupported message type: $message_type"
;;
esac
else
case $message_type in
"info")
printf 'INFORMATION: %s\n\n' "$message"
;;
"error")
printf 'ERROR: %s\n\n' "$message" >&2
;;
"response")
printf '%s ' "$message"
;;
*)
printf 'Unsupported message type: %s\n\n' "$message_type" >&2
;;
esac
fi
}
# Function to ask question
ask_question() {
question="$1"
default_answer="$2"
if [ "$use_zenity" = "true" ]
then
zenity --question \
--ok-label="Yes" \
--cancel-label="No" \
--text="$question"
return $?
else
while :
do
display_message "response" "$question (Default $default_answer):"
read -r yn
yn=${yn:-$default_answer}
case $yn in
[Yy]*)
return 0
;;
[Nn]*)
return 1
;;
*)
display_message "" "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" \
--ok-label="Accept" \
--cancel-label="Quit" \
--entry-text "" 2>/dev/null
else
display_message "" "$2" > /dev/tty
read -r input < /dev/tty
display_message "" "$input"
display_message "" ""
fi
}
# Function for choosing a hosting service or manage settings
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="Quit" \
--width="560" \
--height="390" \
"Upload to FreeImageHost" \
"Upload to ImgBB" \
"Upload to Cloudinary" \
"Upload to Imgur" \
"Manage Settings")
case $hosting_service in
"Upload to FreeImageHost")
hosting_service="FreeImageHost"
;;
"Upload to ImgBB")
hosting_service="ImgBB"
;;
"Upload to Cloudinary")
hosting_service="Cloudinary"
;;
"Upload to Imgur")
hosting_service="Imgur"
;;
"Manage Settings")
hosting_service="Settings"
;;
*)
exit 1
;;
esac
else
display_message "" "Choose an Image Hosting Service:"
display_message "" "1) Upload to FreeImageHost"
display_message "" "2) Upload to ImgBB"
display_message "" "3) Upload to Cloudinary"
display_message "" "4) Upload to Imgur"
display_message "" "5) Manage Settings"
display_message "" "6) Quit"
display_message "response" "Enter your choice (1-6):"
read -r choice
display_message "" ""
case $choice in
1)
hosting_service="FreeImageHost"
;;
2)
hosting_service="ImgBB"
;;
3)
hosting_service="Cloudinary"
;;
4)
hosting_service="Imgur"
;;
5)
hosting_service="Settings"
;;
6)
hosting_service="Quit"
;;
*)
display_message "error" "Please select from 1 to 6."
continue
;;
esac
fi
case $hosting_service in
"FreeImageHost"|"ImgBB"|"Cloudinary"|"Imgur")
HOSTING_SERVICE="$hosting_service"
update_config "HOSTING_SERVICE" "$HOSTING_SERVICE"
if [ "$hosting_service" = "FreeImageHost" ]
then
if [ -z "$FreeImageHost_API_KEY" ]
then
configure_api_keys_for "$hosting_service"
fi
elif [ "$hosting_service" = "ImgBB" ]
then
if [ -z "$ImgBB_API_KEY" ]
then
configure_api_keys_for "$hosting_service"
fi
elif [ "$hosting_service" = "Cloudinary" ]
then
if [ -z "$Cloudinary_CLOUD_NAME" ] || [ -z "$Cloudinary_API_KEY" ] || \
[ -z "$Cloudinary_API_SECRET" ] || [ -z "$Cloudinary_UPLOAD_PRESETS" ]
then
configure_api_keys_for "$hosting_service"
fi
elif [ "$hosting_service" = "Imgur" ]
then
if [ -z "$Imgur_CLIENT_ID" ] || [ -z "$Imgur_CLIENT_SECRET" ]
then
configure_api_keys_for "$hosting_service"
fi
fi
upload_image "$hosting_service"
;;
"Settings")
configure_api_keys
;;
*)
display_message "" "See you soon."
exit
;;
esac
load_config
if [ "$hosting_service" != "Settings" ]
then
upload_image "$hosting_service"
fi
break
done
}
# Centralized function to update or add configuration
update_config() {
key_name="$1"
value="$2"
if grep -q "^${key_name}=" "$config_file" 2>/dev/null
then
sed -i "s/^${key_name}=.*/${key_name}=$value/" "$config_file"
else
printf '%s\n' "${key_name}=$value" >> "$config_file"
fi
}
# Function to configure API keys for a specific host
configure_api_keys_for() {
service="$1"
config_keys=()
config_prompts=()
# Set configuration keys and prompts based on service
case $service in
"Cloudinary")
config_keys=("Cloudinary_CLOUD_NAME" "Cloudinary_API_KEY" "Cloudinary_API_SECRET" "Cloudinary_UPLOAD_PRESETS")
config_prompts=("Cloud Name" "API Key" "API Secret" "Upload Presets")
;;
"Imgur")
config_keys=("Imgur_CLIENT_ID" "Imgur_CLIENT_SECRET")
config_prompts=("Client ID" "Client Secret")
;;
"FreeImageHost")
config_keys=("FreeImageHost_API_KEY")
config_prompts=("API Key")
;;
"ImgBB")
config_keys=("ImgBB_API_KEY")
config_prompts=("API Key")
;;
*)
display_message "error" "Invalid service: $service" >&2
exit 1
;;
esac
load_config
# Update HOSTING_SERVICE in configuration file
update_config "HOSTING_SERVICE" "$service"
while :
do
options=""
valid_options=""
option_number=1
# Prepare current values to display in Zenity
current_values=()
for i in "${!config_keys[@]}"
do
key="${config_keys[$i]}"
prompt="${config_prompts[$i]}"
current_value="${!key}"
current_values+=("${current_value:-}")
done
if [ "$use_zenity" = "true" ]
then
# Building Zenity command with current values displayed before fields
form_entries=""
for i in "${!config_prompts[@]}"
do
prompt="${config_prompts[$i]}"
current_value="${current_values[$i]}"
# Mask secrets with asterisks, or show "None" if the secret is empty
case $prompt in
*"Secret"|*"Key")
if [ -z "$current_value" ]
then
form_entries="$form_entries --add-password='$prompt (current: None)'"
else
form_entries="$form_entries --add-password='$prompt (current: ***** )'"
fi
;;
*)
form_entries="$form_entries --add-entry='$prompt (current: ${current_value:-None})'"
;;
esac
done
zenity_command="zenity --forms \
--ok-label=Accept \
--cancel-label=Back \
--title='${service} Settings' \
--text='Current values are shown above the fields. Please enter the new details for $service:' $form_entries"
# Run Zenity command
if response=$(sh -c "$zenity_command")
then
changes_made=false
# Split the response by the pipe (|) separator
IFS='|' read -r -a response_array <<< "$response"
for i in "${!response_array[@]}"
do
key="${config_keys[$i]}"
# Trim leading/trailing whitespace (spaces, tabs, newlines, etc.)
new_value=$(printf '%s' "${response_array[$i]}" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
current_value="${current_values[$i]}"
# Check if the new value is not empty after trimming
if [ -n "$new_value" ] && [ "$new_value" != "$current_value" ]
then
changes_made=true
update_config "$key" "$new_value"
fi
done
load_config
# Handle changes or no changes
if [ "$changes_made" = "true" ]
then
if zenity --question \
--text="Credentials updated. Do you want to upload the image now?" \
--ok-label="Yes" \
--cancel-label="No"
then
upload_image "$service"
fi
else
zenity --info \
--text="No changes were made to the credentials."
fi
# Return to the main configuration menu
configure_api_keys
break
else
configure_api_keys
break
fi
else
# Classic Terminal Mode
display_message "" "Choose the credential to manage for $service:"
for i in "${!config_keys[@]}"
do
key="${config_keys[$i]}"
prompt="${config_prompts[$i]}"
current_value="${!key}"
# Mask secrets with asterisks or show "None" if the value is empty
case $prompt in
*"Secret"|*"Key")
if [ -z "$current_value" ]
then
options="$options$option_number) $prompt (current: None)\n"
else
options="$options$option_number) $prompt (current: *****)\n"
fi
;;
*)
options="$options$option_number) $prompt (current: ${current_value:-None})\n"
;;
esac
valid_options="$valid_options $option_number"
option_number=$((option_number + 1))
done
options="$options$option_number) Previous Screen\n$((option_number + 1))) Quit"
valid_options="$valid_options $option_number $((option_number + 1))"
printf "%b" "$options"
display_message "response" "Enter your choice (1-$((option_number + 1))):"
read -r action_choice
display_message "" ""
# Validation of user choice
if [[ ! " $valid_options " =~ $action_choice ]] || [ -z "$action_choice" ]
then
display_message "error" "Please select from 1 to $((option_number + 1))."
continue
fi
if [ "$action_choice" -le "${#config_keys[@]}" ]
then
key="${config_keys[$((action_choice - 1))]}"
prompt="${config_prompts[$((action_choice - 1))]}"
current_value="${!key}"
# Hide secrets every time they are displayed
case $prompt in
*"Secret"|*"Key")
if [ -z "$current_value" ]
then
display_message "response" "Please enter the new $prompt (current: None):"
else
display_message "response" "Please enter the new $prompt (current: *****):"
fi
new_value=$(read_password)
display_message "" ""
;;
*)
display_message "response" "Please enter the new $prompt (current: ${current_value:-None}):"
read -r new_value
display_message "" ""
;;
esac
# If a new value is entered, update in configuration file
if [ -n "$(printf '%s' "$new_value" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')" ]
then
update_config "$key" "$new_value"
load_config
changes_made=true
else
if [ -z "$current_value" ]
then
display_message "info" "No change made. Current $prompt remains: None"
else
if [[ $prompt == *"Secret"* || $prompt == *"Key"* ]]
then
display_message "info" "No change made. Current $prompt remains: *****"
else
display_message "info" "No change made. Current $prompt remains: ${current_value}"
fi
fi
fi
# After handling the new values, check if all required credentials are filled
all_credentials_filled=true
for key in "${config_keys[@]}"
do
value="${!key}"
if [ -z "$value" ]
then
all_credentials_filled=false
break
fi
done
# If all credentials are filled, ask if the user wants to upload the image
if [ "$all_credentials_filled" = "true" ] && [ "$changes_made" = "true" ]
then
display_message "response" "The information has been updated. Would you like to download the image now? (y/N):"
read -r response
if [[ "$response" =~ ^[Yy]$ ]]
then
upload_image "$service"
else
display_message "" "No image upload done."
display_message "" ""
fi
fi
elif [ "$action_choice" -eq "$option_number" ]
then
configure_api_keys
break
elif [ "$action_choice" -eq "$((option_number + 1))" ]
then
display_message "" "See you soon."
exit 0
fi
fi
done
}
read_password () {
unset password
prompt=""
while IFS= read -p "$prompt" -r -s -n 1 char
do
# Enter - accept password
if [[ $char == $'\0' ]]
then
break
fi
# Backspace
if [[ $char == $'\177' ]]
then
prompt=$'\b \b'
password="${password%?}"
else
prompt='*'
password+="$char"
fi
done
printf '%s' "$password"
}
# Function to configure API keys
configure_api_keys() {
while :
do
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="Quit" \
--width="560" \
--height="390" \
"FreeImageHost" \
"ImgBB" \
"Cloudinary" \
"Imgur" \
"Previous Screen")
else
display_message "" "Choose the service to configure the API key for:"
display_message "" "1) FreeImageHost"
display_message "" "2) ImgBB"
display_message "" "3) Cloudinary"
display_message "" "4) Imgur"
display_message "" "5) Previous Screen"
display_message "" "6) Quit"
display_message "response" "Enter your choice (1-6):"
read -r service_choice
display_message "" ""
case $service_choice in
1)
chosen_service="FreeImageHost"
;;
2)
chosen_service="ImgBB"
;;
3)
chosen_service="Cloudinary"
;;
4)
chosen_service="Imgur"
;;
5)
chosen_service="Previous Screen"
;;
6)
chosen_service="Quit"
;;
*)
display_message "error" "Please select from 1 to 6."
continue
;;
esac
fi
case $chosen_service in
"FreeImageHost"|"ImgBB"|"Cloudinary"|"Imgur")
HOSTING_SERVICE="$chosen_service"
configure_api_keys_for "$HOSTING_SERVICE"
;;
"Previous Screen")
choose_hosting_service
;;
*)
display_message "" "See you soon."
exit 1
;;
esac
done
}
# Function to choose an image file
choose_image_file() {
if [ "$use_zenity" = "true" ]
then
image_path=$(zenity --file-selection \
--title="Choose an image file" \
--file-filter="Image & PDF (JPG, PNG, BMP, GIF, TIFF, WEBP, HEIC, PDF) | \
*.png *.jpg *.jpeg *.gif *.bmp *.tiff *.webp *.heic *.pdf" 2>/dev/null)
else
display_message "response" "Enter the path of the image or PDF file:"
read -r -e image_path
fi
if [ -z "$image_path" ]
then
display_message "error" "No files selected. Exiting script."
exit 1
fi
if [ ! -f "$image_path" ]
then
display_message "error" "The selected file does not exist."
exit 1
fi
}
# Function to validate image format
validate_image() {
image="$1"
file_type=$(file -b --mime-type "$image")
case $file_type in
image/*|application/pdf)
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
}
check_for_error() {
response="$1"
service="$2"
if printf '%s' "$response" | jq -e '.error' >/dev/null 2>&1
then
display_message "error" "Upload to $service failed: $(printf '%s' "$response" | jq -r '.error.message // .error')"
exit 1
fi
}
# Function to upload image
upload_image() {
file_extension="${image_path##*.}"
file_extension="${file_extension,,}"
case $HOSTING_SERVICE in
"FreeImageHost")
if [ "$file_extension" = "pdf" ]
then
display_message "error" "FreeImageHost does not support PDF files. Please choose another file or service."
exit 1
fi
response=$(curl -s \
-F "key=$FreeImageHost_API_KEY" \
-F "action=upload" \
-F "source=@$image_path" "https://freeimage.host/api/1/upload")
check_for_error "$response" "$HOSTING_SERVICE"
upload_response=$(printf '%s' "$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")
if [ "$file_extension" = "pdf" ]
then
display_message "info" "Uploading a PDF file might take a while. The links will be displayed when the operation is completed."
fi
response=$(curl -s \
-F "key=$ImgBB_API_KEY" \
-F "image=@$image_path" "https://api.imgbb.com/1/upload")
check_for_error "$response" "$HOSTING_SERVICE"
upload_response=$(printf '%s' "$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")
response=$(curl -s \
-X POST "https://api.cloudinary.com/v1_1/$Cloudinary_CLOUD_NAME/image/upload" \
-u "$Cloudinary_API_KEY:$Cloudinary_API_SECRET" \
-F "file=@$image_path" \
-F "upload_preset=$Cloudinary_UPLOAD_PRESETS")
check_for_error "$response" "$HOSTING_SERVICE"
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' "$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))"
')
;;
"Imgur")
if [ "$file_extension" = "pdf" ]
then
display_message "error" "Imgur does not support PDF files. Please choose another file or service."
exit 1
fi
response=$(curl -s \
-H "Authorization: Client-ID $Imgur_CLIENT_ID" \
-F "image=@$image_path" \
"https://api.imgur.com/3/image")
check_for_error "$response" "$HOSTING_SERVICE"
upload_response=$(printf '%s' "$response" | jq -r '
"URL:\n\(.data.link)\n\n" +
"Viewer URL:\n\(.data.link)\n\n" +
"Thumbnail:\n\((.data.thumbnail_link // "Non disponible"))\n\n" +
"BBCode:\n[img]\(.data.link)[/img]\n\n" +
"BBCode Thumbnail:\n\(
if .data.thumbnail_link != null then
"[url=\(.data.link)][img]\(.data.thumbnail_link)[/img][/url]"
else
"[url=\(.data.link)][img]\(.data.link)[/img][/url]"
end
)\n\n" +
"HTML:\n<img src=\"\(.data.link)\" />\n\n" +
"Markdown:\n![\(.data.link)](\(.data.link))"
')
;;
*)
display_message "error" "Unsupported hosting service: $HOSTING_SERVICE"
exit 1
;;
esac
if [ "$use_zenity" = "true" ]
then
zenity --info \
--title="Upload successful" \
--text="$upload_response" \
--width=600 \
--height=550 \
--ok-label="Close"
else
display_message "" "!! Upload successful !!"
display_message "" ""
display_message "" "$upload_response"
display_message "" ""
fi
default_output_file="uploaded_images_links.txt"
default_output_path="$HOME/$default_output_file"
if ask_question "Do you want to save these links to a file to reuse them later?" "yes"
then
if grep -q "^OUTPUT_FILE=" "$config_file" 2>/dev/null
then
configured_output_file=$(grep "^OUTPUT_FILE=" "$config_file" | cut -d '=' -f 2-)
output_file=${configured_output_file:-$default_output_path}
else
output_file=""
fi
if [ -z "$output_file" ] || [ ! -f "$output_file" ]
then
if [ "$use_zenity" = "true" ]
then
while :
do
output_file=$(zenity --file-selection \
--title="Save Links File" \
--filename="$output_file")
if [ -z "$output_file" ]
then
display_message "error" "No file selected. Exiting."
exit 1
fi
if [ -d "$output_file" ]
then
output_file="$output_file/$default_output_file"
fi
if [ -d "$(dirname "$output_file")" ] && [ ! -d "$output_file" ]
then
break
else
display_message "error" "Invalid path or directory does not exist. Falling back to default path: $default_output_path"
output_file="$default_output_path"
break
fi
done
else
while :
do
display_message "response" "Enter a file path to save the links (default: $default_output_path):"
read -r -e chosen_file
output_file=${chosen_file:-$default_output_path}
# If the user validates on a directory, we concatenate with the default file
if [ -d "$output_file" ]
then
output_file="$output_file/$default_output_file"
fi
# Checks if the parent path exists (the directory is valid) or if the file can be created
if [ -d "$(dirname "$output_file")" ]
then
break
else
display_message "error" "Invalid path or directory does not exist. Please enter a valid path."
fi
done
fi
fi
touch "$output_file"
if ! grep -q "^OUTPUT_FILE=" "$config_file" 2>/dev/null
then
display_message "" "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
-------------------------
"
display_message "" "$save_text" >> "$output_file"
display_message "info" "Links have been successfully saved to $output_file"
fi
if ask_question "Do you want to upload another image?" "no"
then
choose_image_file
choose_hosting_service
upload_image
else
exit 0
fi
}
required_progs="zenity curl jq"
missing_dependencies="false"
use_zenity="false"
while getopts ":zi:h" opt
do
case $opt in
z)
use_zenity="true"
;;
i)
image_path="$OPTARG"
;;
h)
display_help
;;
\?)
display_message "error" "Invalid option: -$OPTARG. View help:"
display_help
;;
:)
display_message "error" "Option -$OPTARG requires an argument. View help:"
display_help
;;
*)
display_message "error" "Unknown error occurred. View help:"
display_help
;;
esac
done
shift $((OPTIND - 1))
if [ -z "$image_path" ]
then
if [ -n "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" ]
then
use_zenity="true"
image_path=$(printf '%s' "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" | head -n 1)
elif [ $# -gt 0 ]
then
image_path="$1"
fi
fi
if [ -z "$image_path" ] && [ "$use_zenity" = "false" ]
then
display_message "error" "No options provided. View help:"
display_help
fi
if [ -n "$image_path" ] && [ ! -f "$image_path" ]
then
display_message "error" "The file specified does not exist: $image_path"
exit 1
fi
for prog in $required_progs
do
if [ "$prog" = "zenity" ] && [ "$use_zenity" != "true" ]
then
continue
fi
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
load_config
if [ -n "$image_path" ]
then
image_path=$(printf '%s' "$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
Dernière modification par lynn (Le 18/09/2024, à 15:57)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#2 Le 15/07/2024, à 16: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
Je dirais que le secret pour résoudre un problème, c'est de la patience, parfois du recule et surtout de la prise de tête. Mais on y arrive :)
Hors ligne
#3 Le 15/07/2024, à 19: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, à 18:53)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#4 Le 16/07/2024, à 13:35
- lynn
Re : Poster une image facilement avec imgup
Edit : Script mis à jour en #1
Dernière modification par lynn (Le 17/08/2024, à 11:45)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#5 Le 16/07/2024, à 18: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, à 18:54)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#6 Le 17/07/2024, à 17:26
- lynn
Re : Poster une image facilement avec imgup
Edit : Script mis à jour en #1
Dernière modification par lynn (Le 17/08/2024, à 11:45)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#7 Le 17/07/2024, à 18: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, à 20:11
- lynn
Re : Poster une image facilement avec imgup
Edit : Script mis à jour en #1
Dernière modification par lynn (Le 17/08/2024, à 11:45)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#9 Le 17/07/2024, à 20: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, à 17:29
- lynn
Re : Poster une image facilement avec imgup
Edit : Script mis à jour en #1
Dernière modification par lynn (Le 17/08/2024, à 11:46)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#11 Le 20/07/2024, à 13:16
- lynn
Re : Poster une image facilement avec imgup
Edit : Script mis à jour en #1
Dernière modification par lynn (Le 17/08/2024, à 11:46)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#12 Le 04/08/2024, à 18:51
- lynn
Re : Poster une image facilement avec imgup
Edit : Script mis à jour en #1
Dernière modification par lynn (Le 17/08/2024, à 11:47)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#13 Le 04/08/2024, à 20: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, à 20: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, à 22: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, à 00:17)
Hors ligne
#16 Le 05/08/2024, à 15: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, à 15: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, à 11:48)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#18 Le 07/08/2024, à 17: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, à 19: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, à 19:55)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#20 Le 09/08/2024, à 09: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, à 11:48)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#21 Le 09/08/2024, à 09: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, à 15: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, à 16: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, à 17: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, à 20: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, à 11:49)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne