You are not logged in.

Dear visitor, welcome to VDR Portal. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Saturday, November 5th 2011, 6:36pm

Timer zum Server verschieben

Hallo,

ich habe mal ein Skript geschrieben um Timer vom Client zum Server zu verschieben. Bei mir gibt es dazu einen cron Eintrag der jede Minute nach neuen lokalen Timern schaut ("* * * * * /var/lib/vdr/record_on_server.sh"). Der lokale root User braucht dazu ssh Zugriff auf den Aufnahme Server (ohne Password), am einfachsten einen key erzeugen ("ssh-keygen -t dsa") und den Inhalt der Datei id_dsa.pub auf dem Server in die .ssh/authorized_keys eintragen. Die Variablen $testcheck und $testdir wurden nur eingebaut um Aufnahmen von einem Sender testweise in ein anderes Unterverzeichnis zu legen.

Damit die Anzahl der Aufnahmen kalkuliert werden kann, muß man die Anzahl der vorhanden DVB Karten angeben (bei mir 2 DVBS):

typeset -i DVBS=2
typeset -i DVBC=0
typeset -i DVBT=0

Das Paket etherwake muß installiert sein ("apt-get install etherwake")

$ETHDEV ist das Interface vom Client
$PORT ist der Port den svdrsend.pl nutzt
$REMOTEPC der Name des Servers
$WAKEUPMAC Macadresse(n) des Servers
$maxtransponder gibt an wieviele Aufnahme mit einer DVB Karte gemacht werden können, wenn der Transponder des Sender identisch ist

Source code

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
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
#!/bin/bash
# Script: /var/lib/vdr/record_on_server.sh

ETHDEV="eth0"
SVDRCMD="/usr/lib/vdr/svdrpsend.pl"
PORT="2001"
REMOTEPC="vdrserver"
LOCALPC="`hostname`"
testcheck="XYZ"
testdir="TEST"

WAKEUPMAC="90:E6:4A:1D:0F:CF 90:E6:5A:01:0F:A2"

typeset -i DVBS=2
typeset -i DVBC=0
typeset -i DVBT=0
typeset -i localcount=0
typeset -i maxrecordings=0
typeset -i maxtransponder=1
typeset -i moveonserver=0

/usr/bin/touch /srv/vdr/video.00/.update
/usr/bin/touch /srv/vdr/video.00/SERVER/.update

if [ "`ps -ef | grep -v grep | grep 'xbmc'`" != "" ];then
   echo "xbmc is running ..."
   exit 0
fi

if $($SVDRCMD -p $PORT -d $LOCALPC LSTT | grep "^250" 1>/dev/null);then
   echo ""
   echo "Lokaler Timer gefunden ..."
   echo ""
   # Falls Kommando nicht ausgefuehrt werden kann => aufwecken
  
   if [ "`$SVDRCMD -p $PORT -d $REMOTEPC LSTC 1 2>&1 | grep refused`" != "" ];then
  	if [ "`ssh $REMOTEPC ps -ef|grep vdr`" = "" ];then 
      	echo "VDR not running on $REMOTEPC ..."
      	$SVDRCMD -p $PORT -d $LOCALPC MESG "starting VDR on $REMOTEPC" 1>/dev/null
      	ssh $REMOTEPC /etc/init.d/vdr start
  	fi
  	exit 1
   elif [ "`$SVDRCMD -p $PORT -d $REMOTEPC LSTC 1 | grep "^250" `" = "" ];then
  	echo "Waking up $REMOTEPC ..."
  	$SVDRCMD -p $PORT -d $LOCALPC MESG "Waking up $REMOTEPC" 1>/dev/null

  	for i in $WAKEUPMAC
  	do
     	/usr/sbin/etherwake -i $ETHDEV $i
  	done

  	exit 1
   fi
else
   echo "no local recordings ..."
   $SVDRCMD -p $PORT -d $REMOTEPC LSTT | grep "^250" 
   exit 0
fi

IFS="
"
         	
