diff --git a/functions.sh b/functions.sh index 48c76b9..9c86b48 100755 --- a/functions.sh +++ b/functions.sh @@ -69,12 +69,114 @@ getinfo_photos() { comments=$(echo "$info_photo" | jq -r '.photo .comments | ._content') tags=$(echo "$info_photo" | jq -r '.photo .tags | .tag[].raw' | tr '\n' ',') - urls=$(echo "$info_photo" | jq -r '.photo .urls | .url[] | ._content') + url=$(echo "$info_photo" | jq -r '.photo .urls | .url[] | ._content') +: <<'END_COMMENT2' #echo "Photo ID: $id - Title: $title" echo "Description: $description" echo "Posted: $posted - Taken: $taken" echo "View: $view - Comments: $comments" echo "Tags: $tags" echo +END_COMMENT2 + +} + + + +################################################### +# # +# Get contexts for the given photo. # +# flickr.photos.getAllContexts # +# # +################################################### + +getAllContexts_photos() { + + params=("$@") + #contexts_photo=$(curl -s "https://www.flickr.com/services/rest/?method=flickr.photos.getAllContexts&api_key=$api_key&photo_id=$photo_id&format=json&nojsoncallback=1") + contexts_photo=$(curl -s "https://www.flickr.com/services/rest/?method=flickr.photos.getAllContexts&api_key=$1&photo_id=$2&format=json&nojsoncallback=1") + + albums=$(echo "$contexts_photo" | jq -r '.set') + groups=$(echo "$contexts_photo" | jq -r '.pool') + + if [ "$albums" != "null" ]; then + title_alb=$(echo "$albums" | jq -r '.[].title' | tr '\n' ';') + id_alb=$(echo "$albums" | jq -r '.[].id' | tr '\n' ';') + else + title_alb="" + id_alb="" + fi + + if [ "$groups" != "null" ]; then + title_gro=$(echo "$groups" | jq -r '.[].title' | tr '\n' ';') + id_gro=$(echo "$groups" | jq -r '.[].id' | tr '\n' ';') + url_gro=$(echo "$groups" | jq -r '.[].url' | tr '\n' ';') + else + title_gro="" + id_gro="" + url_gro="" + fi +: <<'END_COMMENT2' + + echo "ID: $id_alb" + echo "Albums: $title_alb" + echo + + echo "ID: $id_gro" + echo "Groups: $title_gro" + echo "URL: $url_flickr$url_gro" +END_COMMENT2 + +} + + +################################################### +# # +# Get favorites for the given photo. # +# flickr.photos.getFavorites # +# # +################################################### + +getFavorites_photos() { + + params=("$@") + favorites_photo=$(curl -s "https://www.flickr.com/services/rest/?method=flickr.photos.getFavorites&api_key=$1&photo_id=$2&format=json&nojsoncallback=1") + + favorites=$(echo "$favorites_photo" | jq -r '.photo .total') + +} + + +search_photos() { + + # tags, tag_mode (OR/AND), text (-exclude) + # min_upload_date, max_upload_date, min_taken_date, max_taken_date (timestamp or mysql datetime) + # sort (date-posted-asc, date-posted-desc, date-taken-asc, date-taken-desc, interestingness-desc, interestingness-asc, and relevance.) + # group_id, user_id, media (all/photos/videos), has_geo + # extras (description, license, date_upload, date_taken, owner_name, icon_server, original_format, last_update, geo, tags, machine_tags, o_dims, views, media, path_alias, url_sq, url_t, url_s, url_q, url_m, url_n, url_z, url_c, url_l, url_o) + + + params=("$@") + search_photo=$(curl -s "https://www.flickr.com/services/rest/?method=flickr.photos.search&api_key=$1&user_id=$2&$3&format=json&nojsoncallback=1") + + search=$(echo "$search_photo" | jq -r '.photos .photo') + + counter=0 + while read -r id && read -r title; do + echo -e "${BOLD}Photo ID: ${id}\t Title: ${title}${COLOR_RESET}" + + photo_id=$(echo "${id}" | sed "s/'/''/g") + photo_title=$(echo "${title}" | sed "s/'/''/g") + + ID+=(${id}) + ((++counter)) + + done < <(jq -r -c '.[] | .id, .title' <<< "$search") + + request="${request//+/ }" + request="${request//%3A/:}" + + echo -e "${COLOR_GREEN}Found $counter public photos for request (${request//+/ }) on Flickr.${COLOR_RESET}" + } diff --git a/insert.sh b/insert.sh new file mode 100755 index 0000000..8a71087 --- /dev/null +++ b/insert.sh @@ -0,0 +1,238 @@ +#!/usr/bin/env bash + +#NO_COLOR=1 + +# Check if NO_COLOR is set to disable colorization +if [ -z "$NO_COLOR" ]; then + : "${COLOR_GREEN:=$'\e[32m'}" + : "${COLOR_GREEN_BOLD:=$'\e[1;32m'}" + : "${COLOR_RED:=$'\e[31m'}" + : "${COLOR_RED_BOLD:=$'\e[1;31m'}" + : "${COLOR_YELLOW=$'\e[33m'}" + : "${COLOR_YELLOW_BOLD:=$'\e[1;33m'}" + : "${COLOR_SILVER=$'\e[37m'}" + : "${COLOR_LIGHT_GREY=$'\e[249m'}" + : "${COLOR_BRIGHT_PURPLE=$'\e[35;1m'}" + : "${BOLD:=$'\e[1m'}" + : "${ITALIC:=$'\e[3m'}" + : "${COLOR_RESET:=$'\e[00m'}" +else + : "${BOLD:=$'\e[1m'}" + : "${COLOR_RESET:=$'\e[00m'}" + : "${ITALIC:=$'\e[3m'}" +fi + +#api_key= +#user_id= + +### Variables for self updating +ScriptArgs=( "$@" ) +ScriptPath="$(readlink -f "$0")" # /Users/bruno/Documents/Scripts/bashbirds/bashbirds.sh +ScriptWorkDir="$(dirname "$ScriptPath")" # /Users/bruno/Documents/Scripts/bashbirds + +dotenv () { + set -a + # shellcheck disable=SC1091 + [ -f "$ScriptWorkDir/.env" ] && . "$ScriptWorkDir/.env" || { echo -e "${red}\nNo .env file found ! No API key for Flickr.'.${reset}"; exit 1; } + set +a +} + +dotenv + + +################################################### +# # +# Create database flick.db # +# # +################################################### + +dir=$(dirname "$0") + +if [ ! -f ./flickr.db ]; then + cmd0="CREATE TABLE photos (PhotoID VARCHAR(16) PRIMARY KEY, Title VARCHAR(50), Description VARCHAR(100), Posted VARCHAR(16), Taken VARCHAR(16), View INT, Favorites INT, Comments INT, Tags VARCHAR(300), Url VARCHAR(75), AlbumID VARCHAR(100), GroupID VARCHAR(150) );" + echo "$cmd0" | sqlite3 ./flickr.db + + cmd1="CREATE TABLE groups (GroupID VARCHAR(16) PRIMARY KEY, GroupTitle VARCHAR(75), GroupUrl VARCHAR(50) );" + echo "$cmd1" | sqlite3 ./flickr.db + + cmd2="CREATE TABLE albums (AlbumID INT PRIMARY KEY, AlbumTitle VARCHAR(50) UNIQUE );" + echo "$cmd2" | sqlite3 ./flickr.db + + if [ $? -ne 0 ]; then exit 0; fi +fi + +array=() + + + +source "$ScriptWorkDir/functions.sh" + +perpage=500 +pages= +# getinfo_people +username= +userid= +path_alias= +firstdatetaken= +photosurl= +profileurl= +# getinfo_photos +description= +posted= +taken= +view= +comments= +tags= +url= +# getFavorites_photos +favorites= +# getAllContexts_photos +title_alb= +id_alb= +title_gro= +id_gro= +url_gro= + +################################################### +# # +# Get info about the given user. # +# # +################################################### + +params_info=("$api_key" "$user_id") +getinfo_people "${params_info[@]}" + +echo -e "\n${COLOR_GREEN}Get info about user ($user_id).${COLOR_RESET}" + +printf "%15s %50s\n" "Name:" "$username" +printf "%15s %50s\n" "Alias:" "$path_alias" +printf "%15s %50s\n" "UserID:" "$userid" +printf "%15s %50s\n" "Joined:" "$firstdatetaken" +printf "%15s %50s\n" "Gallery:" "$photosurl" +printf "%15s %50s\n" "Profile:" "$profileurl" + + + +################################################### +# # +# Get a list of public photos for the given user. # +# # +################################################### + +#photos=$(curl "https://www.flickr.com/services/rest/?method=flickr.people.getPublicPhotos&api_key=$api_key&user_id=$user_id&per_page=500&page=2&format=json&nojsoncallback=1") + +echo -e "\n${COLOR_GREEN}Get a list of public photos for the given user ($user_id).${COLOR_RESET}" + +: <<'END_COMMENT2' + +echo -e "One request per page..." + +#for page in {1..2} +for (( page=1; page <=$pages; page++ )) +do + #echo "Page $page" + curl -s "https://www.flickr.com/services/rest/?method=flickr.people.getPublicPhotos&api_key=$api_key&user_id=$user_id&per_page=500&page=$page&format=json&nojsoncallback=1" | jq '.photos | .photo' > "page${page}.json" +done + +echo -e "Concatenate all pages in liste.json" + +allpages=$(ls page*.json | tr '\n' ' ') + +#jq -s 'add' page1.json page2.json > liste.json +jq -s 'add' ${allpages} > liste.json + +#echo -e "Display all images list..." +echo -e "Insertion des données du fichier liste.json dans la base flickr.db...\n" +END_COMMENT2 + +photos=$(cat page1.json) +#photos=$(cat liste.json) +ID=() +counter=1 + +while read -r id && read -r title; do + echo -e "${BOLD}Photo ID: ${id}\t Title: ${title}${COLOR_RESET}" + + photo_id=$(echo "${id}" | sed "s/'/''/g") + photo_title=$(echo "${title}" | sed "s/'/''/g") + + # Infos + params_info=("$api_key" "$id") + getinfo_photos "${params_info[@]}" + + photo_description=$(echo "${description}" | sed "s/'/''/g") + photo_posted=$(echo "${posted}" | sed "s/'/''/g") + photo_taken=$(echo "${taken}" | sed "s/'/''/g") + photo_view=$(echo "${view}" | sed "s/'/''/g") + photo_comments=$(echo "${comments}" | sed "s/'/''/g") + photo_tags=$(echo "${tags}" | sed "s/'/''/g") + photo_url=$(echo "${url}" | sed "s/'/''/g") + + # Favorites + params_favorites=("$api_key" "$_photo_id") + getFavorites_photos "${params_favorites[@]}" + photo_favorites=$(echo "${favorites}" | sed "s/'/''/g") + + # Albums - Groups + params_context=("$api_key" "$id") + getAllContexts_photos "${params_context[@]}" + + # Albums + a_t=$(echo "${title_alb}" | sed "s/'/''/g") # album_title + a_i=$(echo "${id_alb}" | sed "s/'/''/g") # album_id + + IFS=';' + read -ra album_title <<< "$a_t" + read -ra album_id <<< "$a_i" + + req= + for val in ${!album_id[@]} + do + echo "${album_id[$val]} - ${album_title[$val]}" + + if [ -n "${album_id[$val]}" ]; then + cmd5="INSERT OR REPLACE INTO albums (AlbumID, AlbumTitle) VALUES ('${album_id[$val]}', '${album_title[$val]}');" + echo "$cmd5" | sqlite3 ./flickr.db + fi + done + + +: <<'END_COMMENT2' +END_COMMENT2 + + # Groups + g_t=$(echo "${title_gro}" | sed "s/'/''/g") # group_title + g_i=$(echo "${id_gro}" | sed "s/'/''/g") # group_id + g_u=$(echo "${url_gro}" | sed "s/'/''/g") # group_url + + IFS=';' + read -ra group_title <<< "$g_t" + read -ra group_id <<< "$g_i" + read -ra group_url <<< "$g_u" + + for val in ${!group_id[@]} + do + echo "${group_id[$val]} - ${group_title[$val]} - ${group_url[$val]}" + + if [ -n "${group_id[$val]}" ]; then + cmd4="INSERT OR REPLACE INTO groups (GroupID, GroupTitle, GroupUrl) VALUES ('${group_id[$val]}', '${group_title[$val]}', '${group_url[$val]}');" + echo "$cmd4" | sqlite3 ./flickr.db + fi + done + + + # + cmd3="INSERT OR REPLACE INTO photos (PhotoID, Title, Description, Posted, Taken, View, Favorites, Comments, Tags, Url, AlbumID, GroupID) VALUES ('$photo_id','$photo_title', '$photo_description', '$photo_posted', '$photo_taken', '$photo_view', '$photo_favorites', '$photo_comments', '$photo_tags', '$photo_url', '$a_i', '$g_i');" + echo "$cmd3" | sqlite3 ./flickr.db + echo $? + + + ID+=(${id}) + ((++counter)) + +done < <(jq -r -c '.[] | .id, .title' <<< "$photos") + +echo -e "${COLOR_GREEN}Found $counter public photos for user ($user_id) on Flickr.${COLOR_RESET}" + + + diff --git a/select.sh b/select.sh new file mode 100755 index 0000000..9dfd821 --- /dev/null +++ b/select.sh @@ -0,0 +1,302 @@ +#!/usr/bin/env bash + +#NO_COLOR=1 + +# Check if NO_COLOR is set to disable colorization +if [ -z "$NO_COLOR" ]; then + : "${COLOR_GREEN:=$'\e[32m'}" + : "${COLOR_GREEN_BOLD:=$'\e[1;32m'}" + : "${COLOR_RED:=$'\e[31m'}" + : "${COLOR_RED_BOLD:=$'\e[1;31m'}" + : "${COLOR_YELLOW=$'\e[33m'}" + : "${COLOR_YELLOW_BOLD:=$'\e[1;33m'}" + : "${COLOR_SILVER=$'\e[37m'}" + : "${COLOR_LIGHT_GREY=$'\e[249m'}" + : "${COLOR_BRIGHT_PURPLE=$'\e[35;1m'}" + : "${BOLD:=$'\e[1m'}" + : "${ITALIC:=$'\e[3m'}" + : "${COLOR_RESET:=$'\e[00m'}" +else + : "${BOLD:=$'\e[1m'}" + : "${COLOR_RESET:=$'\e[00m'}" + : "${ITALIC:=$'\e[3m'}" +fi + +#api_key= +#user_id= + +### Variables for self updating +ScriptArgs=( "$@" ) +ScriptPath="$(readlink -f "$0")" # /Users/bruno/Documents/Scripts/bashbirds/bashbirds.sh +ScriptWorkDir="$(dirname "$ScriptPath")" # /Users/bruno/Documents/Scripts/bashbirds + +dotenv () { + set -a + # shellcheck disable=SC1091 + [ -f "$ScriptWorkDir/.env" ] && . "$ScriptWorkDir/.env" || { echo -e "${red}\nNo .env file found ! No API key for Flickr.'.${reset}"; exit 1; } + set +a +} + +dotenv + +source "$ScriptWorkDir/functions.sh" + +: <<'END_COMMENT2' +TABLE photos ( + PhotoID VARCHAR(16) PRIMARY KEY, + Title VARCHAR(50), + Description VARCHAR(100), + Posted VARCHAR(16), + Taken VARCHAR(16), + View INT, + Favorites INT, + Comments INT, + Tags VARCHAR(300), + Url VARCHAR(75), + AlbumID VARCHAR(100), + GroupID VARCHAR(150) + ) + +TABLE groups ( + GroupID VARCHAR(16) PRIMARY KEY, + GroupTitle VARCHAR(75), + GroupUrl VARCHAR(50) + ) + +TABLE albums ( + AlbumID INT PRIMARY KEY, + AlbumTitle VARCHAR(50) UNIQUE + ) +END_COMMENT2 + + +################################################### +# # +# If database flick.db doesn't exist, create it ! # +# # +################################################### + +dir=$(dirname "$0") + +if [ ! -f ./flickr.db ]; then + ./insert.sh +fi + + +perpage=500 +pages= +# getinfo_people +username= +userid= +path_alias= +firstdatetaken= +photosurl= +profileurl= +# getinfo_photos +photo_id= +photo_title= +photo_description= +photo_posted= +photo_taken= +photo_view= +photo_comments= +photo_tags= +photo_url= +# getAllContexts_photos +title_alb= +id_alb= +title_gro= +id_gro= +url_gro= +# getFavorites_photos +favorites= +# search_photos +search= + +: <<'END_COMMENT2' + +echo -e "\n${BOLD}Most viewed:${COLOR_RESET}" + +req1="SELECT * FROM photos ORDER BY View DESC LIMIT 10;" +result1=$(sqlite3 "$ScriptWorkDir/flickr.db" "$req1") + +echo +printf "%s%15s %50s %8s %s\n" "${BOLD}" "ID" "Title" "View" "${COLOR_RESET}" + +if [ -n "$result1" ]; then + array1=() + keywords=() + cmpt=1 + while IFS='|' read -ra array1; + do + photo_id="${array1[0]}" + photo_title="${array1[1]}" + photo_view="${array1[5]}" + + printf "%15s %50s %8d \n" "$photo_id" "$photo_title" "$photo_view" + + cmpt=$((cmpt+1)) + done <<< "$result1" +fi + + +echo -e "\n${BOLD}Most commanted:${COLOR_RESET}" + +req2="SELECT * FROM photos ORDER BY Comments DESC LIMIT 10;" +result2=$(sqlite3 "$ScriptWorkDir/flickr.db" "$req2") + +echo +printf "%s%15s %50s %8s %s\n" "${BOLD}" "ID" "Title" "Comments" "${COLOR_RESET}" + +if [ -n "$result2" ]; then + array2=() + keywords=() + cmpt=1 + while IFS='|' read -ra array2; + do + photo_id="${array2[0]}" + photo_title="${array2[1]}" + photo_comments="${array2[7]}" + + printf "%15s %50s %8d \n" "$photo_id" "$photo_title" "$photo_comments" + + cmpt=$((cmpt+1)) + done <<< "$result2" +fi + + +echo -e "\n${BOLD}Most favoris:${COLOR_RESET}" + +req3="SELECT * FROM photos ORDER BY Favorites DESC LIMIT 10;" +result3=$(sqlite3 "$ScriptWorkDir/flickr.db" "$req3") + +echo +printf "%s%15s %50s %8s %s\n" "${BOLD}" "ID" "Title" "Favorites" "${COLOR_RESET}" + +if [ -n "$result3" ]; then + array3=() + keywords=() + cmpt=1 + while IFS='|' read -ra array2; + do + photo_id="${array3[0]}" + photo_title="${array3[1]}" + photo_comments="${array3[6]}" + + printf "%15s %50s %8d \n" "$photo_id" "$photo_title" "$photo_comments" + + cmpt=$((cmpt+1)) + done <<< "$result3" +fi +END_COMMENT2 + + +echo -e "\n${BOLD}Request:${COLOR_RESET}" + +_user_id=14829919@N00 + +#request="tags=deer,biche" + + # tags, tag_mode (OR/AND), text (-a term to exclude) + # min_upload_date, max_upload_date, min_taken_date, max_taken_date (timestamp or mysql datetime ('YYYY-MM-DD hh:mm:ss')) + # sort (date-posted-asc, date-posted-desc, date-taken-asc, date-taken-desc, interestingness-desc, interestingness-asc, and relevance.) + # group_id, user_id, media (all/photos/videos), has_geo + # extras (description, license, date_upload, date_taken, owner_name, icon_server, original_format, last_update, geo, tags, machine_tags, o_dims, views, media, path_alias, url_sq, url_t, url_s, url_q, url_m, url_n, url_z, url_c, url_l, url_o) + + +# text +request="" +while : +do + read -e -p "Search text (prefix - to exclude term, or q to quit) in library: " search + + [ "$search" == "q" ] && break + if [ "$search" != "q" ] && [ -n "$search" ]; then + request="text=${search// /+}" + + [ -n "$request" ] && break 2 + fi +done + +: <<'END_COMMENT3' + +#tag +# &text=rencontre+entre+2&format=json +request="" +while : +do + read -e -p "Search tags ( or q to quit) in library: " search + + [ "$search" == "q" ] && break + if [ "$search" != "q" ] && [ -n "$search" ]; then + request="tags=${search// /,}" + echo "$request" + + [ -n "$request" ] && break 2 + fi +done + + +#media +# &media=video&format=json +request="" +while : +do + read -e -p "Search medias (all/photo/video or q to quit) in library: " search + + [ "$search" == "q" ] && break + + if [ "$search" != "q" ] && [[ "$search" =~ all|photo*|video* ]]; then + request="media=${search}" + + [ -n "$request" ] && break 2 + fi +done + + +#date +request="" +utmin="" +utmax="" +while : +do + read -e -p "Search dates ('YYYY-MM-DD' or q to quit) in library, from: " search_from + [ "$search_from" == "q" ] && break + + read -e -p "Search dates ('YYYY-MM-DD') in library, to: " search_to + + read -e -p "(U)pload date or (T)aken date:" x + + if [ "$x" == "u" ] || [ "$x" == "U" ]; then + utmin="min_upload_date" + utmax="max_upload_date" + elif [ "$x" == "t" ] || [ "$x" == "T" ]; then + utmin="min_taken_date" + utmax="max_taken_date" + fi + + if [ -n "$utmin" ] && [ -n "$utmax" ]; then + if [[ "$search_from" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] && [[ "$search_to" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then + + search_from="$search_from 00:00:00" + search_to="$search_to 23:59:59" + + #request="min_taken_date=${search_from}&max_taken_date=${search_to}" + request="$utmin=${search_from}&$utmax=${search_to}" + + request="${request// /+}" + request="${request//:/%3A}" + + echo "$request" + + [ -n "$request" ] && break 2 + fi + fi +done + +END_COMMENT3 + +if [ -n "$request" ]; then + params_search=("$api_key" "$_user_id" "$request") + search_photos "${params_search[@]}" +fi