Die üblichen Einträge in ID3V2-Tags des Typs 3 oder 4 können
eventuell mit diesem GROB GETESTETEN Code gelesen werden:
(schnell zusammengebaut anhand einiger Tipps zu VB6.)
Bei den älteren Versionen ist der Aufbau ähnlich.
Die Routine "GetTagEntries" benötigt als Parameter
Pfad/Datei einer MP3-Datei und gibt eine Liste
der gefundenen Einträge zurück - oder Nothing, falls
kein ID3V2.3 oder ID3V2.4 in der Datei enthalten ist.
Private Function GetTagEntries(ByVal filename As String) As List(Of String)
'Die üblichen Tags
Dim Tags() As String = _
{"TIT2", "TCON", "TCOM", "TOPE", "PCNT", "TRCK", _
"TCOP", "COMM", "TYER", "TALB", "TPE1", "TLAN", "TLEN", "TMED", _
"TPUB", "TSSE", "TENC", "WXXX"}
'Den MP3-Dateianfang lesen
Dim enc As System.Text.Encoding = System.Text.Encoding.UTF8
Dim buffer(10240 - 1) As Char, Filestart As String = ""
Using sr As New IO.StreamReader(filename, enc, False)
sr.ReadBlock(buffer, 0, 10240)
End Using
Filestart = buffer
'ID3V2.3/4 vorhanden?
If Not IsID3V2(Filestart) Then Return Nothing
'nach den Tags suchen
Dim tlst As New List(Of String)
For i As Integer = 0 To Tags.Length - 1
Dim tagentry As String = GetTagEntry(Filestart, Tags(i))
If Not tagentry = String.Empty Then
tlst.Add(Tags(i) & ": " & tagentry)
End If
Next i
Return tlst
End Function
'=======================
'Hilfsfunktionen
'=======================
Private Function IsID3V2(ByVal Filestart As String) As Boolean
'ID3V2-Tag suchen
Dim ID3Position As Integer = Filestart.IndexOf("ID3")
If ID3Position = -1 Then Return False
'Tag vorhanden ....
Dim ID3Version As String = Filestart.Substring(ID3Position + 3, 2)
'Versionkontrolle
Dim vers As Integer = Asc(ID3Version.Substring(0, 1))
Return vers = 3 Or vers = 4
End Function
Private Function GetTagEntry _
(ByVal Filestart As String, ByVal Tag As String) As String
Dim pos As Integer = Filestart.IndexOf(Tag)
If pos < 0 Then Return String.Empty
Dim l As Integer = GetEntryLength(Filestart.Substring(pos))
If l < 1 Or l > 1024 Then Return String.Empty
Return GetEntry(Filestart.Substring(pos + Tag.Length + 6), l)
End Function
Private Function GetEntryLength(ByVal Tag As String) As Integer
If String.IsNullOrEmpty(Tag) Then Return -1
If Tag.Length < 10 Then Return -1
Dim FrameLenStr As String = Mid(Tag, 5, 4)
Dim FrameLength As Integer
FrameLength = _
256 * 8 * 8 * Asc(FrameLenStr.Substring(0, 1)) + _
256 * 8 * Asc(FrameLenStr.Substring(1, 1)) + _
256 * Asc(FrameLenStr.Substring(2, 1)) + _
Asc(FrameLenStr.Substring(3, 1))
Return FrameLength
End Function
Private Function GetEntry(ByVal Tag As String, _
ByVal length As Integer) As String
If length < 1 Then Return ""
If Tag.Length < length Then Return ""
GetEntry = ""
If Tag(0) = Chr(0) Then
GetEntry = Tag.Substring(1, length - 1)
Else
GetEntry = Tag.Substring(0, length)
End If
End Function Sinnvoller wäre es vermutlich, wenn Du beim Download der MP3-Dateien
die benötigten Angaben separat notieren würdest.
Einträge in den MP3-Dateien sind lückenhaft, uneinheitlich formuliert
und nicht immer korrekt. Daraus läßt sich wohl kaum zuverlässig ein
Verzeichnisname konstruieren.
Man kann sich die MP3 auch anhören. Der geübte User erkennt am Klang
den Titel und den Interpreten ...
Beitrag wurde zuletzt am 05.03.13 um 09:12:40 editiert. |