#!/bin/bash
#
# sdup2
#
# Lukee tiedostot kameran kortilta, nimeää ja siirtää vain uudet tiedostot  
# Author: Arto Jääskeläinen, GPL3 -- feel free to use the way you like.
#
# v1.0 2014-02-01  Ensiversio
# v1.1 2014-02-18  Korjattu polun tarkistus
# v1.2 2014-02-21  Korjattu kansion luonti
# v1.3 2014-02-28  Näyttää vapaan tilan muistikortilla
# v1.4 2019-11-14  Korjattu tunnistamaan välilyönnillinen polku (Nikon) 
# v1.5 2022-09-22  Alkuperäisen nimen säilyttäminen
#				   Korjaus: Sarjakuvauksessa monta kuvatiedostoa samalla aikaleimalla
# v1.6 2022-09-24  EXIFTOOL-versio, löytää kuvauspäiväyksen mov mp4 avi webm 
# v1.7 2022-09-25  Lisätty tunnistus  vanhemmille mov-tiedostoille (Minolta SX749)  
#########################################################################################

oletuskansio=~/Kuvat/Valokuvat/Kamerasta_nimetty
apukansio=/tmp/sdup2
punainen=\\e[91m
tavallinen=\\e[39m

etsi_dcim()
# Palauttaa muuttujassa "result" DCIM polun jos löytyi
# Palauttaa exitkoodin 1 jos ei löytynyt
# Etsii allaolevista polkulistan paikoista
{
polkulista=(/media/$USER/*/DCIM)
unset result
for paikka in "${polkulista[*]}"; do
	result="$(find "$paikka" -prune 2>/dev/null)" 
	if [ "$?" = "0" ]; then
	return 0
	fi
done
return 1
}

exiftool_asennettu()
{
[[ -z "$(which exiftool)" ]] && return 1
return 0	
}


huomauta_exif_puutteesta()
{
if  ! exiftool_asennettu; then
echo -e $punainen"Virhe: \"exiftool\" ohjelma ei ole asennettu. Asennus: sudo apt-get install libimage-exiftool-perl" $tavallinen
exit 1
fi
}

kansio_ok()
{
# $1=kohdekansio
# return 1 = Kohdekansioon ei voi kirjoittaa
if [ -z "$1" ]; then
	echo "Kohdekansiota ei annettu, käytetään kohteena $oletuskansio"
	kohdekansio=$oletuskansio
else
	kohdekansio="$1"
fi
mkdir -p $kohdekansio &>/dev/null
touch $kohdekansio/00000000 &>/dev/null  # Testataan että on kirjoitusoikeus
if [ "$?" = 0 ]; then rm $kohdekansio/00000000; else echo -e $punainen"Virhe: Ei kirjoitusoikeutta kansioon $kohdekansio"$tavallinen; return 1; fi
}

kortti_ok()
{
# return 1 = muistikorttia ei löytynyt
if  ! etsi_dcim; then
	echo -e $punainen"Virhe: Muistikorttia ei löytynyt, laita kameran muistikortti ensin lukijaan."$tavallinen; return 1
fi
dcim_polku="$result"  # Talletetaan polku
}

hae_exif_kuvausaika()
# Riippuvuus:  "exiftool" ohjelma
# Hakee kuvan EXIF-datasta tai videosta kuvaushetken
# $@=kuvatiedoston nimi
# $result=vvvv-kk-pp_tt-mm-ss
{
unset result
paiva_aika=($(exiftool "$@" 2>/dev/null |grep -im1 "Date/Time Original" | sed 's/[^0-9]*//'|cut -c 1-19))
if [ -z "$paiva_aika" ]; then   # epäonnistui, yritetään vanhempien videoiden menetelmää
	paiva_aika=($(exiftool "$@" 2>/dev/null |grep -im1 "Create Date" | sed 's/[^0-9]*//'|cut -c 1-19))
	if [ -z "$paiva_aika" ]; then	#Ei löydy varamenetelmälläkän
		return 1
	else
		paiva=${paiva_aika[0]//:/-}   # Korvataan kaksoispiste tavuviivalla 
		#aika=${paiva_aika[1]}		  #Käyttää kaksoispistettä hh:mm:ss
		aika=${paiva_aika[1]//:/.}   # Jos Win yhteensopivuus tarpeen hh.mm.ss
		result=$paiva"_"$aika
	fi
else
	paiva=${paiva_aika[0]//:/-}   # Korvataan kaksoispiste tavuviivalla 
	#aika=${paiva_aika[1]}		  #Käyttää kaksoispistettä hh:mm:ss
	aika=${paiva_aika[1]//:/.}   # Jos Win yhteensopivuus tarpeen hh.mm.ss
	result=$paiva"_"$aika
fi
[[ "${#result}" != 19   ]] && return 1
}

kopioi_uudet()
{
ifso=$IFS; IFS=''
rsync_yhteenveto=$(rsync -Ltv --stats $apukansio/* $kohdekansio  | tee /dev/tty)
kopioidut_lkm=$(echo ${rsync_yhteenveto[*]} |grep "files transferred"| sed 's/[^0-9]//g')
IFS=$ifso
}

luo_linkkilista()
{
mkdir -p $apukansio
rm $apukansio/* &>/dev/null
for kansio in "$dcim_polku"/*; do
	for polkutiedosto in "$kansio"/*; do
		tiedosto=${polkutiedosto##*/}	#DSC_1234.JPG
		tiedostoaika=$(date -r "$polkutiedosto" +%F_%H.%M.%S)
		#tyyppi="${polkutiedosto##*.}"
		#tiedostotyyppi="${tyyppi,,}"			# Kirjaimet pieniksi
		hae_exif_kuvausaika "$polkutiedosto"      # Lukee kuvan exif-tiedoista kuvausajan
		if [ -z "$result" ]; then
			#echo -e $punainen"Huomautus: EXIF-kuvausaikaa ei löytynyt tiedostolle $tiedosto, käytetään tiedoston aikaa nimeämiseen." $tavallinen
			#Merkitään risuaidalla tiedostonimen lopussa, että nimetty tiedostopäiväyksellä
			ln -s "$polkutiedosto" "$apukansio"/"$tiedostoaika"_"$tiedosto"#
		else
			kuvausaika="$result"
			#Debug piste:
			#echo "$polkutiedosto" "$apukansio"/"$kuvausaika"_"$tiedosto"
			#read -p "Paussi1"
			ln -s "$polkutiedosto" "$apukansio"/"$kuvausaika"_"$tiedosto"
		fi
	done 
done
}

varmista_kansion_nimi()
{
kansio_ok "$1"
varmistus1=$?
kortti_ok		#Jos muistikortti löytyi niin asettaa polun --> $dcim_polku 
varmistus2=$?
if  [ $varmistus1 -ne 0 ] ||  [ $varmistus2 -ne 0 ]; then exit 1; fi
echo -n "Kopioidaan uudet kuvat $result/* -> $kohdekansio, K/E ? "
until [ -n "$vastaus" ]; do
	read -n1 -s vastaus
done
echo
vastaus=${vastaus^^}  # Voi vastata isolla tai pienellä K-kirjaimella
[[ ! "$vastaus" = "K" ]] && exit 1
}

hae_tiedostojen_lkm()
{
# $1= polku mistä kysellään lukumääärää
# $result = lukumäärä
unset result
result=$(ls /tmp/sdup2 | wc -l)
}

hae_vapaa()
{
# $1= polku mistä kysellään vapaata tilaa
# $result = vapaa tila
unset result
result=$(df -h  "$1" | grep /dev | tr -s ' '| cut -d ' ' -f4)
}

nayta_muistikortin_tila()
{
hae_tiedostojen_lkm
lkm="$result"
hae_vapaa "$dcim_polku"
vapaa_tila="$result"
echo -e "\nMuistikortilla $lkm kpl tiedostoja, vapaata tilaa jäljellä $vapaa_tila\n"
}

# Main #################################################################
echo "sdup2 v1.7 2022-09-25 --- lataa valokuvat ja videot kameran SD-kortilta haluttuun kansioon ja nimeää ne kuvanottopäiväyksen mukaan"
cd ~
huomauta_exif_puutteesta        # Onko "exif" asennettu koneeseen ?
varmista_kansion_nimi "$1"      # Kansio ok ja kortti lukijassa ?
echo "Hetkinen, etsitään muistikortilta tiedostoja jotka eivät ole vielä koneellasi"
luo_linkkilista
kopioi_uudet
if [ $kopioidut_lkm = 0 ]; then
echo -e "\nEi uusia tiedostoja muistikortilla"
else
echo -e "\nKopioitiin $kopioidut_lkm kpl tiedostoja"
fi
nayta_muistikortin_tila


