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