From fb38eb978d52f816dae621cc688df3d30415e2f1 Mon Sep 17 00:00:00 2001 From: Colin Clark Date: Thu, 25 Oct 2018 20:11:22 +0100 Subject: [PATCH] Plugin for camera download Basic function: download all, skip existing, to current folder. Requires gphoto2 --- configure.in | 1 + plugins/Makefile.am | 2 +- plugins/camera-import/Makefile.am | 9 + .../camera-import/camera-import.desktop.in | 19 +++ plugins/camera-import/geeqie-camera-import | 159 ++++++++++++++++++ .../geeqie-camera-import-hook-script | 18 ++ po/POTFILES.in | 1 + 7 files changed, 208 insertions(+), 1 deletion(-) create mode 100644 plugins/camera-import/Makefile.am create mode 100644 plugins/camera-import/camera-import.desktop.in create mode 100755 plugins/camera-import/geeqie-camera-import create mode 100755 plugins/camera-import/geeqie-camera-import-hook-script diff --git a/configure.in b/configure.in index 0998fd90..f891a588 100644 --- a/configure.in +++ b/configure.in @@ -621,6 +621,7 @@ AC_CONFIG_FILES([ plugins/geocode-parameters/Makefile plugins/export-jpeg/Makefile plugins/tethered-photography/Makefile + plugins/camera-import/Makefile geeqie.spec ]) diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 0c8219f5..5df6aca7 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -1,6 +1,6 @@ #FIXME enable or disable individual plugins from configure -SUBDIRS = rotate symlink ufraw import geocode-parameters export-jpeg tethered-photography +SUBDIRS = rotate symlink ufraw import geocode-parameters export-jpeg tethered-photography camera-import qq_desktoptemplatedir = $(appdir) qq_desktoptemplate_DATA = template.desktop diff --git a/plugins/camera-import/Makefile.am b/plugins/camera-import/Makefile.am new file mode 100644 index 00000000..58b91b84 --- /dev/null +++ b/plugins/camera-import/Makefile.am @@ -0,0 +1,9 @@ +dist_gq_bin_SCRIPTS = geeqie-camera-import geeqie-camera-import-hook-script + +gq_desktopdir = $(appdir)/applications +gq_desktop_in_files = camera-import.desktop.in +gq_desktop_DATA = $(gq_desktop_in_files:.desktop.in=.desktop) +@INTLTOOL_DESKTOP_RULE@ + +EXTRA_DIST = $(gq_desktop_in_files) +CLEANFILES = $(gq_desktop_DATA) diff --git a/plugins/camera-import/camera-import.desktop.in b/plugins/camera-import/camera-import.desktop.in new file mode 100644 index 00000000..fff8ede8 --- /dev/null +++ b/plugins/camera-import/camera-import.desktop.in @@ -0,0 +1,19 @@ +[Desktop Entry] +Version=1.0 +Type=Application +_Name=Camera import + +# Requires gphoto2 +# The gphoto2 file $HOME/.gphoto2/settings can +# be used to set auto-rename on download + +Exec=geeqie-camera-import + +# Desktop files that are usable only in Geeqie should be marked like this: +Categories=X-Geeqie; +OnlyShowIn=X-Geeqie; + +# It can be made verbose +#X-Geeqie-Verbose=true + +Icon=geeqie diff --git a/plugins/camera-import/geeqie-camera-import b/plugins/camera-import/geeqie-camera-import new file mode 100755 index 00000000..40cca5f4 --- /dev/null +++ b/plugins/camera-import/geeqie-camera-import @@ -0,0 +1,159 @@ +#!/bin/bash + +# Import all images from camera +# Requires gphoto2 + +function finish +{ + if [ -f /tmp/geeqie-camera-import-files ] + then + rm /tmp/geeqie-camera-import-files + fi + + if [ -p $zen_pipe ] + then + rm $zen_pipe + fi + + if [ "$gphoto2_pid" != "" ] + then + ps -p $gphoto2_pid > /dev/null + if [ $? -eq 0 ] + then + kill $gphoto2_pid + fi + fi + + if [ "$zen_pid" != "" ] + then + ps -p $zen_pid > /dev/null + if [ $? -eq 0 ] + then + kill $zen_pid + fi + fi +} +trap finish EXIT + +if ! [ -x "$(command -v gphoto2)" ] +then + zenity --title="Geeqie camera import" --info --width=200 --text="gphoto2 is not installed" 2>/dev/null + exit 0 +fi + +if [ -f /tmp/geeqie-camera-import.log ] +then + rm /tmp/geeqie-camera-import.log +fi + +if [ $(gphoto2 --auto-detect | wc -l) -le 2 ] +then + zenity --error --title="Geeqie camera import" --text="No camera detected" --window-icon=/usr/local/share/pixmaps/geeqie.png --width=250 2>/dev/null + exit 0 +fi + +list=$(gphoto2 --auto-detect | tail +3) +readarray -t split_list <<<"$list" + +camera_list="" +n=1 +count=$(gphoto2 --auto-detect | tail +3 | wc -l) +if [[ $count -gt 1 ]] +then + for camera in "${split_list[@]}" + do + if [[ $n -eq $count ]] + then + camera_list="$camera_list"$'TRUE\n'"$camera"$'\n'"$n" + else + camera_list="$camera_list"$'FALSE\n'"$camera"$'\n'"$n"$'\n' + fi + n=$((n+1)) + done + + camera_selected=$(echo "$camera_list" | zenity --width=500 --height=250 --title="Geeqie camera import" --list --text "Select camera" --radiolist --column "Select" --column "Camera" --column "n" --hide-column=3 --print-column=2 2>/dev/null) + + if [[ $? == 1 ]] + then + exit 0 + fi +else + camera_selected=$(gphoto2 --auto-detect | tail +3) +fi + +port_type=$(echo $camera_selected |awk -F ':' '{print $1}' | awk '{print $NF}') +camera=$(echo $camera_selected | awk -F $port_type '{print $1}') +port_address=$(echo $camera_selected | awk -F ':' '{print $2}') +port="$port_type:$port_address" + +script_dir=$(dirname "$0") + +zenity --question --title="Geeqie camera import" --text="Camera: $camera\n\nDownloading to folder:\n$PWD" --ok-label="OK" --cancel-label="Cancel" --window-icon=/usr/local/share/pixmaps/geeqie.png --width=350 2>/dev/null + +if [[ $? == 1 ]] +then + exit 0 +fi + +src_files_sorted=$(mktemp --tmpdir geeqie_camera_import_camera_files_sorted_XXXXXX) +dest_files_sorted=$(mktemp --tmpdir geeqie_camera_import_computer_files_sorted_XXXXXX) + +( +gphoto2 --port "$port" --list-files 2>/tmp/geeqie-camera-import.log | awk '/#/ {print $2}' | sort > $src_files_sorted +) | zenity --progress --auto-close --auto-kill --title="Geeqie camera import" --text="Searching for files to download..." --pulsate --window-icon=/usr/local/share/pixmaps/geeqie.png --width=250 + +error=$(grep -i error /tmp/geeqie-camera-import.log) + +if [ ! -z "$error" ] +then + cat /tmp/geeqie-camera-import.log | zenity --text-info --title="Geeqie camera import" - --window-icon=error --width=250 2>/dev/null + exit 1 +fi + +ls -1 | sort > $dest_files_sorted +existing_file_count=$(comm -12 $src_files_sorted $dest_files_sorted | wc -l) + +total=$(cat $src_files_sorted | wc -l) +files_to_load=$(( $total - $existing_file_count )) + +rm $src_files_sorted +rm $dest_files_sorted + +if [ "$files_to_load" -eq 0 ] +then + zenity --info --title="Geeqie camera download" --text="No photos to download" --width=250 --window-icon=usr/local/share/pixmaps/geeqie.png 2>/dev/null + exit 0 +fi + +if [ -f /tmp/geeqie-camera-import-files ] +then + rm /tmp/geeqie-camera-import-files +fi +touch /tmp/geeqie-camera-import-files + +zen_pipe=$(mktemp --dry-run --tmpdir geeqie_camera_import_pipe_XXXXXX) +mkfifo $zen_pipe + +gphoto2 --port "$port" --hook-script "$script_dir/"geeqie-camera-import-hook-script --get-all-files --skip-existing 2>/tmp/geeqie-camera-import.log & + +gphoto2_pid=$! + +(tail -f $zen_pipe 2>/dev/null) | zenity --progress --title="Geeqie camera import" --width=370 --text="Downloading: total: $files_to_load existing: $existing_file_count\n" --auto-close --auto-kill --percentage=0 window-icon=/usr/local/share/pixmaps/geeqie.png 2>/dev/null & +zen_pid=$! + +n=0 +while [ -f /tmp/geeqie-camera-import-files ] && [ "$n" -lt 100 ] +do + i=$(cat "/tmp/geeqie-camera-import-files" | wc -l) + n=$(( $((i * 100)) / $files_to_load)) + echo "$n" >$zen_pipe + + latest_file=$(tail -n 1 /tmp/geeqie-camera-import-files) + if [ -z "$latest_file" ] + then + latest_file="Skipping existing files, if any..." + fi + echo "#Downloading: total: $files_to_load existing: $existing_file_count\n$latest_file" >$zen_pipe + + sleep 1 +done diff --git a/plugins/camera-import/geeqie-camera-import-hook-script b/plugins/camera-import/geeqie-camera-import-hook-script new file mode 100755 index 00000000..46464ee5 --- /dev/null +++ b/plugins/camera-import/geeqie-camera-import-hook-script @@ -0,0 +1,18 @@ +#!/bin/bash + +# Camera import + +if [ "$ACTION" == "download" ] +then + echo "$ARGUMENT" >> /tmp/geeqie-camera-import-files + +elif [ "$ACTION" == "stop" ] +then + zenity --info --title="Geeqie camera download" --text="Import ended" --width=200 --timeout=5 --window-icon=usr/local/share/pixmaps/geeqie.png 2>/dev/null + if [ -f /tmp/geeqie-camera-import-files ] + then + rm /tmp/geeqie-camera-import-files + fi +fi + +exit 0 diff --git a/po/POTFILES.in b/po/POTFILES.in index a09c6d15..9ee74c27 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -3,6 +3,7 @@ plugins/import/geeqie-import-geeqie.desktop.in plugins/import/geeqie-import-gqview.desktop.in plugins/export-jpeg/export-jpeg.desktop.in plugins/tethered-photography/tethered-photography.desktop.in +plugins/camera-import/camera-import.desktop.in plugins/rotate/rotate.desktop.in plugins/symlink/symlink.desktop.in plugins/ufraw/geeqie-ufraw.desktop.in -- 2.20.1