Einlesen der Dateinamen einer Playliste im Extended M3U-Format in eine Listbox

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Einlesen der Dateinamen einer Playliste im Extended M3U-Format in eine Listbox

    Hallo allerseits,

    ich möchte die Dateinamen, die in einer M3U Playliste hinterlegt sind, in einer LIstbox anzeigen lassen. Mein Code ist folgender:


    VB.NET-Quellcode

    1. Public PlaylistAusDatei As List(Of String)
    2. PlaylistAusDatei = System.IO.File.ReadLines("C:\Users\Alpha\Desktop\Cypress Hill\Test Playliste.m3u").ToList
    3. If PlaylistAusDatei(0) = "#EXTM3U" Then
    4. For i = 0 To PlaylistAusDatei.Count - 1
    5. If PlaylistAusDatei(i) <> "" Then
    6. If PlaylistAusDatei(i).Substring(0, 8) = "#EXTINF:" Then
    7. ListBox1.Items.Add(PlaylistAusDatei(i + 1))
    8. End If
    9. End If
    10. Next
    11. End If


    Die Playliste sieht folgendermassen aus, wenn man sie im Texteditor öffnet (natürlich ist das nicht VB.NET, aber ich hab keine bessere Fomratierungsmethode gefunden):

    VB.NET-Quellcode

    1. #EXTM3U
    2. #EXTINF:0,02 Michael jackson - The Way You Make Me Feel.mp3
    3. ..\..\pop\Michael Jackson\Michael Jackson - HIStory\1\02 Michael jackson - The Way You Make Me Feel.mp3
    4. #EXTINF:0,03 Michael jackson - HIStory - CD 1 - Black Or White.mp3
    5. ..\..\pop\Michael Jackson\Michael Jackson - HIStory\1\03 Michael jackson - HIStory - CD 1 - Black Or White.mp3
    6. #EXTINF:0,04 Michael jackson - HIStory - CD 1 - Rock With You.mp3
    7. ..\..\pop\Michael Jackson\Michael Jackson - HIStory\1\04 Michael jackson - HIStory - CD 1 - Rock With You.mp3
    8. #EXTINF:0,01 Michael jackson - HIStory - CD 1 - Billie Jean.mp3
    9. ..\..\pop\Michael Jackson\Michael Jackson - HIStory\1\01 Michael jackson - HIStory - CD 1 - Billie Jean.mp3


    Ich habe an anderer Stelle hier im Forum gelesen, dass man bei .Substring das Argument length bei 1 beginnend angibt. Nur leider kommt, wenn ich in Zeile 8 dann 8 übergebe ein Feher "Der Index und die Länge müssen sich auf eine Position in der Zeichenfolge beziehen.". Wenn ich stattdessen 7 nehme, kommt zwar kein Fehler, es passiert aber rein gar nichts und die Listbox bleibt leer.

    Hat jemand eine Idee, was ich falsch mache? Oder hat jemand vielleicht eine andere Vorgehensweise? Mit einem Haltepunkt hab ichs schon versucht, ich komm da aber auf keinen grünen Zweig...

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    kafffee schrieb:

    .Substring
    hat 2 Überladungen.
    Wenn Du was zu den Parametern wissen willst, frag nicht das Forum, sondern die MSDN:
    MSDN string.Substring und Dir wird geholfen:
    docs.microsoft.com/en-us/dotne…ng.substring?view=net-5.0
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany

    Ja schon. Aber genauso hab ich es gemacht. Da steht:

    Parameters:
    startIndex:
    Int32
    The zero-based starting character position of a substring in this instance.

    length
    Int32
    The number of characters in the substring.

    Das Komische ist auch, dass es wenn ich 7 übergebe, keinen Fehler gibt, aber bei 8 schon.... Das würde je heissen, dass der String nur 7 Zeichen hat oder?

    BTW: Eine Überladung ist nichts Anderes als ein Argument oder?

    EDIT: Alternativ könnte ich einfach die Leerzeilen aus der Liste entfernen und dann jede zweite Zeile einlesen. Hältst du das für sinnvoll?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „kafffee“ ()

    Ein "echter" Parser funktioniert anders.

    Aber du könntest diesen Ansatz nehmen:

    VB.NET-Quellcode

    1. If PlaylistAusDatei(i).StartsWith("#EXTINF:" Then ListBox1.Items.Add(PlaylistAusDatei(i + 1))
    ist aber auch nicht ganz sauber.
    Wenn die Datei inhaltliche Unregelmässigkeiten aufweist, kracht's eventuell.
    Du solltest auch die Zeile i+1 auf Vorhandensein und korrekten Inhalt prüfen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    @petaod

    Super danke. Probier ich gleich mal aus. Gegen die Unregelmäßigkeiten kann ich aber nicht viel tun denke ich. Ich denke das ist immer noch besser als einfach jede zweite Zeile einzulesen. Da muss eh noch überprüft werden ob die Dateinamen denn auch gültig sind, das Programm soll nämlich auch extern erstellte Playlists laden können. Oder hast du eine bessere Idee? Vielleicht von Anfang an die Leerzeilen entfernen?
    @kafffee Poste mal den String und genau das, was Du alles daraus extrahieren willst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi

    Normalerweise enthält eine M3U keine Leerzeilen. Wozu auch? #EXTINF: Kennzeichnet doch einen neuen Eintrag. Wenn es weitere Informationen zu einem Eintrag gibt, dann stehen diese vor dem ersten Komma, direkt nach der Spielzeit, in optionale Tags.

    Meines Wissens ist eine ExtM3U folgendermaßen aufgebaut.

    #EXTM3U
    #EXTINF:Spielzeit,Titel der Datei1/Stream1
    Pfad zur Datei1/Stream1
    #EXTINF:Spielzeit OptionalTag="z.B. Pfad zu einem Bild" OptionalTag1="WasAuchImmer",Titel der Datei2/Stream2
    Pfad zur Datei2/Stream2

    Wobei die Spielzeit auch -1 sein kann. Meist bei Radio- oder TV-Streams. Die optionalen Tags können, müssen aber nicht vorhanden sein, oder haben auch einen anderen Namen, und werden von den meisten Standard M3U-Parsern nicht ausgewertet. Das ist eher was für selbst erstellte ExtM3Us wo man zusätzliche Infos ablegen möchte die auch vom eigenen Programm auch wieder eingelesen wird das auch mit den zusätzlichen Infos was anzufangen weis.
    Mfg -Franky-

    RodFromGermany schrieb:

    Poste mal den String und genau das, was Du alles daraus extrahieren willst.


    siehe Post 1: Alle Zeilen die einen Pfad plus Dateinamen enthalten sollen extrahiert werden. Sprich alle Zeilen, die mit (in diesem Fall) ..\..\ anfangen.

    Hab jetzt auf Wikipedia gelesen, dass manche Programme auch "gemischte" Playlists erzeugen. Also "normale" (in denen nur die Verzeichnisse und Dateinamen hintgerlegt sind), und "extended" (in denen auch Metadaten (also alles nach #EXTINF)) gespeichert werden.

    Also macht es komplett keinen Sinn, wenn ich das so wie in Post 1 mache. Ich habe jetzt entschieden, einfach jede eingelesene Zeile darauf zu prüfen, ob sie einen korrektes Verzeichnis/Dateinamen enthält. Nur wie lösche ich die dann aus der Liste. Mit folgendem Code geht das natürlich nicht, weil, sich die Größe von PlaylistAusDatei innerhalb der For...Each-Schleife ändert.

    VB.NET-Quellcode

    1. Public UngültigerPfad As New LIst (Of Integer)
    2. For i = 0 To PlaylistAusDatei.Count - 1
    3. If System.IO.File.Exists(CStr(PlaylistAusDatei(i))) = False Then
    4. UngültigerMP3Pfad.Add(i)
    5. End If
    6. Next
    7. For Each Pfad In UngültigerMP3Pfad
    8. PlaylistAusDatei.RemoveAt(Pfad)
    9. Next


    Gibt es da irgendeine spezielle Prozedur oder fällt jemand eine Vorgehensweise ein?


    Edit: Na klar mit ist grad eingefallen. Einfach statt .RemoveAt .Remove verwenden und UngültigerPfad als List(Of String) deklarieren...

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „kafffee“ ()

    @kafffee Missverständnis.
    Ich erwartete so was:
    Aus dem String
    ..\..\pop\Michael Jackson\Michael Jackson - HIStory\1\02 Michael jackson - The Way You Make Me Feel.mp3
    möchte ich den String
    02 Michael jackson - The Way You Make Me Feel.mp3
    extrahieren
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!