Skip to content

Commit

Permalink
Merge pull request #67 from luar123/add_stream
Browse files Browse the repository at this point in the history
 Implement add and remove streams and path property
  • Loading branch information
happyleavesaoc authored Mar 16, 2024
2 parents 837b3e2 + 90dc289 commit afde781
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 8 deletions.
22 changes: 21 additions & 1 deletion snapcast/control/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@
STREAM_SETMETA = 'Stream.SetMeta' # deprecated
STREAM_ONUPDATE = 'Stream.OnUpdate'
STREAM_ONMETA = 'Stream.OnMetadata' # deprecated
STREAM_ADDSTREAM = 'Stream.AddStream'
STREAM_REMOVESTREAM = 'Stream.RemoveStream'

SERVER_RECONNECT_DELAY = 5

Expand All @@ -55,12 +57,15 @@
SERVER_DELETECLIENT, CLIENT_GETSTATUS, CLIENT_SETNAME,
CLIENT_SETLATENCY, CLIENT_SETVOLUME,
GROUP_GETSTATUS, GROUP_SETMUTE, GROUP_SETSTREAM, GROUP_SETCLIENTS,
GROUP_SETNAME, STREAM_SETMETA, STREAM_SETPROPERTY, STREAM_CONTROL]
GROUP_SETNAME, STREAM_SETMETA, STREAM_SETPROPERTY, STREAM_CONTROL,
STREAM_ADDSTREAM, STREAM_REMOVESTREAM]

# server versions in which new methods were added
_VERSIONS = {
GROUP_SETNAME: '0.16.0',
STREAM_SETPROPERTY: '0.26.0',
STREAM_ADDSTREAM: '0.16.0',
STREAM_REMOVESTREAM: '0.16.0',
}


Expand Down Expand Up @@ -243,6 +248,21 @@ async def stream_setproperty(self, identifier, stream_property, value):
'value': value
})

async def stream_add_stream(self, stream_uri):
"""Add a stream."""
params = {"streamUri": stream_uri}
result, error = await self._transact(STREAM_ADDSTREAM, params)
if (isinstance(result, dict) and ("id" in result)):
self.synchronize((await self.status())[0])
return result or error

async def stream_remove_stream(self, identifier):
"""Remove a Stream."""
result = await self._request(STREAM_REMOVESTREAM, identifier)
if (isinstance(result, dict) and ("id" in result)):
self.synchronize((await self.status())[0])
return result

def group(self, group_identifier):
"""Get a group."""
return self._groups[group_identifier]
Expand Down
5 changes: 5 additions & 0 deletions snapcast/control/stream.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ def properties(self):
"""Get properties."""
return self._stream.get('properties')

@property
def path(self):
"""Get stream path."""
return self._stream.get('uri').get('path')

def update(self, data):
"""Update stream."""
self._stream = data
Expand Down
30 changes: 24 additions & 6 deletions tests/test_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,11 +101,11 @@
{
'clients': []
}
],
'server': SERVER_STATUS, # DeleteClient calls synchronize
'streams': [
]
}
],
'server': SERVER_STATUS, # DeleteClient calls synchronize
'streams': [
]
}
},
'Group.GetStatus': {
'group': {
Expand All @@ -124,7 +124,13 @@
'Stream.SetMeta': {
'foo': 'bar'
},
'Stream.SetProperty': 'ok'
'Stream.SetProperty': 'ok',
'Stream.AddStream': {
'id': 'stream 2'
},
'Stream.RemoveStream': {
'id': 'stream 2'
},
}


Expand Down Expand Up @@ -228,6 +234,18 @@ def test_stream_setproperty(self):
result = self._run(self.server.stream_setproperty('stream', 'foo', 'bar'))
self.assertEqual(result, 'ok')

@mock.patch.object(Snapserver, '_transact', new=mock_transact('Stream.AddStream'))
@mock.patch.object(Snapserver, 'synchronize', new=MagicMock())
def test_stream_addstream(self):
result = self._run(self.server.stream_add_stream('pipe:///tmp/test?name=stream 2'))
self.assertDictEqual(result, {'id': 'stream 2'})

@mock.patch.object(Snapserver, '_transact', new=mock_transact('Stream.RemoveStream'))
@mock.patch.object(Snapserver, 'synchronize', new=MagicMock())
def test_stream_removestream(self):
result = self._run(self.server.stream_remove_stream('stream 2'))
self.assertDictEqual(result, {'id': 'stream 2'})

def test_synchronize(self):
status = copy.deepcopy(return_values.get('Server.GetStatus'))
status['server']['server']['snapserver']['version'] = '0.12'
Expand Down
5 changes: 4 additions & 1 deletion tests/test_stream.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ def setUp(self):
'id': 'test',
'status': 'playing',
'uri': {
'path': '/tmp/snapfifo',
'query': {
'name': ''
}
Expand All @@ -40,9 +41,11 @@ def test_init(self):
self.assertEqual(self.stream.status, 'playing')
self.assertEqual(self.stream.name, '')
self.assertEqual(self.stream.friendly_name, 'test')
self.assertEqual(self.stream.path, '/tmp/snapfifo')
self.assertDictEqual(self.stream_meta.meta, {'TITLE': 'Happy!'})
self.assertDictEqual(self.stream.properties['metadata'], {'title': 'Happy!'})
self.assertDictEqual(self.stream.properties, {'canControl': False, 'metadata': {'title': 'Happy!',}})
self.assertDictEqual(self.stream.properties,
{'canControl': False, 'metadata': {'title': 'Happy!'}})
self.assertDictEqual(self.stream.metadata, {'title': 'Happy!'})

def test_update(self):
Expand Down

0 comments on commit afde781

Please sign in to comment.