for LOCALRECORDS in $($SVDRCMD -p $PORT -d $LOCALPC LSTT | grep "^250" | sed "s/^250[ -]//g")  
do
	typeset -i remotecount=0
	typeset -i timercount=0
	typeset -i sametransponder=0

	SAMETIMER="false"

	IFS=":"
	read L_RECNUMBER L_RECCHANID L_RECDATE L_RECSTART L_RECSTOP L_RECPRIO L_RECLIFETIME L_RECNAME <<EOA
$LOCALRECORDS
EOA
IFS="
"
	((localcount=$localcount+1))

	L_RECNUMBER=$(echo "$L_RECNUMBER" | awk '{print $1}')
	echo ""
	echo "--------------------------------------------------"
	echo "  L O C A L   T I M E R "
	echo "--------------------------------------------------"
	echo "  Nummer  : $L_RECNUMBER"
	echo "  Kanal   : $L_RECCHANID"
	echo "  Datum   : $L_RECDATE "
	echo "	von   : $L_RECSTART"
	echo "	bis   : $L_RECSTOP"
	#echo "  Prio	: $L_RECPRIO"
	#echo "  Lifetime: $L_RECLIFETIME" 
	echo "  Name	: $L_RECNAME"

	# check lokaler Kanal ist welcher remote kanal
	LOCALCHAN=$($SVDRCMD -p $PORT -d $LOCALPC LSTC $L_RECCHANID | grep "^250" | sed "s/^250[ -]//g")

IFS=":"
	read LNAME LFREQ LPARA LSOURCE LSRATE LVPID LAPID LPID LCAD LSID LNID LTID LRID <<EOB
$LOCALCHAN
EOB
IFS="
"
	LCHANID=$(echo $LNAME | awk '{print $1}')
	echo ""
	echo "  C H A N N E L  I N F O"
	echo "  LNAME   : $LNAME"
	echo "  CHAN	: $LCHANID "
	echo "  FREQ	: $LFREQ "
	echo "  PARA	: $LPARA "
	echo "  SOURCE  : $LSOURCE"
	echo "  SRATE   : $LSRATE "
	echo "  VPID	: $LVPID "
	echo "  APID	: $LAPID"
	echo "  PID 	: $LPID"
	echo "  CAD 	: $LCAD"
	echo "  SID 	: $LSID"
	echo "  NID 	: $LNID"
	echo "  TID 	: $LTID"
	echo "  RID 	: $LRID"


	if [ "$LSOURCE" = "S13.0E" -o "$LSOURCE" = "S19.2E" ];then
     	((maxrecordings=$DVBS))
     	LCARD="DVB-S"
	elif [ "$LSOURCE" = "C" ];then
     	((maxrecordings=$DVBC))
     	LCARD="DVB-C"
	else
     	((maxrecordings=$DVBT))
     	LCARD="DVB-T"
	fi	

	echo "  REC max.  $LSOURCE: $maxrecordings"
	echo ""
	echo ""

	#######################################################################
	################### Channel Remote same as Local? #####################
	#######################################################################
	CHECKED_R_CHAN=$($SVDRCMD -p $PORT -d $REMOTEPC LSTC | egrep ":${LSOURCE}:.*:${LSID}:${LNID}:${LTID}:${LRID}" | sed "s/^250[ -]//g" )
	CHECKED_R_CHANID=$(echo $CHECKED_R_CHAN | awk -F' ' '{print $1}')

	if [ "$CHECKED_R_CHANID" != "$LCHANID" ];then
    	echo " Different Remote Channel: $CHECKED_R_CHANID"
	fi
	
	#######################################################################
	################### Move to Subdirectory?     	#####################
	#######################################################################
	CHECKTEST=$(echo $LNAME | egrep -i "$testcheck")
	
	#######################################################################
	################### Timer String that will be sent ####################
	#######################################################################
	if [ -z "$CHECKTEST" ];then 
     	NEWSERVERTIMER="1:$CHECKED_R_CHANID:$L_RECDATE:$L_RECSTART:$L_RECSTOP:$L_RECPRIO:$L_RECLIFETIME:$L_RECNAME"
	else
     	NEWSERVERTIMER="1:$CHECKED_R_CHANID:$L_RECDATE:$L_RECSTART:$L_RECSTOP:$L_RECPRIO:$L_RECLIFETIME:${testdir}~${L_RECNAME}"
	fi

	###### echo "  New Timer: $NEWSERVERTIMER"

	############################################
	#  Check if recording is on next day   	#
	############################################
	SEC_LSTART=$(date -d "$L_RECDATE $L_RECSTART" +%s)

	if [ $L_RECSTOP -lt $L_RECSTART ];then
   	SEC_LSTOP=$((`date -d "$L_RECDATE $L_RECSTOP" +%s` + 86400))
	else
   	SEC_LSTOP=$(date -d "$L_RECDATE $L_RECSTOP" +%s)
	fi

	######################################################################
	###############   	Remote Recordings   	########################
	######################################################################
	for REMOTERECORDS in $($SVDRCMD -p $PORT -d $REMOTEPC LSTT | grep "^250" | sed "s/^250[ -]//g") 
	do

   	IFS=":"
   	read R_RECNUMBER R_RECCHANID R_RECDATE R_RECSTART R_RECSTOP R_RECPRIO R_RECLIFETIME R_RECNAME <<EOC
