Hallo,
angeregt durch diesen Beitrag habe ich mir den vdr-net-monitor von seahawk1986 erweitert.
So reagiert das Skript jetzt auf eine weitere Nachricht: 'start-cutting'
Die Aufnahmen des Servers sind über NFS auf dem Client eingebunden.
Auf Server muss der vdr-update-monitor laufen.
Auf Server und Client muss der vdr-net-monitor laufen, um die Updates des Aufnahmen auszulösen.
Die Erweiterung darf in dieser Form nur auf dem Server vorgenommen werden!
#!/usr/bin/python3
from socketserver import UDPServer, BaseRequestHandler
import argparse
import dbus
import socket
import datetime
import subprocess
class Handler(BaseRequestHandler):
def handle(self):
#print("message:", self.request[0])
#print("from:", self.client_address)
#print(self.request[0].decode('utf-8'))
#print(self.client_address[0] in ipList)
remote_hostname, message = self.request[0].decode('utf-8').split(':')
if (message == 'update' and not remote_hostname == hostname):
bus = dbus.SystemBus()
dbus2vdr = bus.get_object('de.tvdr.vdr', '/Recordings')
answer = dbus.Int32(0)
anwer, message = dbus2vdr.Update(dbus_interface = 'de.tvdr.vdr.recording')
print("update recordings at {0} as requested by {1}".format(datetime.datetime.now(), remote_hostname))
print("dbus: %s - %s" % (anwer, message))
socket = self.request[1]
socket.sendto(bytes("okily dokily",'UTF-8'), self.client_address)
elif (message == 'update' and remote_hostname == hostname):
print("ignoring update message from local ip address {0}".format(self.client_address[0]))
elif (message == 'start-cutting'):
subprocess.Popen(["/usr/lib/vdr/vdr-cutter"])
print("start cutting at {0} as requested by {1}".format(datetime.datetime.now(), remote_hostname))
socket = self.request[1]
socket.sendto(bytes("okily dokily",'UTF-8'), self.client_address)
argparser = argparse.ArgumentParser(description='update vdr recdir on UDP message')
argparser.add_argument('-p', '--port', metavar='PORT', type=int,
dest='port', default=5555, help='udp port (default 5555)')
args = vars(argparser.parse_args())
hostname = socket.gethostname()
addr = ("", args['port'])
print("listening on %s:%s" % addr)
server = UDPServer(addr, Handler)
server.serve_forever()
Alles anzeigen
Wird die Nachricht 'start-cutting' empfangen, wird ein Shell Skript gestartet.
(Das 'touch /srv/vdr/video/.update' braucht es nur, wenn mehrere Aufnahmen nacheinander abgearbeitet werden sollen, und man möchte das...)
/usr/lib/vdr/vdr-cutter
#!/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
. /usr/lib/vdr/config-loader.sh
. /etc/default/vdr
logger -t vdr-cutter "start cutting ..."
sudo -u $USER -g $USER find $VIDEO_DIR -name cutme -type f ! -fstype nfs -exec sh -c 'recpath=$(dirname "$1"); rm $1; vdr --filesize=25G --record=/usr/lib/vdr/vdr-recordingaction --edit="$recpath"; touch /srv/vdr/video/.update' _ "{}" \;
#sudo -u $USER -g $USER touch $VIDEO_DIR/.update
logger -t vdr-cutter "... all done."
Auf Server und Client braucht es noch was zum Senden der Nachricht:
/usr/bin/trigger-cutting
#!/usr/bin/python3
import socket
from gi.repository import GObject
from gi.repository import Gio
import datetime
import argparse
argparser = argparse.ArgumentParser(description='propagate start-cutting via udp')
argparser.add_argument('-p', '--port', metavar='PORT', type=int,
dest='port', default=5555, help='udp port (default 5555)')
args = vars(argparser.parse_args())
def send_message(message='test'):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)
s.settimeout(5)
s.sendto(bytes(message, 'UTF-8'), ("<broadcast>", args['port']))
try:
print("Response: %s" % s.recv(1024))
except socket.timeout:
print("No server found")
s.close()
send_message("{0}:start-cutting".format(socket.gethostname()))
print("Broadcast 'start-cutting' message at {0}".format(datetime.datetime.now()))
Alles anzeigen
Noch ein Wrapper:
/usr/lib/vdr/mark2cut
#!/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
case "$1" in
--mark)
touch "${2}/cutme"
echo "Die Aufnahme wurde zum Schneiden markiert."
;;
--mark-cut)
touch "${2}/cutme"
trigger-cutting
;;
--cut)
trigger-cutting
;;
*)
echo "$0 --cut|--mark|--mark-cut /path/to/rec"
;;
esac
Alles anzeigen
Jetzt können die Aufnahmen vom Server und Client aus markiert werden
/usr/lib/vdr/reccmds.custom.conf
Zum Schneiden markieren: /usr/lib/vdr/mark2cut --mark
Markieren und Schnitt auf dem Server starten: /usr/lib/vdr/mark2cut --mark-cut
Schnitt auf dem Server starten: /usr/lib/vdr/mark2cut --cut
und sollten auf dem Server geschnitten werden.
Have Fun