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, à 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&lt;img src=\"\(.image.url)\" /&gt;\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&lt;img src=\"\(.data.url)\" /&gt;\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&lt;img src=\"\(.secure_url)\" /&gt;\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 ? 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, à 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 ! 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, à 21: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, à 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 big_smile  big_smile
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. 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, à 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>

--
*

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, à 20: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, à 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