13. März 2025
Ein einfacher MP3-Folder-Player mit Python – manchmal braucht man nur ein bisschen Musik und ein selbstgebautes Tool, um den Tag zu genießen. Genau dafür habe ich einen kleinen MP3-Player geschrieben, der alle MP3-Dateien in einem Ordner abspielt, mit einer schlichten Oberfläche und den wichtigsten Funktionen. Er ist perfekt für alle, die ihre Musiksammlung ohne Schnickschnack durchhören wollen.
Wie alles begann: Die Idee kam mir, als ich meine Smooth-Jazz-Sammlung auf dem Schreibtisch organisieren wollte. Ich hatte MP3-Dateien wie „Bermuda Nights“ und „You Are My Love“ in einem Ordner und suchte nach einem einfachen Weg, sie abzuspielen – am liebsten mit einer eigenen Lösung statt einem überladenen Standard-Player. Also habe ich mich hingesetzt und mit Python losgelegt, unterstützt von Grok 3, dem KI-Helfer von xAI.
Download des Players + Anleitung: MP3_Player_Linux.zip

Der erste Versuch mit mpg123: Am Anfang habe ich versucht, den Player mit `mpg123` zu bauen, einem Kommandozeilen-Audioplayer für Linux. Das Skript konnte MP3s abspielen, Play/Pause und Lautstärke regeln – aber es hatte Schwächen. Die Pause-Funktion war hakelig, weil `mpg123` keine echte Unterbrechung unterstützt; stattdessen musste ich den Prozess stoppen und neu starten, was die Musik immer von vorne beginnen ließ. Der Lautstärkeregler war auch problematisch – jede Änderung startete den Song neu, und eine dynamische Anpassung während der Wiedergabe war nicht drin. Grok 3 hat mir geholfen, das Skript zu schreiben, aber wir sind schnell an die Grenzen von `mpg123` gestoßen. Es war klar: Für einen Folder-Player mit fließendem Übergang zum nächsten Track brauchte ich etwas anderes.
Der Wechsel zu pygame: Nach einigem Hin und Her hat Grok 3 vorgeschlagen, auf `pygame` umzusteigen – eine Python-Bibliothek, die eigentlich für Spiele gedacht ist, aber auch einen starken Audio-Player (`mixer`) mitbringt. Das war der Durchbruch: Mit `pygame` konnte ich eine echte Pause-Funktion mit `mixer.music.pause()` und `unpause()` umsetzen, die Lautstärke dynamisch anpassen und sogar prüfen, wann ein Song zu Ende ist, um automatisch den nächsten zu starten. Grok 3 hat mir Schritt für Schritt geholfen, das Skript umzubauen – von der Installation (`pip3 install pygame`) bis zur Implementierung der `check_playing`-Funktion, die den Folder-Player erst richtig komplett gemacht hat.
Das Python-Script: Wer Lust hat, kann es weiter entwickeln oder so belassen. Unter https://grok.com/share/bGVnYWN5_96524035-d825-4803-aee0-fbad0f6ff2da ist der Werdegang mit all seinen Irrwgen schonunglos dokumentiert.
import tkinter as tk from tkinter import ttk import os from pygame import mixer import mutagen from mutagen.easyid3 import EasyID3 class MP3Player: def __init__(self, root): self.root = root self.root.title("MP3 Player") self.root.geometry("400x500") mixer.init() self.bg_color = "#2B3A55" self.fg_color = "#E8F0F2" self.btn_color = "#3E5C76" self.root.configure(bg=self.bg_color) self.playing = False self.current_file = None self.current_dir = os.path.dirname(os.path.abspath(__file__)) print(f"Skript-Verzeichnis: {self.current_dir}") self.playlist = self.load_mp3_files() self.current_index = 0 self.create_gui() self.root.protocol("WM_DELETE_WINDOW", self.on_closing) def load_mp3_files(self): playlist = [] for file in os.listdir(self.current_dir): if file.lower().endswith('.mp3'): mp3_path = os.path.join(self.current_dir, file) playlist.append(mp3_path) print(f"MP3 hinzugefügt: {mp3_path}") if not playlist: print("Keine MP3-Dateien gefunden.") return ["Keine .mp3 Dateien gefunden"] return playlist def create_gui(self): style = ttk.Style() style.theme_use('default') style.configure("Horizontal.TScale", background=self.bg_color, troughcolor=self.btn_color) self.tag_frame = tk.Frame(self.root, bg=self.bg_color) self.tag_frame.pack(pady=20, fill='x', padx=10) self.title_label = tk.Label(self.tag_frame, text="Titel: -", bg=self.bg_color, fg=self.fg_color, font=("Arial", 12)) self.title_label.pack() self.artist_label = tk.Label(self.tag_frame, text="Artist: -", bg=self.bg_color, fg=self.fg_color, font=("Arial", 10)) self.artist_label.pack() self.album_label = tk.Label(self.tag_frame, text="Album: -", bg=self.bg_color, fg=self.fg_color, font=("Arial", 10)) self.album_label.pack() control_frame = tk.Frame(self.root, bg=self.bg_color) control_frame.pack(pady=20) self.prev_btn = tk.Button(control_frame, text="◄◄ Prev", command=self.prev_track, bg=self.btn_color, fg=self.fg_color, relief='flat') self.prev_btn.pack(side='left', padx=5) self.play_btn = tk.Button(control_frame, text="▶ Play", command=self.play_pause, bg=self.btn_color, fg=self.fg_color, relief='flat') self.play_btn.pack(side='left', padx=5) self.stop_btn = tk.Button(control_frame, text="■ Stop", command=self.stop, bg=self.btn_color, fg=self.fg_color, relief='flat') self.stop_btn.pack(side='left', padx=5) self.next_btn = tk.Button(control_frame, text="▶▶ Next", command=self.next_track, bg=self.btn_color, fg=self.fg_color, relief='flat') self.next_btn.pack(side='left', padx=5) volume_frame = tk.Frame(self.root, bg=self.bg_color) volume_frame.pack(pady=20, fill='x', padx=20) tk.Label(volume_frame, text="Lautstärke:", bg=self.bg_color, fg=self.fg_color).pack(side='left', padx=5) self.volume_slider = ttk.Scale(volume_frame, from_=0, to=100, orient='horizontal', command=self.set_volume, style="Horizontal.TScale") self.volume_slider.set(50) self.volume_slider.pack(side='left', fill='x', expand=True) self.listbox = tk.Listbox(self.root, bg=self.btn_color, fg=self.fg_color, selectbackground="#1D2A44", font=("Arial", 10)) self.listbox.pack(pady=20, fill='both', expand=True, padx=10) for song in self.playlist: self.listbox.insert('end', os.path.basename(song)) self.listbox.bind('<<ListboxSelect>>', self.on_select) def play_pause(self): if not self.playlist or "Keine .mp3 Dateien gefunden" in self.playlist: return if not self.playing: if not self.current_file: self.current_file = self.playlist[self.current_index] mixer.music.load(self.current_file) mixer.music.play() else: mixer.music.unpause() self.playing = True self.play_btn.config(text="❚❚ Pause") self.update_tags() self.check_playing() # Starte die Überprüfung else: mixer.music.pause() self.playing = False self.play_btn.config(text="▶ Play") def stop(self): mixer.music.stop() self.playing = False self.play_btn.config(text="▶ Play") def next_track(self): if not self.playlist or "Keine .mp3 Dateien gefunden" in self.playlist: return self.stop() self.current_index = (self.current_index + 1) % len(self.playlist) self.current_file = self.playlist[self.current_index] mixer.music.load(self.current_file) mixer.music.play() self.playing = True self.play_btn.config(text="❚❚ Pause") self.listbox.select_clear(0, 'end') self.listbox.select_set(self.current_index) self.update_tags() self.check_playing() # Starte die Überprüfung def prev_track(self): if not self.playlist or "Keine .mp3 Dateien gefunden" in self.playlist: return self.stop() self.current_index = (self.current_index - 1) % len(self.playlist) self.current_file = self.playlist[self.current_index] mixer.music.load(self.current_file) mixer.music.play() self.playing = True self.play_btn.config(text="❚❚ Pause") self.listbox.select_clear(0, 'end') self.listbox.select_set(self.current_index) self.update_tags() self.check_playing() # Starte die Überprüfung def set_volume(self, val): volume = float(val) / 100 # Pygame erwartet Werte von 0.0 bis 1.0 mixer.music.set_volume(volume) def update_tags(self): try: audio = EasyID3(self.current_file) self.title_label.config(text=f"Titel: {audio.get('title', ['-'])[0]}") self.artist_label.config(text=f"Artist: {audio.get('artist', ['-'])[0]}") self.album_label.config(text=f"Album: {audio.get('album', ['-'])[0]}") except: self.title_label.config(text="Titel: -") self.artist_label.config(text="Artist: -") self.album_label.config(text="Album: -") def on_select(self, event): if not self.listbox.curselection() or "Keine .mp3 Dateien gefunden" in self.playlist: return self.current_index = self.listbox.curselection()[0] self.current_file = self.playlist[self.current_index] self.stop() mixer.music.load(self.current_file) mixer.music.play() self.playing = True self.play_btn.config(text="❚❚ Pause") self.update_tags() self.check_playing() # Starte die Überprüfung def check_playing(self): if self.playing and not mixer.music.get_busy(): # Wenn Musik abgespielt ist self.next_track() if self.playing: self.root.after(1000, self.check_playing) # Prüfe alle 1 Sekunde def on_closing(self): mixer.music.stop() self.root.destroy() if __name__ == "__main__": root = tk.Tk() app = MP3Player(root) root.mainloop()
Funktion: Das fertige Skript ist simpel, aber effektiv. Es lädt alle MP3-Dateien aus dem Ordner, in dem es liegt, zeigt sie in einer Liste an und bietet Buttons für „Play/Pause“, „Stop“, „Next“ und „Prev“. Die Lautstärke lässt sich über einen Slider regeln, und dank `pygame` passiert das ohne Unterbrechung. Die Tags (Titel, Artist, Album) werden mit `mutagen` ausgelesen und oben angezeigt. Das Herzstück ist die `check_playing`-Methode: Sie prüft alle Sekunde, ob die Musik noch läuft (`mixer.music.get_busy()`), und ruft `next_track` auf, wenn ein Song fertig ist. So spielt der Player die ganze Playlist automatisch durch – oder fängt wieder von vorne an, wenn sie durch ist.
Bedienung: Nach dem Start öffnet sich ein Fenster mit der Playlist und den Steuerknöpfen. Ein Klick auf „Play“ startet den ersten Song oder einen aus der Liste gewählten Track. „Pause“ hält die Musik an, „Stop“ beendet sie komplett, und „Next“ oder „Prev“ springen vorwärts oder zurück. Der Lautstärkeregler reagiert sofort, und wenn ein Song endet, geht’s automatisch weiter. Schlicht, aber genau das, was ich wollte – und vielleicht auch, was andere Musikliebhaber suchen.
Notwendige Abhängigkeiten: Damit der Player läuft, braucht man Python 3 (meistens schon da), `pygame` (`pip3 install pygame`), `mutagen` (`pip3 install mutagen`) und `tkinter` (normalerweise mit Python dabei). Unter Linux wie Ubuntu müssen ein paar SDL-Bibliotheken installiert werden, was mit diesem Befehl klappt:
sudo apt-get install python3-tk libsdl2-dev libsdl2-mixer-dev libsdl2-ttf-dev && pip3 install pygame mutagen
Fazit: Der MP3-Folder-Player ist ein kleines Projekt mit großem Nutzen – zumindest für mich. Er tut genau, was ich brauche: meine MP3s abspielen, ohne viel Tamtam. Der Weg dorthin war ein bisschen holprig, aber mit Grok 3 als Sparringspartner wurde aus der `mpg123`-Sackgasse ein funktionierendes `pygame`-Skript. Jetzt läuft meine Smooth-Jazz-Sammlung im Hintergrund, und irgendwie klingt sie mit einem selbstgebauten Player einfach besser – subjektiv natürlich. Wer das nachbauen will, findet den Code und die Bilder hier im Artikel. Vielleicht inspiriert es ja jemanden, seinen eigenen Player zu basteln!
Nachtrag in eigener Sache: Diese Zeilen schreibe ich selbst. Auch diesen Artikel habe ich probeweise vom Chatbot Grok 3 schreiben lassen, mit sämtlichen Formatierungen, aber ohne Bilder und den Einbau des Quellcode des Pythonscripts – vorerst. Zum Einsatz kam die kostenlose Version von Grok 3, die auch das Python-Skript des MP3-Player mit meiner Hilfe und mit meinen Anweisungen entwickelte.

