Obsługa aparatu foto w XFCE.

W ostatnim wątku (a dokładnie w komentarzach pod nim) przewijała się kwestia braku obsługi aparatu w środowisku XFCE na systemie Linuks. Ogólnie głównym winowajcą najprawdopodobniej jest Thunar, domyślny manager plików. Nie mogę jednak powiedzieć tego na 100 %.

Dlaczego? Ano dlatego iż inne managery a nawet program gThumb który może obsługiwać aparaty nie widzą urządzenia dopóki nie zostanie ono zamontowane poleceniem

CAMPORT=`gphoto2 –auto-detect | grep ‘S2 IS’ | cut -c 38- | sed ‘s/ //g’`
gvfs-mount “gphoto2://[usb:$CAMPORT]/”

Dopiero wtedy można do tego urządzenia się dobrać. Niestety jjak widać nie jest ono obsługiwane bezpośrednio przez system a poprzez aplikację gphoto2 i bibliotekę libgphoto. Jest to jak się okazuje dość standardowe rozwiązanie ze względu na niechlujność producentów aparatów i ich olewanie systemu Linuks.

Niechlujność nie sprowadza się do tego iż Nikon czy Canon są kiepskiej jakości, tylko do faktu że nie trzymają standardu obsługi pamięci masowych. Dotyczy to chyba 99% aparatów.

Można użyć programu typu digiKam czy Shotwell, a i zapewne wielu innych. Niestety pierwszy jest dość ciężki, w końcu to dziecko KDE. Natomiast drugi zrobił taki syf w galerii że aż się przeraziłem. Co prawda nie jest to błąd aplikacji ale brak możliwości skonfigurowania zasad tworzenia galerii (digiKam zrobił to akurat domyślnie dobrze) powoduje iż mija się ona z celem.

Otóż Shotwell sortuje zdjęcia po czasie ich wykonania zapisanym w danych exif. Po każdym ładowaniu (muszę wyjmować baterię z aparatu) aparat resetuje datę i czas, niestety jestem leniwy i na pytanie systemu daję CENCEL co powoduje ustawienie domyślnej daty 2003-01-01. No i praktycznie całość mojej galerii wylądowała w tym jednym miejscu (oczywiście nie fizycznie bo by mnie szlag trafił, tylko w bazie danych)

Galeria leży na dysku w katalogu Kodak i podkatalogach których nazwą jest dzień dokonywania zrzutu na kompa. Jest to dla mnie wygodne i wydaje mi się dość oczywistym rozwiązaniem.

Po głębszym zastanowieniu stwierdziłem iż nie jest mi do niczego potrzebne oprogramowanie do przeglądania aparatu i operacji na zdjęciach gdyż całość sprowadza się do :

  • chcę aby po podłączeniu aparatu wystartował program
  • zdjęcia mają zostać skopiowane na dysk do katalogu o nazwie aktualnej daty
  • karta pamięci ma zostać skasowana
  • koniec

Po krótkiej pracy powstał taki oto skrypt

#!/bin/bash
#Zdefiniowanie katalogu docelowego wedug aktualnej daty
path=/media/sdc6/!ZDJECIA!/Kodak/
data=$(date +%Y”-”%m”-”%d)
PICPATH=”${path}${data}”
#Sprawdzenie czy istnieje katalog docelowy i ewentualne utworzenie go
if [ ! -d $PICPATH ]; then
mkdir -p $PICPATH
fi
cd $PICPATH
gphoto2 –get-all-files
gphoto2 –delete-all-files -R

Działał doskonale🙂 Niestety po analizie jego zachowań okazał się bardzo niebezpieczny. Ze względu na brak parametrów pracy operował na pełnym zakresie portów co w przypadku podłączenia kilku urządzeń które mogły by zostać zidentyfikowane jako aparaty (na przykład iPhon’y i różne tablety) skończyło by się skasowaniem pamięci na nich wszystkich. Skrypt v0.1 poszedł do kosza. trzeba było wprowadzić nieco kontroli.

Okazało się to miejscami trudne (w końcu człek pracował na innym systemie) a czasami wręcz ocierające się moje granice wykonalności. Bite trzy godziny kombinowałem jak z wyniku zwracanego przez polecenie :

$ gphoto2 --auto-detect
Model                                                Port
----------------------------------------------------------
Kodak DX6490                                   usb: 

wyciosać nazwę aparatu. Oczywiście mogłem na stałe przypisać własną ale miałem napad ambicji i się zaparłem. Może to i nie eleganckie ale działa🙂

# Wykrycie aparatu i pobranie nazwy
APARAT=$(gphoto2 --auto-detect | sed '1,2d')
APARAT=$(echo $APARAT | sed 's/ \+/_/g' | sed 's/_\+/ /g')
APARAT=$(echo $APARAT | rev | cut -d " " -f2- | rev)

