Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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&lt;img src=\"\(.image.url)\" /&gt;\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&lt;img src=\"\(.data.url)\" /&gt;\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&lt;img src=\"\(.secure_url)\" /&gt;\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&lt;img src=\"\(.data.link)\" /&gt;\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 ? big_smile

  • grep pour traiter une ligne, c'est moyen moins smile

  • 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 ! tongue 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. wink

  • 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é ! smile

...


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. smile

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... tongue 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. cool


«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 big_smile  big_smile
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. smile

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>

--
*

man readlink a écrit :

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

Watael a écrit :

à quoi sert le shift dans les case $1 in -z (à la fin) ?

le shift ne sert à rien ! roll

Ç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 ! tongue

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