b6e27cda33a762e80be6fdf5aaa89e5337aeb932
[utils.git] / planime
1 #!/bin/bash
2
3 isnum() {
4     grep -xq '[0-9]\+' <<<"$1"
5 }
6
7 scorefile() {
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
17 findbase() {
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
29 findfile() {
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
73 origargs=("$0" "$@")
74 cmdline=(mplayer -fs -ass)
75 debug=
76 unset pretend printfile
77
78 while [ "${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
122 done
123
124 dirbase="$(basename "$(pwd)")"
125 base=.
126 nextep=n
127 file=
128 tqual=
129 if [ $# -eq 0 ]; then
130     nextep=y
131 elif [ $# -eq 1 ]; then
132     if [ -r "$1" ]; then
133         file="$1"
134     else
135         base=
136         ep="$1"
137     fi
138 elif [ $# -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
147 else
148     base="$1"
149     ep="$2"
150     tqual="$3"
151 fi
152 if [ "$ep" = . ]; then nextep=y; fi
153 if [ "$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
159 fi
160 if [ -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
176 fi
177
178 if [ -z "$file" -o ! -r "$file" ]; then
179     echo "planime: no matching file found" >&2
180     exit 1
181 fi
182
183 case "${file##*.}" in
184     ogm)
185         aid=1
186         sid=0
187         ;;
188     mkv)
189         alang=jpn
190         slang=eng
191         ;;
192 esac
193
194 ifile=".${file}.info"
195
196 if [ -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
203 fi
204
205 unset delay
206
207 if [ -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<&-
233 fi
234
235 if [ -n "$alang" ]; then
236     cmdline=("${cmdline[@]}" -alang "$alang")
237 elif [ -n "$aid" ]; then
238     cmdline=("${cmdline[@]}" -aid "$aid")
239 fi
240 if [ -n "$slang" ]; then
241     cmdline=("${cmdline[@]}" -slang "$slang")
242 elif [ -n "$sid" ]; then
243     cmdline=("${cmdline[@]}" -sid "$sid")
244 fi
245
246 if [ "`hostname`" = pc6 -o "`hostname`" = pc7 -a "$DISPLAY" = :1 ]; then chwp=y; fi
247
248 if [ -n "$pretend" ]; then
249     echo "${cmdline[@]}" "$file"
250 elif [ -n "$printfile" ]; then
251     echo "$file"
252 else
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
286 fi