Added mechanism for passing arguments to mplayer from planime.
[utils.git] / planime
1 #!/bin/bash
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         -A)
52             while :; do
53                 a="$1"
54                 shift
55                 if [ "$a" = \; ]; then
56                     break;
57                 fi
58                 cmdline=("${cmdline[@]}" "$a")
59             done
60             ;;
61         -s)
62             savepar="$1"
63             shift
64             saveval="$1"
65             shift
66             ;;
67     esac
68 done
69
70 base="$(basename "$(pwd)")"
71 nextep=n
72 file=
73 tqual=
74 if [ $# -eq 0 ]; then
75     nextep=y
76     if [ -r curser ]; then
77         base="$base $(<curser)"
78     fi
79 elif [ $# -eq 1 ]; then
80     if [ -r "$1" ]; then
81         file="$1"
82     else
83         if findfile "$base - " "$1" >/dev/null; then
84             ep="$1"
85         else
86             nextep=y
87             base="$base $1"
88         fi
89     fi
90 elif [ $# -eq 2 ]; then
91     if findfile "$base - " "$1" "$2" >/dev/null; then
92         ep="$1"
93         tqual="$2"
94     else
95         if [ "$1" = . -a -r curser ]; then
96             base="$base $(<curser)"
97         else
98             base="$base $1"
99         fi
100         ep="$2"
101     fi
102 else
103     if [ "$1" = . -a -r curser ]; then
104         base="$base $(<curser)"
105     else
106         base="$base $1"
107     fi
108     ep="$2"
109     tqual="$3"
110 fi
111 if [ "$ep" = . ]; then nextep=y; fi
112 if [ "$nextep" = y -a -r nextep ]; then
113     ep="$(<nextep)"
114     if ! isnum "$ep"; then
115         echo "planime: nextep is non-numeric" >&2
116         exit 1
117     fi
118 fi
119 if [ -z "$file" ]; then
120     file="$(findfile "$base - " "$ep" "$tqual")"
121 fi
122
123 if [ -z "$file" -o ! -r "$file" ]; then
124     echo "planime: no matching file found" >&2
125     exit 1
126 fi
127
128 case "${file##*.}" in
129     ogm)
130         defopts=(-aid 1 -sid 0)
131         ;;
132     mkv)
133         defopts=(-slang eng -alang jpn)
134         ;;
135 esac
136
137 ifile=".${file}.info"
138
139 if [ -n "$savepar" ]; then
140     if [ -r "$ifile" ]; then
141         egrep -v "^${savepar} " "$ifile" >"$ifile.new"
142         mv -f "$ifile.new" "$ifile"
143     fi
144     echo "$savepar $saveval" >>"$ifile"
145     exit 0
146 fi
147
148 unset delay
149
150 if [ -r "$ifile" ]; then
151     exec 3<&0
152     exec 0<"$ifile"
153     while read par arg; do
154         if [ "$par" = delay ]; then
155             cmdline=("${cmdline[@]}" -delay "$arg")
156         elif [ "$par" = aspect ]; then
157             cmdline=("${cmdline[@]}" -aspect "$arg")
158         fi
159     done
160     exec 0<&3
161     exec 3<&-
162 else
163     cmdline=("${cmdline[@]}" "${defopts[@]}")
164 fi
165
166 if [ "`hostname`" = pc6 ]; then chwp=y; fi
167
168 if [ "$chwp" = y ]; then (sleep 2; randomwp) & fi
169 "${cmdline[@]}" "$file"
170
171 if [ "$nextep" = y ]; then
172     echo "0. Save and continue (or Space)"
173     echo "1. Continue without saving"
174     echo "2. Save and exit (or Enter)"
175     echo "3. Exit without saving (or any key)"
176     IFS= read -sn1 c
177     save=n
178     cont=n
179     case "$c" in
180         0|" ")
181             save=y
182             cont=y
183             ;;
184         1)
185             cont=y
186             ;;
187         2|"")
188             save=y
189             ;;
190     esac
191     if [ "$save" = y ]; then
192         let ep++
193         echo "$ep" >nextep
194     fi
195     if [ "$cont" = y ]; then
196         exec "${origargs[@]}"
197     else
198         echo "nextep is $ep"
199     fi
200 fi