vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Blitzschnelles Erstellen von grafischen Diagrammen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2020
 
zurück
Rubrik: Multimedia & Sound · Sonstiges   |   VB-Versionen: VB4, VB5, VB609.12.03
Jedwede .m3u-Datei auslesen

Auslesen von einfachen oder erweiterten .m3U-Dateien mit relativen oder absoluen Pfadangaben.

Autor:   Enrico PäselBewertung:     [ Jetzt bewerten ]Views:  21.163 
home.arcor.de/maesterSystem:  Win9x, WinNT, Win2k, WinXP, Vista, Win7, Win8, Win10 Beispielprojekt auf CD 

Die beiden hier bereits veröffentlichten Tips "Auslesen einer .m3u-Datei" und "Vollständiges Auslesen einer .m3u-Datei" bieten bereits gute Ansätze, was das Auslesen von .m3u-Dateien angeht, jedoch decken beide Artikel nicht das vollständige Spektrum möglicher .m3u-Varianten ab. Eine m3u-Datei kann in einfacher oder erweiterter Form (Extended M3U) vorliegen und Links zu Media-Dateien mit jeweils relativen oder absoluten Pfadangaben enthalten, so dass die genannten Beispiele nicht in jedem Falle funktionieren dürften.

Der folgende Code liest eine .m3u-Datei in ein ListView-Control ein, wobei pro Listeneintrag der Dateiname der Media-Datei, die Spieldauer und der angezeigte Titel in Winamp ermittelt werden, genauso wie die Information, ob die Datei wirklich auch existiert (valider oder invalider Eintrag).

Dabei spielt es keine Rolle, ob es sich bei der Playliste um eine schlichte Auflistung von Dateilinks handelt (einfache M3U) oder um eine erweiterte M3U oder letztlich gar um eine Kombination aus beidem. Weiterhin kommt die Funktion ReadM3U sowohl mit relativen als auch mit absoluten Pfadangaben einschlieszlich Netzwerkressourcen klar. Leerzeilen in der M3U werden ignoriert und Streams werden richtig erkannt.

Der Code verwendet das Scripting.FileSystemObjekt, daher ist ein Verweis auf die Microsoft Scripting Runtime(scrrun.dll) notwendig.

Option Explicit
 
' Deklarationen
Private Type M3UEntry
  File As String
  Title As String
  Length As Long
  Exists As Boolean
