#!/usr/bin/env bash
# Linux hack to benefit from Google Picasa face tagging on NAS drive photos.
# My wife has tagged bazillions of faces in Photos stored on our NAS using
# Picasa in Windows. This script creates a folder for each "contact" (person
# face tagged) and then places local links arranged in folders by contact for
# each photo on the NAS
#
# Author: Mark Ruff
# Date: 19 May 2012
# basedir that the photos are stored in
BASEDIR="/media/Photos/"
# contacts - file that the contacts are stored in
CONTACTS="/media/xxxxxx/Google/Picasa2/contacts/contacts.xml"
# targetdir for the links to photos to be stored
TARGETDIR="/home/mark/pics/photo_tags"
if [ $# -ne 2 ]
then
SAFECALL=$(echo $0 | sed 's/[][\.*^$/]/\\&/g')
grep "contact id" contacts.xml | sed "s/^.*\"\(.*\)\" name=\"\(.*\)\" modified.*$/"$SAFECALL" \1 \2/" | bash
exit
fi
# make our subdirectory
TAG=$1
NAME=$2
mkdir -p $TARGETDIR/$NAME
# clean subdirectory for sed
SUBDIR=$(echo $TARGETDIR/$NAME | sed 's/[][\.*^$/]/\\&/g')
function spider {
# recursively drop down into each directory within the current directory
for DIR in *
do
if [ -d "$DIR" ]
then
cd "$DIR"
spider
cd ..
fi
done
# in each directory is a Picasa.ini file which lists each photo along with
# the tags. The file contains [FILENAME] followed by a list of tags.
# So we grep for the tag and pull the line above, then grep for just the
# jpegs (and only show the file name, not the [ ]). Pipe the file names
# into sed to create the cp command and enclose the filename in quotes
# in case it contains spaces. Finally pipe the output (a list of cp
# commands) into sh
PWD=$(pwd | sed 's/[][\.*^$/]/\\&/g')
grep -B2 $TAG* Picasa.ini 2>/dev/null | grep -io [^\[].*jpg | sed "s/\(.*\)/ln -s \"$PWD\/\1\" $SUBDIR/" | sh
}
cd $BASEDIR
spider
Comments