M3U Playlisten auslesen

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.
Benutzeravatar
Deluxe0321
Beiträge: 336
Registriert: 19.05.2006 00:31
Kontaktdaten:

M3U Playlisten auslesen

Beitrag von Deluxe0321 »

Da ich mich z.Z relativ viel mit Sound & Co beschäftige habe ich eben mal einen kleinen Code geschrieben der M3U's ausliest. Mir ist klar das der Code nicht hoch optimiert ist, aber wenn ihr Verbesserungsvorschläge habt; immer her damit! Das Schreiben füge ich später noch bei.

Zudem habe ich eine Frage. Warum liest mir der Code bei diesem Ausschnitt immer Mist aus:
#EXTINF:264,冨田勲 – Boléro
C:\Dokumente und Einstellungen\All Users\Dokumente\Eigene Musik\Titel irgendeinenummer.mp3
Nicht das ich probiert hätte die Datei in Unicode, oder UTF-8 auszulesen, aber dann bekomme ich an dieser Stelle "Fragezeichenbrei".


Code: Alles auswählen

Structure M3U
  M3U_Lenght.l
  M3U_Tags.s
  M3U_File.s
EndStructure

NewList M3UData.M3U()

Enumeration
#EXTM3U
#M3U
#M3U_FileList
EndEnumeration

Procedure.s CheckLineFeed(RString.s)
  If Not FindString(RString.s,#CRLF$,1)
    If FindString(RString.s,Chr(10),1)
      LF.s = Chr(10)
    ElseIf FindString(RString.s,#CR$,1)
      LF.s = #CR$
    EndIf
  Else
  LF.s = #CRLF$
  EndIf
  
  ProcedureReturn LF.s
EndProcedure

Procedure AddEXTM3UData(RString.s,M3UData.M3U(),FileID=0)
  If RString.s
    
    If Not FileID = 0
      Debug FileID
      RString2.s= ReadString(FileID)
      RString.s + #CRLF$ 
      RString.s + RString2.s
    EndIf
    
    AddElement(M3UData())
    M3UData()\M3U_Lenght.l = Val(Mid(RString.s,FindString(RString.s,"#EXTINF:",1)+8,(FindString(RString.s,",",1))-(FindString(RString.s,"#EXTINF:",1)+8)))
    M3UData()\M3U_Tags.s   = Mid(RString.s,FindString(RString.s,",",1)+1,(FindString(RString.s,#CRLF$,1))-(FindString(RString.s,",",1)+1))
    M3UData()\M3U_File.s   = Mid(RString.s,FindString(RString.s,#CRLF$,1)+2,Len(RString.s)-(FindString(RString.s,#CRLF$,1)+1))
    
  EndIf
EndProcedure

Procedure LoadM3U(FileName.s,M3UData.M3U())
 Protected FileSize.l,FileID.l,RString.s
  If FileName.s
    FileSize.l = FileSize(FileName.s)
    If Not FileSize < 0
     
      FileID.l=ReadFile(#PB_Any,FileName.s)
      If FileID.l
        RString.s=ReadString(FileID.l)
        If FindString(RString.s,"#EXTM3U",1)
          DataWay.l = #EXTM3U
          LF.s=CheckLineFeed(RString.s)
          If Not LF.s
            RString.s = ReadString(FileID.l)
            LF.s=CheckLineFeed(RString.s)
          EndIf
        ElseIf FindString(RString.s,"#M3U",1)
          DataWay.l = #M3U
          LF.s=CheckLineFeed(RString.s)
          If Not LF.s
            RString.s = ReadString(FileID.l)
            LF.s=CheckLineFeed(RString.s)
          EndIf     
        Else
          DataWay.l = #M3U_FileList
          LF.s=CheckLineFeed(RString.s)
        EndIf
      EndIf
      
      If Not FL.s = #CR$ And Not FL.s = Chr(10)
          If DataWay.l = #EXTM3U
            
            If Not FindString(RString.s,"#EXTINF",1)
              RString.s = ReadString(FileID)
            EndIf
            AddEXTM3UData(RString.s,M3UData(),FileID)
            
            While Eof(FileID) = 0  
              RString.s = ReadString(FileID) + #CRLF$ + ReadString(FileID)
              AddEXTM3UData(RString.s,M3UData())
            Wend
            
          ElseIf DataWay.l = #M3U
            
            If FindString(RString.s,"#M3U",1)
              RString.s = ReadString(FileID)
            EndIf
            
            
            AddElement(M3UData())
              M3UData()\M3U_File.s = RString.s
            
            While Eof(FileID) = 0
              RString.s = ReadString(FileID)
              AddElement(M3UData())
                M3UData()\M3U_File.s = RString.s
            Wend
          
          ElseIf DataWay.l = #M3U_FileList
            
              AddElement(M3UData())
                M3UData()\M3U_File.s = RString.s
            
            While Eof(FileID) = 0
              RString.s = ReadString(FileID)
              AddElement(M3UData())
                M3UData()\M3U_File.s = RString.s
            Wend
          
          EndIf
        
        Else
       
      EndIf    
    EndIf
  EndIf
EndProcedure

File.s="DATEIANGEBEN!"
LoadM3U(File.s,M3UData())
Debug CountList(M3UData())
ResetList(M3UData())
While NextElement(M3UData())
  Debug M3UData()\M3U_Lenght.l
  Debug M3UData()\M3U_Tags.s
  Debug M3UData()\M3U_File.s
  Debug ""
Wend
M3u zum Testen

Code: Alles auswählen

#EXTM3U
#EXTINF:221,Queen - Bohemian Rhapsody
Titel 1.mp3
#EXTINF:473,Dire Straits - Walk Of Life
Pop\Meine Auswahl\Titel 2.mp3
#EXTINF:264,Test – Boléro
C:\Dokumente und Einstellungen\All Users\Dokumente\Eigene Musik\Titel irgendeinenummer.mp3
#EXTINF:504,Bob Marley - Buffalo Soldier
http://www.seite.de/musik/titel4.mp3