Das wird mir immer unheimlicher. Seit zwei Jahren arbeite ich mit Chatbots wie ChatGPT und kenne die tückenhaften Anfänge mit dem fehlerhaften Coding und den Halluzinationen, die die Sprachmodelle von sich geben, wenn ihnen Trainingsdaten gefehlt haben. Aber dass die Entwicklung so schnell geht, hätte auch ich nicht vermutet. Der lockere Schreibstil von Grok 3 hat mich von den Socken gehauen.. Ich kann nicht nachvollziehen, wie er überhaupt meinen Musikgeschmack herausgefundenh hat. Ich fragte Grok 3 dann, ob er meine Stereoanlage kennt. Darauf fing er spontan eine Internetrecherche an, die allerdings erfolglos verlief. Früher oder später findet er auch das heraus und noch vieles mehr. Mal sehen, was in den nächsten Jahren noch kommt.
Wie hat Grok 3 meinen Musikgeschmack herausgefunden? Jetzt ist es mir eingefallen. Ich hatte an Grok3 eine Fehlermeldung hochgeladen, in der die vom Player erkannten mp3-Dateien gelistet waren. Die Bezeichnungen der mp3-Dateien reichten Grok3 meinen Musikgeschmack herauszufinden. Dabei hatte ich nie danach gefragt. Diese KI rückte ungefragt von sich aus damit heraus, obwohl dies mit dem eigentlichen Thema „MP3-Player-Entwicklung“ überhaupt nichts zu tun hat. Niemand kennt die versteckten Verhaltensmuster einer auf einem Sprachmodell beruhenden Künstlichen Intelligenz, die auf Grund von Trainingsdaten riesige Gleichungssysteme entwickelt hat, die im Detail nicht mehr nachzuvollziehen sind.