Potem poszło z górki. Jako iż chciałem mieć komunikację z użytkownikiem (minimalną, głównie informacyjną) konieczne było GUI. Pomocne okazało się Zenity. Niestety w pewnym momencie ugrzązłem, po lekturach w internecie okazało się iż jest to znany BUG którego autorzy nie poprawią bo im się nie chce, co napisali wprost. Chodzi o zmianę nazw przycisków. Głupio klikać anuluj gdy chcemy tam mieć coś innego. Aby było jasne w kilku oknach się da ale w większości niestety nie. Jak znajdę dobry manual przesiądę się na YAD. Ale wracając do tematu.

Niestety ze względu na wymyślenie sobie pasków postępu polecenie

$ gphoto2 --camera Kodak DX6490 –get-all-files

musiałem zastąpić pętelką kopiującą pliki po kolei. Tak samo z kasowaniem. Dzisiaj mogę pochwalić się skryptem v0.3. Chyba nawet projekt na Sourceforge wrzucę🙂

Program w wielu miejscach opiera się na moich prywatnych ustawieniach jak na przykład folder galerii ale jest to do zrobienia i będzie wkrótce o ile będzie czas. Program przetestowany wielokrotnie. Działa doskonale. Niestety nie sprawdzałem działania na innym sprzęcie fotograficznym ale postaram się od kogoś pożyczyć aparat do testów (a najlepiej kilka różnych). Kod nie jest elegancki ale mam nadzieję że czytelny.

#!/bin/bash
# IMGMOVE v0.3
# Kopiuje dane z aparatu fotograficznego, a następnie kasuje dane w aparacie
#
# Rozpowszechniany na licencji MIT
# Copyright (c) 2012 Tomasz Bulek (tombula@centrum.cz)
#
# Wstępna konfiguracja
#
#Zdefiniowanie katalogu docelowego wedug aktualnej daty
path=/media/sdc6/!ZDJECIA!/Kodak/
data=$(date +%Y"-"%m"-"%d)
PICPATH="${path}${data}"
# Wykrycie aparatu i pobranie nazwy
APARAT=$(gphoto2 --auto-detect | sed '1,2d')
APARAT=$(echo $APARAT | sed 's/ \+/_/g' | sed 's/_\+/ /g')
APARAT=$(echo $APARAT | rev | cut -d " " -f2- | rev)
#Nazwa okna
ZENITY_TITLE="Obsługa aparatu"${APARAT}
#Inne parametry
NOWY=0
TEKST1=""
#
# Obsługa aparatu poprzez gphoto2 z GUI Zenity
#
#Inicjalizacja
zenity --question \
 --text="Wykryto podłączenie aparau $APARAT\n\nKopiowanie plików rozpocznie się za 5 sekund." \
 --title "$ZENITY_TITLE" \
 --timeout=5
if [ $? = 1 ]; then exit $?; fi
#Sprawdzenie czy istnieje katalog docelowy i ewentualne utworzenie go
if [ ! -d $PICPATH ]; then
 mkdir -p $PICPATH
 NOWY=1
fi
#
#Zliczenie pliów w aparacie
#
COUNTER=$(gphoto2 --camera "$APARAT" --list-files | grep -c "^#")
#
# Kopiowanie zdjęć do wyznaczonej lokacji
#
# Czy został utworzony nowy folder? Modyfikacja informacji.
if [ $NOWY = 1 ]; then
TEKST1="Utworzono nowy folder $data w $path\n\n"
fi
# Wejdź do katalogu docelowego. Wymagane dla gphoto2.
cd $PICPATH
# Pętla kopiująca.
for (( i=1; $i <= $COUNTER; i++ )) ; do
 PROCENT=$((i*(100/COUNTER)))
 gphoto2 --camera "$APARAT" --get-file $i --force-overwrite
 echo $PROCENT
 done | zenity --progress \
 --percentage=0 \
 --title "$ZENITY_TITLE" \
 --auto-close \
 --text "$TEKST1 Kopiowanie $COUNTER plików z $APARAT do $PICPATH"
#
# Kasowanie zdjeć w aparacie
#
# Pętla kasująca.
for (( i=$COUNTER; $i >= 1; i-- )) ; do
 PROCENT=$(((COUNTER-(i-1))*(100/COUNTER)))
 gphoto2 --camera "$APARAT" --delete-file $i -R
 echo $PROCENT
 done | zenity --progress \
 --percentage=0 \
 --title "$ZENITY_TITLE" \
 --auto-close \
 --text "Kasowanie pliku $COUNTER w $APARAT"
#
# Informacja o zakończeniu
#
zenity --info \
--text="Operacja zakończona.\n\nSkopiowano $COUNTER plików.\n\nPliki zostały skosowane z\n\naparatu $APARAT"
exit

3 thoughts on “Obsługa aparatu foto w XFCE.

  1. Mała suplementacja🙂

    W ustawieniach XFCE jest obsługa urządzeń przenośnych i dysków wymiennych.
    Jeśli nie jest zaznaczona opcja „Importowanie fotografii po podłączeniu” system z aparatem nie robi nic. Jeśli zaś jest zaznaczona (co prawda zaznaczenie jej wiąże się z podaniem ścieżki do programu managera foto) system po podłączeniu aparatu informuje że został takowy podłączony i oczywiście nadal nie robi nic🙂 Tak więc wykorzystuję tę opcję do odpalenia mojego skryptu.

Możliwość komentowania jest wyłączona.