$REMOTERECORDS
EOC
IFS="
"
   	((remotecount=$remotecount+1))

   	###########################################
   	# 	LAENGE DER AUFZEICHNUNG PRUEFEN 	#
   	###########################################
   	SEC_RSTART=$(date -d "$R_RECDATE $R_RECSTART" +%s)

   	if [ $R_RECSTOP -lt $R_RECSTART ];then
      	SEC_RSTOP=$((`date -d "$R_RECDATE $R_RECSTOP" +%s` + 86400))
   	else
      	SEC_RSTOP=$(date -d "$R_RECDATE $R_RECSTOP" +%s)
   	fi

   	############################################
   	#  Check Aufzeichnung zur gleichen Zeit	#
   	############################################
   	if [ $SEC_LSTART -le $SEC_RSTART -a $SEC_LSTOP -ge $SEC_RSTART ] || [ $SEC_LSTART -ge $SEC_RSTART -a $SEC_LSTART -lt $SEC_RSTOP ];then

        	###########################################
        	# 	Aufzeichnung existiert bereits  	#
        	###########################################
        	if [ "$CHECKED_R_CHANID" = "$R_RECCHANID" ] && [ $SEC_LSTART -eq $SEC_RSTART ];then
              	SAMETIMER="true"
              	continue
        	###########################################
        	# 	Aufzeichnung existiert bereits  	#
        	###########################################
        	elif [ "$CHECKED_R_CHANID" = "$R_RECCHANID" ] && [ $SEC_LSTOP -eq $SEC_RSTOP ];then
              	SAMETIMER="true"
              	continue
        	else
              	REMOTECHAN=$($SVDRCMD -p $PORT -d $REMOTEPC LSTC $R_RECCHANID| grep "^250" | sed "s/^250[ -]//g")
              	IFS=":"
              	read RNAME RFREQ RPARA RSOURCE RSRATE RVPID RAPID RPID RCAD RSID RNID RTID RRID <<EOB
