TagMP3



Option Explicit

Private mvarFilename As String

Private Type Info
sTitle As String
sArtist As String
sAlbum As String
sComment As String
sYear As String
sGenre As String
End Type

Private MP3Info As Info

Public Property Get Filename() As String
Filename = mvarFilename
End Property

Private Function IsValidFile(ByVal sFilename) As Boolean

Dim bOk As Boolean
' verifica che il file esista

bOk = CBool(Dir(sFilename, vbHidden) <> "")
Dim aExtensions, ext
aExtensions = Array(".mp3", ".mp2", ".mp1")
Dim bOkayExtension As Boolean
bOkayExtension = False

If bOk Then
For Each ext In aExtensions
If InStr(1, sFilename, ext, vbTextCompare) > 0 Then
bOkayExtension = True
End If
Next 'ext
End If

IsValidFile = bOk And bOkayExtension

End Function

Public Property Let Filename(ByVal sPassFilename As String)

Dim iFreefile As Integer
Dim lFilePos As Long
Dim sData As String * 128
Dim sGenre() As String

'genere


Const sGenreMatrix As String = "Blues|Classic Rock|Country|Dance|Disco|Funk|Grunge|" + _
"Hip-Hop|Jazz|Metal|New Age|Oldies|Other|Pop|R&B|Rap|Reggae|Rock|Techno|" + _
"Industrial|Alternative|Ska|Death Metal|Pranks|Soundtrack|Euro-Techno|" + _
"Ambient|Trip Hop|Vocal|Jazz+Funk|Fusion|Trance|Classical|Instrumental|Acid|" + _
"House|Game|Sound Clip|Gospel|Noise|Alt. Rock|Bass|Soul|Punk|Space|Meditative|" + _
"Instrumental Pop|Instrumental Rock|Ethnic|Gothic|Darkwave|Techno-Industrial|Electronic|" +_
"Pop-Folk|Eurodance|Dream|Southern Rock|Comedy|Cult|Gangsta Rap|Top 40|Christian Rap|" + _
"Pop/Punk|Jungle|Native American|Cabaret|New Wave|Phychedelic|Rave|Showtunes|Trailer|" + _
"Lo-Fi|Tribal|Acid Punk|Acid Jazz|Polka|Retro|Musical|Rock & Roll|Hard Rock|Folk|" + _
"Folk/Rock|National Folk|Swing|Fast-Fusion|Bebob|Latin|Revival|Celtic|Blue Grass|" + _
"Avantegarde|Gothic Rock|Progressive Rock|Psychedelic Rock|Symphonic Rock|Slow Rock|" + _
"Big Band|Chorus|Easy Listening|Acoustic|Humour|Speech|Chanson|Opera|Chamber Music|" + _
"Sonata|Symphony|Booty Bass|Primus|Porn Groove|Satire|Slow Jam|Club|Tango|Samba|Folklore|"+_
"Ballad|power Ballad|Rhythmic Soul|Freestyle|Duet|Punk Rock|DrumSolo|ACapella|EuroHouse|"+ _
"Dance Hall|Goa|Drum&Bass|ClubHouse|Hardcore|Terror|indie|BritPop|Negerpunk|PolskPunk|" + _
"Beat|Christian Gangsta Rap|Heavy Metal|Black Metal|Crossover|Comteporary Christian|" + _
"Christian Rock|Merengue|Salsa|Trash Metal|Anime|JPop|Synth Pop"

' Costrusce l'array Genere (solo VB6+)

sGenre = Split(sGenreMatrix, "|")

' Store the filename (for "Get Filename"property)

mvarFilename = sPassFilename

' Clear the info variables

If Not IsValidFile(sPassFilename) Then' bug fix
Exit Property
End If

MP3Info.sTitle = ""
MP3Info.sArtist = ""
MP3Info.sAlbum = ""
MP3Info.sYear = ""
MP3Info.sComment = ""
' Verifica se esiste il file MP3

' Carica le info dal file MP3

iFreefile = FreeFile
lFilePos = FileLen(mvarFilename) - 127

