chiark / gitweb /
gremlin/gremlin.in: Use `locale.getpreferredencoding'.
[autoys] / flaccrip / flaccrip-toc
CommitLineData
583b7e4a
MW
1#! /bin/bash
2
3set -e
4
5###--------------------------------------------------------------------------
6### Table of contents representation.
7###
8### We need a simple table of contents representation. A toc file consists
9### of a number of records, one per line; each record is a number of
10### blank-delimited fields. Fields don't contain whitespace, so no quoting
11### is needed. The first field of each record is a type which explains how
12### to decode the rest.
13###
14### `T' START Audio track starts at START frames.
15###
16### `D' START Data track, starts at START frames.
17###
18### `E' END Leadout at END frames.
19
20###--------------------------------------------------------------------------
21### Command line options.
22
23hidden=0
24data=none
25while getopts "d:h:" opt; do
26 case "$opt" in
27 h) hidden=$OPTARG ;;
28 d) data=$OPTARG ;;
29 *) exit 1 ;;
30 esac
31done
32shift $((OPTIND - 1))
33
34case "$#" in
35 1) ;;
36 *) echo >&2 "Usage: $0 [-d DATA] [-h HIDDEN] DIR|CD-DEVICE"; exit 1 ;;
37esac
38source=$1
39
40###--------------------------------------------------------------------------
41### Work out what to do.
42
43if [ -d "$source" ]; then
44
45 ## Intuit what's going on from a directory full of FLAC files.
46 cd "$source"
47 for i in [0-9][0-9][-.\ ]*.flac; do
48 metaflac --show-total-samples "$i"
49 done | {
50 tn=1 tot=$hidden
51 while read samples; do
52 frames=$((samples/588))
53 echo "T $tot"
54 tot=$((tot + frames))
55 done
56 case "$data" in
57 none)
58 ;;
59 *)
60 tot=$((tot + 11400))
61 echo "D $tot"
62 tot=$((tot + data))
63 ;;
64 esac
65 echo "E $tot"
66 }
67
68elif [ -b "$source" ]; then
69
70 ## Read a table of contents from a CD.
71 wodim dev="$source" -toc | sed '
72 /^track:/ !d
73 s/^track:\(.*\) lba: *\([0-9][0-9]*\) (.*mode: *\([-0-9][0-9]*\) *$/\1 \3 \2/
74 ' | while read track mode offset; do
75 case "$track,$mode" in
76 lout,-1) echo "E $offset" ;;
77 *,0 | *,-1) echo "T $offset" ;;
78 *,1 | *,2) echo "D $offset" ;;
79 esac
80 done
81
82else
83 echo >&2 "$0: don't know how to read a toc from $source"
84fi