Aktuelle Zeit: 12.07.2020 07:48

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: M3U Playlist erstellen (auf dem MAC)
BeitragVerfasst: 21.06.2020 20:33 
Offline

Registriert: 21.06.2020 20:15
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:
;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



Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: M3U Playlist erstellen (auf dem MAC)
BeitragVerfasst: 21.06.2020 23:35 
Offline
Benutzeravatar

Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9
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:
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:
Global NewList Listings.s()
Global ist hier überflüssig, da Du keine Prozeduren verwendest.

ChristianH hat geschrieben:
Code:
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:
        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:
;write the listings to a file
If OpenFile(1, DirectoryName+"Playlist.M3U") ; If file can be created...
besser: CreateFile(...

ChristianH hat geschrieben:
Code:
    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

_________________
Schrödingers Smiley :):


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: M3U Playlist erstellen (auf dem MAC)
BeitragVerfasst: 22.06.2020 08:03 
Offline

Registriert: 21.06.2020 20:15
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:
;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

 


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: M3U Playlist erstellen (auf dem MAC)
BeitragVerfasst: 22.06.2020 08:20 
Offline
Benutzeravatar

Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9
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:
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: https://www.purebasic.fr/german/viewtopic.php?p=80742#p80742

Grüße ... Peter

_________________
Schrödingers Smiley :):


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: M3U Playlist erstellen (auf dem MAC)
BeitragVerfasst: 22.06.2020 21:56 
Online

Registriert: 13.05.2010 09:26
Wohnort: Berlin
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:
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:
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().

_________________
Dieser Satz ist falsch.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: Nino und 6 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye