Visual Basic 2008 m3u Playlist hilfe!!!

  • VB.NET

Es gibt 36 Antworten in diesem Thema. Der letzte Beitrag () ist von Dodo.

    Visual Basic 2008 m3u Playlist hilfe!!!

    Hallo ihr Lieben.

    Ich komme einfach nicht weiter. Ich versuche das meine Listview eine m3u Playlist einliest.
    Ich habe bei Google nix gefunden, für Visual Basic 2008...
    Ich habe einen Code gefunden, der ist aber für Visual Basic 05/06....

    Kann ich den Code auch in Visual Basic 2008 anwenden oder um schreiben???


    Hier der Code:

    VB.NET-Quellcode

    1. 'Dieser Quellcode stammt von http://www.activevb.de
    2. 'und kann frei verwendet werden. Für eventuelle Schäden
    3. 'wird nicht gehaftet.
    4. 'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
    5. 'Ansonsten viel Spaß und Erfolg mit diesem Source!
    6. '------------- Anfang Projektdatei Projekt1.vbp -------------
    7. ' Die Komponente 'Microsoft Common Dialog Control 6.0 (SP3) (COMDLG32.OCX)' wird benötigt.
    8. ' Die Komponente 'Microsoft Windows Common Controls 6.0 (SP6) (MsComCtl.ocx)' wird benötigt.
    9. '--------- Anfang Formular "Form1" alias Form1.frm ---------
    10. ' Steuerelement: Listenanzeigesteuerungselement "ListView1"
    11. ' Steuerelement: Standarddialog-Steuerelement "CommonDialog1"
    12. ' Steuerelement: Schaltfläche "Command1"
    13. 'Hauptfunktion zum Auslesen udn einfügen in die ListView
    14. Private Function ReadM3U(ByVal sFilename As String, LV_Playlist _
    15. As ListView) As Boolean
    16. Dim Textzeile As String
    17. Dim Zeile As Long
    18. Dim Wrong As Boolean
    19. Dim LastZeile As String
    20. Dim strLVText As String
    21. Dim stred As Long
    22. Dim Laenge As String
    23. Dim Laenge_Text As String
    24. Dim FileTitle As String
    25. Dim FileExt As String
    26. Dim Laenge_tmp
    27. Dim F As Integer
    28. On Error Goto ErrHandler
    29. With LV_Playlist
    30. ' ListView-Spalten erstellen
    31. .Sorted = False
    32. .View = lvwReport
    33. .ColumnHeaders.Clear
    34. .ColumnHeaders.Add , , "Titel / Dateiname", .Width - 1600
    35. .ColumnHeaders.Add , , "Länge", 1000, 1
    36. ' ListView-Einträge löschen
    37. .ListItems.Clear
    38. ' Playlist auslesen
    39. Zeile = 0
    40. F = FreeFile
    41. Open sFilename For Input As #F
    42. ' Schleife bis Dateiende
    43. Do While Not EOF(F)
    44. Zeile = Zeile + 1
    45. ' Zeile in Variable einlesen.
    46. Line Input #F, Textzeile
    47. If Zeile = 1 And Textzeile <> "#EXTM3U" Then
    48. Wrong = True
    49. End If
    50. If Left$(LastZeile, 8) = "#EXTINF:" Then
    51. ' zusätzliche Infos der zuletzt eingelesenen
    52. ' Zeile auswerten
    53. strLVText = Right$(LastZeile, Len(LastZeile) - 8)
    54. ' Länge (Spieldauer) ermitteln
    55. stred = InStr(strLVText, ",")
    56. If stred > 0 Then
    57. Laenge = Left$(strLVText, stred - 1)
    58. Laenge_Text = Format(Laenge / 60, "00.00")
    59. Laenge_Text = ReplaceM(Laenge_Text, ",", ":", ".", _
    60. ":")
    61. strLVText = Right$(strLVText, Len(strLVText) - stred)
    62. Laenge_tmp = ""
    63. stred = 0
    64. stred = InStr(Laenge_Text, ":")
    65. If stred > 0 Then
    66. Laenge_tmp = Right$(Laenge_Text, Len(Laenge_Text) _
    67. - stred)
    68. Laenge_tmp = Format((Laenge_tmp / 99) * 60, "0")
    69. Laenge_tmp = Format(Laenge_tmp, "00")
    70. Laenge_Text = Left$(Laenge_Text, stred - 1) & ":" _
    71. & Laenge_tmp
    72. End If
    73. End If
    74. ' Titel
    75. FileTitle = GetFileFromPath(Textzeile)
    76. FileExt = GetFileExt(FileTitle)
    77. If FileExt <> "" Then
    78. FileExt = "." & FileExt
    79. End If
    80. FileTitle = Left$(FileTitle, Len(FileTitle) - _
    81. Len(FileExt))
    82. ' Aktuellen Titel im ListView anzeigen
    83. If FileTitle <> strLVText Then
    84. .ListItems.Add , , strLVText & " - [" & Textzeile & _
    85. "]"
    86. Else
    87. .ListItems.Add , , strLVText
    88. End If
    89. .ListItems(.ListItems.Count).SubItems(1) = Laenge_Text
    90. End If
    91. LastZeile = Textzeile
    92. Loop
    93. ' Datei schließen.
    94. Close #F
    95. End With
    96. ErrHandler:
    97. If Err > 0 Then
    98. Wrong = True
    99. End If
    100. ReadM3U = (Wrong = False)
    101. End Function
    102. ' String-Ersetzen
    103. Function ReplaceM(ByVal FromStr As String, ParamArray _
    104. varReplacements() As Variant) As String
    105. Dim intMacro As Integer
    106. Dim strResString As String
    107. Dim nFrom As Integer
    108. Dim nTo As Integer
    109. Dim strMacro As String
    110. Dim strValue As String
    111. On Error Resume Next
    112. strResString = FromStr
    113. ' Für jedes übergebene Makro/Wert-Paar...
    114. nFrom = LBound(varReplacements)
    115. nTo = UBound(varReplacements)
    116. For intMacro = nFrom To nTo Step 2
    117. strMacro = varReplacements(intMacro)
    118. strValue = varReplacements(intMacro + 1)
    119. On Error Goto 0
    120. ' Ersetzen aller vorkommenden strMacro
    121. ' durch strValue
    122. Dim intPos As Integer
    123. Do
    124. intPos = InStr(strResString, strMacro)
    125. If intPos > 0 Then
    126. strResString = Left$(strResString, intPos - 1) & _
    127. strValue & Right$(strResString, Len(strResString) _
    128. - Len(strMacro) - intPos + 1)
    129. End If
    130. Loop Until intPos = 0
    131. Next intMacro
    132. ReplaceM = strResString
    133. On Error Goto 0
    134. Exit Function
    135. End Function
    136. ' Ermittelt die Dateierweiterung eines Dateinamens
    137. Function GetFileExt(Pfadname As String)
    138. Dim Dateinamen As String
    139. Dim Länge As Integer
    140. Dim n As Integer
    141. Dim Position As Integer
    142. Länge = Len(Pfadname)
    143. Do
    144. n = InStr(n + 1, Pfadname, ".")
    145. If n = 0 Then
    146. Exit Do
    147. End If
    148. Position = n
    149. Loop
    150. If Position <> 0 Then
    151. GetFileExt = StrConv(Right$(Pfadname, Länge - Position), _
    152. vbUpperCase)
    153. End If
    154. End Function
    155. ' Filtert Playlist namen
    156. Function GetFileFromPath(Pfadname As String)
    157. Dim Dateinamen As String
    158. Dim Länge As Integer
    159. Dim n As Integer
    160. Dim Position As Integer
    161. Länge = Len(Pfadname)
    162. Do
    163. n = InStr(n + 1, Pfadname, "\")
    164. If n = 0 Then
    165. Exit Do
    166. End If
    167. Position = n
    168. Loop
    169. GetFileFromPath = Right$(Pfadname, Länge - Position)
    170. End Function
    171. Private Sub Command1_Click()
    172. On Error Resume Next
    173. ' wenn ma der User nix auswählt ;)
    174. 'Commondialog Initialisieren
    175. With CommonDialog1
    176. .DialogTitle = "Playlist Öffnen"
    177. .Filter = "Playlists|*.m3u"
    178. .InitDir = "C:\"
    179. .ShowOpen
    180. End With
    181. 'Playlist Laden
    182. ReadM3U CommonDialog1.FileName, ListView1
    183. End Sub

    MediaXtremely schrieb:

    Kann ich den Code auch in Visual Basic 2008 anwenden oder um schreiben???


    Ja! Im Prinzip kann man fast den Code verwenden, weil blöderweise es den Microsoft.VisualBasic-Namespace gibt, welcher die alten VB6 Methoden und Funktionen zur verfügung stellt. Aber diese sollten bei guter Programmierung nicht mehr verwendet werden, manche sind langsamer, nicht mehr OOP usw.
    Ich würde dir raten den Code komplett selbst zu schreiben, so schwer dürfte das nicht sein, eine Winamp Playlist ist ja nun nicht so schwer aufgebaut. Entweder mit Split() und IndexOf() oder besser mit RegEx, welches jedoch etwas komplizierter ist, jedoch würde dadruch der Code deutlich kürzer werden.

    Aufjedenfall wären scohn Grundlagen nötig.
    Danke für deine Antwort.
    Ich kann die Listview speichern, aber wenn ich sie wieder lade, kann ich die Tracks nicht abspielen. Da fehlt wohl was, ich weis nur nicht was?


    Hier die Code zum laden

    VB.NET-Quellcode

    1. Private Sub Button12_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button12.Click
    2. OpenFileDialog2.ShowDialog()
    3. Dim Path As String = OpenFileDialog2.FileName
    4. Dim Allitems As String
    5. Try
    6. Allitems = My.Computer.FileSystem.ReadAllText(Path)
    7. Dim ItemLines As New TextBox
    8. ItemLines.Text = Allitems
    9. For Each line As String In ItemLines.Lines
    10. ListView1.Items.Add(line)
    11. Next
    12. Catch ex As Exception
    13. End Try
    14. End Sub


    Und hier zum seichern:

    VB.NET-Quellcode

    1. Private Sub Button11_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button11.Click
    2. SaveFileDialog1.ShowDialog()
    3. Dim Path As String = SaveFileDialog1.FileName
    4. Dim Allitems As String = ""
    5. Try
    6. For Itm = 0 To ListView1.Items.Count - 1
    7. Allitems = Allitems & ListView1.Items.Item(Itm).Text & vbNewLine
    8. Next
    9. Allitems = Allitems.Trim
    10. Catch ex As Exception
    11. End Try
    12. Try
    13. If My.Computer.FileSystem.FileExists(Path) Then
    14. My.Computer.FileSystem.DeleteFile(Path)
    15. End If
    16. My.Computer.FileSystem.WriteAllText(Path, Allitems, False)
    17. Catch ex As Exception
    18. End Try
    19. End Sub


    Ich habe keine Ahnung was da fehlt...
    Ich habe jetzt mal meine List und eine m3u liste im Editor angeschaut.

    Meine Liste speichert nur den Tag also das Item, das was man in der Listview sieht und die m3u speicher das Item und den Pfad zur Datei.

    Wie kann ich jetzt noch den Pfad mit speichern???
    Nun, den Pfad könntest du z.B. in der Tag-Eigenschaft eines ListViewItems abspeichern.

    Es gibt viele Möglichkeiten, ich weiß ja nichtmal wie du die m3u ausließt in deine LsitView, da ist es auch schwierig Tips zu geben wie dabei dann bei dir dne Pfad mit speichern kannst.
    Also die Items nehme ich so in die Listview auf:

    VB.NET-Quellcode

    1. Try
    2. With OpenFileDialog1
    3. .Filter = _
    4. "MP3 Dateien (*.mp3*) |*.mp3*"
    5. .FilterIndex = 1
    6. If Form2.TextBox1.Text = "" Then
    7. .InitialDirectory = "C:/"
    8. Else
    9. .InitialDirectory = Form2.TextBox1.Text
    10. End If
    11. .Title = "Dateien Hinzufügen"
    12. If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
    13. For Each s As String In OpenFileDialog1.FileNames
    14. Dim Filename As String = System.IO.Path.GetFileName(s)
    15. ListView1.Items.Add(Filename).Tag = s
    16. Next
    17. End If
    18. End With
    19. Catch ex As Exception
    20. End Try


    Da kommen der Pfad als Text und der Trackname als Tag zusammen und kann abgespielt werden.

    Jetzt will ich das als Text Datei speichern und wieder laden, so das ich, wenn ich es lade auch wieder abspielen kann.
    Und dann passiert auch nix.
    Selbst wenn ich nur den Pfad speichere. Und nur den Pfad in die Listview einfüge, kommt auch nix. es geht nur wenn ich die Lieder per OpenFileDialog einfüge.
    Wenn ich es als Text speichere und lade, kann ich die nicht abspielen.

    Wie bekomme ich die Informationen in Die Textdatei?
    Und wie lade ich die Text Datei mit den Informationen??


    Kann mir keiner helfen????
    Dann zeig uns doch mal ein bischel mehr Code, sollen wir Raten?? Wie die MP3 Dateien in deine ListView bekommst wissen wir nun, aber wie die Textdatei speicherst und lädst wissen wir nicht und somit auch nicht was du da ggf. falsch machst.
    danke mache ich...

    Hier wird er gespeichert:

    VB.NET-Quellcode

    1. SaveFileDialog1.ShowDialog()
    2. Dim Path As String = SaveFileDialog1.FileName
    3. Dim Allitems As String = ""
    4. Try
    5. For Itm = 0 To ListView1.Items.Count - 1
    6. Allitems = Allitems & ListView1.Items.Item(Itm).Tag & vbNewLine & ListView1.Items.Item(Itm).Text
    7. Next
    8. Allitems = Allitems.Trim
    9. Catch ex As Exception
    10. End Try
    11. Try
    12. If My.Computer.FileSystem.FileExists(Path) Then
    13. My.Computer.FileSystem.DeleteFile(Path)
    14. End If
    15. My.Computer.FileSystem.WriteAllText(Path, Allitems, False)
    16. Catch ex As Exception
    17. End Try




    Und hier lade ich den Text:

    VB.NET-Quellcode

    1. OpenFileDialog2.ShowDialog()
    2. Dim Path As String = OpenFileDialog2.FileName
    3. Dim Allitems As String
    4. Try
    5. Allitems = My.Computer.FileSystem.ReadAllText(Path)
    6. Dim ItemLines As New TextBox
    7. ItemLines.Text = Allitems
    8. For Each line As String In ItemLines.Lines
    9. ListView1.Items.Add(line)
    10. Next
    11. Catch ex As Exception
    12. End Try
    Nunja, erstmal schaue dir den StreamWriter an, der ist für dich besser geeignet als alles erst in einen String zu schreiben und dann noch den My-Namespace zu nutzen.

    Zudem speicherst du ja zuerst den Pfad dann neue Zeile und dann das Lied, danach machst du aber keinen Zeilenumbruch, damit wird das nächste Mal der Pfad direkt hinter das Lied gesetzt. Wenn jedoch den StreamWrtier nutzt erübrigt sich das Problem, mit der WriteLine()-Methode.

    Beim Auslesen fügst du JEDE Zeile in deine ListView ein, aber das klappt ja so nicht, da in der einen Zeile der Pfad steht und darunter die Datei.
    Zudem musst du keine Textbox verwenden um an die Lines zu kommen, sondern nutze hierfür Split() bzw. ließ gleich alles über System.IO.File.ReadAllLines() ein, dann hast du gleich ein Array.
    Dann machst du eine For Schleife mit Step 2 und ließt den Index des Arrays aus wo der Pfad drin steht und mit Index + 1 den Liedtitel.
    Kannst du mir ein Codebeispiel geben??

    Das habe ich probiert:

    VB.NET-Quellcode

    1. Dim writer As New StreamWriter(SaveFileDialog1.FileName)
    2. writer.WriteLine(ListView1.Items)
    3. writer.Close(

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

    Nunja, in deinem alten Code gehst du die Items in einer Schleif durch, wieso meinst du das hier nun nicht mehr machen zu müssen? Ich habe lediglich gesagt dass der StreamWrtier und die WriteLine-Methode dir das zusammenstellen des String abnimmt.

    Code bauchst du nicht, du hast im prinzip schon alles was du brauchst, wenn du wirklich weißt, was dort passiert bekommst du das auch alleine hin. Wir geben hier lediglich Hilfestellung und programmieren nicht für jemand.
    Nunja als Beispiel könnte ich jetzt deinen Code kopieren den schon hast

    VB.NET-Quellcode

    1. SaveFileDialog1.ShowDialog()
    2. Dim Path As String = SaveFileDialog1.FileName
    3. Dim Allitems As String = ""
    4. Try
    5. For Itm = 0 To ListView1.Items.Count - 1
    6. Allitems = Allitems & ListView1.Items.Item(Itm).Tag & vbNewLine & ListView1.Items.Item(Itm).Text
    7. Next
    8. Allitems = Allitems.Trim
    9. Catch ex As Exception
    10. End Try
    11. Try
    12. If My.Computer.FileSystem.FileExists(Path) Then
    13. My.Computer.FileSystem.DeleteFile(Path)
    14. End If
    15. My.Computer.FileSystem.WriteAllText(Path, Allitems, False)
    16. Catch ex As Exception
    17. End Try


    Da hat du alles drin, wenn nicht sogar noch mehr, als du brauchst.

    Erstmal würde ich das DialogResult auswerten, denn wenn man im Dialog Abbrechen drückt, wird es zu Fehlern kommen, die du anscheint mit Try-Catch abfängst, was aber nicht sauber ist. Mache einfach

    VB.NET-Quellcode

    1. If SaveDialog.ShowDialog()= DialogResult.OK Then
    2. End If


    Damit wird der Code nur ausgeführt wenn OK gewählt wurde.

    Dann gehst du alle Items durch, das hast du schon, du stückelst momentan einen String zusammen, das machste weg und ersetzt das einfach durch die WriteLine-Methode des StreamWriters.

    Also Ganz logisch vorgehen:

    1. SaveDialog anzeigen
    2. DialogResult auswerten
    3. StreamWriter mit angegebenen Datei öffnen
    4. Schleife durch die Items
    5. Mittels WriteLine() die einzelnen Items wegschreiben
    6. Wenn Schleife durchgelaufen ist, StreamWriter beenden
    7. Sich freuen weil der Code so übersichtlich und vorallem kurz ist
    Danke...

    Ist alle plausibel, aber ich verstehe das nicht mit der Writeline:

    VB.NET-Quellcode

    1. SaveFileDialog1.ShowDialog()
    2. Dim Path As String = SaveFileDialog1.FileName
    3. Dim Allitems As String = ""
    4. Try
    5. For Itm = 0 To ListView1.Items.Count - 1
    6. Dim writer As New StreamWriter(SaveFileDialog1.FileName)
    7. writer.WriteLine(ListView1.Items.)
    8. writer.Close()
    9. Next
    10. Allitems = Allitems.Trim
    11. Catch ex As Exception
    12. End Try
    13. If SaveFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
    14. If My.Computer.FileSystem.FileExists(Path) Then
    15. My.Computer.FileSystem.DeleteFile(Path)
    16. End If
    17. My.Computer.FileSystem.WriteAllText(Path, Allitems, False)
    18. End If


    Jetzt steht nix in der text Datei und Das SavefileDialog öffnet sich nach dem OK nochmal...

    Bin ich jetzt blöd???:)