remake the whole thing. still not finished
This commit is contained in:
parent
12741ce4ba
commit
78c532808e
8 changed files with 611 additions and 160 deletions
|
@ -1,5 +0,0 @@
|
|||
UPLOAD_AUTH=""
|
||||
UPLOAD_URL="https://atums.world/api/upload"
|
||||
|
||||
UPLOAD_HEADERS="x-zipline-format: date;x-zipline-original-name: true;x-zipline-domain: atums.world,your-mommy.org;"
|
||||
# https://github.com/diced/zipline/blob/e1256db6612ea3fb5f83091ca415a3b58a1edd55/src/lib/uploader/parseHeaders.ts#L42
|
|
@ -1,4 +1,4 @@
|
|||
# grabit
|
||||
# grabIT
|
||||
|
||||
A simple script to take a screenshot, upload it to atums.world, and copy the link to the clipboard.
|
||||
|
||||
|
@ -17,6 +17,7 @@ A simple script to take a screenshot, upload it to atums.world, and copy the lin
|
|||
|
||||
### Other
|
||||
- `xdg-utils`
|
||||
- tk
|
||||
- Python 3
|
||||
|
||||
## Setup
|
||||
|
|
186
helpers/config.sh
Normal file
186
helpers/config.sh
Normal file
|
@ -0,0 +1,186 @@
|
|||
#!/bin/bash
|
||||
|
||||
[[ ! -d "$CONFIG_DIR" ]] && mkdir -p "$CONFIG_DIR"
|
||||
if [[ ! -f "$CONFIG_FILE" || ! -s "$CONFIG_FILE" ]]; then
|
||||
echo "{}" > "$CONFIG_FILE"
|
||||
NEEDS_SETUP=1
|
||||
fi
|
||||
|
||||
validate_config() {
|
||||
local is_valid=true
|
||||
local temp_file=$(mktemp)
|
||||
|
||||
local keys
|
||||
keys=$(jq -r 'keys[]' "$CONFIG_FILE")
|
||||
|
||||
for key in $keys; do
|
||||
if [[ -z "${ALLOWED_KEYS[$key]}" ]]; then
|
||||
jq "del(.\"$key\")" "$CONFIG_FILE" > "$temp_file" && mv "$temp_file" "$CONFIG_FILE"
|
||||
else
|
||||
local value
|
||||
value=$(jq -r --arg key "$key" '.[$key]' "$CONFIG_FILE")
|
||||
if ! [[ "$value" =~ ${ALLOWED_KEYS[$key]} ]]; then
|
||||
jq "del(.\"$key\")" "$CONFIG_FILE" > "$temp_file" && mv "$temp_file" "$CONFIG_FILE"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
for req_key in "${REQUIRED_KEYS[@]}"; do
|
||||
if ! jq -e --arg key "$req_key" 'has($key)' "$CONFIG_FILE" >/dev/null; then
|
||||
NEEDS_SETUP=1
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
get_value() {
|
||||
local key="$1"
|
||||
jq -r ".${key} // empty" "$CONFIG_FILE"
|
||||
}
|
||||
|
||||
set_value() {
|
||||
local key="$1"
|
||||
local value="$2"
|
||||
|
||||
if [[ -z "$key" || -z "$value" ]]; then
|
||||
echo "Usage: $0 set <key> <value>"
|
||||
exit 1
|
||||
fi
|
||||
if [[ -z "${ALLOWED_KEYS[$key]}" ]]; then
|
||||
echo "Invalid key: $key"
|
||||
exit 1
|
||||
fi
|
||||
if ! [[ "$value" =~ ${ALLOWED_KEYS[$key]} ]]; then
|
||||
echo "Invalid value for $key: $value"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
jq ". + {\"$key\": \"$value\"}" "$CONFIG_FILE" > temp.json && mv temp.json "$CONFIG_FILE"
|
||||
}
|
||||
|
||||
remove_value() {
|
||||
local key="$1"
|
||||
jq "del(.${key})" "$CONFIG_FILE" > temp.json && mv temp.json "$CONFIG_FILE"
|
||||
echo "Removed $key."
|
||||
}
|
||||
|
||||
list_values() {
|
||||
cat "$CONFIG_FILE" | jq .
|
||||
}
|
||||
|
||||
setup_domain() {
|
||||
local domain
|
||||
local service
|
||||
local auth
|
||||
|
||||
if [[ -z "$SERVICE" ]]; then
|
||||
while true; do
|
||||
echo -ne "${CYAN}Choose a service (${valid_services[*]}): ${RESET}"
|
||||
read service
|
||||
|
||||
if [[ " ${valid_services[*]} " =~ " $service " ]]; then
|
||||
break
|
||||
else
|
||||
echo -e "${RED}Invalid service. Please choose from: ${valid_services[*]}${RESET}"
|
||||
fi
|
||||
done
|
||||
|
||||
set_value "SERVICE" "$service"
|
||||
else
|
||||
service="$SERVICE"
|
||||
fi
|
||||
|
||||
if [[ "$service" == "zipline" ]]; then
|
||||
while true; do
|
||||
echo -ne "${CYAN}Enter the domain (e.g. example.com): ${RESET}"
|
||||
read domain
|
||||
|
||||
if [[ "$domain" =~ ^[a-zA-Z0-9.-]+$ ]]; then
|
||||
break
|
||||
else
|
||||
echo -e "${RED}Invalid domain format. Please enter a valid domain (e.g. example.com).${RESET}"
|
||||
fi
|
||||
done
|
||||
|
||||
domain="https://$domain"
|
||||
domain="${domain%/}"
|
||||
[[ "$domain" != */api/upload ]] && domain="$domain/api/upload"
|
||||
|
||||
set_value "DOMAIN" "$domain"
|
||||
echo -e "${GREEN}Domain set to: $domain${RESET}"
|
||||
fi
|
||||
|
||||
while [[ -z "$auth" ]]; do
|
||||
echo -ne "${CYAN}Enter your auth token: ${RESET}"
|
||||
read auth
|
||||
[[ -z "$auth" ]] && echo -e "${RED}Auth token cannot be empty. Please enter a valid token.${RESET}"
|
||||
done
|
||||
|
||||
set_value "${service}_auth" "$auth"
|
||||
echo -e "${GREEN}Auth token set successfully.${RESET}"
|
||||
}
|
||||
|
||||
setup_config() {
|
||||
local save_dir
|
||||
local show_capture_preview
|
||||
local show_notifications
|
||||
local save_images
|
||||
local default_option
|
||||
|
||||
echo -ne "${CYAN}What do you want the default option to be? (upload/save/copy): ${RESET}"
|
||||
read default_option
|
||||
while ! [[ "$default_option" =~ ^(upload|save|copy)$ ]]; do
|
||||
echo -e "${RED}Invalid option. Please enter 'upload', 'save', or 'copy'.${RESET}"
|
||||
echo -ne "${CYAN}Choose (upload/save/copy): ${RESET}"
|
||||
read default_option
|
||||
done
|
||||
set_value "DEFAULT_OPTION" "$default_option"
|
||||
|
||||
[[ "$default_option" == "upload" ]] && setup_domain
|
||||
|
||||
echo -ne "${CYAN}Do you want to save images? (y/n): ${RESET}"
|
||||
read save_images
|
||||
while ! [[ "$save_images" =~ ^(y|Y|n|N|true|false)$ ]]; do
|
||||
echo -e "${RED}Invalid option. Please enter 'y' or 'n'.${RESET}"
|
||||
echo -ne "${CYAN}Do you want to save images? (y/n): ${RESET}"
|
||||
read save_images
|
||||
done
|
||||
[[ "$save_images" =~ ^(y|Y)$ ]] && save_images="true" || save_images="false"
|
||||
set_value "SAVE_IMAGES" "$save_images"
|
||||
|
||||
if [[ "$save_images" == "true" ]]; then
|
||||
echo -ne "${CYAN}Enter the directory to save images (default: $HOME/Pictures): ${RESET}"
|
||||
read save_dir
|
||||
save_dir="${save_dir:-$HOME/Pictures}"
|
||||
while [[ ! -d "$save_dir" ]]; do
|
||||
echo -e "${RED}Directory does not exist. Please enter a valid directory.${RESET}"
|
||||
echo -ne "${CYAN}Enter the directory to save images: ${RESET}"
|
||||
read save_dir
|
||||
done
|
||||
set_value "SAVE_DIR" "$save_dir"
|
||||
fi
|
||||
|
||||
echo -ne "${CYAN}Do you want to show capture notifications? (y/n): ${RESET}"
|
||||
read show_notifications
|
||||
while ! [[ "$show_notifications" =~ ^(y|Y|n|N|true|false)$ ]]; do
|
||||
echo -e "${RED}Invalid option. Please enter 'y' or 'n'.${RESET}"
|
||||
echo -ne "${CYAN}Do you want to show capture notifications? (y/n): ${RESET}"
|
||||
read show_notifications
|
||||
done
|
||||
[[ "$show_notifications" =~ ^(y|Y)$ ]] && show_notifications="true" || show_notifications="false"
|
||||
set_value "SHOW_NOTIFICATIONS" "$show_notifications"
|
||||
|
||||
echo -ne "${CYAN}Do you want to show capture preview? (y/n): ${RESET}"
|
||||
read show_capture_preview
|
||||
while ! [[ "$show_capture_preview" =~ ^(y|Y|n|N|true|false)$ ]]; do
|
||||
echo -e "${RED}Invalid option. Please enter 'y' or 'n'.${RESET}"
|
||||
echo -ne "${CYAN}Do you want to show capture preview? (y/n): ${RESET}"
|
||||
read show_capture_preview
|
||||
done
|
||||
[[ "$show_capture_preview" =~ ^(y|Y)$ ]] && show_capture_preview="true" || show_capture_preview="false"
|
||||
set_value "SHOW_CAPTURE_PREVIEW" "$show_capture_preview"
|
||||
|
||||
echo -e "${GREEN}${BOLD}Configuration completed successfully!${RESET}"
|
||||
echo -e "${YELLOW}You can change the configuration later by running the script with the --config option.${RESET}"
|
||||
|
||||
[[ "$show_capture_preview" == "true" ]] && setup_venv
|
||||
}
|
17
helpers/installer.sh
Normal file
17
helpers/installer.sh
Normal file
|
@ -0,0 +1,17 @@
|
|||
VENV_DIR="$SCRIPT_DIR/.venv"
|
||||
|
||||
setup_venv() {
|
||||
if [[ ! -d "$VENV_DIR" ]]; then
|
||||
python3 -m venv "$VENV_DIR" >/dev/null 2>&1
|
||||
"$VENV_DIR/bin/pip" install --upgrade pip >/dev/null 2>&1
|
||||
"$VENV_DIR/bin/pip" install pillow screeninfo >/dev/null 2>&1
|
||||
|
||||
PYTHON_EXEC="$VENV_DIR/bin/python3"
|
||||
if [[ ! -f "$PYTHON_EXEC" ]]; then
|
||||
echo -e "${RED}Python executable not found in virtual environment.${RESET}"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
PYTHON_EXEC="$VENV_DIR/bin/python3"
|
||||
fi
|
||||
}
|
62
helpers/variables.sh
Normal file
62
helpers/variables.sh
Normal file
|
@ -0,0 +1,62 @@
|
|||
GREEN="\e[32m"
|
||||
YELLOW="\e[33m"
|
||||
RED="\e[31m"
|
||||
CYAN="\e[36m"
|
||||
BOLD="\e[1m"
|
||||
RESET="\e[0m"
|
||||
|
||||
CONFIG_DIR="$HOME/.config/grabIT"
|
||||
CONFIG_FILE="$CONFIG_DIR/config.json"
|
||||
NEEDS_SETUP=0
|
||||
|
||||
declare -A ALLOWED_KEYS=(
|
||||
["log_level"]="^(DEBUG|INFO|WARN|ERROR)$"
|
||||
["SHOW_CAPTURE_PREVIEW"]="^(true|false)$"
|
||||
["SHOW_NOTIFICATIONS"]="^(true|false)$"
|
||||
["SAVE_IMAGES"]="^(true|false)$"
|
||||
["SAVE_DIR"]="^.+$"
|
||||
["DOMAIN"]="^.+$"
|
||||
["DEFAULT_OPTION"]="^(upload|save|copy)$"
|
||||
["SERVICE"]="^(zipline|nest|fakecrime|ez|guns|pixelvault)$"
|
||||
)
|
||||
|
||||
REQUIRED_KEYS=(
|
||||
"SHOW_CAPTURE_PREVIEW"
|
||||
"SHOW_NOTIFICATIONS"
|
||||
"SAVE_IMAGES"
|
||||
"DEFAULT_OPTION"
|
||||
)
|
||||
|
||||
valid_services=("zipline" "nest" "fakecrime" "ez" "guns" "pixelvault")
|
||||
valid_args=("--help" "--version" "--config" "-c" "-u" "-f" "-d" "--silent")
|
||||
|
||||
for service in "${valid_services[@]}"; do
|
||||
valid_args+=("--$service")
|
||||
ALLOWED_KEYS["${service}_auth"]="^.+$"
|
||||
done
|
||||
|
||||
declare -A UPLOADERS=(
|
||||
["pixelvault"]="https://pixelvault.co"
|
||||
["guns"]="https://guns.lol/api/upload"
|
||||
["ez"]="https://api.e-z.host/files"
|
||||
["fakecrime"]="https://upload.fakecrime.bio"
|
||||
["nest"]="https://nest.rip/api/files/upload"
|
||||
)
|
||||
|
||||
declare -A UPLOAD_HEADERS=(
|
||||
["pixelvault"]="https://pixelvault.co|Authorization"
|
||||
["guns"]="key"
|
||||
["ez"]="key"
|
||||
["fakecrime"]="Authorization"
|
||||
["nest"]="Authorization"
|
||||
["zipline"]="authorization"
|
||||
)
|
||||
|
||||
declare -A UPLOAD_JSON_KEYS=(
|
||||
["pixelvault"]="resource"
|
||||
["nest"]="fileURL"
|
||||
["guns"]="link"
|
||||
["ez"]="imageUrl"
|
||||
["fakecrime"]="url"
|
||||
["zipline"]="files[0].url"
|
||||
)
|
344
main.sh
Executable file
344
main.sh
Executable file
|
@ -0,0 +1,344 @@
|
|||
#!/bin/bash
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
|
||||
source "$SCRIPT_DIR/helpers/variables.sh"
|
||||
source "$SCRIPT_DIR/helpers/installer.sh"
|
||||
source "$SCRIPT_DIR/helpers/config.sh"
|
||||
|
||||
validate_config
|
||||
|
||||
if [[ "$NEEDS_SETUP" -eq 1 ]]; then setup_config; fi
|
||||
if [[ $(get_value "SHOW_CAPTURE_PREVIEW") == "true" ]]; then setup_venv; fi
|
||||
|
||||
arguments=()
|
||||
while [[ $# -gt 0 ]]; do
|
||||
arg="$1"
|
||||
case "$arg" in
|
||||
--help)
|
||||
echo "Usage: $0 [options]"
|
||||
echo "--help Show this help message"
|
||||
echo "--version Show version information"
|
||||
echo "--config Allows you to set up the config file"
|
||||
echo "-c Copies the screenshot to clipboard"
|
||||
echo "-u Uploads the screenshot"
|
||||
echo "-f <file> Uploads the given file instead of taking a screenshot"
|
||||
echo "-d Debug mode"
|
||||
echo "--silent Suppresses Image preview and notifications"
|
||||
echo
|
||||
echo "Domain Specific Options:"
|
||||
for service in "${valid_services[@]}"; do
|
||||
echo "--$service"
|
||||
done
|
||||
exit 0
|
||||
;;
|
||||
--version)
|
||||
echo "Version: $VERSION"
|
||||
exit 0
|
||||
;;
|
||||
--config)
|
||||
setup_config
|
||||
exit 0
|
||||
;;
|
||||
-c)
|
||||
arguments+=("-c")
|
||||
shift
|
||||
;;
|
||||
-u)
|
||||
arguments+=("-u")
|
||||
shift
|
||||
;;
|
||||
-f)
|
||||
shift
|
||||
if [[ -n "$1" && "$1" != -* ]]; then
|
||||
arguments+=("-f" "$1")
|
||||
shift
|
||||
else
|
||||
echo -e "${RED}Error: No valid file specified for -f option.${RESET}"
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
-d)
|
||||
DEBUG=true
|
||||
shift
|
||||
;;
|
||||
--silent)
|
||||
SHOW_NOTIFICATIONS=false
|
||||
SHOW_CAPTURE_PREVIEW=false
|
||||
shift
|
||||
;;
|
||||
--*)
|
||||
service="${arg:2}"
|
||||
if [[ " ${valid_services[*]} " =~ " ${service} " ]]; then
|
||||
SHOULD_UPLOAD=true
|
||||
SHOULD_COPY=false
|
||||
SERVICE="${service}"
|
||||
shift
|
||||
else
|
||||
echo -e "${RED}Error: Invalid service: $service${RESET}"
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
echo -e "${RED}Error: Invalid argument: $arg${RESET}"
|
||||
echo "Use --help for usage information."
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
REQUIRED_COMMANDS=("notify-send" "curl" "jq")
|
||||
|
||||
SHOULD_UPLOAD=$(get_value "DEFAULT_OPTION")
|
||||
[[ "$SHOULD_UPLOAD" == "upload" ]] && SHOULD_UPLOAD=true || SHOULD_UPLOAD=false
|
||||
|
||||
SHOW_NOTIFICATIONS=$(get_value "SHOW_NOTIFICATIONS")
|
||||
[[ "$SHOW_NOTIFICATIONS" == "true" ]] && SHOW_NOTIFICATIONS=true || SHOW_NOTIFICATIONS=false
|
||||
|
||||
SHOW_CAPTURE_PREVIEW=$(get_value "SHOW_CAPTURE_PREVIEW")
|
||||
[[ "$SHOW_CAPTURE_PREVIEW" == "true" ]] && SHOW_CAPTURE_PREVIEW=true || SHOW_CAPTURE_PREVIEW=false
|
||||
|
||||
if [[ -n "$WAYLAND_DISPLAY" ]]; then
|
||||
SCREENSHOT_CMD=("grim" "-g")
|
||||
SELECT_REGION="slurp"
|
||||
REQUIRED_COMMANDS+=("wl-copy" "grim" "slurp")
|
||||
elif [[ -n "$DISPLAY" ]]; then
|
||||
SCREENSHOT_CMD=("flameshot" "gui" "-p")
|
||||
REQUIRED_COMMANDS+=("xclip" "flameshot")
|
||||
else
|
||||
echo "Error: Unable to detect display server (Wayland/X11)."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
MISSING_COMMANDS=()
|
||||
for cmd in "${REQUIRED_COMMANDS[@]}"; do
|
||||
command -v "$cmd" &>/dev/null || MISSING_COMMANDS+=("$cmd")
|
||||
done
|
||||
|
||||
# Check for xdg-utils for xdg-open
|
||||
if ! command -v xdg-open &>/dev/null; then
|
||||
MISSING_COMMANDS+=("xdg-utils")
|
||||
fi
|
||||
|
||||
if [[ ${#MISSING_COMMANDS[@]} -gt 0 ]]; then
|
||||
echo -e "${RED}Error: The following commands are not installed: ${MISSING_COMMANDS[*]}${RESET}"
|
||||
echo -e "${RED}Please install them"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
send_notification() {
|
||||
[[ "$SHOW_NOTIFICATIONS" == "false" ]] && return
|
||||
|
||||
local title="$1"
|
||||
local message="$2"
|
||||
local image="$3"
|
||||
|
||||
if [[ -z "$title" && -z "$message" ]]; then
|
||||
return
|
||||
fi
|
||||
|
||||
local notify_cmd=("notify-send")
|
||||
|
||||
[[ -n "$image" ]] && notify_cmd+=("-i" "$image")
|
||||
[[ -n "$title" ]] && notify_cmd+=("$title")
|
||||
[[ -n "$message" ]] && notify_cmd+=("$message")
|
||||
|
||||
"${notify_cmd[@]}"
|
||||
}
|
||||
|
||||
SHOULD_UPLOAD=false
|
||||
SHOULD_SAVE="$(get_value "SAVE_IMAGES")"
|
||||
SHOULD_COPY=false
|
||||
|
||||
case "$(get_value "DEFAULT_OPTION")" in
|
||||
upload) SHOULD_UPLOAD=true ;;
|
||||
copy) SHOULD_COPY=true ;;
|
||||
esac
|
||||
|
||||
for arg in "${arguments[@]}"; do
|
||||
case "$arg" in
|
||||
-c)
|
||||
SHOULD_UPLOAD=false
|
||||
SHOULD_COPY=true
|
||||
;;
|
||||
-u|-f)
|
||||
SHOULD_UPLOAD=true
|
||||
SHOULD_COPY=false
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
CURRENT_DATE=$(date +%Y-%m-%d-%H-%M-%S)
|
||||
RANDOM_FILE_NAME="${CURRENT_DATE}_$(date +%s%N | cut -b1-13)"
|
||||
|
||||
if [[ "$SHOULD_COPY" == "true" ]]; then
|
||||
if [[ "$SHOULD_SAVE" == "true" ]]; then
|
||||
SAVE_DIR=$(get_value "SAVE_DIR")
|
||||
if [[ ! -d "$SAVE_DIR" ]]; then
|
||||
mkdir -p "$SAVE_DIR"
|
||||
fi
|
||||
FILE="$SAVE_DIR/$CURRENT_DATE.png"
|
||||
else
|
||||
FILE="/tmp/$RANDOM_FILE_NAME.png"
|
||||
fi
|
||||
|
||||
if [[ -n "$WAYLAND_DISPLAY" ]]; then
|
||||
"${SCREENSHOT_CMD[@]}" "$("$SELECT_REGION")" "$FILE"
|
||||
else
|
||||
"${SCREENSHOT_CMD[@]}" "$FILE"
|
||||
fi
|
||||
|
||||
if [[ $? -ne 0 ]]; then
|
||||
echo "Error: Screenshot capture failed." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ ! -f "$FILE" ]]; then
|
||||
echo "Error: File not found: $FILE" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -n "$WAYLAND_DISPLAY" ]]; then
|
||||
echo "Using wl-copy for clipboard."
|
||||
cat "$FILE" | wl-copy
|
||||
elif [[ -n "$DISPLAY" ]]; then
|
||||
echo "Using xclip for clipboard."
|
||||
xclip -selection clipboard -t image/png -i "$FILE"
|
||||
else
|
||||
echo "Error: Unable to detect display server (Wayland/X11)."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ "$SHOW_CAPTURE_PREVIEW" == "true" ]]; then
|
||||
"$PYTHON_EXEC" "$SCRIPT_DIR/helpers/show_image.py" "$FILE" "Copied to your clipboard"
|
||||
fi
|
||||
|
||||
if [[ "$SHOULD_SAVE" != "true" ]]; then
|
||||
[[ -n "$FILE" ]] && rm -f "$FILE"
|
||||
fi
|
||||
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ -z "$SERVICE" ]]; then
|
||||
SERVICE=$(get_value "SERVICE")
|
||||
if [[ -z "$SERVICE" ]]; then
|
||||
echo -e "${RED}Error: No service specified and no default service set.${RESET}"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ "$SERVICE" == "zipline" ]]; then
|
||||
DOMAIN=$(get_value "DOMAIN")
|
||||
if [[ -z "$DOMAIN" ]]; then
|
||||
echo -e "${RED}Error: Domain not set for zipline.${RESET}"
|
||||
setup_domain
|
||||
fi
|
||||
else
|
||||
DOMAIN="${UPLOADERS[$SERVICE]}"
|
||||
fi
|
||||
|
||||
AUTH=$(get_value "${SERVICE}_auth")
|
||||
if [[ -z "$AUTH" ]]; then
|
||||
echo -e "${RED}Error: Auth not set for $SERVICE.${RESET}"
|
||||
setup_domain
|
||||
|
||||
AUTH=$(get_value "${SERVICE}_auth")
|
||||
if [[ -z "$AUTH" ]]; then
|
||||
echo -e "${RED}Error: No auth key provided for $SERVICE.${RESET}"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
USER_FILE=""
|
||||
if [[ "$SHOULD_UPLOAD" == "true" ]]; then
|
||||
for ((i = 0; i < ${#arguments[@]}; i++)); do
|
||||
if [[ "${arguments[i]}" == "-f" ]]; then
|
||||
USER_FILE="${arguments[i+1]}"
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
if [[ -z "$USER_FILE" ]]; then
|
||||
if [[ "$SHOULD_SAVE" == "true" ]]; then
|
||||
SAVE_DIR=$(get_value "SAVE_DIR")
|
||||
if [[ ! -d "$SAVE_DIR" ]]; then
|
||||
mkdir -p "$SAVE_DIR"
|
||||
fi
|
||||
FILE="$SAVE_DIR/$CURRENT_DATE.png"
|
||||
else
|
||||
FILE="/tmp/$RANDOM_FILE_NAME.png"
|
||||
fi
|
||||
|
||||
if [[ -n "$WAYLAND_DISPLAY" ]]; then
|
||||
"${SCREENSHOT_CMD[@]}" "$("$SELECT_REGION")" "$FILE"
|
||||
else
|
||||
"${SCREENSHOT_CMD[@]}" "$FILE"
|
||||
fi
|
||||
|
||||
if [[ $? -ne 0 ]]; then
|
||||
echo "Error: Screenshot capture failed." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ ! -f "$FILE" ]]; then
|
||||
echo "Error: File not found: $FILE" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ "$SHOULD_SAVE" != "true" ]]; then
|
||||
[[ -n "$FILE" ]] && rm -f "$FILE"
|
||||
fi
|
||||
else
|
||||
FILE="$USER_FILE"
|
||||
fi
|
||||
|
||||
if [[ ! -f "$FILE" ]]; then
|
||||
echo "Error: File not found: $FILE" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
FILE_URL=""
|
||||
|
||||
REPONSE=$(curl -s -X POST \
|
||||
-F "file=@$FILE" \
|
||||
-H "${UPLOAD_HEADERS[$SERVICE]}: $AUTH" \
|
||||
"$DOMAIN")
|
||||
|
||||
if ! echo "$REPONSE" | jq . &>/dev/null; then
|
||||
echo -e "${RED}Error: Invalid response from server.${RESET}"
|
||||
exit 1
|
||||
fi
|
||||
FILE_URL=$(echo "$REPONSE" | jq -r ".${UPLOAD_JSON_KEYS[$SERVICE]}")
|
||||
|
||||
if [[ "$FILE_URL" == "null" ]]; then
|
||||
echo -e "${RED}Error: File URL not found in response.${RESET}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
MIME_TYPE=$(file --mime-type -b "$FILE")
|
||||
if [[ "$MIME_TYPE" == image/* ]]; then
|
||||
if [[ "$SHOW_NOTIFICATIONS" == "true" ]]; then
|
||||
send_notification "Uploaded to $SERVICE" "$FILE_URL" "$FILE"
|
||||
fi
|
||||
|
||||
if [[ "$SHOW_CAPTURE_PREVIEW" == "true" ]]; then
|
||||
"$PYTHON_EXEC" "$SCRIPT_DIR/helpers/show_image.py" "$FILE" "Uploaded to $SERVICE"
|
||||
fi
|
||||
else
|
||||
if [[ "$SHOW_NOTIFICATIONS" == "true" ]]; then
|
||||
send_notification "Uploaded to $SERVICE" "$FILE_URL"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ -n "$WAYLAND_DISPLAY" ]]; then
|
||||
echo "Using wl-copy for clipboard."
|
||||
echo "$FILE_URL" | wl-copy
|
||||
elif [[ -n "$DISPLAY" ]]; then
|
||||
echo "Using xclip for clipboard."
|
||||
echo "$FILE_URL" | xclip -selection clipboard
|
||||
else
|
||||
echo "Error: Unable to detect display server (Wayland/X11)."
|
||||
exit 1
|
||||
fi
|
154
upload.sh
154
upload.sh
|
@ -1,154 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
VENV_DIR="$SCRIPT_DIR/.venv"
|
||||
ENV_FILE="$SCRIPT_DIR/.env"
|
||||
|
||||
if [[ ! -d "$VENV_DIR" ]]; then
|
||||
echo "Creating Python virtual environment..."
|
||||
python3 -m venv "$VENV_DIR"
|
||||
"$VENV_DIR/bin/pip" install --upgrade pip
|
||||
"$VENV_DIR/bin/pip" install pillow screeninfo
|
||||
fi
|
||||
|
||||
PYTHON_EXEC="$VENV_DIR/bin/python3"
|
||||
|
||||
if [[ -f "$ENV_FILE" ]]; then
|
||||
set -o allexport
|
||||
source "$ENV_FILE"
|
||||
set +o allexport
|
||||
else
|
||||
echo "Error: .env file not found in script directory ($SCRIPT_DIR)."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -n "$WAYLAND_DISPLAY" ]]; then
|
||||
SCREENSHOT_CMD=("grim" "-g")
|
||||
SELECT_REGION="slurp"
|
||||
REQUIRED_COMMANDS=("curl" "jq" "wl-copy" "grim" "slurp")
|
||||
elif [[ -n "$DISPLAY" ]]; then
|
||||
SCREENSHOT_CMD=("flameshot" "gui" "-p")
|
||||
REQUIRED_COMMANDS=("curl" "jq" "xclip" "flameshot")
|
||||
else
|
||||
echo "Error: Unable to detect display server (Wayland/X11)."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
MISSING_COMMANDS=()
|
||||
for cmd in "${REQUIRED_COMMANDS[@]}"; do
|
||||
command -v "$cmd" &>/dev/null || MISSING_COMMANDS+=("$cmd")
|
||||
done
|
||||
|
||||
# Check for xdg-utils for xdg-open
|
||||
if ! command -v xdg-open &>/dev/null; then
|
||||
MISSING_COMMANDS+=("xdg-utils")
|
||||
fi
|
||||
|
||||
if [[ ${#MISSING_COMMANDS[@]} -gt 0 ]]; then
|
||||
echo "Error: The following commands are not installed: ${MISSING_COMMANDS[*]}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -z "$UPLOAD_AUTH" || -z "$UPLOAD_URL" ]]; then
|
||||
echo "Error: Required environment variables UPLOAD_AUTH or UPLOAD_URL are not set in .env."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
HEADERS=(
|
||||
-H "authorization: $UPLOAD_AUTH"
|
||||
-H "content-type: multipart/form-data"
|
||||
)
|
||||
|
||||
if [[ -n "$UPLOAD_HEADERS" ]]; then
|
||||
IFS=';' read -ra ADDITIONAL_HEADERS <<< "$UPLOAD_HEADERS"
|
||||
for HEADER in "${ADDITIONAL_HEADERS[@]}"; do
|
||||
HEADERS+=(-H "$HEADER")
|
||||
done
|
||||
fi
|
||||
|
||||
if [[ "$1" == "-h" || "$1" == "-help" ]]; then
|
||||
echo "Usage: $0 [-c | -clipboard] [FILE]"
|
||||
echo "Upload an image to atums.world and copy the URL to the clipboard"
|
||||
echo
|
||||
echo "Options:"
|
||||
echo " -c, -clipboard Upload the image from the clipboard"
|
||||
echo
|
||||
exit 0
|
||||
fi
|
||||
|
||||
TEMP_FILE=""
|
||||
|
||||
if [[ "$1" == "-c" || "$1" == "-clipboard" ]]; then
|
||||
FILE="$2"
|
||||
|
||||
if [[ -z "$FILE" ]]; then
|
||||
TEMP_FILE="/tmp/screenshot.png"
|
||||
if [[ -n "$WAYLAND_DISPLAY" ]]; then
|
||||
"${SCREENSHOT_CMD[@]}" "$("$SELECT_REGION")" "$TEMP_FILE"
|
||||
else
|
||||
"${SCREENSHOT_CMD[@]}" "$TEMP_FILE"
|
||||
fi
|
||||
if [[ $? -ne 0 ]]; then
|
||||
echo "Error: Screenshot capture failed." >&2
|
||||
exit 1
|
||||
fi
|
||||
FILE="$TEMP_FILE"
|
||||
fi
|
||||
|
||||
if [[ ! -f "$FILE" ]]; then
|
||||
echo "Error: File not found: $FILE" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -n "$WAYLAND_DISPLAY" ]]; then
|
||||
echo "Using wl-copy for clipboard."
|
||||
cat "$FILE" | wl-copy
|
||||
elif [[ -n "$DISPLAY" ]]; then
|
||||
echo "Using xclip for clipboard."
|
||||
xclip -selection clipboard -t image/png -i "$FILE"
|
||||
else
|
||||
echo "Error: Unable to detect display server (Wayland/X11)."
|
||||
exit 1
|
||||
fi
|
||||
"$PYTHON_EXEC" "$SCRIPT_DIR/show_image.py" "$FILE" "Copied to your clipboard"
|
||||
|
||||
[[ -n "$TEMP_FILE" ]] && rm -f "$TEMP_FILE"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ -z "$1" ]]; then
|
||||
TEMP_FILE="/tmp/screenshot.png"
|
||||
if [[ -n "$WAYLAND_DISPLAY" ]]; then
|
||||
"${SCREENSHOT_CMD[@]}" "$("$SELECT_REGION")" "$TEMP_FILE"
|
||||
else
|
||||
"${SCREENSHOT_CMD[@]}" "$TEMP_FILE"
|
||||
fi
|
||||
if [[ $? -ne 0 ]]; then
|
||||
echo "Error: Screenshot capture failed." >&2
|
||||
exit 1
|
||||
fi
|
||||
FILE="$TEMP_FILE"
|
||||
else
|
||||
FILE="$1"
|
||||
fi
|
||||
|
||||
if [[ ! -f "$FILE" ]]; then
|
||||
echo "Error: File not found: $FILE" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
FILE_URL=$(curl -s "${HEADERS[@]}" -F file=@"$FILE" "$UPLOAD_URL" | jq -r .files[0].url | tr -d '\n')
|
||||
|
||||
if [[ -n "$WAYLAND_DISPLAY" ]]; then
|
||||
echo "Using wl-copy for clipboard."
|
||||
echo -n "$FILE_URL" | wl-copy
|
||||
elif [[ -n "$DISPLAY" ]]; then
|
||||
echo "Using xclip for clipboard."
|
||||
echo -n "$FILE_URL" | xclip -selection clipboard
|
||||
else
|
||||
echo "Error: Unable to detect display server (Wayland/X11)."
|
||||
exit 1
|
||||
fi
|
||||
"$PYTHON_EXEC" "$SCRIPT_DIR/show_image.py" "$FILE" "$FILE_URL" "$FILE_URL"
|
||||
|
||||
[[ -n "$TEMP_FILE" ]] && rm -f "$TEMP_FILE"
|
Loading…
Add table
Reference in a new issue