$REMOTECHAN
EOB
IFS="
"
              	RCHANID=$(echo $RNAME | awk '{print $1}')

              	echo " 	#################################"	
              	echo " 	R E C O R D I N G"
              	echo " 	#################################"	
              	echo " 	Number: $remotecount"
              	echo " 	CHAN  : $R_RECCHANID"             	
              	echo " 	DATE  : $R_RECDATE"
              	echo " 	START : $R_RECSTART"
              	echo " 	STOP  : $R_RECSTOP"
              	echo " 	LSTART: $SEC_LSTART"
              	echo " 	LSTOP : $SEC_LSTOP"
              	echo " 	RSTART: $SEC_RSTART"
              	echo " 	RSTOP : $SEC_RSTOP"
              	echo " 	----------------------"
              	echo " 	C H A N N E L  I N F O"
              	echo " 	----------------------"
              	echo " 	NAME   : $RNAME"
              	echo " 	CHAN   : $RCHANID "
              	echo " 	FREQ   : $RFREQ "
              	echo " 	PARA   : $RPARA "
              	echo " 	SOURCE : $RSOURCE"
              	echo " 	SRATE  : $RSRATE "
              	echo " 	VPID   : $RVPID "
              	echo " 	APID   : $RAPID"
              	echo " 	PID	: $RPID"
              	echo " 	CAD	: $RCAD"
              	echo " 	SID	: $RSID"
              	echo " 	NID	: $RNID"
              	echo " 	TID	: $RTID"
              	echo " 	RID	: $RRID"

              	########################
              	# Check gleiche Karte  #
              	########################
              	if [ "$RSOURCE" = "S13.0E" -o "$RSOURCE" = "S19.2E" ];then
                   	RCARD="DVB-S"
              	elif [ "$RSOURCE" = "C" ];then
                   	RCARD="DVB-C"
              	else
                   	RCARD="DVB-T"
              	fi	

              	if [ "$LCARD" != "$RCARD" ];then
                   	echo ""
                   	echo " 	not on same card ..."
                   	echo ""
                   	continue
              	fi

              	###############################
              	# Check gleicher Transponder  #
              	###############################
              	if [ "$LFREQ" = "$RFREQ" ] && [ "$LPARA" = "$RPARA" ] && [ "$LSRATE" = "$RSRATE" ];then

                  	echo ""
                  	echo " 	is on same transponder ..."
                  	echo ""

                  	((sametransponder=$sametransponder+1))
              	fi

              	((timercount=$timercount+1))

        	fi
        	###########################################
        	# Ende Aufzeichnung existiert bereits 	#
        	###########################################
   	fi 
   	################################################
   	#  Ende Check Aufzeichnung zur gleichen Zeit   #
   	################################################

	done
	######################################################################
	##################### Ende Remote Recordings #########################
	######################################################################

	echo ""
	echo " 	------------------"
	echo "    	R E S U L T	"
	echo " 	------------------"
	echo ""

	((checkrecording=$timercount-$sametransponder))

	if [ "$SAMETIMER" = "true" ];then
   	echo " 	${L_RECNAME}: same TIMER exists!"
   	$SVDRCMD -p $PORT -d $LOCALPC MESG "${L_RECNAME}: timer already exists!" 1>/dev/null
	elif [ $timercount -gt $maxrecordings ] && [ $sametransponder -eq 0 ];then
   	echo " 	${L_RECNAME}: max. records reached!"
   	echo " 	[${timercount}/${maxrecordings} $sametransponder/$maxtransponder]"
   	$SVDRCMD -p $PORT -d $LOCALPC MESG "${L_RECNAME}: max. recording reached!" 1>/dev/null
   	$SVDRCMD -p $PORT -d $LOCALPC MESG "[${timercount}/${maxrecordings} $sametransponder/$maxtransponder]" 1>/dev/null
	elif [ $timercount -gt $maxrecordings ] && [ $sametransponder -gt $maxtransponder ];then
   	echo " 	${L_RECNAME}: max. recording reached!"
   	echo " 	[${timercount}/${maxrecordings} $sametransponder/$maxtransponder]"
   	$SVDRCMD -p $PORT -d $LOCALPC MESG "${L_RECNAME}: max. recording reached!" 1>/dev/null
   	$SVDRCMD -p $PORT -d $LOCALPC MESG "[${timercount}/${maxrecordings} $sametransponder/$maxtransponder]" 1>/dev/null
	elif [ $checkrecording -gt $maxrecordings ];then
   	echo " 	${L_RECNAME}: max. recording reached!"
   	echo " 	[${timercount}/${maxrecordings} $sametransponder/$maxtransponder]"
   	$SVDRCMD -p $PORT -d $LOCALPC MESG "${L_RECNAME}: max. recording reached!" 1>/dev/null
   	$SVDRCMD -p $PORT -d $LOCALPC MESG "[${timercount}/${maxrecordings} $sametransponder/$maxtransponder]" 1>/dev/null
	else
   	((moveonserver=$moveonserver+1))
   	$SVDRCMD -p $PORT -d $REMOTEPC NEWT "$NEWSERVERTIMER" 1>/dev/null
   	echo "$NEWSERVERTIMER" >> /etc/vdr/remotetimer.log

   	echo " 	${L_RECNAME}: moving recording to Server ..."
   	echo " 	Datum: $L_RECDATE Start: $L_RECSTART Records: [${timercount}/${maxrecordings} $sametransponder/$maxtransponder]"
   	$SVDRCMD -p $PORT -d $LOCALPC MESG "${L_RECNAME}: sending to Server" 1>/dev/null
   	$SVDRCMD -p $PORT -d $LOCALPC MESG "Datum: $L_RECDATE Start: $L_RECSTART Records: [${timercount}/${maxrecordings} $sametransponder/$maxtransponder]" 1>/dev/null
	fi

	$SVDRCMD -p $PORT -d $LOCALPC MODT 1 off 1>/dev/null
	$SVDRCMD -p $PORT -d $LOCALPC DELT 1 	1>/dev/null
	echo ""

