Rubrik: Multimedia & Sound · Sonstiges | VB-Versionen: VB4, VB5, VB6 | 09.12.03 |
Jedwede .m3u-Datei auslesen Auslesen von einfachen oder erweiterten .m3U-Dateien mit relativen oder absoluen Pfadangaben. | ||
Autor: Enrico Päsel | Bewertung: | Views: 22.703 |
home.arcor.de/maester | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | 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