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