If lFilePos > 0 Then' bug fix
Open mvarFilename For Binary As #iFreefile
Get #iFreefile, lFilePos, sData
Close #iFreefile
End If

' Aggorna la variabile info


If Left(sData, 3) = "TAG" Then
MP3Info.sTitle = Mid(sData, 4, 30)
MP3Info.sArtist = Mid(sData, 34, 30)
MP3Info.sAlbum = Mid(sData, 64, 30)
MP3Info.sYear = Mid(sData, 94, 4)
MP3Info.sComment = Mid(sData, 98, 30)
Dim lGenre
lGenre = Asc(Mid(sData, 128, 1))

If lGenre <= UBound(sGenre) Then
MP3Info.sGenre = sGenre(lGenre)
Else
MP3Info.sGenre = ""
End If
Else
MP3Info = GetInfo(mvarFilename)
End If

End Property

Private Function GetInfo(ByVal sFilename) As Info

Dim i As Info
GetInfo = i
Dim s
s = sFilename

If InStrRev(s, "\") > 0 Then 'it's a full path
s = Mid(s, InStrRev(s, "\") + 1)
End If

'drop extension

s = Left(s, InStrRev(s, ".", , vbTextCompare) - 1)
s = Replace(Trim(s), " ", " ")
s = Trim(s)

If CountItems(s, " ") < 1 Then
i.sTitle = Replace(s, "_", " ")
GetInfo = i
Exit Function
End If

s = Trim(Replace(s, "_", " "))

If Left(s, 1) = "(" And CountItems(s, "-") < 3 Then
i.sArtist = Mid(s, 2, InStr(s, ")") - 2)
s = Trim(Mid(s, InStr(s, ")") + 1))

If Left(s, 1) = "-" Then 'grab title
i.sTitle = Trim(Mid(s, 2))
Else 'grab title anyway

If InStr(s, "-") > 0 Then
i.sAlbum = Mid(s, InStr(s, "-") + 1)
i.sTitle = Left(s, InStr(s, "-") - 1)
Else
i.sTitle = Trim(s)
End If

End If

Else
Dim aThings
Dim l
aThings = Split(s, "- ")

For l = 0 To UBound(aThings)
If Not IsNumeric(aThings(l)) Then
If i.sArtist = "" Then
i.sArtist = aThings(l)
Else
If IsNumeric(aThings(l - 1)) Then ' title
If i.sTitle = "" Then
i.sTitle = aThings(l)
End If
ElseIf i.sAlbum = "" Then
i.sAlbum = aThings(l)
End If
End If
End If
Next ' i
End If

i.sArtist = Replace(Replace(i.sArtist, "(", ""), ")", "")

If Left(s, 1) <> "(" And i.sTitle = "" And (InStr(sFilename, "\") <> _
InStrRev(sFilename, "\")) Then
' recurse

GetInfo = GetInfo(FixDir(sFilename))
Else
GetInfo = i
End If
End Function

Private Function CountItems(s, sToCount)
Dim a
a = Split(s, sToCount)

If UBound(a) = -1 Then
CountItems = 0
Else
CountItems = UBound(a) - LBound(a)
End If
End Function

Private Function FixDir(sFullpath)
Dim s1, s2
s1 = Trim(Left(sFullpath, InStrRev(sFullpath, "\") - 1))
s2 = Trim(Mid(sFullpath, InStrRev(sFullpath, "\") + 1))
FixDir = s1 & " - " & s2
End Function

Public Property Get Title() As String
Title = Trim(MP3Info.sTitle)
End Property

Public Property Get Artist() As String
Artist = Trim(MP3Info.sArtist)
End Property

Public Property Get Genre() As String
Genre = Trim(MP3Info.sGenre)
End Property

Public Property Get Album() As String
Album = Trim(MP3Info.sAlbum)
End Property

Public Property Get Year() As String
Year = Trim(MP3Info.sYear)
End Property

Public Property Get Comment() As String
Comment = Trim(MP3Info.sComment)
End Property

(tagmp3.html)- by Paolo Puglisi - Modifica del 25/3/2019