diff --git a/README.md b/README.md index e50e872..14f256b 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Because I run an online D&D game, which includes a background music stream f ## Quick Start (Server) -This assumes you have a functioning icecast2 installation already. +This assumes you have a functioning icecast2/whatever installation already. ``` % sudo apt install libshout3-dev @@ -41,6 +41,8 @@ This assumes you have a functioning icecast2 installation already. Now start the server, which will begin streaming the `session_start` playlist: +## Controlling The Server + ``` % croaker start INFO Daemonizing controller on (localhost, 8003); pidfile and logs in ~/.dnd/croaker @@ -83,14 +85,14 @@ OK Skip this track and move on to the next: ``` -FFWD +ffwd OK ``` Stop the music: ``` -STOP +stop OK ``` @@ -101,3 +103,57 @@ kthx KBAI Connection closed by foreign host. ``` + +## Python Client Implementation + +Here's a sample client using Ye Olde Socket Library: + +```python +import socket +from dataclasses import dataclass +from functools import cached_property + + +@dataclass +class CroakerClient(): + host: str + port: int + + @cached_property + def playlists(self): + return self.send("LIST").split("\n") + + def list(self, *args): + if not args: + return self.playlists + return self.send(f"LIST {args[0]}") + + def play(self, *args): + if not args: + return "Error: Must specify the playlist to play." + return self.send(f"PLAY {args[0]}") + + def ffwd(self, *args): + return self.send("FFWD") + + def stop(self, *args): + return self.send("STOP") + + def send(self, msg: str): + BUFSIZE = 4096 + data = bytearray() + with socket.create_connection((self.host, self.port)) as sock: + sock.sendall(f"{msg}\n".encode()) + while True: + buf = sock.recv(BUFSIZE) + data.extend(buf) + if len(buf) < BUFSIZE: + break + sock.sendall(b'KTHX\n') + return data.decode() + + +if __name__ == '__main__': + client = CroakerClient(host='localhost', port=1234) + client.play('session_start') +```