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: Beispiel: 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 22.680 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
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. |
sevISDN 1.0 Überwachung aller eingehender Anrufe! Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Tipp des Monats März 2024 Dieter Otter UTF-8 Konvertierung von Dateien und Strings VB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. Neu! sevEingabe 3.0 Einfach stark! Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. |
||||||||||||||||
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. |