Last Updated or created 2023-08-07
We take a lot of pictures, with our Nikon camera and our mobile phones.
(Apparently in 2019 5544 pictures)
Some stats 757 20190803 - on a single day (Holiday) Average pictures per month locate "/2019/" | egrep -i "photoalbum|gsm" | egrep -i "mp4$|jpg$" | grep -Eo '2[[:digit:]]{3}[[:digit:]]{2}[[:digit:]]{2}' | cut -c-6 |sort | uniq -c | sort -n | awk '{ sum += $1; n++ } END { if (n > 0) print sum / n; }' 461
Besides android pictures being automatically uploaded to our nextcloud, I’m using some apps and scripts to get pictures and movies stored on my fileserver. (bash scripts/andftp)
For sorting those media files, i made a sorting script.
(Today I added a location sorting addition using GPS information stored in the exif information.
- jpg and jpeg (add your own extentions)
- mp4 and mov (for mobile and nikon)
- Sorts by camera model/year/date/location
- tries to extract date from filename when not found in exifinfo
- Sorts whatsapp media
- Sorts Raw
INSTALLING
pip3 install reverse_geocoder
You need python3, exiftool, exiftime and mediainfo
copy below python script in ~/bin/reverse2.py
( need more info? change last print entry admin1/admin2)
[{‘lat’: ‘-39.45556’, ‘lon’: ‘173.85833’, ‘name’: ‘Opunake’, ‘admin1’: ‘Taranaki’, ‘admin2’: ‘South Taranaki District’, ‘cc’: ‘NZ’}]
import reverse_geocoder as rg import sys lat=sys.argv[1] lon=sys.argv[2] coordinates = (lat,lon) results = rg.search(coordinates) # default mode = 2 #print (results) for entry in results: print(entry['name'] + "(" + entry['cc'] + ")")
And a bash script /usr/local/bin/exifsort.sh
#!/bin/bash #set -x reversepath=/home/henri/projects/reversegeo/reverse2.py #RAW rawcnt=`ls | grep -i nef$ | wc -l` if [ "$rawcnt" = "0" ] ; then echo "no raw" else mkdir raw 2>/dev/null ls | grep -i nef$ | while read ; do mv $REPLY raw ; done fi ls | egrep -i "jpg$|jpeg" | while read ; do location="" getmodel=$(exiftool "$REPLY" |grep "Make " | awk '{ print $3 }') if [ "$getmodel" != "" ] ; then getmodel=$getmodel/ fi echo "$REPLY" | grep WA0 >/dev/null && getmodel=whatsapp/ gpsinfo=$(exiftool -c "%+.6f" "$REPLY" |grep "GPS Position" | cut -d":" -f2 | tr -d ' ' | sed s/,/\ /g) if [ "$gpsinfo" != "" ] ; then location=$(python3 $reversepath $gpsinfo | grep -vi load | sed s/\(NL\)//g) fi dater=$(exiftime "$REPLY" 2>/dev/null | egrep "Created|Digitized" | sed s/Digitized/Created/g | tail -1 | cut -c 16-19,21,22,24,25) if [ "$dater" = "" ] ; then # echo "Trying from filename" dater=$(echo $REPLY | grep -Eo '2[[:digit:]]{3}-[[:digit:]]{2}-[[:digit:]]{2}') if [ "$dater" = "" ] ; then # echo "Trying from filename - maybe without dashes" dater=$(echo $REPLY | grep -Eo '2[[:digit:]]{3}[[:digit:]]{2}[[:digit:]]{2}') fi fi if [ "$dater" != "" ] ; then year=$(echo $dater | cut -c-4) mkdir -p "${getmodel}$year/${dater}/$location" mv "$REPLY" "${getmodel}${year}/${dater}/$location" else mkdir -p "${getmodel}unknowndate/$location" mv "$REPLY" "${getmodel}unknowndate/$location" fi done ls | egrep -i "mov$|mp4$" | while read ; do location="" getmodel=$(exiftool "$REPLY" |grep "Make " | awk '{ print $3 }') if [ "$getmodel" != "" ] ; then getmodel=$getmodel/ fi echo "$REPLY" | grep WA0 >/dev/null && getmodel=whatsapp/ gpsinfo=$(exiftool -c "%+.6f" "$REPLY" |grep "GPS Position" | cut -d":" -f2 | tr -d ' ' | sed s/,/\ /g) if [ "$gpsinfo" != "" ] ; then location=$(python3 $reversepath $gpsinfo | grep -vi load | sed s/\(NL\)//g) fi dater=$(mediainfo "$REPLY" | grep Encode | tail -1 | cut -f2- -d: | cut -f3 -d" " | sed s/-//g) if [ "$dater" = "" ] ; then # echo "Trying from filename" dater=$(echo $REPLY | grep -Eo '2[[:digit:]]{3}-[[:digit:]]{2}-[[:digit:]]{2}') if [ "$dater" = "" ] ; then # echo "Trying from filename - maybe without dashes" dater=$(echo $REPLY | grep -Eo '2[[:digit:]]{3}[[:digit:]]{2}[[:digit:]]{2}') fi fi if [ "$dater" != "" ] ; then year=$(echo $dater | cut -c-4) mkdir -p "${getmodel}$year/${dater}/$location" mv "$REPLY" "${getmodel}${year}/${dater}/$location" else mkdir -p "${getmodel}unknowndate/$location" mv "$REPLY" "${getmodel}unknowndate/$location" fi done
Example running in a directory with mixed media
# Raw images get moved into a RAW directory
no raw
# Samsung phone detected with date and GPS location
mkdir -p samsung/20220717/Hilversum
mv 20220717_133453.jpg samsung/20220717/Hilversum
# OnePlus phone
mkdir -p OnePlus/20021208/Voorburg
mv IMG_20190109_091825.jpg OnePlus/20021208/Voorburg
# Realme (Added country when not NL)
mkdir -p realme/20220607/Isle of Islay(GB)
mv IMG20220607213630.jpg realme/20220607/Isle of Islay(GB)
# Whatsapp has no date embedded so it gets it from filename
Trying from filename
Trying from filename - maybe without dashes
mkdir -p whatsapp/20221021/
mv IMG-20221021-WA0000.jpg whatsapp/20221021/
# Nikon without GPS
mkdir -p NIKON/20220613/
mv DSC_1423.MOV NIKON/20220613/
# Whatsapp video without exif
mkdir -p whatsapp/20170528/
mv VID-20170528-WA0006.mp4 whatsapp/20170528/
# No camera name detected in exif from mobile movie
mkdir -p 20190114/Maarssen
mv VID_20190114_142455.mp4 20190114/Maarssen
# Location in mp4
mkdir -p 20220607/Lamlash(GB)
mv VID20220607155044.mp4 20220607/Lamlash(GB)
Result
./NIKON/2022/20220613/DSC_1423.MOV ./NIKON/2022/20220610/750_1101.JPG ./realme/2022/20220818/Hilversum/IMG20220818203825.jpg ./realme/2022/20220607/Isle of Islay(GB)/IMG20220607213630.jpg ./2019/20190114/Maarssen/VID_20190114_142455.mp4 ./whatsapp/2017/20170528/VID-20170528-WA0006.mp4 ./whatsapp/2022/20221021/IMG-20221021-WA0000.jpg ./2022/20220607/Lamlash(GB)/VID20220607155044.mp4 ./2022/20220516/Hilversum/VID20220516125913.mp4 ./OnePlus/2002/20021208/Voorburg/IMG_20190109_091825.jpg ./samsung/2022/20220717/Hilversum/20220717_133453.jpg
You could automate this using incrond
apt-get install incron
add your user to /etc/incron.allow
incrontab -e
add
/fileserver/mediain/ IN_CREATE /usr/local/bin/sortmymedia.sh
sortmymedia.sh
#!/bin/bash cd /home/user/media /usr/local/bin/exifsort.sh