Long-running socket watcher, needs proper cleanup

This commit is contained in:
James Barnsley
2018-11-04 14:41:08 +13:00
parent 4327771b2e
commit ffaef9d63e
8 changed files with 156 additions and 44 deletions

View File

@ -1,6 +1,6 @@
from threading import Thread
import os, logging, subprocess, socket, json, random, string
import os, logging, subprocess, socket, json, random, string, select
# import logger
logger = logging.getLogger(__name__)
@ -24,9 +24,9 @@ class IrisSnapcast(object):
port = int(self.config['iris']['snapcast_port'])
try:
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.settimeout(10)
self.socket.connect((host, port))
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.settimeout(10)
self.sock.connect((host, port))
logger.debug("Snapcast connection established on "+host+":"+str(port))
except socket.gaierror, e:
@ -43,32 +43,39 @@ class IrisSnapcast(object):
# @param broadcast = Method
##
def listen(self, broadcast):
logger.info("Established Snapcast listener")
broadcast(data={'method':'snapcast_connected'})
self.connect()
self.listen = True
logger.info("Established Snapcast listener")
broadcast(data={'method':'snapcast_connected'})
messages = []
data = ""
select.select([], [self.sock], [])
while self.listen:
# TODO: This works great, but when no data over X seconds we hit the timeout
# Possibly stop timeout? seems to lock things up
data = data + self.socket.recv(1024)
print data
if data.endswith(u"\r\n"):
readlist, writelist, exceptionlist = select.select([self.sock], [], [], 5)
message = data
data = ""
# Check if we've got any lists
if [readlist, writelist, exceptionlist] != [[], [], []]:
logger.debug("Incoming Snapcast message: "+message)
# Rread and print the available data on any of the read list
for socket in readlist:
try:
message = json.loads(message)
broadcast(data=message)
except:
logger.error("Malformed Snapcast message: "+message)
message = socket.recv(1024)
try:
message = json.loads(message)
# Prefix with snapcast
message['method'] = "snapcast_"+message['method']
# Broadcast to all clients
broadcast(data=message)
except:
logger.error("Malformed Snapcast message: "+message)
##
@ -88,7 +95,7 @@ class IrisSnapcast(object):
def request(self, data):
# No socket to make request on
if self.socket == None:
if self.sock == None:
raise Exception("Socket not established");
# Construct our request, based on the provided data
@ -107,7 +114,7 @@ class IrisSnapcast(object):
# Attempt to send the request
try:
self.socket.send(request.encode('ascii')+b"\n")
self.sock.send(request.encode('ascii')+b"\n")
except socket.error, e:
logger.error("Iris could not send request to Snapcast: %s" % e)
@ -123,7 +130,7 @@ class IrisSnapcast(object):
while True:
try:
response = self.socket.recv(8192)
response = self.sock.recv(8192)
except socket.error, e:
logger.error("Iris failed to receive Snapcast response: %s" % e)
@ -143,13 +150,9 @@ class IrisSnapcast(object):
logger.debug(response)
if 'result' in response:
socket_response = {
'response': response['result']
}
socket_response = response['result']
else:
socket_response = {
'error': response['error']
}
socket_response = response['error']
except:
logger.error("Iris received malformed Snapcast response: "+response)