2025-07-21 12:57:44 +03:30
|
|
|
#!/usr/bin/env python3
|
|
|
|
import subprocess
|
|
|
|
import time
|
2025-07-21 15:53:13 +03:30
|
|
|
from pathlib import Path
|
|
|
|
import threading
|
|
|
|
import json
|
|
|
|
import tempfile
|
|
|
|
import urllib.request
|
|
|
|
import websocket
|
2025-07-21 12:57:44 +03:30
|
|
|
# 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"
|
2025-07-21 15:53:13 +03:30
|
|
|
#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()
|
2025-07-21 12:57:44 +03:30
|
|
|
while True:
|
|
|
|
try:
|
|
|
|
print("Playing now...")
|
|
|
|
subprocess.run(["notify-send", "Playing now..."])
|
2025-07-21 15:53:13 +03:30
|
|
|
proc = subprocess.Popen(["mpv", "--no-video", f"--volume={VOL}", URL])
|
|
|
|
with open(PID, "w") as f:
|
|
|
|
f.write(str(proc.pid))
|
|
|
|
proc.wait()
|
2025-07-21 12:57:44 +03:30
|
|
|
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)
|