Brauchte eine minimalistische Lösung um per GUI auf https://www.radio-browser.info zugreifen zu können. Streamadresse wird an Audacious übergeben. Zu finden in Playlist "Momentane Wiedergabe", von da aus kann in bestehende Playlists kopiert werden.
Sollte unabhängig von Audacious gesamte oder selektierte Suche per M3U gespeichert werden so ist das möglich.
Sollte Ergebnisfeld leer bleiben, dann Suchbutton nochmal ausführen.(kann auch manchmal einige Sekunden dauern, warum momentan noch nicht klar) Desktop Datei ist unter dem Script.
Audacious sollte als Einzelinstanz laufen.
Über Terminal Start des Python Scripts per:
python3 <scriptpfad.py> #ggf. noch sudo apt install python3-tk
*.py Script
import tkinter as tk
from tkinter import filedialog, messagebox
import requests
import subprocess
# -------- Radio-Browser Mirrors --------
MIRRORS = [
"https://de1.api.radio-browser.info",
"https://de2.api.radio-browser.info"
]
API_PATH = "/json/stations/search"
stations = []
# -------- Hilfsfunktionen --------
def set_status(text, color="black"):
status_label.config(text=text, fg=color)
status_label.update_idletasks()
# -------- Hauptfunktionen --------
def search():
listbox.delete(0, tk.END)
stations.clear()
query = entry.get().strip()
if not query:
messagebox.showwarning("Hinweis", "Bitte einen Suchbegriff eingeben.")
return
btn_search.config(state=tk.DISABLED)
set_status("Suche läuft …", "blue")
headers = {"User-Agent": "RadioBrowserTk/1.0"}
last_error = None
for idx, base_url in enumerate(MIRRORS, start=1):
api_url = base_url + API_PATH
set_status(f"Server {idx}/{len(MIRRORS)} wird geprüft …", "blue")
try:
r = requests.get(
api_url,
params={
"name": query,
"limit": 400,
"hidebroken": True
},
headers=headers,
timeout=8
)
r.raise_for_status()
data = r.json()
if data:
break # Erfolg!
else:
data = []
except (requests.exceptions.Timeout,
requests.exceptions.ConnectionError,
requests.exceptions.HTTPError,
ValueError) as e:
last_error = e
continue
else:
messagebox.showerror(
"Server nicht erreichbar",
"Keiner der Radio-Browser-Server hat geantwortet.\n"
"Bitte später erneut versuchen."
)
set_status("Alle Server fehlgeschlagen", "red")
btn_search.config(state=tk.NORMAL)
return
# Daten anzeigen
for s in data:
stations.append({
"name": s.get("name", "Unbekannt"),
"url": s.get("url_resolved", "")
})
listbox.insert(tk.END, s.get("name", "Unbekannt"))
set_status(f"{len(stations)} Sender gefunden", "green")
btn_search.config(state=tk.NORMAL)
def play(event):
sel = listbox.curselection()
if not sel:
return
url = stations[sel[0]]["url"]
if url:
subprocess.Popen(["audacious", url])
def write_m3u(station_list):
if not station_list:
messagebox.showwarning("Hinweis", "Keine Sender zum Speichern.")
return
filename = filedialog.asksaveasfilename(
defaultextension=".m3u",
filetypes=[("M3U Playlist", "*.m3u")],
title="Playlist speichern unter"
)
if not filename:
return
with open(filename, "w", encoding="utf-8") as f:
f.write("#EXTM3U\n")
for s in station_list:
f.write(f"#EXTINF:-1,{s['name']}\n")
f.write(f"{s['url']}\n")
messagebox.showinfo("Fertig", "Playlist wurde gespeichert.")
def save_all():
write_m3u(stations)
def save_selected():
selected = listbox.curselection()
if not selected:
messagebox.showwarning("Hinweis", "Keine Sender markiert.")
return
sel_stations = [stations[i] for i in selected]
write_m3u(sel_stations)
# -------- GUI --------
root = tk.Tk()
root.title("Radio-Browser + Audacious")
entry = tk.Entry(root, width=40)
entry.pack(padx=10, pady=5)
btn_frame = tk.Frame(root)
btn_frame.pack(pady=5)
btn_search = tk.Button(btn_frame, text="Suchen", width=15, command=search)
btn_search.pack(side=tk.LEFT, padx=5)
btn_save_all = tk.Button(btn_frame, text="Alle speichern", width=15, command=save_all)
btn_save_all.pack(side=tk.LEFT, padx=5)
btn_save_sel = tk.Button(btn_frame, text="Markierte speichern", width=20, command=save_selected)
btn_save_sel.pack(side=tk.LEFT, padx=5)
listbox = tk.Listbox(root, width=90, height=22, selectmode=tk.EXTENDED)
listbox.pack(padx=10, pady=5)
listbox.bind("<<ListboxSelect>>", play)
status_label = tk.Label(root, text="Bereit", anchor="w")
status_label.pack(fill=tk.X, padx=10, pady=5)
root.mainloop()*.desktop
[Desktop Entry] Name=radio-browser.info GUI + Audacious GenericName= Comment=Radio Browser Python GUI Icon=python3 Type=Application Exec=bash -c "python3 <Scriptpfad.py>" Terminal=false