| 1 | #! /bin/bash |
| 2 | |
| 3 | set -e |
| 4 | : ${JBDIR=/mnt/jb} |
| 5 | |
| 6 | case $# in |
| 7 | 3) ;; |
| 8 | *) echo >&2 "Usage: $0 OFFSET SOURCEDIR TARGETDIR"; exit 1 ;; |
| 9 | esac |
| 10 | |
| 11 | offset=$1 sourcedir=$2 targetdir=$3 |
| 12 | mkdir "$targetdir" |
| 13 | tmp="$targetdir"/_tmp; mkdir "$tmp" |
| 14 | trap 'rm -rf "$targetdir"' EXIT INT TERM |
| 15 | |
| 16 | lens="" |
| 17 | for i in "$sourcedir"/*.flac; do |
| 18 | base=${i##*/} |
| 19 | metaflac --export-tags-to="$tmp/${base%.flac}.tags" "$i" |
| 20 | len=$(metaflac --show-total-samples "$i") |
| 21 | lens="${lens:+$lens }$len" |
| 22 | done |
| 23 | |
| 24 | { |
| 25 | if ((offset < 0)); then |
| 26 | $JBDIR/bin/cat-prefix $((4 * -offset)) </dev/zero |
| 27 | fi |
| 28 | for i in "$sourcedir"/*.flac; do |
| 29 | flac -d -s -o- --force-raw-format --sign=signed --endian=little "$i" |
| 30 | done |
| 31 | if ((offset > 0)); then |
| 32 | $JBDIR/bin/cat-prefix $((4 * offset)) </dev/zero |
| 33 | fi |
| 34 | } | { |
| 35 | if ((offset > 0)); then |
| 36 | $JBDIR/bin/cat-prefix $((4 * offset)) >/dev/null |
| 37 | fi |
| 38 | set -- $lens |
| 39 | for i in "$sourcedir"/*.flac; do |
| 40 | base=${i##*/} |
| 41 | len=$1; shift |
| 42 | $JBDIR/bin/cat-prefix $((4 * len)) >"$tmp"/"${base%.flac}.pcm" |
| 43 | flac --force-raw-format --sign=signed --endian=little --channels=2 \ |
| 44 | --bps=16 --sample-rate=44100 --best -o "$targetdir"/"$base" \ |
| 45 | "$tmp"/"${base%.flac}.pcm" |
| 46 | metaflac --remove-all-tags \ |
| 47 | --import-tags-from="$tmp"/"${base%.flac}.tags" \ |
| 48 | "$targetdir"/"$base" |
| 49 | done |
| 50 | if ((offset < 0)); then |
| 51 | $JBDIR/bin/cat-prefix $((4 * -offset)) >/dev/null |
| 52 | fi |
| 53 | } |
| 54 | |
| 55 | for i in "$sourcedir"/* "$sourcedir"/.[!.]*; do |
| 56 | if [ ! -e "$i" ]; then continue; fi |
| 57 | case "$i" in |
| 58 | *.flac) ;; |
| 59 | *) cp -r "$i" "$targetdir"/ ;; |
| 60 | esac |
| 61 | done |
| 62 | |
| 63 | rm -rf "$tmp" |
| 64 | trap '' EXIT INT TERM |