ubuntuusers.de

Internetradio DB -> Audacious + .m3u

Status: Ungelöst | Ubuntu-Version: Ubuntu 24.04 (Noble Numbat)
Antworten |

Gastmarant

Anmeldungsdatum:
24. September 2025

Beiträge: 150

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

Gastmarant

(Themenstarter)

Anmeldungsdatum:
24. September 2025

Beiträge: 150

⬆️ Abfrage läuft nun besser, KI editiert. ⬆️

Antworten |