Added method to programmatically get the list of active Snapcast connections
This commit is contained in:
parent
a349b45ba4
commit
c619d89fa4
1 changed files with 65 additions and 0 deletions
|
@ -2,6 +2,7 @@ import json
|
||||||
import socket
|
import socket
|
||||||
import threading
|
import threading
|
||||||
|
|
||||||
|
from platypush.config import Config
|
||||||
from platypush.context import get_backend
|
from platypush.context import get_backend
|
||||||
from platypush.plugins import Plugin, action
|
from platypush.plugins import Plugin, action
|
||||||
|
|
||||||
|
@ -543,4 +544,68 @@ class MusicSnapcastPlugin(Plugin):
|
||||||
hosts[self.backend_hosts[i]] = self.backend_ports[i]
|
hosts[self.backend_hosts[i]] = self.backend_ports[i]
|
||||||
return hosts
|
return hosts
|
||||||
|
|
||||||
|
@action
|
||||||
|
def get_playing_streams(self, exclude_local=True):
|
||||||
|
"""
|
||||||
|
Returns the remote streams configured in the `music.snapcast` backend
|
||||||
|
that are currently active and unmuted.
|
||||||
|
|
||||||
|
:param exclude_local: Exclude localhost connections (default: true)
|
||||||
|
:type exclude_local: bool
|
||||||
|
|
||||||
|
:returns: dict with the host->port mapping. Example::
|
||||||
|
|
||||||
|
{
|
||||||
|
"hosts": {
|
||||||
|
"server_1": 1705,
|
||||||
|
"server_2": 1705,
|
||||||
|
"server_3": 1705
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
|
||||||
|
backend_hosts = self.get_backend_hosts().output
|
||||||
|
|
||||||
|
def _worker(host, port):
|
||||||
|
if exclude_local and (host == 'localhost'
|
||||||
|
or host == Config.get('device_id')):
|
||||||
|
del backend_hosts[host]
|
||||||
|
return
|
||||||
|
|
||||||
|
server_status = self.status(host=host, port=port).output
|
||||||
|
client_status = self.status(host=host, port=port,
|
||||||
|
client=Config.get('device_id')).output
|
||||||
|
|
||||||
|
if client_status.get('config', {}).get('volume', {}).get('muted'):
|
||||||
|
del backend_hosts[host]
|
||||||
|
return
|
||||||
|
|
||||||
|
group = [g for g in server_status.get('groups', {})
|
||||||
|
if g.get('id') == client_status.get('group_id')].pop(0)
|
||||||
|
|
||||||
|
if group.get('muted'):
|
||||||
|
del backend_hosts[host]
|
||||||
|
return
|
||||||
|
|
||||||
|
stream = [s for s in server_status.get('streams')
|
||||||
|
if s.get('id') == group.get('stream_id')].pop(0)
|
||||||
|
|
||||||
|
if stream.get('status') != 'playing':
|
||||||
|
del backend_hosts[host]
|
||||||
|
return
|
||||||
|
|
||||||
|
workers = []
|
||||||
|
|
||||||
|
for host, port in backend_hosts.items():
|
||||||
|
w = threading.Thread(target=_worker, args=(host,port))
|
||||||
|
w.start()
|
||||||
|
workers.append(w)
|
||||||
|
|
||||||
|
while workers:
|
||||||
|
w = workers.pop()
|
||||||
|
w.join()
|
||||||
|
|
||||||
|
return {'hosts': backend_hosts}
|
||||||
|
|
||||||
|
|
||||||
# vim:sw=4:ts=4:et:
|
# vim:sw=4:ts=4:et:
|
||||||
|
|
Loading…
Reference in a new issue