planime: Added base aliases.
[utils.git] / planime
... / ...
CommitLineData
1#!/bin/bash
2
3isnum() {
4 grep -xq '[0-9]\+' <<<"$1"
5}
6
7scorefile() {
8 if [ "${1##*.}" = mkv ]; then
9 echo 10
10 elif [ "${1##*.}" = ogm ]; then
11 echo 5
12 else
13 echo 0
14 fi
15}
16
17findbase() {
18 if [ -r aliases ]; then
19 while read alias rest; do
20 if [ "$alias" = "$1" ]; then
21 echo "$rest"
22 return
23 fi
24 done <aliases
25 fi
26 echo "$1"
27}
28
29findfile() {
30 if [ -n "$debug" ]; then echo "finding base='$1', ep='$2', qual='$3'" >&2; fi
31 local base file tail eq eqt m matches max score
32 matches=()
33 base="$(findbase "$1")"
34 for file in "$base"*; do
35 tail="${file#"$base"}"
36 eq="${tail%.*}"
37 m=n
38 if [ "${eq%% *}" -eq "$2" ] 2>/dev/null; then
39 if [[ "$eq" == *\ * ]]; then
40 eqt="${eq#* }"
41 else
42 eqt=
43 fi
44 m=y
45 elif [ "${eq:0:${#2}}" = "$2" ]; then
46 eqt="${eq:${#2}}"
47 if [ "${eqt:0:1}" = " " -o -z "$eqt" ]; then
48 eqt="${eqt# }"
49 m=y
50 fi
51 fi
52 if [ "$m" = y ]; then
53 if [ "$eqt" = "$3" -o "$eqt" = "($3)" ]; then
54 matches=("${matches[@]}" "$file")
55 fi
56 fi
57 done
58 if [ ${#matches[@]} -lt 1 ]; then return 1; fi
59 max=
60 for m in "${matches[@]}"; do
61 score="$(scorefile "$m")"
62 if [ -n "$debug" ]; then echo "found \`$m': score $score" >&2; fi
63 if [ -z "$max" ] || [ "$score" -gt "$max" ]; then
64 max="$score"
65 file="$m"
66 fi
67 done
68 if [ -n "$debug" ]; then echo "using \`$file'" >&2; fi
69 echo "$file"
70 return 0
71}
72
73origargs=("$0" "$@")
74cmdline=(mplayer -fs -ass)
75debug=
76unset pretend printfile
77
78while [ "${1:0:1}" = - ]; do
79 a="$1"
80 shift
81 case "$a" in
82 -h)
83 echo "usage: planime [-fdhtC] [-A PLAYER-ARGS... ;] [-s PAR VAL] [--] [NAME-QUAL] [EP|.] [TYPE-QUAL]" >&2
84 exit 0
85 ;;
86 -d)
87 debug=y
88 ;;
89 -t)
90 cmdline=("${cmdline[@]}" -ao oss:/dev/dsp1)
91 ;;
92 -C)
93 pretend=y
94 ;;
95 -A)
96 while :; do
97 a="$1"
98 shift
99 if [ "$a" = \; ]; then
100 break;
101 fi
102 cmdline=("${cmdline[@]}" "$a")
103 done
104 ;;
105 -s)
106 savepar="$1"
107 shift
108 saveval="$1"
109 shift
110 ;;
111 -f)
112 printfile=y
113 ;;
114 --)
115 break
116 ;;
117 *)
118 echo "planime: unknown option \`$a'"
119 exit 1
120 ;;
121 esac
122done
123
124dirbase="$(basename "$(pwd)")"
125base=.
126nextep=n
127file=
128tqual=
129if [ $# -eq 0 ]; then
130 nextep=y
131elif [ $# -eq 1 ]; then
132 if [ -r "$1" ]; then
133 file="$1"
134 else
135 base=
136 ep="$1"
137 fi
138elif [ $# -eq 2 ]; then
139 if findfile "$dirbase - " "$1" "$2" >/dev/null; then
140 base=""
141 ep="$1"
142 tqual="$2"
143 else
144 base="$1"
145 ep="$2"
146 fi
147else
148 base="$1"
149 ep="$2"
150 tqual="$3"
151fi
152if [ "$ep" = . ]; then nextep=y; fi
153if [ "$nextep" = y -a -r nextep ]; then
154 ep="$(<nextep)"
155 if ! isnum "$ep"; then
156 echo "planime: nextep is non-numeric" >&2
157 exit 1
158 fi
159fi
160if [ -z "$file" ]; then
161 if [ "$base" = . ]; then
162 if [ -r curser ]; then
163 curser="$(<curser)"
164 else
165 curser=
166 fi
167 else
168 curser="$(findbase "$base")"
169 fi
170 if [ -n "$curser" ]; then
171 file="$(findfile "$dirbase $curser - " "$ep" "$tqual")" || \
172 file="$(findfile "$curser - " "$ep" "$tqual")"
173 else
174 file="$(findfile "$dirbase - " "$ep" "$tqual")"
175 fi
176fi
177
178if [ -z "$file" -o ! -r "$file" ]; then
179 echo "planime: no matching file found" >&2
180 exit 1
181fi
182
183case "${file##*.}" in
184 ogm)
185 aid=1
186 sid=0
187 ;;
188 mkv)
189 alang=jpn
190 slang=eng
191 ;;
192esac
193
194ifile=".${file}.info"
195
196if [ -n "$savepar" ]; then
197 if [ -r "$ifile" ]; then
198 egrep -v "^${savepar} " "$ifile" >"$ifile.new"
199 mv -f "$ifile.new" "$ifile"
200 fi
201 echo "$savepar $saveval" >>"$ifile"
202 exit 0
203fi
204
205unset delay
206
207if [ -r "$ifile" ]; then
208 exec 3<&0
209 exec 0<"$ifile"
210 while read par arg; do
211 if [ "$par" = delay ]; then
212 cmdline=("${cmdline[@]}" -delay "$arg")
213 elif [ "$par" = aspect ]; then
214 cmdline=("${cmdline[@]}" -aspect "$arg")
215 elif [ "$par" = volmod ]; then
216 cmdline=("${cmdline[@]}" -af volume="$arg")
217 elif [ "$par" = alang ]; then
218 unset alang aid
219 alang="$arg"
220 elif [ "$par" = aid ]; then
221 unset alang aid
222 aid="$arg"
223 elif [ "$par" = slang ]; then
224 unset slang sid
225 slang="$arg"
226 elif [ "$par" = sid ]; then
227 unset slang sid
228 sid="$arg"
229 fi
230 done
231 exec 0<&3
232 exec 3<&-
233fi
234
235if [ -n "$alang" ]; then
236 cmdline=("${cmdline[@]}" -alang "$alang")
237elif [ -n "$aid" ]; then
238 cmdline=("${cmdline[@]}" -aid "$aid")
239fi
240if [ -n "$slang" ]; then
241 cmdline=("${cmdline[@]}" -slang "$slang")
242elif [ -n "$sid" ]; then
243 cmdline=("${cmdline[@]}" -sid "$sid")
244fi
245
246if [ "`hostname`" = pc6 -o "`hostname`" = pc7 -a "$DISPLAY" = :1 ]; then chwp=y; fi
247
248if [ -n "$pretend" ]; then
249 echo "${cmdline[@]}" "$file"
250elif [ -n "$printfile" ]; then
251 echo "$file"
252else
253 if [ "$chwp" = y ]; then (sleep 2; randomwp) & fi
254 "${cmdline[@]}" "$file"
255
256 if [ "$nextep" = y ]; then
257 echo "0. Save and continue (or Space)"
258 echo "1. Continue without saving"
259 echo "2. Save and exit (or Enter)"
260 echo "3. Exit without saving (or any key)"
261 IFS= read -sn1 c
262 save=n
263 cont=n
264 case "$c" in
265 0|" ")
266 save=y
267 cont=y
268 ;;
269 1)
270 cont=y
271 ;;
272 2|"")
273 save=y
274 ;;
275 esac
276 if [ "$save" = y ]; then
277 let ep++
278 echo "$ep" >nextep
279 fi
280 if [ "$cont" = y ]; then
281 exec "${origargs[@]}"
282 else
283 echo "nextep is $ep"
284 fi
285 fi
286fi