Skip to content

Commit

Permalink
add interface for more commands
Browse files Browse the repository at this point in the history
  • Loading branch information
rytilahti committed Dec 9, 2018
1 parent 95cc933 commit 701314d
Show file tree
Hide file tree
Showing 2 changed files with 129 additions and 9 deletions.
62 changes: 57 additions & 5 deletions songpal/group.py
Original file line number Diff line number Diff line change
Expand Up @@ -148,25 +148,64 @@ async def state(self) -> GroupState:
res = await act.async_call()
return GroupState.make(**res)

async def statem(self):
async def statem(self) -> GroupState:
"""Return the current group state (memory?)."""
act = self.service.action("X_GetStateM")
res = await act.async_call()
return GroupState.make(**res)

async def get_group_memory(self, result):
async def get_group_memory(self):
"""Return group memory."""
# Returns an XML with groupMemoryList
# X_DeleteGroupMemory)> (['MemoryID'])
# X_UpdateGroupMemory)> (['MemoryID', 'GroupMode', 'GroupName', 'SlaveList', 'CodecType', 'CodecBitrate'])
act = self.service.action("X_GetAllGroupMemory")
res = await act.async_call()
return res

async def update_group_memory(self, memory_id, mode, name, slaves, codectype=0x0040, bitrate=0x0003):
"""Update existing memory? Can be used to create new ones, too?"""
act = self.service.action("X_UpdateGroupMemory")
res = await act.async_call(MemoryID=memory_id,
GroupMode=mode,
GroupName=name,
SlaveList=slaves,
CodecType=codectype,
CodecBitrate=bitrate)

return res

async def delete_group_memory(self, memory_id):
"""Delete group memory."""
act = self.service.action("X_DeleteGroupMemory")
res = await act.async_call(MemoryID=memory_id)

async def get_codec(self):
"""Get codec settings."""
act = self.service.action("X_GetCodec")
res = await act.async_call()
return res

async def set_codec(self, codectype=0x0040, bitrate=0x0003):
"""Set codec settings."""
act = self.service.action("X_SetCodec")
res = await act.async_call(CodecType=codectype, CodecBitrate=bitrate)
return res

async def abort(self):
"""Abort current group session."""
state = await self.state()
res = await self.call("X_Abort", MasterSessionID=state.SessionID)
res = await self.call("X_Abort", MasterSessionID=state.MasterSessionID)
return res

async def stop(self):
"""Stop playback?"""
state = await self.state()
res = await self.call("X_Stop", MasterSessionID=state.MasterSessionID)
return res

async def play(self):
"""Start playback?"""
state = await self.state()
res = await self.call("X_Play", MasterSessionID=state.MasterSessionID)
return res

async def create(self, name, slaves):
Expand All @@ -179,6 +218,19 @@ async def create(self, name, slaves):
CodecBitrate=0x0003)
return res

async def add(self, slaves):
state = await self.state()
res = await self.call("X_Entry", MasterSessionID=state.MasterSessionID, SlaveList=slaves)
return res

async def remove(self, slaves):
state = await self.state()
res = await self.call("X_Leave", MasterSessionID=state.MasterSessionID, SlaveList=slaves)

# What does these do?
# INFO: songpal.upnpctl:Action: < UpnpService.Action(X_EntryM) > (['MasterSessionID', 'SlaveList'])
# INFO: songpal.upnpctl:Action: < UpnpService.Action(X_LeaveM) > (['MasterSessionID', 'SlaveList'])

async def set_mute(self, activate):
"""Set group mute."""
res = await self.call("X_SetGroupMute", GroupMute=activate)
Expand Down
76 changes: 72 additions & 4 deletions songpal/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -638,10 +638,19 @@ async def state(gc: GroupControl):
@group.command()
@pass_groupctl
@coro
async def abort(gc: GroupControl):
"""Abort existing group."""
click.echo("Aborting current group..")
click.echo(await gc.abort())
async def codec(gc: GroupControl):
"""Codec settings."""
codec = await gc.get_codec()
click.echo("Codec: %s" % codec)


@group.command()
@pass_groupctl
@coro
async def memory(gc: GroupControl):
"""Group memory."""
mem = await gc.get_group_memory()
click.echo("Memory: %s" % mem)


@group.command()
Expand All @@ -655,5 +664,64 @@ async def create(gc: GroupControl, name, slaves):
click.echo(await gc.create(name, slaves))


@group.command()
@pass_groupctl
@coro
async def abort(gc: GroupControl):
"""Abort existing group."""
click.echo("Aborting current group..")
click.echo(await gc.abort())

@group.command()
@pass_groupctl
@click.argument('slaves', nargs=-1, required=True)
@coro
async def add(gc: GroupControl, slaves):
"""Add speakers to group."""
click.echo("Adding to existing group: %s" % slaves)
click.echo(await gc.add(slaves))


@group.command()
@pass_groupctl
@click.argument('slaves', nargs=-1, required=True)
async def remove(gc: GroupControl, slaves):
"""Remove speakers from group."""
click.echo("Removing from existing group: %s" % slaves)
click.echo(await gc.remove(slaves))


@group.command()
@pass_groupctl
@click.argument('volume', type=int)
async def volume(gc: GroupControl, volume):
"""Adjust volume [-100, 100]"""
click.echo("Setting volume to %s" % volume)
click.echo(await gc.set_group_volume(volume))


@group.command()
@pass_groupctl
@click.argument('mute', type=bool)
async def mute(gc: GroupControl, mute):
"""(Un)mute group."""
click.echo("Muting group: %s" % mute)
click.echo(await gc.set_mute(mute))


@group.command()
@pass_groupctl
async def play(gc: GroupControl):
"""Play?"""
click.echo("Sending play command: %s" % await gc.play())


@group.command()
@pass_groupctl
async def stop(gc: GroupControl):
"""Stop playing?"""
click.echo("Sending stop command: %s" % await gc.stop())


if __name__ == "__main__":
cli()

0 comments on commit 701314d

Please sign in to comment.