diff --git a/keywords2insta 2.sh b/keywords2insta 2.sh new file mode 100755 index 0000000..8c9e6ac --- /dev/null +++ b/keywords2insta 2.sh @@ -0,0 +1,880 @@ +#!/usr/bin/env bash + +red="\033[1;31m" +greenbold="\033[1;32m" +green="\033[0;32m" +yellow="\033[0;33m" +bold="\033[1m" +#bold_under="\033[1;4m" +underline="\033[4m" +reset="\033[0m" + + +# Tags automatically added +# You can add tags to this 4 arrays + +wild=("wildlife" "wildlifephoto" "wildlifephotographer") +nat=("naturelovers" "natureshot" "naturephotography") +reg=("Bourgogne" "Burgundy" "Bourgogne Franche-Comté" "Côte d'or") +#others=("lanscape" "animal" "beautiful nature") +#others=() + +# Display Instagram AND/OR Flickr tags +insta=false # #Becasseauvariable #LeTeich #Bird +flickr=true # "Bécasseau variable" "Le Teich" Bird +ccpx=true # Bécasseau variable, Le Teich, Bird + +gps=0 +opt_gps=true # insert gps data (false: gps data will be deleted in file) +opt_copyright=true # insert copyright, artist, creator (false: data will be deleted in file) + +# Default: all tags +opt_others=false +opt_lens=false +opt_model=false +opt_region=false +opt_nature=false +opt_wildlife=false +opt_all=true # default + +# Google maps static +zoom=10 +color=blue +label="S" +type=hybrid +map_size="450x450" +prefix=${map_size%%x*} # find x position in map_size string +x=${#prefix} +gm_width=${map_size:0:$x} + +#long_path=$(pwd)"/"$(basename "$0") # /Users/bruno/Documents/Scripts/kymsu2/keywords2insta.sh +# long: /Users/bruno/Documents/GitHub/GooFuzz/keywords2insta.sh + +dir=$(dirname "$0") # /Users/bruno/Documents/Scripts/keywords2insta + +dotenv () { + set -a + # shellcheck disable=SC1091 + [ -f "$HOME/.env" ] && . "$HOME/.env" || echo -e "${red}\nNo .env file found ! Googlemaps reverse geocode not working.${reset}" + set +a +} + +dotenv + +trim () { + read -rd '' "$1" <<<"${!1}" +} + +alpha_name= +alpha () { + + array=() + #declare -A ilce=( ['ILCE-7M3']="Alpha 7 III" ['ILCE-7M4']="α7 IV" ['ILCE-7MRM5']="α7R V" ['ILCE-7SM3']="Alpha 7S III" ['ILCE-7RM4']="α7R IV" ['ILCE-7RM3']="α7R III" ['ILCE-7C']="Alpha 7C" ) + declare -A ilce + + if [ -f "$dir"/sony.csv ]; then + + #echo "Loading Sony APNs..." + + while IFS=';' read -ra array; + do + key="${array[0]}" + value="${array[1]}" + ilce["$key"]="$value" + done < "$dir"/sony.csv + + fi + + for val in "${!ilce[@]}" + do + [[ ${val} == "$model" ]] && alpha_name="${ilce[$val]}" + done +} + +showHelp() { + echo -e "${greenbold}keywords2insta${reset} v3.1" + echo -e "Bruno " + echo -e "Read exif and keywords from an image file, and copy them to the clipboard, " + echo -e " ready for Instagram, Flickr and 500px." + echo + echo -e "${yellow}USAGE:${reset}" + echo -e "${green}keyword2insta [-Options...] -f ${reset}" + echo -e "If no option (except gps and copyright) is chosen, all tags are added (default)." + echo -e "Keywords taken from exifs are automatically added." + echo -e "You can add keywords permanently by adding them to the ${underline}others array${reset} at the start of the script. (See others=())" + echo -e "The images files are not modified." + echo + echo -e "If the gps and coypright options are selected, the images files will be modified." + echo + echo -e "${yellow}OPTIONS:${reset}" + echo -e " ${green}-f${reset}, ${green}--file ${reset} Image file" + echo -e " ${green}-l${reset}, ${green}--lens${reset} Add lens exif" + echo -e " ${green}-m${reset}, ${green}--model${reset} Add APN model exif" + echo -e " ${green}-n${reset}, ${green}--nature${reset} Add nature related keywords" + echo -e " ${green}-r${reset}, ${green}--region${reset} Add region related keywords" + echo -e " ${green}-c${reset}, ${green}--copyright${reset} Delete artist and copyright in file" + echo -e " ${green}-t${reset} Add some additionnals keywords" + echo -e " ${green}-w${reset}, ${green}--wildlife${reset} Add wildlife related keywords" + echo -e " ${green}-h${reset}, ${green}--help${reset} Display this help" + echo + echo -e "${yellow}REQUIEREMENTS:${reset}" + echo -e " -${underline}exiftool${reset} for extract exifs ${bold}(requis)${reset}" + echo -e " brew install exiftool" + echo -e " -${underline}iconv${reset} for suppress accent (optional" + echo -e " brew install iconv" + echo -e " -${underline}gawk${reset} for suppress doubles (optional)" + echo -e " brew install gawk" + echo + echo -e "${yellow}EXAMPLES:${reset}" + echo -e " keyword2insta -f image.jpg" + echo -e " keyword2insta -lm -f image.jpg" + echo -e " keyword2insta --lens --model --file image.jpg" + echo -e " keyword2insta -lm -t deer mammal animal -f deer.jpg" + echo + echo -e "${yellow}EXIT CODES:${reset}" + echo -e " 0: Success !" + echo -e " 1: Exiftool could not be found." + echo -e " 2: No image file." + echo -e " 3: Unknown long option." + echo -e " 4: Unknown short option." + echo -e " 5: No Keywords found in image file." + echo + echo -e "${yellow}Changelog:${reset}" + echo -e " v3.0: support 500px" + echo -e " v3.1: display thumb" + echo -e " v3.2: suppress copyright and artist infos" + echo -e " v3.3: add a static Google maps for geoloc" +} + +# https://stackoverflow.com/questions/402377/using-getopts-to-process-long-and-short-command-line-options +# le 1er : de $optspec supprime le message d'erreur +unset -v tags +#OPTIND=1 +optspec=":wnrcf:t:mlh-:" +while getopts "$optspec" opt +do + case $opt in + -) case "${OPTARG}" in + help) showHelp; exit;; + wildlife) opt_wildlife=true;; + nature) opt_nature=true;; + region) opt_region=true;; + file) + file="${!OPTIND}"; OPTIND=$(( OPTIND + 1 )) + ;; + file=*) + file=${OPTARG#*=} + #opt=${OPTARG%=$file} + opt="$(printf "%s\n" "${OPTARG}" | cut -d'=' -f1 )" ; file="$(printf "%s\n" "${OPTARG}" | cut -d'=' -f2-)" + ;; + model) opt_model=true;; + lens) opt_lens=true;; + copyright) opt_copyright=false;; + *) + if [ "$OPTERR" = 1 ] && [ "${optspec:0:1}" = ":" ]; then + echo "Unknown option --${OPTARG}" >&2 + fi + exit 3 + ;; + esac;; + w) opt_wildlife=true;; + n) opt_nature=true;; + r) opt_region=true;; + c) opt_copyright=false;; + f) file="${OPTARG}";; + t) tags=("$OPTARG") + until [[ $(eval "echo \${$OPTIND}") =~ ^-.* ]] || [ -z $(eval "echo \${$OPTIND}") ]; do + tags+=($(eval "echo \${$OPTIND}")) + OPTIND=$((OPTIND + 1)) + done + ;; + m) opt_model=true;; + l) opt_lens=true;; + h) + showHelp + exit 0 + ;; + *) + if [ "$OPTERR" != 1 ] || [ "${optspec:0:1}" = ":" ]; then + echo "Non-option argument: '-${OPTARG}'" >&2 + fi + exit 4 + ;; + esac +done +#shift $((OPTIND-1)) + +if [ $opt_lens = true ] || [ $opt_model = true ] || [ $opt_region = true ] || [ $opt_nature = true ] || [ $opt_wildlife = true ]; then + opt_all=false +fi + +# others: array from script +# tags: array from arguments +if [ ${#others[@]} -gt 0 ] || [ ${#tags[@]} -gt 0 ]; then + opt_others=true +fi + +t=$(echo "${tags[@]}" | sed -r 's/[^ ]+/,&/g') + +#: <<'END_COMMENT' +echo "----" +echo "others: " ${others[@]} +echo "tags: " ${tags[@]} # t +echo "opt_lens: " $opt_lens # l +echo "opt_model: " $opt_model # m +echo "opt_region: " $opt_region # r +echo "opt_nature: " $opt_nature # n +echo "opt_wildlife: " $opt_wildlife # w +echo "opt_others: " $opt_others +echo "opt_copyright: " $opt_copyright # c +echo "----" +#END_COMMENT + + +if ! command -v exiftool &> /dev/null; then + echo -e "${bold}exiftool${reset} could not be found !\n" + echo -e "You should install ${bold}exiftool${reset}:\n" + echo -e " - brew install exiftool" + echo -e "" + exit 1 +fi + +[ ! -f "$file" ] && echo -e "${bold}${red}No input file !${reset}" && exit 2 + +echo -e "\n${greenbold}keywords2insta${reset} v3.3" + +# dico français / anglais + +fr=() +en=() +array2=() +declare -A dico + +if [ -f "$dir"/keywords.csv ]; then + + echo "Loading keyword dictionary..." + + while IFS=';' read -ra array2; + do + fr+=("${array2[0]}") + en+=("${array2[1]}") + done < "$dir"/keywords.csv + + j=0 + for i in "${fr[@]}" + do + x="${en[$j]}" + dico+=( ["$i"]="$x" ) + ((j=j+1)) + done +fi + + +echo -e "\n${bold}Reading $file exif...${reset}" + +# The exiftool application exits with a status of 0 on success, or 1 if an +# error occurred, or 2 if all files failed the -if condition (for any of +# the commands if -execute was used). + + +#exif=$(exiftool -Canon -s -Keywords -j "$file") +exif=$(exiftool -j "$file") +# The exiftool application exits with a status of 0 on success, or 1 if an +# error occurred, or 2 if all files failed the -if condition (for any of +# the commands if -execute was used). + +# exif + +make=$(echo "$exif" | jq -j '.[] | .Make | select( . != null )') +model=$(echo "$exif" | jq -j '.[] | .Model | select( . != null )') +date_original=$(echo "$exif" | jq -j '.[] | .DateTimeOriginal | select( . != null )') +speed=$(echo "$exif" | jq -j '.[] | .ShutterSpeed | select( . != null )') +aperture=$(echo "$exif" | jq -j '.[] | .Aperture | select( . != null )') +iso=$(echo "$exif" | jq -j '.[] | .ISO | select( . != null )') +lens=$(echo "$exif" | jq -j '.[] | .Lens | select( . != null )') +lensID=$(echo "$exif" | jq -j '.[] | .LensID | select( . != null )') +lensModel=$(echo "$exif" | jq -j '.[] | .LensModel | select( . != null )') +focal=$(echo "$exif" | jq -j '.[] | .FocalLength | select( . != null )') +latitude=$(echo "$exif" | jq -j '.[] | .GPSLatitude | select( . != null )') +longitude=$(echo "$exif" | jq -j '.[] | .GPSLongitude | select( . != null )') +altitude=$(echo "$exif" | jq -j '.[] | .GPSAltitude | select( . != null )') +width=$(echo "$exif" | jq -j '.[] | .ImageWidth | select( . != null )') +height=$(echo "$exif" | jq -j '.[] | .ImageHeight | select( . != null )') +size=$(echo "$exif" | jq -j '.[] | .FileSize | select( . != null )') +city=$(echo "$exif" | jq -j '.[] | .City | select( . != null )') +state=$(echo "$exif" | jq -j '.[] | .State | select( . != null )') +country=$(echo "$exif" | jq -j '.[] | .Country | select( . != null )') +comment=$(echo "$exif" | jq -j '.[] | .Comment | select( . != null )') +software=$(echo "$exif" | jq -j '.[] | .Software | select( . != null )') + + +# EXIF:Artist | IPTC:By-line | XMP:Creator : Pesenti +# EXIF:Copyright | IPTC:CopyrightNotice | XMP:Rights: clicclac.info +art=$(echo "$exif" | jq -j '.[] | .Artist | select( . != null )') +#byline=$(echo "$exif" | jq -j '.[] | .By-line | select( . != null )') +creator=$(echo "$exif" | jq -j '.[] | .Creator | select( . != null )') + +if [ -n "$art" ]; then artist="$art" +elif [ -n "$creator" ]; then artist="$creator" +fi + +copy=$(echo "$exif" | jq -j '.[] | .Copyright | select( . != null )') +notice=$(echo "$exif" | jq -j '.[] | .CopyrightNotice | select( . != null )') +rights=$(echo "$exif" | jq -j '.[] | .Rights | select( . != null )') + +if [ -n "$copy" ]; then copyright="$copy " +elif [ -n "$notice" ]; then copyright="$notice" +else copyright="$rights" +fi + + +# Display thumb image + +if [ "$(echo "$__CFBundleIdentifier" | grep iterm2)" ]; then + tmp_path=/tmp/k2i + [ -d $tmp_path ] && rm -rf $tmp_path + mkdir $tmp_path + + #tempfoo=`basename "$file"` + tempfoo=$(basename "$file") + magick "$file" -quality 50 -resize 600x600\> $tmp_path/thumb_"$tempfoo" + if [ -f "$tmp_path/thumb_$tempfoo" ]; then + [ "$width" -gt "$height" ] && w_thumb=600 || w_thumb=$(echo "600/3*2" | bc) + #printf "\n\t\033]1337;File=;width=$w_thumb px;inline=1:`cat $tmp_path/thumb_$tempfoo | base64`\a\n" + printf "\n\t\033]1337;File=;width=$w_thumb px;inline=1:$(cat $tmp_path/thumb_$tempfoo | base64)\a\n" + fi +fi + +echo +if [[ -n $iso ]] && [[ -n $speed ]] && [[ -n $aperture ]]; then + printf " %-11s %-35s \n" "Speed:" "${speed}" + printf " %-11s %-35s \n" "Aperture:" "f/${aperture}" + printf " %-11s %-35s \n" "ISO:" "${iso}" + printf " %-11s %-35s \n" "Date:" "${date_original}" + printf " %-11s %-35s \n" "Maker:" "${make}" + if [[ "$make" =~ ^SONY ]]; then + alpha + printf " %-11s %-35s \n" "APN:" "$alpha_name (${model})" + else + printf " %-11s %-35s \n" "APN:" "${model}" + fi + printf " %-11s %-35s \n" "Focal:" "${focal}" + +# Many lens have the same Lensid +# https://exiftool.org/forum/index.php?topic=3833.msg82043#msg82043 + +# "LensInfo": "100-500mm f/?", +# "LensModel": "RF100-500mm F4.5-7.1 L IS USM", +# "Lens": "RF100-500mm F4.5-7.1 L IS USM", +# "LensID": "Canon RF 100-500mm F4.5-7.1L IS USM or Canon RF 100-500mm F4.5-7.1L IS USM + RF1.4x or Canon RF 100-500mm F4.5-7.1L IS USM + RF2x" + +# "LensInfo": "600mm f/?", +# "LensModel": "EF600mm f/4L IS III USM", +# "Lens": "EF600mm f/4L IS III USM", +# "LensID": "Canon EF 600mm f/4L IS III USM" + +# "LensInfo": "100mm f/?", +# "LensModel": "EF100mm f/2.8 Macro USM", +# "Lens": "EF100mm f/2.8 Macro USM", +# "LensID": "Canon EF 100mm f/2.8 Macro USM" + +# "LensInfo": "24-105mm f/?", +# "LensModel": "EF24-105mm f/4L IS USM", +# "Lens": "EF24-105mm f/4L IS USM", +# "LensID": "Canon EF 24-105mm f/4L IS USM" + +# "LensInfo": "17-40mm f/?", +# "LensModel": "EF17-40mm f/4L USM", +# "Lens": "EF17-40mm f/4L USM", +# "LensID": "Canon EF 17-40mm f/4L USM" + +# "LensInfo": "500mm f/?", +# "LensModel": "EF500mm f/4L IS USM", +# "Lens": "EF500mm f/4L IS USM", +# "LensID": "Canon EF 500mm f/4L IS USM" + +# "LensInfo": "70-200mm f/?", +# "LensModel": "EF70-200mm f/4L USM", +# "Lens": "EF70-200mm f/4L USM", +# "LensID": "Canon EF 70-200mm f/4L USM" + +# "LensInfo": "24mm f/?", +# "LensModel": "24mm F1.4 DG HSM | Art 015", +# "Lens": "24mm F1.4 DG HSM | Art 015", +# "LensID": "Sigma 24-105mm f/4 DG OS HSM | A" + +# "LensInfo": "24-105mm f/?", +# "LensModel": "RF24-105mm F4-7.1 IS STM", +# "Lens": "RF24-105mm F4-7.1 IS STM", +# "LensID": "Canon RF 24-105mm F4-7.1 IS STM" + +# "LensInfo": "840mm f/?", +# "LensModel": "EF600mm f/4L IS III USM +1.4x III", +# "Lens": "EF600mm f/4L IS III USM +1.4x III", +# "LensID": "Canon EF 600mm f/4L IS III USM + 1.4x" + +# "LensInfo": "700mm f/?", +# "LensModel": "EF500mm f/4L IS USM +1.4x III", +# "Lens": "EF500mm f/4L IS USM +1.4x III", +# "LensID": "Canon EF 500mm f/4L IS USM + 1.4x" + + + if [[ -n $lensID ]]; then + printf " %-11s %-35s \n" "LensID:" "${lensID}" + l="$lensID" + elif [[ -n $lensModel ]]; then + printf " %-11s %-35s \n" "LensModel:" "${lensModel}" + l="$lensModel" + else + printf " %-11s %-35s \n" "Lens:" "${lens}" + l="$lens" + fi + # width > height && w=2400 || w=1600 + if [ "$width" -gt "$height" ]; then + wi=2400 + he=1600 + [ "$width" -ne "$wi" ] && printf " %-11s %-35b \n" "Width:" "${red}${width}${reset}" || printf " %-11s %-35s \n" "Width:" "${width}" + [ "$height" -ne "$he" ] && printf " %-11s %-35b \n" "Height:" "${red}${height}${reset}" || printf " %-11s %-35s \n" "Height:" "${height}" + elif [ "$height" -gt "$width" ]; then + wi=1600 + he=2400 + [ "$width" -ne "$wi" ] && printf " %-11s %-35b \n" "Width:" "${red}${width}${reset}" || printf " %-11s %-35s \n" "Width:" "${width}" + [ "$height" -ne "$he" ] && printf " %-11s %-3b \n" "Height:" "${red}${height}${reset}" || printf " %-11s %-35s \n" "Height:" "${height}" + fi + #printf " %-11s %-35s \n" "Width:" "${width}" + #printf " %-11s %-35s \n" "Height:" "${height}" + printf " %-11s %-35s \n" "Size:" "${size}" + + if [[ -n $latitude ]] && [[ -n $longitude ]]; then + gps=1 + + printf " %-11s %-35s \n" "Latitude:" "${latitude}" + printf " %-11s %-35s \n" "Longitude:" "${longitude}" + printf " %-11s %-35s \n" "Altitude:" "${altitude}" + city="" + if [[ -n $city ]] && [[ -n $state ]] && [[ -n $country ]]; then + printf " %-11s %-35s \n" "City:" "${city}" + printf " %-11s %-35s \n" "State:" "${state}" + printf " %-11s %-35s \n" "Country:" "${country}" + else + coords=$(exiftool -n -gpslatitude -gpslongitude "$file") + lat=$(echo "$coords" | sed -n '1p' | awk -F":" '{print $2}' | xargs) + long=$(echo "$coords" | sed -n '$p' | awk -F":" '{print $2}' | xargs) + + if [[ -n $GM_API_KEY ]]; then + gm=$(curl -s "https://maps.googleapis.com/maps/api/geocode/json?latlng=${lat},${long}&sensor=false&key=$GM_API_KEY" | jq -r '.results[0].address_components') + city=$(echo "$gm" | jq '. | map( select( .types | contains(["locality"]) ) ) | .[].long_name') + code=$(echo "$gm" | jq '. | map( select( .types | contains(["postal_code"]) ) ) | .[].long_name') + state=$(echo "$gm" | jq '. | map( select( .types | contains(["administrative_area_level_2"]) ) ) | .[].long_name') + region=$(echo "$gm" | jq '. | map( select( .types | contains(["administrative_area_level_1"]) ) ) | .[].long_name') + country=$(echo "$gm" | jq '. | map( select( .types | contains(["country"]) ) ) | .[].long_name') + + printf " %-11s %-35s \n" "CP / City:" "${code//\"/} ${city//\"/}" + printf " %-11s %-35s \n" "State:" "${state//\"/}" + printf " %-11s %-35s \n" "Region:" "${region//\"/}" + printf " %-11s %-35s \n" "Country:" "${country//\"/}" + + #url="https://maps.googleapis.com/maps/api/staticmap?center=$lat,$long&zoom=14&size=400x400&key=$GM_API_KEY" + url="https://maps.googleapis.com/maps/api/staticmap?center=$lat,$long&zoom=$zoom&markers=color:$color%7Clabel:$label%7C$lat,$long&maptype=$type&size=$map_size&key=$GM_API_KEY" + + #curl "https://maps.googleapis.com/maps/api/staticmap?center=47.1275353416667,4.78201903333333&zoom=14&size=400x400&key=AIzaSyD94L2Q4K9_ErGSarTBN4FrUxDSspGzNhY" --output /tmp/gm.png + gm_path=/tmp/k2i/gm.png + curl -s "$url" --output $gm_path + if [ -f "$gm_path" ]; then + #printf "\n\t\033]1337;File=;width=$((gm_width * 2)) px;inline=1:`cat $gm_path | base64`\a\n" + printf "\n\t\033]1337;File=;width=$((gm_width * 2)) px;inline=1:$(cat $gm_path | base64)\a\n" + fi + + fi + fi + fi + + printf " %-11s %-35s \n" "Software:" "${software}" + printf " %-11s %-35s \n" "Comment:" "${comment}" + printf " %-11s %-35s \n" "Artist:" "${artist}" + printf " %-11s %-35s \n" "Copyright:" "${copyright}" + echo + +fi + + + +# gps +if [ $opt_gps = true ]; then + if [ $gps -eq 1 ]; then + echo -e "${red}GPS data available !${reset}" + + d=$(echo -e "Do you want to ${bold}erase GPS data${reset} ? (k)eep or (e)rase ") + read -r -p "$d" choice + + if [ "$choice" == "e" ] || [ "$choice" == "E" ]; then + echo "Erasing GPS data..." + exiftool -gps:all= "$file" + fi + fi +else + # erase GPS data + echo "Erasing GPS data..." + exiftool -gps:all= "$file" +fi + + +# copyright +if [ $opt_copyright = false ]; then + b=$(echo -e "Do you want to ${bold}erase Artist and Copyright data${reset} ? (k)eep or (e)rase ") + read -r -p "$b" choice + + if [ "$choice" == "e" ] || [ "$choice" == "E" ]; then + echo "Erasing Artist and Copyright data..." + #a="-EXIF:Artist= -IPTC:By-line= -XMP:Creator=" + #c="-EXIF:Copyright= -IPTC:CopyrightNotice= -XMP:Rights=" + exiftool -EXIF:Artist= -IPTC:By-line= -XMP:Creator= -EXIF:Copyright= -IPTC:CopyrightNotice= -XMP:Rights= "$file" + fi +fi + + +# keywords +k=$(echo "$exif" | jq --compact-output --raw-output '.[] | .Keywords[]?' | tr "\n" "," | sed 's/\,$//') +#k=$(echo "$exif" | sed -n '/^Keywords/p' | awk -F":" '{print $2}' | sed 's/^ *//g') + +if [ -z "$k" ]; then + echo -e "\n${bold}${red}No Keywords found !${reset}" + echo +fi + + +IFS="," read -r -a key <<< "$k" + + +for i in "${key[@]}" +do + #echo "@$i@" + # @ bouton d'or@ + # xargs: unterminated quote + + ii="$i" + trim ii + + if [[ ! "$ii" =~ ^_ ]]; then + + if [[ ${dico["$ii"]} ]] ; then + k_en=${dico["$ii"]} + else + k_en="" + fi + + k_fr="$ii" + + if [ -n "$k_en" ]; then + [[ "$k_fr" = *" "* ]] && keyword_flickr+="\"${k_fr}\" " || keyword_flickr+="${k_fr} " + [[ "$k_en" = *" "* ]] && keyword_flickr+="\"${k_en}\" " || keyword_flickr+="${k_en} " + keyword_insta+="#${k_fr// /} #${k_en// /} " + [[ "$k_fr" = *" "* ]] && keyword_ccpx+="${k_fr}," || keyword_ccpx+="${k_fr}," + [[ "$k_en" = *" "* ]] && keyword_ccpx+="${k_en}," || keyword_ccpx+="${k_en}," + else + [[ "$k_fr" = *" "* ]] && keyword_flickr+="\"${k_fr}\" " || keyword_flickr+="${k_fr} " + [[ "$k_fr" = *" "* ]] && keyword_ccpx+="${k_fr}," || keyword_ccpx+="${k_fr}," + keyword_insta+="#${k_fr// /} " + fi + + fi +done + + +# model +# Canon EOS R6 Canon EOS 5D Mark III Canon EOS-1D Mark IV Canon EOS 20D +#m=$(echo "$exif" | sed -n '/^Model/p' | awk -F":" '{print $2}' | xargs) +#mod=("${m}") # Canon EOS R6 + +# "Make": "OM Digital Solutions", +# "Model": "OM-5", "OM-1" +# "Make": "SONY", +# "Model": "ILCE-7M3", "ILCE-7M4" +# "Make": "FUJIFILM", +# "Model": "X-T5", +# "Make": "Panasonic", +# "Model": "DC-S5", + +# "Make": "LEICA CAMERA AG", +# "Model": "LEICA Q3", "LEICA SL2-S" +# "Make": "NIKON CORPORATION", +# "Model": "NIKON D850", +# "Make": "NIKON CORPORATION", +# "Model": "NIKON Z 9", +# "Make": "Canon", +# "Model": "Canon EOS R7", + +if [[ "$make" =~ ^Panasonic ]] || [[ "$make" =~ ^FUJI ]]; then + mod=("${make} ${model}") + mod+=("${make}") + mod+=("${model}") + mod+=("${make,,}photography") +elif [[ "$make" =~ ^SONY ]]; then + mod=("${make} ${model}") + mod+=("${make}") + mod+=("${model}") + # convertir α en Alpha + q=$(echo "${alpha_name}" | sed 's/α/Alpha /') + mod+=("$q") + mod+=("${make,,}photography") +elif [[ "$make" =~ ^"OM Digital Solutions" ]]; then + mod=("${make} ${model}") # OM Digital Solutions OM-5 + mod+=("Olympus") # Olympus + mod+=("${model}") # OM-5 +elif [[ "$model" =~ ^NIKON ]] || [[ "$model" =~ ^LEICA ]]; then + mod=("${make}") + z=$(echo "${make,,}" | awk '{print $1}') ## nikon + y=$(echo "${make}" | awk '{print $1}') ## NIKON + mod+=("${z}photography") # nikonphotography leicaphotography + mod+=("${y}") # NIKON LEICA + mod+=("${model}") # NIKON Z 9 LEICA Q3 + w=$(echo "${model}" | awk '{$1=""; print $0}' | xargs) + mod+=("${w}") +elif [[ "$model" =~ ^Canon ]]; then + mod+=("Canon") + mod+=("${make,}photography") + [[ "$model" = *EOS* ]] || mod+=("EOS") # EOS + z=$(echo "$model" | sed 's/Canon\ //g' | xargs) + y=$(echo "$model" | sed 's/EOS//g' | sed 's/[ ][ ]*/ /g' | xargs) + mod+=("${z}") # EOS R6 + mod+=("${y}") # Canon R6 +fi + +for i in "${mod[@]}" +do + if [[ "$i" = *" "* ]]; then + model_flickr+="\"${i}\" " + else + model_flickr+="${i} " + fi + model_ccpx+="${i}," + model_insta+="#${i// /} " # supprime tous les espaces et ajoute le # +done + + +#lens + +# "LensModel": "E 28-200mm F2.8-5.6 A071", +# "Lens": "E 28-200mm F2.8-5.6 A071", +# "LensID": "Tamron 28-200mm F2.8-5.6 Di III RXD", +# "LensModel": "FE 35mm F2.8 ZA", +# "Lens": "FE 35mm F2.8 ZA", +# "LensID": "FE 35mm F2.8 ZA" + +# LensID": "OLYMPUS M.12-45mm F4.0" +# "LensModel": "OLYMPUS M.12-45mm F4.0", +# "Lens": "OLYMPUS M.12-45mm F4.0", +# "LensModel": "OLYMPUS M.300mm F4.0", +# "Lens": "OLYMPUS M.300mm F4.0", +# "LensID": "OLYMPUS M.300mm F4.0" + +# "Lens": "OLYMPUS M.300mm F4.0", "Lens": "OLYMPUS M.12-45mm F4.0", +# "LensModel": "OLYMPUS M.300mm F4.0", "LensModel": "OLYMPUS M.12-45mm F4.0", + +# Leica no Lens no LensID +# "LensModel": "SUMMILUX 1:1.7/28 ASPH.", "Leica APO-Summicron-SL 35mm f/2 ASPH", + +# "LensModel": "Leica APO-Summicron-SL 35mm f/2 ASPH", +# "Lens": "Leica APO-Summicron-SL 35mm f/2 ASPH", +# "LensID": "Leica APO-Summicron-SL 35mm f/2 ASPH" + +# "Lens": "Fujifilm Fujinon XF18mmF1.4 R LM WR", +# "LensModel": "Fujifilm Fujinon XF18mmF1.4 R LM WR", +# LensID": "LUMIX S 20-60mm F3.5-5.6" + +# "Lens": "LUMIX S 20-60/F3.5-5.6", +# "LensModel": "LUMIX S 20-60/F3.5-5.6", +# "LensID": "Fujifilm Fujinon XF18mm F1.4 R LM WR" + +# "Lens": "400mm f/2.8", +# "LensID": "AF-S VR Nikkor 400mm f/2.8G ED", +# Nikon si LensModel vide => LensID + +# "LensModel": "VR 300mm f/2.8G", +# "Lens": "300.0 mm f/2.8", +# "LensID": "VR 300mm f/2.8G" + +# "LensModel": "EF600mm f/4L IS III USM", +# "LensID": "Canon EF 600mm f/4L IS III USM" +# "Lens": "EF600mm f/4L IS III USM", + +# 1 LensID puis 2 LendModel + + +lens_flickr="\"${l}\" " +lens_insta="$(echo "$l" | sed 's/ //g' | sed -r 's/[^ ]+/#&/g') " +lens_ccpx+="${l}," + + +for i in "${wild[@]}" +do + if [[ "$i" = *" "* ]]; then + wildlife_flickr+="\"${i}\" " + else + wildlife_flickr+="${i} " + fi + wildlife_ccpx+="${i}," + wildlife_insta+="#$(echo "${i}" | iconv -s -f UTF-8-MAC -t ascii//translit | sed 's/[^a-zA-Z 0-9]//g' | sed 's/ //g') " +done + +for i in "${nat[@]}" +do + if [[ "$i" = *" "* ]]; then + nature_flickr+="\"${i}\" " + else + nature_flickr+="${i} " + fi + nature_ccpx+="${i}," + nature_insta+="#$(echo "${i}" | iconv -s -f UTF-8-MAC -t ascii//translit | sed 's/[^a-zA-Z 0-9]//g' | sed 's/ //g') " +done + +for i in "${reg[@]}" +do + if [[ "$i" = *" "* ]]; then + region_flickr+="\"${i}\" " + else + region_flickr+="${i} " + fi + region_ccpx+="${i}," + region_insta+="#$(echo "${i}" | iconv -s -f UTF-8-MAC -t ascii//translit | sed 's/[^a-zA-Z 0-9]//g' | sed 's/ //g') " +done + + +if [ $opt_all = false ]; then + + if [ $opt_wildlife = false ]; then + wildlife_flickr="" + wildlife_insta="" + wildlife_ccpx="" + fi + + if [ $opt_nature = false ]; then + nature_flickr="" + nature_insta="" + nature_ccpx="" + fi + + if [ $opt_region = false ]; then + region_flickr="" + region_insta="" + region_ccpx="" + fi + + if [ $opt_lens = false ]; then + lens_flickr="" + lens_insta="" + lens_ccpx="" + fi + + if [ $opt_model = false ]; then + model_flickr="" + model_insta="" + model_ccpx="" + fi + +fi + +keywords_flickr="$keyword_flickr$model_flickr$lens_flickr$wildlife_flickr$nature_flickr$region_flickr" +keywords_ccpx="$keyword_ccpx$model_ccpx$lens_ccpx$wildlife_ccpx$nature_ccpx$region_ccpx" +keywords_insta=$(echo "$keyword_insta$model_insta$lens_insta$wildlife_insta$nature_insta$region_insta" | awk '{print tolower($0)}') + +if [ $opt_others = true ]; then + + # insert tags added with option -t to others's tag array + others+=($(echo "$t" | tr ',' ' ')) + + for i in "${others[@]}" + do + if [[ ${dico["$i"]} ]] ; then + o_en=${dico["$i"]} + else + o_en="" + fi + + if [ -n "$o_en" ]; then + [[ "$i" = *" "* ]] && others_flickr+="\"${i}\" " || others_flickr+="${i} " + [[ "$o_en" = *" "* ]] && others_flickr+="\"${o_en}\" " || others_flickr+="${o_en} " + others_insta+="#${i// /} #${o_en// /} " + [[ "$i" = *" "* ]] && others_ccpx+="${i}," || others_ccpx+="${i}," + [[ "$o_en" = *" "* ]] && others_ccpx+="${o_en}," || others_ccpx+="${o_en}," + else + [[ "$i" = *" "* ]] && others_flickr+="\"${i}\" " || others_flickr+="${i} " + [[ "$i" = *" "* ]] && others_ccpx+="${i}," || others_ccpx+="${i}," + others_insta+="#${i// /} " + fi + done + keywords_flickr+="$others_flickr" + keywords_insta+="$others_insta" + keywords_ccpx+="${others_ccpx:0:-1}" +fi + + +# suppress accent (bug in macos) => add sed => suppress punctuation too +# https://stackoverflow.com/questions/806199/how-to-fix-weird-issue-with-iconv-on-mac-os-x + +if ! command -v iconv &> /dev/null; then + echo -e "\n${bold}iconv${reset} could not be found !\n" + echo -e "It's required for suppress accents." + echo -e "You should install ${bold}icon${reset}:" + echo -e " - brew install iconv" + echo -e "" +else + ### + keywords_insta=$(echo "$keywords_insta" | iconv -s -f UTF-8-MAC -t ascii//translit | sed 's/[^a-zA-Z 0-9 \#]//g') +fi + + +# suppress duplicates (gawk) +if ! command -v gawk &> /dev/null; then + echo -e "\n${bold}gawk${reset} could not be found !\n" + echo -e "It's required for suppress duplicates." + echo -e "You should install ${bold}gawk${reset}:" + echo -e " - brew install gawk" + echo -e "" +else + keywords_insta=$(echo "$keywords_insta" | gawk -v RS="[ \n]" -v ORS=" " '!($0 in a){print;a[$0]}') +fi + + +# copy tags to clipboard + +if [ "$insta" = true ]; then + + if [[ "$OSTYPE" == "linux-gnu" ]] && [ -x "$(command -v xsel)" ]; then + xsel -b <<< "$keywords_insta" + elif [[ "$OSTYPE" == "darwin"* ]] && [ -x "$(command -v pbcopy)" ]; then + pbcopy <<< "$keywords_insta" + fi + + echo -e "\n${bold}The Instagram's tags are available in your clipboard !${reset}" + echo "$keywords_insta" + + [ "$flickr" = true ] || [ "$ccpx" = true ] && echo -e "\nPress to get the Flickr's or the 500px's tags..." && read -r -p "" + +fi + +if [ "$flickr" = true ]; then + if [[ "$OSTYPE" == "linux-gnu" ]] && [ -x "$(command -v xsel)" ]; then + xsel -b <<< "$keywords_flickr" + elif [[ "$OSTYPE" == "darwin"* ]] && [ -x "$(command -v pbcopy)" ]; then + pbcopy <<< "$keywords_flickr" + fi + + [ "$insta" = true ] && echo -e "\n${bold}Here the Flickr's tags too !${reset}" || echo -e "\n${bold}The Flickr's tags are available in your clipboard !${reset}" + echo "$keywords_flickr" + + [ "$ccpx" = true ] && echo -e "\nPress to get the 500px's tags..." && read -r -p "" +fi + +if [ "$ccpx" = true ]; then + if [[ "$OSTYPE" == "linux-gnu" ]] && [ -x "$(command -v xsel)" ]; then + xsel -b <<< "$keywords_ccpx" + elif [[ "$OSTYPE" == "darwin"* ]] && [ -x "$(command -v pbcopy)" ]; then + pbcopy <<< "$keywords_ccpx" + fi + + #[ "$insta" = true ] && echo -e "\n${bold}Here the Flickr's tags too !${reset}" || echo -e "\n${bold}The Flickr's tags are available in your clipboard !${reset}" + [ "$insta" = true ] || [ "$flickr" = true ] && echo -e "\n${bold}Here the 500px's tags too !${reset}" || echo -e "\n${bold}The 500px's tags are available in your clipboard !${reset}" + + echo "$keywords_ccpx" +fi