Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0584: m3u-Playlists auslesen

 von 

Beschreibung 

Wer eine Liste von MP3-Dateien als sogenannte "Playlist" speichert, wie Winamp das z.B. macht, kann diese Dateien auch ohne Probleme in VB einlesen. Dieser Tipp zeigt, wie's geht!

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

keine

Download:

Download des Beispielprojektes [3,33 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Projekt1.vbp -------------
' Die Komponente 'Microsoft Common Dialog Control 6.0 (SP3) (COMDLG32.OCX)' wird benötigt.
' Die Komponente 'Microsoft Windows Common Controls 6.0 (SP6) (MsComCtl.ocx)' wird benötigt.

'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Listenanzeigesteuerungselement "ListView1"
' Steuerelement: Standarddialog-Steuerelement "CommonDialog1"
' Steuerelement: Schaltfläche "Command1"
'Hauptfunktion zum Auslesen udn einfügen in die ListView
Private Function ReadM3U(ByVal sFilename As String, LV_Playlist _
    As ListView) As Boolean
    
  Dim Textzeile As String
  Dim Zeile As Long
  Dim Wrong As Boolean
  Dim LastZeile As String
  Dim strLVText As String
  Dim stred As Long
  Dim Laenge As String
  Dim Laenge_Text As String
  Dim FileTitle As String
  Dim FileExt As String
  Dim Laenge_tmp
  Dim F As Integer
    
    On Error Goto ErrHandler
    With LV_Playlist
      ' ListView-Spalten erstellen
      .Sorted = False
      .View = lvwReport
      .ColumnHeaders.Clear
      .ColumnHeaders.Add , , "Titel / Dateiname", .Width - 1600
      .ColumnHeaders.Add , , "Länge", 1000, 1
      
      ' ListView-Einträge löschen
      .ListItems.Clear
      
      ' Playlist auslesen
      Zeile = 0
      F = FreeFile
      Open sFilename For Input As #F
      
      ' Schleife bis Dateiende
      Do While Not EOF(F)
        Zeile = Zeile + 1
        
        ' Zeile in Variable einlesen.
        Line Input #F, Textzeile
        If Zeile = 1 And Textzeile <> "#EXTM3U" Then
          Wrong = True
        End If
        
        If Left$(LastZeile, 8) = "#EXTINF:" Then
          ' zusätzliche Infos der zuletzt eingelesenen
          ' Zeile auswerten
          strLVText = Right$(LastZeile, Len(LastZeile) - 8)
          
          ' Länge (Spieldauer) ermitteln
          stred = InStr(strLVText, ",")
          If stred > 0 Then
            Laenge = Left$(strLVText, stred - 1)
            Laenge_Text = Format(Laenge / 60, "00.00")
            Laenge_Text = ReplaceM(Laenge_Text, ",", ":", ".", _
                ":")
            strLVText = Right$(strLVText, Len(strLVText) - stred)
            Laenge_tmp = ""
             stred = 0
            
            stred = InStr(Laenge_Text, ":")
            If stred > 0 Then
              Laenge_tmp = Right$(Laenge_Text, Len(Laenge_Text) _
                  - stred)
              Laenge_tmp = Format((Laenge_tmp / 99) * 60, "0")
              Laenge_tmp = Format(Laenge_tmp, "00")
              Laenge_Text = Left$(Laenge_Text, stred - 1) & ":" _
                  & Laenge_tmp
            End If
          End If
          
          ' Titel
          FileTitle = GetFileFromPath(Textzeile)
          FileExt = GetFileExt(FileTitle)
          If FileExt <> "" Then
            FileExt = "." & FileExt
          End If
          FileTitle = Left$(FileTitle, Len(FileTitle) - _
              Len(FileExt))
          
          ' Aktuellen Titel im ListView anzeigen
          If FileTitle <> strLVText Then
            .ListItems.Add , , strLVText & " - [" & Textzeile & _
                "]"
          Else
            .ListItems.Add , , strLVText
          End If
          .ListItems(.ListItems.Count).SubItems(1) = Laenge_Text
        End If
        LastZeile = Textzeile
      Loop
      
      ' Datei schließen.
      Close #F
    End With
    
ErrHandler:
    If Err > 0 Then
      Wrong = True
    End If
    ReadM3U = (Wrong = False)
End Function

' String-Ersetzen
Function ReplaceM(ByVal FromStr As String, ParamArray _
    varReplacements() As Variant) As String
    
  Dim intMacro As Integer
  Dim strResString As String
  Dim nFrom As Integer
  Dim nTo As Integer
  Dim strMacro As String
  Dim strValue As String
    
    On Error Resume Next
    strResString = FromStr
    
    ' Für jedes übergebene Makro/Wert-Paar...
    nFrom = LBound(varReplacements)
    nTo = UBound(varReplacements)
    For intMacro = nFrom To nTo Step 2
      strMacro = varReplacements(intMacro)
      strValue = varReplacements(intMacro + 1)
      On Error Goto 0
      
      ' Ersetzen aller vorkommenden strMacro
      ' durch strValue
  Dim intPos As Integer
      Do
        intPos = InStr(strResString, strMacro)
        If intPos > 0 Then
          strResString = Left$(strResString, intPos - 1) & _
              strValue & Right$(strResString, Len(strResString) _
              - Len(strMacro) - intPos + 1)
        End If
      Loop Until intPos = 0
    Next intMacro
    
    ReplaceM = strResString
    On Error Goto 0
    Exit Function
End Function
' Ermittelt die Dateierweiterung eines Dateinamens
Function GetFileExt(Pfadname As String)
  Dim Dateinamen As String
  Dim Länge As Integer
  Dim n As Integer
  Dim Position As Integer
    
    Länge = Len(Pfadname)
    Do
      n = InStr(n + 1, Pfadname, ".")
      If n = 0 Then
        Exit Do
      End If
      Position = n
    Loop
    
    If Position <> 0 Then
      GetFileExt = StrConv(Right$(Pfadname, Länge - Position), _
          vbUpperCase)
    End If
End Function
' Filtert Playlist namen
Function GetFileFromPath(Pfadname As String)
  Dim Dateinamen As String
  Dim Länge As Integer
  Dim n As Integer
  Dim Position As Integer
    
    Länge = Len(Pfadname)
    Do
      n = InStr(n + 1, Pfadname, "\")
      If n = 0 Then
        Exit Do
      End If
      Position = n
    Loop
    
    GetFileFromPath = Right$(Pfadname, Länge - Position)
End Function

Private Sub Command1_Click()
    On Error Resume Next
    ' wenn ma der User nix auswählt ;)
    'Commondialog Initialisieren
    With CommonDialog1
      .DialogTitle = "Playlist Öffnen"
      .Filter = "Playlists|*.m3u"
      .InitDir = "C:\"
      .ShowOpen
    End With
    
    'Playlist Laden
    ReadM3U CommonDialog1.FileName, ListView1
    
End Sub

'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Projekt1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 3 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Al Capone am 04.10.2004 um 11:01


kan kann auch einfach
CommonDialog1.CancelError=False
setzen und sich on error routine sparen. zumal hier keine differenzierung der fehler stattfindet.

Kommentar von Marco Stielow am 07.04.2003 um 09:00

@Axel:

Mit folgender Änderung dürfte dieses nicht mehr passieren:

Private Sub Command1_Click()
On Error Goto fehler
' wenn ma der User nix auswählt ;)
'Commondialog Initialisieren
With CommonDialog1
.DialogTitle = "Playlist Öffnen"
.Filter = "Playlists|*.m3u"
.InitDir = "C:\"
.ShowOpen
End With

'Playlist Laden
ReadM3U CommonDialog1.FileName, ListView1

Exit Sub
fehler:
'es wurde auf "Abbrechen" geklickt
End Sub

Kommentar von Axel Prignitz am 06.04.2003 um 00:11

Wenn man "Abbrechen" bei "Datei laden" klickt, erhält man eine Fehlermeldung.