M3U Playlist erstellen (auf dem MAC)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
ChristianH
Beiträge: 8
Registriert: 21.06.2020 20:15

M3U Playlist erstellen (auf dem MAC)

Beitrag von ChristianH »

Hi zusammen,

mit dem folgenden Code kann man unter MacOS Catalina eine einfache M3U Play Liste erstellen. Der überwiegende Teil ist aus einem Beispiel und ich habe es nur angepasst
, damit es für den zugedachten Zweck passt.

Nach dem Aufruf kann man ein Verzeichnis mit Media Dateien (PathRequester) wählen in dem dann eine einfache M3U Playlist Datei erstellt wird. Danach beendet sich das Programm von selbst.

Ich "füttere" damit meinen Elmedia Player oder den VLC auf meinem Mac, aber vermutlich klappen auch alle anderen Programme. Es ist nichts besonders komplexes aber wer es brauchen kann und noch nicht so fortgeschritten ist hat vielleicht Verwendung.

Gruß Christian

Code: Alles auswählen

;English forum: http://www.purebasic.fr/english/viewtopic.php?t=8998&highlight=

; As template and adapted for M3U playlists 06.2020 ChristianH


IncludeDirectoriesInListings.l = #False 
DirectoryName.s 
FileType.l 

;Create a new LinkedList that will hold the results of our directory 'scan' 
Global NewList Listings.s() 

;Choose a directory 
DirectoryName = PathRequester("Please choose a folder to create playlist from...", "") 

;Examine that directory 
If ExamineDirectory(1, DirectoryName, "") ; If directory can be read... 
    Repeat 
        FileType = NextDirectoryEntry(1) 
        If FileType = 1 ; 1 = File 
            ;Add the file name to the listings 
            AddElement(Listings()) 
            Listings() = DirectoryEntryName(1) 
        EndIf 
       
    Until FileType = 0 
EndIf 

;write the listings to a file 
If OpenFile(1, DirectoryName+"Playlist.M3U") ; If file can be created... 
  ForEach Listings() 
    If Len(Listings()) >3
      If (Right(Listings(),4) ="flac") Or (Right(Listings(),3) ="mp3") Or (Right(Listings(),3) ="wav")
      WriteStringN(1,DirectoryName + Listings()) 
    EndIf
  EndIf
  
    
    Next 
    CloseFile(1) 
EndIf 

Benutzeravatar
Kiffi
Beiträge: 10620
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: M3U Playlist erstellen (auf dem MAC)

Beitrag von Kiffi »

Hallo ChristianH,

ist ja lobenswert, dass Du uns mit Deinem ersten Posting direkt einen Code zur Verfügung stellen willst, aber der ist (auch wenn er überwiegend nicht von Dir, sondern von einem 16 Jahre alten Code von Kale im englischen Forum stammt) alles andere als "effizient, elegant und beispielhaft oder einfach nur cool" (Forumsbeschreibung).

Ich möchte hiermit mal eine konstruktive Kritik äußern:
ChristianH hat geschrieben:mit dem folgenden Code kann man unter MacOS Catalina eine einfache M3U Play Liste erstellen.
M3U kann nahezu jeder ernstzunehmende Player abspielen; ist also nicht OS spezifisch.

* EnableExplizit fehlt
ChristianH hat geschrieben:

Code: Alles auswählen

IncludeDirectoriesInListings.l = #False 
DirectoryName.s 
FileType.l
Das sind keine gültige Variablen-Deklarationen (zumal IncludeDirectoriesInListings nicht in Deinem Code verwendet wird).
ChristianH hat geschrieben:

Code: Alles auswählen

Global NewList Listings.s()
Global ist hier überflüssig, da Du keine Prozeduren verwendest.
ChristianH hat geschrieben:

Code: Alles auswählen

DirectoryName = PathRequester("Please choose a folder to create playlist from...", "")
;Examine that directory 
If ExamineDirectory(1, DirectoryName, "") ; If directory can be read... 
hier fehlt die Prüfung, ob der PathRequester mit 'Abbrechen' quittiert wurde.
ChristianH hat geschrieben:

Code: Alles auswählen

        FileType = NextDirectoryEntry(1) 
        If FileType = 1 ; 1 = File 
hierfür gibt es eine Konstante: #PB_DirectoryEntry_File. Ist aussagekräftiger als 1. Dann muss man das auch nicht extra im Kommentar vermerken.
ChristianH hat geschrieben:

Code: Alles auswählen

;write the listings to a file 
If OpenFile(1, DirectoryName+"Playlist.M3U") ; If file can be created...
besser: CreateFile(...
ChristianH hat geschrieben:

Code: Alles auswählen

    If Len(Listings()) >3
      If (Right(Listings(),4) ="flac") Or (Right(Listings(),3) ="mp3") Or (Right(Listings(),3) ="wav")
hierfür gibt es GetExtensionPart()

Man könnte auch darüber diskutieren, ob es nicht sinnvoller wäre, die Extensions-Prüfung direkt in den ExamineDirectory-Block zu verlegen.

Den Code noch vernünftig einzurücken wäre auch nicht schlecht.

Grüße ... Peter
Hygge
ChristianH
Beiträge: 8
Registriert: 21.06.2020 20:15

Re: M3U Playlist erstellen (auf dem MAC)

Beitrag von ChristianH »

Hallo Kiffi,

erst einmal besten Dank das Du Dir die Zeit für diesen ausführlichen Kommentar genommen hast. :allright: Der Grund warum ich diesen Code hier gepostet habe war allerdings nicht die Suche nach Lob. Vielmehr brauchte ich genau so ein Tool wie ich es hier gepostet habe und dachte mir warum nicht als PB Programm. Zuerst wollte ich es mit PowerShell
schreiben, aber der Aufruf eines kompilierten Programms ist noch einmal einfacher.

Es gibt hier im Board sehr viele Beispiele, doch sind das überwiegend Windows Beispiele und weniger für den MAC. Genau so ist es mit PowerShell. Dort werden sehr oft .NET Aufrufe gemacht und der SRC ist natürlich nicht mehr portable. Ich vermute (bisher nicht getestet) das der SRC zum M3U Listen erstellen auch auf Windows läuft.
Mir ist bewusst das dies nichts künstlerisch wertvolles ist. Aber es funktioniert für mich und vermutlich auch für andere und das ist schon einmal eine gute Sache.

Da Du dir die Arbeit gemacht hast alles anzusehen und zu kommentieren habe ich die Gelegenheit aufgegriffen und Deine Anregungen umgesetzt. Auf diesem Wege lernt man auch mal was. :-) Falls Du weitere Verbesserungen hast (z.B. rekursives einlesen von Verzeichnissen) sind diese natürlich willkommen.

Gruß Christian

Code: Alles auswählen

;Basis for this source code:   
;English forum: http://www.purebasic.fr/english/viewtopic.php?t=8998&highlight=
; As template and adapted for M3U playlists 06.2020 ChristianH (optimized with the support of Kiffi)
; 

EnableExplicit

Define DirectoryName.s 
Define FileType.l 

NewList Listings.s()  ;Create a new LinkedList that will hold the results of the directory 'scan' 
DirectoryName = PathRequester("Please choose a folder to create playlist from...", "")  ;Choose a directory 

If DirectoryName
  If ExamineDirectory(1, DirectoryName, "") ; If directory can be read than examine that directory 
    Repeat 
        FileType = NextDirectoryEntry(1) 
        If FileType = #PB_DirectoryEntry_File
        AddElement(Listings())  ;Add the file name to the listings 
        Listings() = DirectoryEntryName(1) 
        EndIf 
    Until FileType = 0 
  EndIf 

  ;write the playlist.m3u to a file 
  If CreateFile(1, DirectoryName+"Playlist.M3U") ; If file can be created... 
    ForEach Listings() 
       If (GetExtensionPart(Listings()) = "flac") Or (GetExtensionPart(Listings()) = "mp3") Or (GetExtensionPart(Listings()) = "wav") 
          WriteStringN(1,DirectoryName + Listings()) 
       EndIf
    Next 
     CloseFile(1) 
  EndIf 
Else
    MessageRequester("Information", "The program was cancelled.", 0) 
EndIf

  
Benutzeravatar
Kiffi
Beiträge: 10620
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: M3U Playlist erstellen (auf dem MAC)

Beitrag von Kiffi »

ChristianH hat geschrieben:habe ich die Gelegenheit aufgegriffen und Deine Anregungen umgesetzt.
:allright:

einen Vorschlag noch: Teste die Extensionen lieber unabhängig von der Groß-/Kleinschreibung:

Code: Alles auswählen

Select LCase(GetExtensionPart(Listings()))
  Case "flac", "mp3", "wav"
    WriteStringN(1,DirectoryName + Listings())
Ein Beispiel für das rekursive Durchsuchen von Verzeichnissen findest Du z.B. hier: viewtopic.php?p=80742#p80742

Grüße ... Peter
Hygge
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: M3U Playlist erstellen (auf dem MAC)

Beitrag von Nino »

Kiffi hat geschrieben:Man könnte auch darüber diskutieren, ob es nicht sinnvoller wäre, die Extensions-Prüfung direkt in den ExamineDirectory-Block zu verlegen.
Mein Beitrag zu dieser Diskussion wäre ziemlich kurz: "Ja, wäre es." ;-)
Ich halte es nicht für besonders sinnvoll, erst alle Dateinamen eines Verzeichnisses in einer Liste zu speichern (abgesehen davon, dass das nicht wie geplant passiert, s.u.), und erst später dann zu prüfen, welche davon überhaupt gebraucht werden.


Der folgende Code aus dem 2. Listing ist fehlerhaft:

Code: Alles auswählen

Repeat
   FileType = NextDirectoryEntry(1)
   If FileType = #PB_DirectoryEntry_File
      AddElement(Listings())  ;Add the file name to the listings
      Listings() = DirectoryEntryName(1)
   EndIf
Until FileType = 0 
1) Man arbeitet nicht mit dem Rückgabewert einer Funktion und prüft erst nachher, ob der Wert überhaupt gültig ist. Die Prüfung ob 'FileType' = 0 ist, gehört also an den Anfang der Schleife.
2) Der Rückgabewert von NextDirectoryEntry() sagt nichts über den Typ des Verzeichniseintrags aus. Daher ist obige Zeile If FileType = #PB_DirectoryEntry_File sinnlos.

Der obige Code-Schnipsel sollte also so aussehen:

Code: Alles auswählen

While NextDirectoryEntry(1)
   If DirectoryEntryType(1) = #PB_DirectoryEntry_File
      AddElement(Listings())
      Listings() = DirectoryEntryName(1)
   EndIf
Wend


Sorry, aber insgesamt sehe ich in diesem Beitrag keinen Tipp oder Trick. Hier wird eher durch eine Reihe von Fehlern Verwirrung gestiftet. Wer wissen will, wie die Einträge eines Verzeichnisses richtig gelesen werden, schaut am besten einfach in die Hilfe zu ExamineDirectory().
Antworten