#!/usr/bin/python3 from __future__ import absolute_import from __future__ import print_function import socket, time, os if socket.gethostname()=="work.salstar.sk": default_sap_ip = '233.10.47.10' else: # Antik default_sap_ip = '224.2.127.254' sdp_dir = os.environ.get("SDP_DIR") class multicast: def __init__(self, group=default_sap_ip, port=9875, join=True): self.group = group sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM, #socket.IPPROTO_UDP ) self.sock = sock sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 32) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_LOOP, 1) sock.bind((os.environ.get("SAP_BIND_IP", ""), port)) self.host = socket.gethostbyname(socket.gethostname()) sock.setsockopt( socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(self.host) ) if join: sock.setsockopt( socket.SOL_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton(group) + socket.inet_aton(self.host) ) # functions self.recv = self.sock.recv self.recvfrom = self.sock.recvfrom self.send = self.sock.send self.sendall = self.sock.sendall def close(self): self.sock.setsockopt( socket.SOL_IP, socket.IP_DROP_MEMBERSHIP, socket.inet_aton(self.group) + socket.inet_aton(self.host) ) self.sock.close() class sdp(dict): def __init__(self, data): d0 = data[0] self.ver = d0>>5 self.addr = (d0>>4)&1 self.mtype = (d0>>2)&1 self.encryption = (d0>>1)&1 self.compress = d0&1 self.auth_len = data[1] self.msg_id = data[2]*256+data[3] if self.addr==0: self.source = data[4:8] self.data = data[8:].rstrip(b'\n') else: self.source = data[4:20] self.data = data[20:].rstrip(b'\n') if b'\x00' in self.data: self.ctype, self.data = self.data.split(b'\x00', 1) else: self.ctype = b"" if self.ver>=1: self.list = [ x.rstrip(b'\r').decode("utf8").split('=', 1) for x in self.data.split(b'\n') if b'=' in x ] dict.__init__(self, **dict(self.list)) def ok(self): if self.encryption: print("ENCRYPTED:", self) return self.ver==1 and self.addr==0 and self.mtype==0 \ and self.encryption==0 and self.compress==0 \ and self['s'] and ('m' in self) and ('c' in self) def name(self): return self['s'] def filename(self): return self['s'].replace(" ", "_").replace("/", "_") + ".sdp" def ip(self): return self['c'].split(' ')[2].split('/', 1)[0] def port(self): return self['m'].split(' ')[1] def media(self): return self['m'].split(' ')[0] def url(self): return "rtp://%s:%s/" % (self.ip(), self.port()) def group(self): return self.a('x-plgroup') def a(self, search): search = search+":" for key, value in self.list: if key=="a" and value.startswith(search): return value.split(":", 1)[1] return '' def search(group=default_sap_ip, port=9875, timeout=5): mcast = multicast(group, port) all = [] tend = time.time()+timeout while time.time()1: ip = sys.argv[1] else: ip = default_sap_ip timeout = int(os.environ.get("TIMEOUT", "10")) if "--php" in sys.argv: print("