Files
it-know-how/Linux/Subsonic-API.md
T
2026-09-02 16:32:50 +02:00

3.1 KiB
Raw Blame History

Perfekt dann ist eine Subsonic-kompatible Library genau das, was du suchst 👍

Für Python gibt es z. B. py-sonic.
Die ist zwar nicht mehr super aktiv gepflegt, funktioniert aber mit IT-Know-How/Linux/Navidrome problemlos, weil Navidrome die IT-Know-How/Linux/Subsonic-API spricht.


Installation

pip install py-sonic

Grund-Setup

from pysonic.connection import Connection

# Verbindung aufbauen
conn = Connection(
    host="http://localhost:4533",
    username="meinuser",
    password="meinpass",
    api_version="1.16.1",
    client_name="pyclient"
)

Anwendungsfälle

1. Playlist erstellen oder öffnen

# Neue Playlist
playlist = conn.create_playlist("Importierte M3U Playlist")

# Alle Playlists abfragen
all_playlists = conn.get_playlists()

2. Tracks suchen (z. B. per Filename, Titel, Artist)

search = conn.search2(query="Songtitel", songCount=5)
for song in search['song']:
    print(song['id'], song['title'], song['artist'])

3. Track zur Playlist hinzufügen

conn.update_playlist(
    playlist_id=playlist['id'],
    song_id=["12345", "67890"]  # mehrere IDs möglich
)

4. Stern vergeben

conn.star("12345")   # Song-ID

5. Bookmark setzen

conn.create_bookmark("12345", position=60000, comment="Kapitel 1")

Workflow: M3U importieren

Du kannst einfach durch deine .m3u-Datei iterieren, für jede Zeile versuchen, den Track im Navidrome zu finden, und dann Aktionen ausführen:

def import_m3u_to_navidrome(m3u_path, playlist_name):
    # Playlist anlegen
    playlist = conn.create_playlist(playlist_name)
    playlist_id = playlist['id']

    with open(m3u_path, encoding="utf-8") as f:
        for line in f:
            if line.startswith("#") or not line.strip():
                continue
            filename = line.strip().split("/")[-1]  # nur Dateiname
            
            # Suche im Server
            search = conn.search2(query=filename, songCount=1)
            if 'song' in search and search['song']:
                song = search['song'][0]
                song_id = song['id']
                
                # Playlist hinzufügen
                conn.update_playlist(playlist_id=playlist_id, song_id=[song_id])
                
                # Stern setzen
                conn.star(song_id)
                
                # Bookmark bei 0 (Startpunkt)
                conn.create_bookmark(song_id, position=0, comment="Importiert aus M3U")
                
                print(f"→ {filename} gefunden und verarbeitet.")
            else:
                print(f"⚠ {filename} nicht gefunden.")

👉 Damit hättest du ziemlich genau deinen beschriebenen Workflow:
M3U → Tracks auflösen → Playlist + Sterne + Bookmarks automatisch setzen.


Soll ich dir ein vollständiges Script bauen, das direkt eine .m3u einliest, die passende Playlist erstellt und alle drei Aktionen (Playlist-Eintrag, Stern, Bookmark) in einem Durchlauf macht?