done

echo "----------------------------------"
echo "Aufnahmen (lokal)   : $localcount"
echo "Aufnahmen (remote)  : $remotecount"
echo "Aufnahmen verschoben: $moveonserver"
echo "----------------------------------"

$SVDRCMD -p $PORT -d $REMOTEPC LSTT | grep "^250" >> /etc/vdr/remotetimer.log


Das Script kann man sicher noch verbessern, es läuft bei mir derzeit einwandfrei
Gruss
Uwe
----
Client I + II: Asus Pundit P4-P5N9300, Intel Core Duo 2,5Ghz,TBS 6920, Lirc CIR port, Bild/Ton via HDMI
Server: M3N WS, TBS 6920, TT-1600, DVB-C
Software: Ubuntu 9.10, Kernel 2.6.31, VDR 1.7.9, XBMC, vdpau, xineliboutput, xine (Installation siehe hier)
Scripts: Timer zum Server verschieben

This post has been edited 4 times, last edit by "uxtuner" (Nov 6th 2011, 6:06pm)


2

Monday, November 7th 2011, 8:54am

Warum nimmst du nicht das Remotetimer-Plugin zum verschieben?
Gibertini SE75 | Inverto QuadroLNB Black Eco | Inverto Unicable Multischalter 1/8/1 | DD OctopusNET Rack mit 2x DuoFlexS2 | Telestar Digibit R1 (Testlab)
VDR 2.1.6 (Server) auf Asus M5A78L-M/USB3 | Sempron 145@2Cores | 4GB ECC RAM | SAT>IP via vtuner/satip | PicoPSU | Debian Wheezy 64Bit | Linux Kernel 3.15.
VDR 2.0.6 via streamdev auf RaspberryPI
R.I.P: Gigaset M740 mit VDR von open7x0.org

3

Monday, November 7th 2011, 10:42am

Für das Plugin muß der vdr gepatcht werden, was in einigen Distris sehr aufwendig sein kann, das Skript läuft out of the box. Es würde mich interessieren, ob das plugin den remote server auch per etherwake aufwecken kann?
Gruss
Uwe
----
Client I + II: Asus Pundit P4-P5N9300, Intel Core Duo 2,5Ghz,TBS 6920, Lirc CIR port, Bild/Ton via HDMI
Server: M3N WS, TBS 6920, TT-1600, DVB-C
Software: Ubuntu 9.10, Kernel 2.6.31, VDR 1.7.9, XBMC, vdpau, xineliboutput, xine (Installation siehe hier)
Scripts: Timer zum Server verschieben

schmirl

Professional

Posts: 1,295

Location: Nähe Augsburg

  • Send private message

4

Monday, November 7th 2011, 1:07pm

Für das Plugin muß der vdr gepatcht werden.

Das ist so nicht richtig. Die Grundfunktionalität benötigt keine Patches. Nur wenn Sofort-Aufnahmen und die Pause-Taste für Live-TV serverseitig aufzeichnen soll, ist ein Patch erforderlich. Und natürlich um die Hauptmenü-Einträge durch die Plugin-Menüs zu ersetzen (MainMenuHooks).

Quoted

Es würde mich interessieren, ob das plugin den remote server auch per etherwake aufwecken kann

Nein, das Plugin geht davon aus, dass beim Aufruf der Server bereits läuft. Aber zum Ausführen beliebiger Befehle gibt es im VDR die commands.conf.