This commit is contained in:
coast 2025-07-21 15:53:13 +03:30
parent 5dcc1ac3f1
commit 9eb4717f59
3 changed files with 148 additions and 6 deletions

View file

@ -1,7 +1,12 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import subprocess import subprocess
import time import time
from pathlib import Path
import threading
import json
import tempfile
import urllib.request
import websocket
# 128kbps Opus # 128kbps Opus
URL="https://radio.animebits.moe/stream/stream128.ogg" URL="https://radio.animebits.moe/stream/stream128.ogg"
# 256kbps Opus # 256kbps Opus
@ -12,15 +17,55 @@ URL="https://radio.animebits.moe/stream/stream128.ogg"
#URL="https://radio.animebits.moe/stream/stream192.mp3" #URL="https://radio.animebits.moe/stream/stream192.mp3"
# Lossless FLAC # Lossless FLAC
#URL="https://radio.animebits.moe/stream/stream.flac" #URL="https://radio.animebits.moe/stream/stream.flac"
#config file & pid
#volume CONF = Path.home() / ".config" / "radiorc"
VOL=20 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: while True:
try: try:
print("Playing now...") print("Playing now...")
subprocess.run(["notify-send", "Playing now..."]) subprocess.run(["notify-send", "Playing now..."])
subprocess.run(["mpv", "--no-video", f"--volume={VOL}", URL]) 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: except KeyboardInterrupt:
subprocess.run(["notify-send", "Stopping now..."]) subprocess.run(["notify-send", "Stopping now..."])
print("\nStopping now...") print("\nStopping now...")

77
local/radio Executable file
View file

@ -0,0 +1,77 @@
#!/usr/bin/env python3
import os
import subprocess
import time
from pathlib import Path
import threading
import json
import tempfile
import urllib.request
import websocket
import signal
URL = "https://radio.animebits.moe/stream/stream128.ogg"
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], preexec_fn=os.setsid)
with open(PID, "w") as f:
f.write(str(os.getpgid(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)

20
local/radio-kill Executable file
View file

@ -0,0 +1,20 @@
#!/usr/bin/env python3
import subprocess
import sys
import signal
try:
# Find PID(s) of running 'radio' process (matching name)
out = subprocess.check_output(["pgrep", "-f", "radio"])
pids = [int(pid) for pid in out.decode().strip().split()]
except subprocess.CalledProcessError:
print("No running 'radio' process found.")
sys.exit(1)
for pid in pids:
try:
# Send SIGKILL (kill -9) to each found pid
subprocess.run(["kill", "-9", str(pid)])
print(f"Killed PID {pid}")
except Exception as e:
print(f"Failed to kill PID {pid}: {e}")