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