-
Notifications
You must be signed in to change notification settings - Fork 4
/
dradio
executable file
·214 lines (163 loc) · 6.01 KB
/
dradio
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
#!/bin/bash
# Copyleft 2010 by Keywan Najafi Tonekaboni, me@prometoys.net
# http://prometoys.net
# Dieses Wrapper-Skript für Streamripper steht unter GPL v. 3
# Das ist ein ganz einfaches Skript zum Aufnehmen von Radio-Sendungen per
# Streamripper. Anstelle der ganzen Optionen von Streamripper reicht ein
# ganz einfacher Aufruf:
# Aufnahme von DRadio Wissen für 60 Minuten mit Label:
# dradio dwissen 60 hoersaal
# Das Skript nimmt immer in einem einzigen Happen auf. Weitere Tips zur
# Bedienung weiter unten.
# Zum Start folgende Angaben bearbeiten:
# Ort wo die Aufnahmen gespeichert werden sollen. Pfad mit / abschliessen.
# Beispiel: TARGET="/tmp/"
TARGET="/tmp/"
# Maximalle Füllrate in Prozent. Ist auf der angegebenen Partition mehr
# Platz belegt, wird die Aufnahme nicht gestartet.
MAX_USED_SPACE_RATE=98
# Wenn die maximale Füllrate fast erreicht ist, kann auch ein Tool zum
# vorzeitigen Warnen genutzt werden.
MAX_USED_SPACE_RATE_WARN=90
# WARNINGTOOL="/usr/local/bin/gesms" # e.g. tool to send sms/text message
# WARNINGTOOL_OPT=0123456789 # e.g. mobile number
# USERAGENT: So gibt sich Streamripper gegenüber dem Server aus. Um eine
# Aussperrung zu vermeiden, versucht einen gültigen Agent zu ergattern.
# Ein paar Beispiele:
#
# Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 6.0)
# Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)
# Microsoft-WebDAV-MiniRedir/6.1.7600
# gvfs/1.4.1
# Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16
# Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7
# VLC media player - version 1.0.2 Goldeneye - (c) 1996-2009 the VideoLAN team
USERAGENT='"Microsoft-WebDAV-MiniRedir/6.1.7600"'
USERNAME=`whoami`
# Optionale Argumente für Streamripper
OPT=""
# Falls am Desktop gestartet und notify-send installiert ist, gibt es
# die Möglichkeit Benachrichtigungen anzuzeigen. Dazu auf TRUE umstellen.
MESSAGING=FALSE
# Senderliste
STATION_FILE=$HOME/.config/dradio/sender.list
# Aufruf: dradio SENDER [ ZEIT ] [ LABEL ]
# SENDER: siehe $SENDER
# ZEIT: Länge der Aufnahme in Minuten (optional)
# LABEL: Freier Text der in dem Dateinamen eingetragen wird (optional)
# Beispiel 55 Minuten DLF aufnehmen: dradio dlf 55
# Dieses Programm benötigt streamripper und optional notify-send
# Zeitgesteurte Aufnahmen mit cron:
# Crontab editieren mit: crontab -e
# Beispiel: 46m DLF aufnehmen an jedem Montag um 19:14 Uhr
#
# 14 19 * * 2 /usr/local/bin/dradio dlf 46 feature >/dev/null 2>&1 # DLF Feature
#
# Zeitgesteuerte Aufnahme mit at:
# at aufrufen mit z.B.: at 19:14
# Befehl eingeben: /usr/local/bin/dradio dlf 46 feature
# Enter drücken, dann CTRL+D
if [ -r "$HOME/.config/dradio/dradio.config" ]; then
. "$HOME/.config/dradio/dradio.config"
fi
# Variablen für das Skript, besser nicht ändern ;)
TIME="60"
STREAM=""
CHANNEL=$1
LABEL=""
if [ "$DEBUG" == "TRUE" ] ; then
WARN="TRUE"
fi
error() {
echo -e $* >&2
}
debug() {
if [ "$DEBUG" == "TRUE" ] ; then
echo -e $* >&2
fi
}
warn() {
if [ "$WARN" == "TRUE" ] ; then
echo -e $* >&2
fi
}
# TODO getopts
# z.B. kein oder leerer Channel uebergeben mit ""
if [ $# -lt 1 ] || [ -z "$CHANNEL" ] ; then
error "Kein Sender gewählt..."
exit 1
fi
USED_RATE=$(df $TARGET | awk '$3 ~ /[0-9]+/ { print $5 }' | sed -e "s/%//")
if [ $(($USED_RATE+0)) -ge $MAX_USED_SPACE_RATE ] ; then
error "Partition des Zielverzeichnisses $TARGET zu ${USED_RATE}% belegt.\n Keine Aufnahme, da zuwenig freier Speicher."
exit 1
fi
if [ $# -gt 1 ] ; then
OPT="$OPT -l $(($2*$TIME))"
fi
if [ $# -gt 2 ] ; then
LABEL=$3
fi
# Stream-URL aus Senderliste ermitteln
if [ -r $STATION_FILE ] ; then
STREAM=$(awk "/^$CHANNEL/ {print \$2; exit}" < $STATION_FILE)
else
error "Senderliste $STATION_FILE nicht gefunden"
fi
# Pruefen, ob gueltiger Sender gefunden wurde.
if [ -z "$STREAM" ] ; then
SENDER=$(awk "/^\\S/ {printf(\"%s \", \$1)}" < $STATION_FILE)
error "$CHANNEL ist kein gueltiger Sender: $SENDER"
exit 1
fi
debug "Starte Aufname"
DATE=`date +%Y_%m_%d_%H_%M`
## Pruefen, ob Skript aus dem Terminal oder an einer Pipe aufgerufen wird.
# if [ -t 1 ] ; then
streamripper $STREAM -d $TARGET -s -a "$CHANNEL-%d-$LABEL" $OPT -u $USERAGENT -A -i --quiet
# else
# echo "streamripper $STREAM -d $TARGET -s -a \"$CHANNEL-%d-$LABEL\" $OPT -u $USERAGENT -A -i --quiet"
# fi
# ID3-Tag setzten
# Pruefen, ob LABEL gesetzt und id3v2 vorhanden
if [ -z "$LABEL" ] ; then
warn "Kein Label gesetzt, Metadaten werden nicht angepasst"
elif [ -z "`which id3v2`" ] ; then
warn "Programm id3v2 nicht vorhanden, Metadaten werden nicht angepasst"
else
debug "Aktualisiere Metadaten mit folgendem Aufruf \n id3v2 -a $CHANNEL -A $LABEL ${TARGET}${CHANNEL}-$DATE*-$LABEL.mp3"
id3v2 -a $CHANNEL -A $LABEL ${TARGET}${CHANNEL}-$DATE*-$LABEL.mp3
fi
CUEFILES=${TARGET}${CHANNEL}-`date +%Y_%m_%d_`*.cue
for FILE in $CUEFILES ; do
if [ -f $FILE ] ; then
debug "Aufraeumen: $FILE"
rm $FILE
fi
done
# Warnung ueber knappen Speicherplatz
if [ $(($USED_RATE+0)) -gt $(($MAX_USED_SPACE_RATE_WARN+0)) ] && [ x$WARNINGTOOL != x ] ; then
WARNING_DISKSPACE="Achtung: Partition des Zielverzeichnisses $TARGET zu ${USED_RATE}% belegt. $CHANNEL - $DATE - $LABEL "
if [ -e /tmp/.dradio_warn ]; then
warn "Already send warn message: $WARNING_DISKSPACE"
else
touch /tmp/.warnsms
debug "Sende Warnmeldung mit folgendem Aufruf: \n $WARNINGTOOL $WARNINGTOOL_OPT $WARNING_DISKSPACE"
$WARNINGTOOL $WARNINGTOOL_OPT $WARNING_DISKSPACE
fi
fi
# Messaging
# Benachrichtigung mit notify-send
if [ $MESSAGING == TRUE ] ; then
MESSAGE="Neue Aufnahme abgeschlossen"
TITLE="Aufnahme $CHANNEL $LABEL"
NOTIFY_TIME="6000"
QUIET=""
export DISPLAY=`who | awk "/\\(:[0-9]+\\)/ {gsub(\"[:|(|)]\",\"\"); if (\$1 == \"$USERNAME\") {print \":\"\$5; exit }}"`
debug "Erzeuge Benachrichtigung '$TITLE: $MESSAGE' auf DISPLAY $DISPLAY für ${NOTIFY_TIME}ms"
if [ -n "`which notify-send`" ] && [ -n "$DISPLAY" ] ; then
notify-send "$TITLE" "$MESSAGE" -t $NOTIFY_TIME -u normal -i gtk-dialog-info
else
error "Konnte Benachrichtigung nicht erzeugen"
fi
fi