Replace the convert_0.2-0.3.sh script by convert_0.3-0.4.sh.
[paraslash.git] / convert_0.3-0.4.sh
diff --git a/convert_0.3-0.4.sh b/convert_0.3-0.4.sh
new file mode 100755 (executable)
index 0000000..aa0b239
--- /dev/null
@@ -0,0 +1,221 @@
+#!/usr/bin/env bash
+
+#-------------------------------------------------------------------------------
+## Script to convert the database of paraslash 0.3.5 to version 0.4.x.
+##
+## Assumptions:
+##     - para_server 0.3.5 is running
+##     - "para_client check" reports no errors
+##     - para_server 0.4.x is running, listens on another port and uses a
+##       different afs database and a different afs socket
+##     - The database of paraslash 0.4.x has been initialized (i.e.
+##       para_client init has successfully been executed)
+##     - All audio files in the 0.3.x database have already been added to
+##       the 0.4.x database (execute para_client add /my/audio/file/dir to
+##       do that)
+##
+#-------------------------------------------------------------------------------
+
+# Call this script without arguments to see usage info
+
+# How to connect to para_server 0.3.x.
+client03=/usr/local/bin/para_client
+port03=2991
+host03=localhost
+database03=$HOME/.paraslash/afs_database
+
+# How to connect to para_server 0.4.x.
+client04=$(pwd)/para_client
+port04=2990
+host04=localhost
+database04=$HOME/.paraslash/afs_database-0.4
+
+# Any character that does not occur in any filename of an audio file
+sep='|'
+
+
+client03_cmd="$client03 -p $port03 -i $host03"
+client04_cmd="$client04 -p $port04 -i $host04"
+
+exec_client03_cmd()
+{
+       result="$($client03_cmd -- "$@")"
+}
+
+exec_client04_cmd()
+{
+       result="$($client04_cmd -- "$@")"
+}
+
+convert_attribute_table()
+{
+       local atts
+
+       echo "converting attribute table"
+       exec_client03_cmd lsatt
+       atts="$result"
+       exec_client04_cmd addatt $atts
+}
+
+convert_attributes()
+{
+       local OIFS="$IFS" a p att atts
+
+       printf "converting attributes: "
+       $client03_cmd -- ls -p -lv \
+               | grep '^path:\|^attributes_txt:' \
+               | sed -e "/^path:/N;s/\n/$sep/1" \
+               | {
+                       IFS="$sep"
+                       while read p a; do
+                               p=${p#path: }
+                               a=${a#attributes_txt:}
+                               IFS=" "
+                               atts=
+                               for att in $a; do
+                                       atts="$atts $att+"
+                               done
+                               IFS="$OIFS"
+                               [[ -n "$atts" ]] && $client04_cmd -- setatt $atts "$p"
+                               IFS="$sep"
+                               printf "."
+                       done
+                       echo done
+               }
+               IFS="$OIFS"
+}
+
+convert_lna()
+{
+       local OIFS="$IFS" p l n a
+
+       printf "converting last_played, num_played, amplification values: "
+       $client03_cmd -- ls -p -d -lv \
+               | grep '^path:\|^last_played: \|^num_played: \|^amplification: ' \
+               | sed -e "/^path:/N;N;N;s/\n/$sep/g" \
+               | {
+                       IFS="$sep"
+                       while read p l n a; do
+                               #echo "p: $p, l:$l, n:$n a:$a"
+                               p=${p#path: }
+                               l=${l#last_played: }
+                               n=${n#num_played: }
+                               a=${a#amplification: }
+                               IFS="$OIFS"
+                               $client04_cmd -- touch "-l$l" "-n$n" "-a$a" "$p"
+                               IFS="$sep"
+                               printf "."
+                       done
+                       echo done
+               }
+               IFS="$OIFS"
+}
+
+convert_blobs()
+{
+       local blob name
+
+       for blob in img lyr mood pl; do
+               printf "converting $blob table: "
+               exec_client03_cmd ls$blob
+               echo "$result" | while read name; do
+                       $client03_cmd -- cat$blob "$name" | $client04_cmd -- add$blob "$name"
+                       printf "."
+               done
+               echo done
+       done
+}
+
+convert_ids()
+{
+       local OIFS="$IFS" p i y iopts yopts
+
+       printf "converting image and lyrics ids: "
+       $client03_cmd -- ls -p -lv \
+               | grep '^path:\|^image_name: \|^lyrics_name: ' \
+               | sed -e "/^path:/N;N;s/\n/$sep/g" \
+               | {
+                       IFS="$sep"
+                       while read p i l; do
+                               IFS="$OIFS"
+                               iopts=
+                               yopts=
+                               p=${p#path: }
+                               i=${i#image_name: }
+                               l=${l#lyrics_name: }
+                               if [[ "$i" != '(none)' ]]; then
+                                       exec_client04_cmd lsimg -l "$i"
+                                       iopts="-i${result%%     *}"
+                               fi
+                               if [[ "$l" != '(none)' ]]; then
+                                       exec_client04_cmd lslyr -l "$l"
+                                       yopts="-y${result%%     *}"
+                               fi
+                               if [[ -n "$iopts" && -n "$yopts" ]]; then
+                                       $client04_cmd -- touch "$iopts" "$yopts" "$p"
+                               elif [[ -n "$iopts" ]]; then
+                                       $client04_cmd -- touch "$iopts" "$p"
+                               elif [[ -n "$yopts" ]]; then
+                                       $client04_cmd -- touch "$yopts" "$p"
+                               fi
+                               printf "."
+                               IFS="$sep"
+                       done
+                       echo done
+               }
+               IFS="$OIFS"
+}
+
+
+usage()
+{
+       grep '^##' $0 | sed -e 's/^## *//'
+       echo '
+Usage: $0 command
+
+command is one of the following:
+
+       attribute_table: create attributes
+       attributes: convert attributes for each audio file
+       lna: convert the last_played/num_played/amplification values
+       blobs: convert the image/lyrics/moods/playlists tables
+       ids: convert image and the lyrics id of each audio file.
+       all: Do all of the above.
+
+Edit the top of the script to customize some options.
+'
+}
+
+if test $# -ne 1; then
+       usage
+       exit 1
+fi
+
+case "$1" in
+attribute_table)
+       convert_attribute_table
+       ;;
+attributes)
+       convert_attributes
+       ;;
+lna)
+       convert_lna
+       ;;
+blobs)
+       convert_blobs
+       ;;
+ids)
+       convert_ids
+       ;;
+all)
+       convert_attribute_table
+       convert_attributes
+       convert_lna
+       convert_blobs
+       convert_ids
+       ;;
+*)
+       usage
+       exit 1
+       ;;
+esac