End Type
' Funktion ReadM3U
' Liest eine Playliste (m3u-Datei) in ein
' ListView-Control ein
Private Function ReadM3U(ByVal sFilename As String, _
  LV_Playlist As ListView) As Boolean
 
  Dim fso As New FileSystemObject
  Dim Playlist As File
  Dim litem As ListItem
  Dim ts As TextStream
  Dim Textzeile As String
  Dim Audio As M3UEntry
  Dim strLVText As String
  Dim stred As Long
 
  ReadM3U = True
  With LV_Playlist
    ' ListView-Spalten erstellen
    .Sorted = False
    .View = lvwReport
    .ColumnHeaders.Clear
    .ColumnHeaders.Add , , "Existiert?", 900
    .ColumnHeaders.Add , , "Dateiname", .Width - 4900
    .ColumnHeaders.Add , , "Länge", 1000
    .ColumnHeaders.Add , , "Titel", 3000
 
    ' ListView-Einträge löschen
    .ListItems.Clear
  End With
 
  If fso.FileExists(sFilename) Then
    Set Playlist = fso.GetFile(sFilename)
  Else
    MsgBox "Die einzulesende Playliste existiert nicht " _
        & "-> die Operation wird beendet."
    ReadM3U = False
    Exit Function
  End If
 
  ' Playliste auslesen
  Set ts = fso.OpenTextFile(sFilename, ForReading)
 
  Do While Not ts.AtEndOfStream
    Textzeile = ts.ReadLine
    Select Case Textzeile
      Case Is = "#EXTM3U", ""
        ' ungültige Zeile(n) überspringen
 
      Case Else
        If Left$(Textzeile, 8) = "#EXTINF:" Then
          ' Zusatzinformationen:
          strLVText = Right$(Textzeile, Len(Textzeile) - 8)
          stred = InStr(strLVText, ",")
          If stred > 0 Then
              Audio.Length = CLng(Left$(strLVText, stred - 1))
              Audio.Title = Right$(strLVText, Len(strLVText) - stred)
          End If
 
        Else
          ' Pfadangabe
          If Mid$(Textzeile, 2, 2) = ":\" Or Left$(Textzeile, 2) = "\\" Then
            ' absolute Pfadangabe oder Netzwerkpfad
            Audio.File = Textzeile
          Else
            ' relative Pfadangabe
            Audio.File = fso.BuildPath(Playlist.ParentFolder, Textzeile)
          End If
 
          Audio.Exists = fso.FileExists(Audio.File)
          If Not Audio.Exists Then ReadM3U = False
 
          ' Playlist-Element in das ListView eintragen
          With LV_Playlist
            If Audio.Exists Then
              Set litem = .ListItems.Add(, , "Ja")
            Else
              Set litem = .ListItems.Add(, , "Nein")
            End If
            litem.SubItems(1) = GetFileFromPath(Audio.File)
            If Audio.Length >= 0 Then
              litem.SubItems(2) = TimeFormat(Audio.Length)
            Else
              litem.SubItems(2) = "Stream"
            End If
            litem.SubItems(3) = Audio.Title
          End With
 
          ' Audio - Element wieder bereinigen
          Audio.File = ""
          Audio.Length = 0
          Audio.Title = ""
        End If
    End Select
  Loop
  ts.Close
  Set Playlist = Nothing
End Function
' Hilfsfunktion:
' Ermittelt den Dateinamen aus Pfad+Datei
Private 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
    Position = n
  Loop
 
  GetFileFromPath = Right$(Pfadname, Länge - Position)
End Function
' Hilfsfunktion:
' wandelt die Zeitangabe in Sekunden in
' das Format 'hh:mm:ss' um
Private Function TimeFormat(Seconds As Long) As String
  Dim h As Long
  Dim m As Long
  Dim hh As String
  Dim mm As String
  Dim ss As String
 
  ' Stunden ermitteln
  If Seconds > 0 Then
    h = Int(Seconds / 3600)
    Seconds = Seconds - (3600 * h)
  Else
    TimeFormat = ""
    Exit Function
  End If
 
  ' Minuten ermitteln
  If Seconds > 0 Then
    m = Int(Seconds / 60)
    Seconds = Seconds - (60 * m)
  End If
 
  ' zweistellig formatieren
  hh = Format$(h, "00")
  mm = Format$(m, "00")
  ss = Format$(Seconds, "00")
 
  TimeFormat = hh & ":" & mm & ":" & ss
End Function

Anwendungsbeispiel:
Die Funktion ReadM3U gibt 'True' zurück, wenn alle Listeneinträge gefunden wurden und 'False', wenn wenigstens ein Listeneintrag auf eine fehlende Datei zeigt.

Beispiel:
Fügen Sie in einem (neuen) Projekt ein Listview-Control und einen Button ein.
Fügen Sie Ihrem Projekt einen Verweis auf die Microsoft Scripting Runtime (scrrun.dll) hinzu.

Setzen Sie folgenden Code in das Button-Click-Ereignis:

Private Sub Command1_Click()
  If ReadM3U("X:\Pfad\Playlistname.m3u", ListView1) Then
    MsgBox "Die eingelesene Playliste enthält korrekte Einträge."
  Else
    MsgBox "Die eingelesene Playliste enthält inkorrekte Einträge."
  End If
End Sub

Dieser Tipp wurde bereits 21.163 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
   

Druckansicht Druckansicht Copyright ©2000-2020 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel