diff --git a/default.nix b/default.nix index b4041ff..cf81d8b 100644 --- a/default.nix +++ b/default.nix @@ -4,5 +4,5 @@ pkgs.python3Packages.buildPythonApplication { pname = "radio"; src = self; version = "0.1"; - propagatedBuildInputs = with pkgs.python3Packages; [ pip ffmpeg-python flask ]; -} \ No newline at end of file + propagatedBuildInputs = with pkgs.python3Packages; [ pip ffmpeg-python flask requests pkgs.ffmpeg ]; +} diff --git a/radio.py b/radio.py index b2b40fb..908f03d 100644 --- a/radio.py +++ b/radio.py @@ -4,14 +4,19 @@ import transcoder from time import sleep from flask import Flask, request from queue import Queue +import json +import requests app = Flask(__name__) +host = "localhost:8000" +stream = "stream.mp3" + class Radio(object): def __init__(self): self.downloader = None self.transcoder = None - self.uploader = uploader.Uploader() + self.uploader = uploader.Uploader(host, stream) self.playingUrl = None self.queue = Queue() @@ -52,6 +57,10 @@ class Radio(object): self.stopPlaying() self.playIfSongAvailable() + def listenerCount(self): + r = requests.get("http://" + host + "/status-json.xsl") + return json.loads(r.text)['icestats']['source']['listeners'] + r = Radio() @app.route('/play', methods=['POST']) @@ -75,6 +84,10 @@ def current(): def queue(): return str(list(r.queue.queue)) +@app.route('/listeners', methods=['GET']) +def listeners(): + return str(r.listenerCount()) + def run(): app.run(host="0.0.0.0") diff --git a/stream_listener.py b/stream_listener.py index bd9bc9e..0214d3c 100644 --- a/stream_listener.py +++ b/stream_listener.py @@ -48,14 +48,12 @@ class StreamListener(Thread): def run(self): while main_thread().is_alive() and not self.quit: while True: + output = None if not self.stream is None: output = non_block_read(self.stream) - if output == None or output == b'': - if not self.backupStream is None: - output = non_block_read(self.backupStream) - if output == None or output == b'': - break - else: - break - self.listener.write(output) + if (output == None or output == b'') and not self.backupStream is None: + output = non_block_read(self.backupStream) + if output == None or output == b'': + break + self.listener.write(output) sleep(0.1) \ No newline at end of file diff --git a/uploader.py b/uploader.py index 7d85e61..48e5108 100644 --- a/uploader.py +++ b/uploader.py @@ -6,13 +6,15 @@ import nullsrc class Uploader(object): - def __init__(self): + def __init__(self, host, stream): + self.host = host + self.stream = stream self.connect() def connect(self): self.process = ( ffmpeg .input('pipe:', re=None) - .output("icecast://source:hackme@localhost:8000/stream.mp3", format='mp3', content_type="audio/mpeg") + .output("icecast://source:hackme@" + self.host + "/" + self.stream, format='mp3', content_type="audio/mpeg") .run_async(pipe_stdin=True, pipe_stderr=True) ) logger.add(self.process.stderr, "uploader.log")