|
@@ -1,6 +1,6 @@
|
1
|
1
|
#!/bin/bash
|
2
|
2
|
|
3
|
|
-##### FUNCTIONS #####
|
|
3
|
+##### SNIPPETS #####
|
4
|
4
|
|
5
|
5
|
log() {
|
6
|
6
|
# Beautiful logs
|
|
@@ -8,6 +8,12 @@ log() {
|
8
|
8
|
echo "[$date]" $1
|
9
|
9
|
}
|
10
|
10
|
|
|
11
|
+display_err_arg() {
|
|
12
|
+ echo "Usage: welcomehome --start $(tput smul)configuration file$(tput rmul)"
|
|
13
|
+ echo "OR"
|
|
14
|
+ echo "Usage: welcomehome --stop"
|
|
15
|
+}
|
|
16
|
+
|
11
|
17
|
parse_arg() {
|
12
|
18
|
# Echoes the value of a given parameter in a given configuration file
|
13
|
19
|
value=$(cat $1 | grep -E "^$2" | cut -d"=" -f2)
|
|
@@ -23,18 +29,11 @@ check_url() {
|
23
|
29
|
return $?
|
24
|
30
|
}
|
25
|
31
|
|
26
|
|
-check_volume() {
|
27
|
|
- # Check if the volume value is valid
|
28
|
|
- if [ $1 -gt 100 ] || [ $1 -lt 0 ]; then
|
29
|
|
- echo "Invalid volume value"
|
30
|
|
- exit 1
|
31
|
|
- fi
|
32
|
|
-}
|
|
32
|
+##### STREAM CONTROL #####
|
33
|
33
|
|
34
|
34
|
set_volume() {
|
35
|
35
|
# Set the volume to the right value
|
36
|
36
|
volume=$1
|
37
|
|
- check_volume $volume
|
38
|
37
|
log "Set volume to $volume"
|
39
|
38
|
|
40
|
39
|
data='{"jsonrpc": "2.0", "id": 1, "method": "core.mixer.set_volume", "params": [VOLUME]}'
|
|
@@ -61,9 +60,6 @@ play_stream() {
|
61
|
60
|
# Play dat sound
|
62
|
61
|
curl -s -d "$data" http://localhost:6680/mopidy/rpc > /dev/null
|
63
|
62
|
curl -s -d '{"jsonrpc": "2.0", "id": 1, "method": "core.playback.play"}' http://localhost:6680/mopidy/rpc > /dev/null
|
64
|
|
-
|
65
|
|
- # The right music at the righ volume. Nothing's more perfect.
|
66
|
|
- set_volume $2
|
67
|
63
|
}
|
68
|
64
|
|
69
|
65
|
stop_stream() {
|
|
@@ -72,48 +68,100 @@ stop_stream() {
|
72
|
68
|
log "Stream stopped"
|
73
|
69
|
}
|
74
|
70
|
|
75
|
|
-##### PROGRAM #####
|
|
71
|
+##### CONTROLLERS #####
|
76
|
72
|
|
77
|
|
-if [[ $# -eq 0 || ! -f $1 ]]; then
|
78
|
|
- echo "I need a config file as first argument"
|
79
|
|
- exit 1
|
80
|
|
-fi
|
|
73
|
+start_playing() {
|
|
74
|
+ touch $lock_file
|
|
75
|
+ play_stream $stream
|
|
76
|
+}
|
81
|
77
|
|
82
|
|
-config_file=$1
|
|
78
|
+stop_playing() {
|
|
79
|
+ if [ -f $lock_file ]; then
|
|
80
|
+ rm $lock_file
|
|
81
|
+ fi
|
|
82
|
+ stop_stream
|
|
83
|
+}
|
83
|
84
|
|
84
|
|
-log "Parsing the configuration file"
|
|
85
|
+##### MAIN FUNCTIONS #####
|
85
|
86
|
|
86
|
|
-# Get parameters from the given configuration file
|
87
|
|
-volume=$(parse_arg $config_file "volume")
|
88
|
|
-stream=$(parse_arg $config_file "stream")
|
89
|
|
-threshold=$(parse_arg $config_file "device_threshold")
|
90
|
|
-address=$(parse_arg $config_file "device_address")
|
|
87
|
+init() {
|
|
88
|
+ # Initialise the variables
|
|
89
|
+ config_file=$1
|
91
|
90
|
|
92
|
|
-if [ ! $(check_url $stream) ]; then
|
93
|
|
- echo "Incorrect stream address"
|
94
|
|
- exit 1
|
95
|
|
-fi
|
|
91
|
+ # Check if the config file exists
|
|
92
|
+ if [ ! -f $config_file ]; then
|
|
93
|
+ echo "$config_file is not a file"
|
|
94
|
+ exit 1
|
|
95
|
+ fi
|
|
96
|
+
|
|
97
|
+ log "Parsing the configuration file"
|
96
|
98
|
|
97
|
|
-log "Initialisation complete"
|
|
99
|
+ # Get parameters from the given configuration file
|
|
100
|
+ volume=$(parse_arg $config_file "volume")
|
|
101
|
+ stream=$(parse_arg $config_file "stream")
|
|
102
|
+ threshold=$(parse_arg $config_file "device_threshold")
|
|
103
|
+ address=$(parse_arg $config_file "device_address")
|
98
|
104
|
|
99
|
|
-while true; do
|
100
|
|
- # Lock file
|
101
|
|
- lock_file="/etc/welcomehome/home.lck"
|
|
105
|
+ # Check stream URL validity
|
|
106
|
+ if [ ! $(check_url $stream) ]; then
|
|
107
|
+ echo "Incorrect stream address"
|
|
108
|
+ exit 1
|
|
109
|
+ fi
|
102
|
110
|
|
103
|
|
- count=$(ping -W 1 -c $threshold $address | grep ttl | wc -l)
|
|
111
|
+ # Check volume value validity
|
|
112
|
+ if [ $volume -gt 100 ] || [ $volume -lt 0 ]; then
|
|
113
|
+ echo "Invalid volume value"
|
|
114
|
+ exit 1
|
|
115
|
+ fi
|
104
|
116
|
|
105
|
|
- if [ $count -gt 0 ]; then
|
106
|
|
- # Lock file present = music already playing
|
107
|
|
- if [ ! -f $lock_file ]; then
|
108
|
|
- log "Device detected"
|
109
|
|
- play_stream $stream $volume
|
110
|
|
- touch $lock_file
|
111
|
|
- fi
|
112
|
|
- else
|
113
|
|
- if [ -f $lock_file ]; then
|
114
|
|
- log "Device lost"
|
115
|
|
- stop_stream
|
116
|
|
- rm $lock_file
|
|
117
|
+ # Set volume to the right value
|
|
118
|
+ set_volume $volume
|
|
119
|
+
|
|
120
|
+ log "Initialisation complete"
|
|
121
|
+}
|
|
122
|
+
|
|
123
|
+main() {
|
|
124
|
+ #Main loop
|
|
125
|
+ log "Looking for device"
|
|
126
|
+ while true; do
|
|
127
|
+ # Polling the device's IP address
|
|
128
|
+ count=$(ping -W 1 -c $threshold $address | grep ttl | wc -l)
|
|
129
|
+
|
|
130
|
+ if [ $count -gt 0 ]; then
|
|
131
|
+ # Lock file present = music already playing
|
|
132
|
+ if [ ! -f $lock_file ]; then
|
|
133
|
+ log "Device detected"
|
|
134
|
+ start_playing
|
|
135
|
+ fi
|
|
136
|
+ else
|
|
137
|
+ if [ -f $lock_file ]; then
|
|
138
|
+ log "Device lost"
|
|
139
|
+ stop_playing
|
|
140
|
+ fi
|
117
|
141
|
fi
|
118
|
|
- fi
|
119
|
|
-done
|
|
142
|
+ done
|
|
143
|
+}
|
|
144
|
+
|
|
145
|
+##### PROGRAM #####
|
|
146
|
+
|
|
147
|
+if [ $# -eq 0 ] || [ $# -gt 2 ]; then
|
|
148
|
+ echo "Wrong arguments number"
|
|
149
|
+ display_err_arg
|
|
150
|
+ exit 1
|
|
151
|
+fi
|
|
152
|
+
|
|
153
|
+# Setting lock file path
|
|
154
|
+lock_file="/etc/welcomehome/home.lck"
|
|
155
|
+
|
|
156
|
+# Check if we know the requested feature
|
|
157
|
+case "$1" in
|
|
158
|
+ "--start") init $2
|
|
159
|
+ main
|
|
160
|
+ ;;
|
|
161
|
+ "--stop") stop_playing
|
|
162
|
+ ;;
|
|
163
|
+ *) echo "Unknown argument $1"
|
|
164
|
+ display_err_arg
|
|
165
|
+ ;;
|
|
166
|
+esac
|
|
167
|
+
|