-
Notifications
You must be signed in to change notification settings - Fork 5
/
mpv_socket_commands
115 lines (102 loc) · 5.22 KB
/
mpv_socket_commands
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#!/bin/sh
#DEP: `jq` for notifications and '-s'
allsockets='/tmp/all_mpvsockets'
activesocket='/tmp/active_mpvsocket'
socketloc='/tmp/mpvsocket'
( echo "$*" | grep -q ' st ' ) && socket=`echo $* | awk '{ print $2 }' FS=' st '` && oldsocket=`cat $activesocket` || socket=`cat $activesocket`
kill () {
rm -f $allsockets
for i in `ls "$socketloc"*`; do
if [ -n "$( echo '{ "command": ["get_property", "pid" ] }' | socat - "$i" )" ]; then
echo "$i" >> $allsockets
echo "$i added"
else
rm -f "$i"
echo "$i removed"
fi
done
}
sendtoall () {
kill >/dev/null
if [ "$1" = "ac" ]; then
oldsocket="`cat $activesocket`"
for s in $socket; do
sed -i "\|$s|d" $allsockets
done
elif [ "$1" = "a" ]; then
[ -n "$oldsocket" ] && printf '' > $allsockets && echo "$socket" | tr ' ' '\n' >> $allsockets
fi
for i in `cat $allsockets`; do
(echo "$i" | tee $activesocket; mpv_socket_commands $2 $3 $4 $5) | paste -s -d ' \n'
done
kill >/dev/null
[ -n "$oldsocket" ] && echo "$oldsocket" > $activesocket || echo "$socket" > $activesocket
}
getinfo () {
[ "$(echo '{ "command": ["get_property", "pause"] }' | socat - "$mpvsocket" | jq -r .data)" = 'false' ] && play='Playing' || play='Paused'
[ "$(echo '{ "command": ["get_property", "loop" ] }' | socat - "$mpvsocket" | jq -r .data)" = 'inf' ] && loop='Yes' || loop='No'
vol="$(echo '{ "command": ["get_property", "volume" ] }' | socat - "$mpvsocket" | jq -r .data)"
perc="$(echo '{ "command": ["get_property", "percent-pos" ] }' | socat - "$mpvsocket" | jq -r .data)"
duration=$(echo '{ "command": ["get_property", "duration" ] }' | socat - "$mpvsocket" | jq -r .data | cut -d'.' -f1)
position=$(echo '{ "command": ["get_property", "time-pos" ] }' | socat - "$mpvsocket" | jq -r .data | cut -d'.' -f1)
[ "$duration" -lt 3600 ] && dur="$(printf "%02d:%02d/%02d:%02d" $((position%3600/60)) $((position%60)) $((duration%3600/60)) $((duration%60)))" || dur="$(printf "%d:%02d:%02d/%d:%02d:%02d" $((position/3600)) $((position%3600/60)) $((position%60)) $((duration/3600)) $((duration%3600/60)) $((duration%60)))"
}
notifyinfo () {
kill >/dev/null
if [ "$1" = '-a' ]; then
oldsocket=`cat $activesocket`
for i in `cat $allsockets`; do
echo "$i" > $activesocket
mpvsocket="$i"
getinfo
notify-send $play "$( mpv_socket_commands g media-title | jq -r .data ) $( mpv_socket_commands g percent-pos | jq -r .data | cut -d. -f1 )% \n${dur} ${vol}V \n Loop: $loop\n$(cat $activesocket)"
done
echo $oldsocket > $activesocket
else
mpvsocket=`cat $activesocket`
getinfo
notify-send $play "$( mpv_socket_commands g media-title | jq -r .data ) $( mpv_socket_commands g percent-pos | jq -r .data | cut -d. -f1 )% \n${dur} ${vol}V \n Loop: $loop\n$(cat $activesocket)"
fi
}
nextsock () {
line=$( grep -Fxn "$( cat $activesocket )" $allsockets | cut -d':' -f1 )
line=$(( line+1 ))
[ "$line" -gt "$( grep -c '' $allsockets )" ] && line='1'
sed -n "${line}p" $allsockets > $activesocket
notifyinfo
}
prevsock () {
line=$( grep -Fxn "$( cat $activesocket )" $allsockets | cut -d':' -f1 )
line=$(( line-1 ))
[ "$line" -lt "1" ] && line="$( grep -c '' $allsockets )"
sed -n "${line}p" $allsockets > $activesocket
notifyinfo
}
case "$1" in
"g") printf '{ "command": ["get_property", "%s"] }\n' "$2" | socat - "$socket" ;;
"gs") printf '{ "command": ["get_property_string", "%s"] }\n' "$2" | socat - "$socket" ;;
"s") printf '{ "command": ["set_property", "%s", %s] }\n' "$2" "$3" | socat - "$socket" ;;
"c") printf '{ "command": ["%s", "%s"] }\n' "$2" "$3" | socat - "$socket" ;;
"cc") printf '{ "command": ["%s", "%s", "%s"] }\n' "$2" "$3" "$4" | socat - "$socket" ;;
"e") shift 1; echo "$( echo "$@" | sed 's/ st .*//' )" | socat - "$socket" ;;
"a") sendtoall $* ;;
"ac") sendtoall $* ;;
"-n") kill >/dev/null 2>&1; nextsock ;;
"-p") kill >/dev/null 2>&1; prevsock ;;
"-s") sel="$(mpv_socket_commands a g media-title | cut -d' ' -f2- | jq -r .data | grep -n '' | dmenu -i -l 10 | cut -d':' -f1)"; [ -n "$sel" ] && sed -n "${sel}p" $allsockets > $activesocket ;;
"-sp") sel=$(cat $allsockets | dmenu -i -l 5); [ -n "$sel" ] && echo "$sel" > $activesocket ;;
"n") notifyinfo -a ;;
"k") kill ;;
"ls") kill >/dev/null; ls $socketloc* ;;
*) echo "\tls - list sockets; -n - next socket; -p - previous socket; -s - select socket by media-title; -sp - select socket by path
g - get_property; gs - get_property_string; s - set_property; c - command; cc - like c except accepts 1 more arg; e - echo;
a - do something on all sockets or the ones specified with 'st'. example: mpv_socket_commands a <g|s|c|cc|e> [<command>] <property> <value>
ac - do something on all but the current socket or the ones specified with 'st'.
n - send a notification containing info of all socket's loop state, position, and name.
k - update $allsockets - remove unused sockets.
to act on a socket that is not the current active one, pass st <socket> as last arguments. further, one can
exclude multiple sockets when using the 'ac' option by passing all the undesriable sockets after the st agruement.
or only run commands on sockets specified with 'st' for 'a' instead of for all.
ex: mpv_socket_commands [a|ac] g path [st /tmp/mpvsocket1 /tmp/mpvsocket4/]
* sockets must be named as /tmp/mpvsocket<name> to be detected by the script." ;;
esac