Mp3 öffnen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Ich versuche über die Shell mehrere .mp3 zu öffnen.
Nachdem der StandardPlayer nur 1x offen sein kann - was ja auch logisch ist - wird aber nur das erste Lied abgespielt - ich hätte da aber gern eine Playlist

Code: Alles auswählen

import os

verzeichnis = "E:Musik\\Eluveitie\\Slania"

lieder = [ ]
endung = ".mp3"

for name in os.listdir(verzeichnis):
    if endung in name:
        lieder.append(name)


for lied in lieder:
    os.startfile(verzeichnis+"\\"+str(lied),"open")

so sieht das momentan aus -
was mich auch wundert ist warum er das erste Lied nimmt - und nicht das Letzte? Ich nehme mal an das liegt daran das dass "open" nicht funktioniert weil der Player schon geöffnet ist?
BlackJack

@Tengel: Dann erstelle eine Playliste und starte diese Datei. Ansonsten kann man so allgemein da nichts dran ändern, denn ob und wie man Lieder bei einer laufenden Player-Software hinzufügen kann, hängt von der konkreten Player-Software ab.

Der Test auf die Endung testet übrigens nicht ob der Dateiname tatsächlich damit *endet* sondern ob die Endung irgendwo im Namen enthalten ist. Das kann auch auf Namen zutreffen die keine MP3-Dateien sind.
Malachite
User
Beiträge: 34
Registriert: Sonntag 24. Juni 2012, 13:43
Wohnort: Berlin

Vielleicht bringt es was, wenn du den Player alle Lieder auf einmal öffnen lässt, anstatt für jedes Lied eine neue Instanz zu starten. Hängt natürlich vom Player ab.

Code: Alles auswählen

os.startfile(" ".join(r"{}\{}".format(verzeichnis, lied) for lied in lieder), 'open')
(ungetestet, da ich kein Windows habe)

Ach ja, statt

Code: Alles auswählen

if endung in name:
solltst du lieber

Code: Alles auswählen

if name.endswith(endung):
benutzen, da endung in name auch für name="how to open .mp3s with python.doc" zutrifft.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Der Test auf die Endung testet übrigens nicht ob der Dateiname tatsächlich damit *endet*
Jupp das ist mir zur Abwechslung sogar mal klar :) - mir wurde nur bei print(lieder) .jpg etc. angezeigt - cdcover u sowas was ich im ordner aber nicht sehen konnte



@Malachite
Danke für die Idee - ich werds mal testen.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Da es ja beim programmieren immer mehrere Wege gibt und ich auf folgenden gekommen bin

Code: Alles auswählen

checkMP3 = ".mp3"

for datei in os.path.listdir(verzeichnis):
    if datei[-4:] == checkMP3:
        print(datei)

Natürlich ist das unnötig da es ja die endswith() gibt - aber ich frag mich nur ob das so funktionieren würde oder ob das zu Fehlern führen könnte?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Dazu noch ein paar kleine Anmerkungen:

"checkMP3" ist ein schlecht gewählter Name. Es hört sich eher nach einer Funktion an, als nach einer Dateiendung. Hier solltest du dir einen besseren Namen überlegen. Außerdem werden Konstanten in Python, per Konvention, vollständig in Großbuchstaben geschrieben.

"datei" ist auch wieder in unpassender Name. Da steckt niemals eine Datei drin, sondern immer ein Dateiname. "verzeichnis" hingegen sagt gar nichts aus. Wenn du bei allen Namen dieses Muster anwenden würdest, dann könntest du Zahlen auch "zahl" nennen oder Listen "list". Ein Name soll aussagen was für Information an den Namen gebunden ist und nicht den Typ oder irgend etwas allgemeines.

Der Test auf die Dateiendung ist gleich auf mehreren Wegen ungünstig. Die "-4" ist eine "magische Zahl" die einfach so, ohne ersichtlichen Zusammenhang, im Code auftaucht. Dabei ergibt sich die 4 aus der Länge von "checkMP3". Dann sollte man das aber auch so schreiben. Dann bist du auf der sicheren Seite, falls sich die Länge der Dateiendung doch mal ändern sollte.

Etwas besser wird es, wenn du du das Ende des Strings mit der Dafür vorgesehenen Methode verwendest. So hat jeder String eine endswith-Methode, welche genau diesen Test durchführt.

Noch besser wird es, wenn du das os.path-Modul verwendest. Dort gibt es spezielle Funktionen, um auf Dateinamen und Pfaden zu arbeiten. So kann man dort auch die Dateiendung abtrennen und die Prüfung insgesamt robuster gestalten.

Zu guter letzt solltest du die ganze Funktionalität noch in Funktionen aufteilen. Es bietet sich hier eine Funktion zum Test auf eine bestimmte Dateiendung an und die Funktion, welche die eigentliche Aufgabe erledigt.
Das Leben ist wie ein Tennisball.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Was auch erwähnt werden sollte ist dass der Vergleich Case-Sensitive ist, aber für Windows ".mp3", ".MP3", ".mP3" und ".Mp3" alles das gleiche sind, was Dateiendungen angeht.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten