Don't clobber STDIN.
[utils.git] / planime
1 #!/bin/sh
2
3 isnum() {
4     grep -xq '[0-9]\+' <<<"$1"
5 }
6
7 findfile() {
8     local file tail eq eqt m
9     for file in "$1"*; do
10         tail="${file#$1}"
11         eq="${tail%.*}"
12         m=n
13         if [ "${eq%% *}" -eq "$2" ] 2>/dev/null; then
14             if [[ "$eq" == *\ * ]]; then
15                 eqt="${eq#* }"
16             else
17                 eqt=
18             fi
19             m=y
20         elif [ "${eq:0:${#2}}" = "$2" ]; then
21             eqt="${eq:${#2}}"
22             if [ "${eqt:0:1}" = " " -o -z "$eqt" ]; then
23                 eqt="${eqt# }"
24                 m=y
25             fi
26         fi
27         if [ "$m" = y ]; then
28             if [ "$eqt" = "$3" -o "$eqt" = "($3)" ]; then
29                 echo "$file"
30                 return 0
31             fi
32         fi
33     done
34     return 1
35 }
36
37 origargs=("$0" "$@")
38 cmdline=(mplayer -fs)
39
40 while [ "${1:0:1}" = - ]; do
41     a="$1"
42     shift
43     case "$a" in
44         -h)
45             echo "usage: planime [-ht] [-s PAR VAL] [NAME-QUAL] [EP|.] [TYPE-QUAL]" >&2
46             exit 0
47             ;;
48         -t)
49             cmdline=("${cmdline[@]}" -ao oss:/dev/dsp1)
50             ;;
51         -s)
52             savepar="$1"
53             shift
54             saveval="$1"
55             shift
56             ;;
57     esac
58 done
59
60 base="$(basename "$(pwd)")"
61 nextep=n
62 file=
63 tqual=
64 if [ $# -eq 0 ]; then
65     nextep=y
66 elif [ $# -eq 1 ]; then
67     if [ -r "$1" ]; then
68         file="$1"
69     else
70         if findfile "$base - " "$1" >/dev/null; then
71             ep="$1"
72         else
73             nextep=y
74             base="$base $1"
75         fi
76     fi
77 elif [ $# -eq 2 ]; then
78     if findfile "$base - " "$1" "$2" >/dev/null; then
79         ep="$1"
80         tqual="$2"
81     else
82         base="$base $1"
83         ep="$2"
84     fi
85 else
86     base="$base $1"
87     ep="$2"
88     tqual="$3"
89 fi
90 if [ "$ep" = . ]; then nextep=y; fi
91 if [ "$nextep" = y -a -r nextep ]; then
92     ep="$(<nextep)"
93     if ! isnum "$ep"; then
94         echo "planime: nextep is non-numeric" >&2
95         exit 1
96     fi
97 fi
98 if [ -z "$file" ]; then
99     file="$(findfile "$base - " "$ep" "$tqual")"
100 fi
101
102 if [ -z "$file" -o ! -r "$file" ]; then
103     echo "planime: no matching file found" >&2
104     exit 1
105 fi
106
107 case "${file##*.}" in
108     ogm)
109         defopts=(-aid 1 -sid 0)
110         ;;
111     mkv)
112         defopts=(-slang eng -alang jpn)
113         ;;
114 esac
115
116 ifile=".${file}.info"
117
118 if [ -n "$savepar" ]; then
119     if [ -r "$ifile" ]; then
120         egrep -v "^${savepar} " "$ifile" >"$ifile.new"
121         mv -f "$ifile.new" "$ifile"
122     fi
123     echo "$savepar $saveval" >>"$ifile"
124     exit 0
125 fi
126
127 unset delay
128
129 if [ -r "$ifile" ]; then
130     exec 3<&0
131     exec 0<"$ifile"
132     while read par arg; do
133         if [ "$par" = delay ]; then
134             cmdline=("${cmdline[@]}" -delay "$arg")
135         elif [ "$par" = aspect ]; then
136             cmdline=("${cmdline[@]}" -aspect "$arg")
137         fi
138     done
139     exec 0<&3
140     exec 3<&-
141 else
142     cmdline=("${cmdline[@]}" "${defopts[@]}")
143 fi
144
145 if [ "`hostname`" = pc6 ]; then chwp=y; fi
146
147 if [ "$chwp" = y ]; then (sleep 2; randomwp) & fi
148 "${cmdline[@]}" "$file"
149
150 if [ "$nextep" = y ]; then
151     echo "0. Save and continue (or Space)"
152     echo "1. Continue without saving"
153     echo "2. Save and exit (or Enter)"
154     echo "3. Exit without saving (or any key)"
155     IFS= read -sn1 c
156     save=n
157     cont=n
158     case "$c" in
159         0|" ")
160             save=y
161             cont=y
162             ;;
163         1)
164             cont=y
165             ;;
166         2|"")
167             save=y
168             ;;
169     esac
170     if [ "$save" = y ]; then
171         let ep++
172         echo "$ep" >nextep
173     fi
174     if [ "$cont" = y ]; then
175         exec "${origargs[@]}"
176     else
177         echo "nextep is $ep"
178     fi
179 fi