#!/usr/bin/env python3
import subprocess
import time
from   pathlib import Path
import threading
import json
import tempfile
import urllib.request
import websocket
# 128kbps Opus
URL="https://radio.animebits.moe/stream/stream128.ogg"
# 256kbps Opus
#URL="https://radio.animebits.moe/stream/stream256.ogg"
# ~148kbps VBR AAC
#URL="https://radio.animebits.moe/stream/stream128.aac"
# ~192kbps VBR MP3
#URL="https://radio.animebits.moe/stream/stream192.mp3"
# Lossless FLAC
#URL="https://radio.animebits.moe/stream/stream.flac"
#config file & pid
CONF = Path.home() / ".config" / "radiorc"
PID = Path.home() / ".config" / "radio-pid"
with open(CONF) as f:
    VOL = f.read().strip()
def notify(title, image_url=None):
    icon_path = None
    if image_url:
        try:
            tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".png")
            urllib.request.urlretrieve(image_url, tmp.name)
            icon_path = tmp.name
        except:
            icon_path = None
    args = ["notify-send", title]
    if icon_path:
        args += ["-i", icon_path]
    subprocess.run(args)
def ws_listener():
    def on_message(ws, message):
        data = json.loads(message)
        if "data" in data and "title" in data["data"]:
            title = data["data"]["title"]
            image = data["data"].get("album_cover")
            notify(title, image)
    def on_error(ws, error):
        pass
    def on_close(ws, close_status_code, close_msg):
        time.sleep(1)
        run_ws()
    def on_open(ws):
        pass
    def run_ws():
        ws = websocket.WebSocketApp("wss://radio.animebits.moe/api/events/basic",
                                    on_message=on_message,
                                    on_error=on_error,
                                    on_close=on_close,
                                    on_open=on_open)
        ws.run_forever()
    run_ws()
threading.Thread(target=ws_listener, daemon=True).start()
while True:
    try:
        print("Playing now...")
        subprocess.run(["notify-send", "Playing now..."])
        proc = subprocess.Popen(["mpv", "--no-video", f"--volume={VOL}", URL])
        with open(PID, "w") as f:
            f.write(str(proc.pid))
        proc.wait()
    except KeyboardInterrupt:
        subprocess.run(["notify-send", "Stopping now..."])
        print("\nStopping now...")
        break
    except Exception as e:
        print(f"Something broke... trying again... Error: {e}")
        time.sleep(2)
