postprefix
11/13/2013 - 8:34 AM

OpenMeta2OSXTags.sh

# =============================================================
# =                  OpenMeta to OS X Tags                    =
# =============================================================
# Script to convert OpenMeta tags to OS X Mavericks tags.
# 
# Created by Zettt (Andreas Zeitler) on 2013-06-28
# Source www.macosxscreencasts.com, mosx.tumblr.com
# 
# OpenMeta to OS X Tags by Andreas Zeitler is licensed under a 
# Creative Commons Attribution-NonCommercial-ShareAlike
# 3.0 Unported License.
# Based on a work at http://www.macosxscreencasts.com.
# Permissions beyond the scope of this license may be 
# available at http://www.macosxscreencasts.com.
# =============================================================
# with lots of help from various sources such as stack overflow
# https://groups.google.com/forum/#!topic/openmeta/DK4Of2QGkpM
# http://hints.macworld.com/article.php?story=20110102222441243
# http://bit.ly/12oHSSj
# https://github.com/jakepetroules/wherefrom/blob/master/wherefrom
# Thanks!
# =============================================================
# Please run:
#
#    chmod +x OpenMeta2OSXTags.sh
#
# Call the script using:
#
#    ./OpenMeta2OSXTags.sh

#!/bin/sh

# this is the absolute path of the directory you want to process 
# please no trailing slash!
# think twice if it's really necessary to process your entire $HOME
files="/Users/you/Documents"

unset a i
while IFS= read -r -d $'\0' file; do
	fileArray[i++]="$file"
done < <(find "$files" -print0)
# echo ${fileArray[@]}
set a i

# this is the plist part that will go before and end of tags
plistFront='<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><array>'
plistEnd='</array></plist>'

for currentFile in "${fileArray[@]}"; do
	echo "Processing: $currentFile"

	# extract openmeta tags to string
	currentTags=$(/usr/local/bin/openmeta -t -p "$currentFile")
	# remove trailing -p path from openmeta
	currentTags=$(echo ${currentTags%%$currentFile})
	# remove trailing whitespace (if any)
	currentTags=$(echo ${currentTags%%\w})
	
	# only process if there are tags
	if [[ -z $currentTags ]]; then
		echo "File has no tags."
	else
		echo "Number of tags: ${#tagArray[@]}"
		echo "Tags: $currentTags"
		# create array of all tags
		eval tagArray=($currentTags)
	
		# assemble plist string of tags
		plistTagString=""
		for i in "${tagArray[@]}"; do
			# echo "Tag $i"
			plistTagString="$plistTagString<string>$i</string>"
		done
	
		# write tags to file
		xattr -w com.apple.metadata:_kMDItemUserTags "$plistFront$plistTagString$plistEnd" "$currentFile"
	fi
	
	echo	
done

# Reading OpenMeta tags:
# xattr -p com.apple.metadata:kMDItemOMUserTags OpenMeta2OSXTags.sh | xxd -r -p | plutil -convert xml1 -o - - | xmllint --xpath "/plist/array/string/text()" -

# Writing Mavericks tags
# xattr -w com.apple.metadata:_kMDItemUserTags '<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><array><string>tag1</string><string>tag2</string></array></plist>' $currentFile