Click here to Skip to main content
6,636,867 members and growing! (23,294 online)
Email Password   helpLost your password?
Languages » VB.NET » General     Intermediate

Reading and writing MP3 ID3v1 tags

By Thommy Mewes

A simple class for mainpulating ID3v1 tags of MP3 files.
VB, Windows, .NET 1.0, .NET 1.1, Visual Studio, Dev
Posted:4 Dec 2003
Views:78,882
Bookmarked:44 times
Announcements
Loading...
 
Search    
Advanced Search
Add to IE Search
printPrint   add Share
      Discuss Discuss   Broken Article?Report  
17 votes for this article.
Popularity: 4.59 Rating: 3.73 out of 5
1 vote, 5.9%
1
1 vote, 5.9%
2
2 votes, 11.8%
3
3 votes, 17.6%
4
10 votes, 58.8%
5

Introduction

This article provides a simple class which can read and write MP3 ID3v1 tags.

The code

The code itself is very easy to understand, here it is:

Imports System.IO

Public Class MP3ID3v1

    ' Constructor

    Public Sub New(Optional ByVal Filename As String = "")
        MyBase.New()
        If (Filename <> "") Then Me.Filename = Filename
    End Sub

    ' Genres

    Public Enum Genres As Byte
        Blues = 0
        ClassicRock = 1
        Country = 2
        Dance = 3
        Disco = 4
        Funk = 5
        Grunge = 6
        HipHop = 7
        Jazz = 8
        Metal = 9
        NewAge = 10
        Oldies = 11
        Other = 12
        Pop = 13
        RnB = 14
        Rap = 15
        Reggae = 16
        Rock = 17
        Techno = 18
        Industrial = 19
        Alternative = 20
        Ska = 21
        DeathMetal = 22
        Pranks = 23
        Soundtrack = 24
        EuroTechno = 25
        Ambient = 26
        TripHop = 27
        Vocal = 28
        JazzFunk = 29
        Fusion = 30
        Trance = 31
        Classical = 32
        Instrumental = 33
        Acid = 34
        House = 35
        Game = 36
        SoundClip = 37
        Gospel = 38
        Noise = 39
        AlternRock = 40
        Bass = 41
        Soul = 42
        Punk = 43
        Space = 44
        Meditative = 45
        InstrumentalPop = 46
        InstrumentalRock = 47
        Ethnic = 48
        Gothic = 49
        Darkwave = 50
        TechnoIndustrial = 51
        Electronic = 52
        PopFolk = 53
        Eurodance = 54
        Dream = 55
        SouthernRock = 56
        Comedy = 57
        Cult = 58
        Gangsta = 59
        Top40 = 60
        ChristianRap = 61
        PopFunk = 62
        Jungle = 63
        NativeAmerican = 64
        Cabaret = 65
        NewWave = 66
        Psychadelic = 67
        Rave = 68
        Showtunes = 69
        Trailer = 70
        LoFi = 71
        Tribal = 72
        AcidPunk = 73
        AcidJazz = 74
        Polka = 75
        Retro = 76
        Musical = 77
        RocknRoll = 78
        HardRock = 79
        None = 255
    End Enum

    ' Frame types

    Public Enum FrameTypes As Byte
        Title = 0
        Artist = 1
        Album = 2
        Year = 3
        Track = 4
        Comment = 5
        Genre = 6
    End Enum

    ' Filename

    Private mstrFilename As String
    Public Property Filename() As String
        Get
            Return mstrFilename
        End Get
        Set(ByVal Value As String)
            Dim objFile As File
            If (objFile.Exists(Value)) Then
                mstrFilename = Value
                Refresh()
            Else
                Throw New System.IO.FileLoadException( _
                    "The specified file does not exist", Value)
            End If
        End Set
    End Property

    ' TagExists

    Private mblnTagExists As Boolean
    Public ReadOnly Property TagExists() As Boolean
        Get
            Return mblnTagExists
        End Get
    End Property

    ' Frame

    Private mobjFrame(7) As Object
    Public Property Frame(ByVal FrameType As FrameTypes)
        Get
            Return mobjFrame(FrameType)
        End Get
        Set(ByVal Value)
            mobjFrame(FrameType) = Value
        End Set
    End Property

    ' Refresh (gets all tags from the specified file)

    Public Sub Refresh()

        ' Declarations

        Dim strTag As New String(" ", 3)
        Dim strTitle As New String(" ", 30)
        Dim strArtist As New String(" ", 30)
        Dim strAlbum As New String(" ", 30)
        Dim strYear As New String(" ", 4)
        Dim strComment As New String(" ", 28)
        Dim bytDummy As Byte
        Dim bytTrack As Byte
        Dim bytGenre As Byte

        ' Open the file

        Dim intFile As Integer = FreeFile()
        FileOpen(intFile, mstrFilename, OpenMode.Binary, _
              OpenAccess.Read, OpenShare.LockWrite)

        ' Gets length of file

        Dim lngLOF As Long = LOF(intFile)
        If (lngLOF > 128) Then

            ' Check for the ID3v1 tag

            FileGet(intFile, strTag, lngLOF - 127, True)
            If (strTag.ToUpper <> "TAG") Then

                ' No ID3v1 tag found

                mblnTagExists = False
                mobjFrame(0) = ""
                mobjFrame(1) = ""
                mobjFrame(2) = ""
                mobjFrame(3) = ""
                mobjFrame(4) = ""
                mobjFrame(5) = ""
                mobjFrame(6) = ""

            Else

                ' ID3v1 tag found

                mblnTagExists = True

                ' Read all frames from the file

                FileGet(intFile, strTitle)
                FileGet(intFile, strArtist)
                FileGet(intFile, strAlbum)
                FileGet(intFile, strYear)
                FileGet(intFile, strComment)
                FileGet(intFile, bytDummy)
                FileGet(intFile, bytTrack)
                FileGet(intFile, bytGenre)

                ' Assign the frame content to the properties

                mobjFrame(0) = strTitle
                mobjFrame(1) = strArtist
                mobjFrame(2) = strAlbum
                mobjFrame(3) = strYear
                mobjFrame(4) = bytTrack
                mobjFrame(5) = strComment
                mobjFrame(6) = bytGenre

            End If
        End If

        ' Close the file

        FileClose(intFile)

    End Sub

    ' Update

    Public Sub Update()

        ' Declarations

        Dim strTag As New String(" ", 3)
        Dim strTitle As New String(" ", 30)
        Dim strArtist As New String(" ", 30)
        Dim strAlbum As New String(" ", 30)
        Dim strYear As New String(" ", 4)
        Dim strComment As New String(" ", 28)
        Dim bytDummy As Byte
        Dim bytTrack As Byte
        Dim bytGenre As Byte

        ' Open the file

        Dim intFile As Integer = FreeFile()
        FileOpen(intFile, mstrFilename, OpenMode.Binary, _
           OpenAccess.ReadWrite, OpenShare.LockWrite)

        ' Gets length of file

        Dim lngLOF As Long = LOF(intFile)
        If (lngLOF > 0) Then
            If (lngLOF > 128) Then

                ' Check for an existing ID3v1 tag

                FileGet(intFile, strTag, lngLOF - 127)
                If (strTag.ToUpper <> "TAG") Then

                    ' No ID3v1 tag found, so just add one

                    Seek(intFile, lngLOF)
                    strTag = "TAG"
                    FilePut(intFile, strTag)

                End If

                ' Fix the length of the frames

                strTitle = LSet(mobjFrame(0), Len(strTitle))
                strArtist = LSet(mobjFrame(1), Len(strArtist))
                strAlbum = LSet(mobjFrame(2), Len(strAlbum))
                strYear = LSet(mobjFrame(3), Len(strYear))
                bytTrack = mobjFrame(4)
                strComment = LSet(mobjFrame(5), Len(strComment))
                bytGenre = mobjFrame(6)

                ' Write the frames to the file

                FilePut(intFile, strTitle)
                FilePut(intFile, strArtist)
                FilePut(intFile, strAlbum)
                FilePut(intFile, strYear)
                FilePut(intFile, strComment)
                FilePut(intFile, bytDummy)
                FilePut(intFile, bytTrack)
                FilePut(intFile, bytGenre)

            End If
        End If

        ' Close the file

        FileClose(intFile)

    End Sub

End Class

Using the code

To implement the class in your projects, just add the class file to your solution and declare a new instance of it:

Dim objMP3V1 As New MP3ID3v1("c:\song.mp3")

If the MP3 file contains tags, the property TagExists will be True, so you can start reading the tags (you'll find all frame types inside the code):

If (objMP3V1.TagExists) Then
    MessageBox.Show(objMP3V1.Frame(MP3ID3v1.FrameTypes.Album))
    MessageBox.Show(objMP3V1.Frame(MP3ID3v1.FrameTypes.Artist))
End If

For assigning a new tag, just set the property to the new value and call Update():

objMP3V1.Frame(MP3ID3v1.FrameTypes.Album) = "Album name"
objMP3V1.Update()

That's it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Thommy Mewes


Member
Feel free to contact me via Email or MSN Messenger (thommy@live.com).
Occupation: Architect
Company: Albamond GmbH
Location: Germany Germany

Other popular VB.NET articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 18 of 18 (Total in Forum: 18) (Refresh)FirstPrevNext
GeneralCan you do in C#? Pinmemberrnbguru16:34 22 Jul '09  
GeneralRe: Can you do in C#? PinmemberChuck Deluxe5:14 1 Aug '09  
GeneralMy vote of 1 Pinmemberjoseyoommen23:51 15 Jul '09  
GeneralImplementation PinmemberChuck Deluxe6:03 7 Jul '09  
Generalhip hop music writing PinmemberJust Blaaaze6:34 12 Dec '08  
Questiongetting error message Pinmemberalex-pof6:54 23 Jul '07  
GeneralRe: getting error message PinmemberCélio12:36 2 Mar '08  
AnswerRe: getting error message [modified] PinmemberSatakus10:16 29 Aug '09  
Generalupdate Pinmembersimacek5:27 3 Mar '05  
GeneralRe: update PinmemberThommy Mewes5:49 3 Mar '05  
GeneralTag Updates only in MP3 file Pinsussanonymous18:17 14 Feb '04  
GeneralRe: Tag Updates only in MP3 file PinmemberThommy Mewes14:44 17 Feb '04  
GeneralSomething is missing?? PinmemberAnders Munk12:17 18 Jan '04  
GeneralRe: Something is missing?? PinsussAnonymous12:23 18 Jan '04  
GeneralRe: Something is missing?? PinmemberThommy Mewes12:25 18 Jan '04  
GeneralRe: Something is missing?? PinmemberAnders Munk5:57 19 Jan '04  
GeneralUpdate PinmemberThommy Mewes13:24 7 Dec '03  
GeneralRe: Update Pinmembereggie521:07 5 Sep '04  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 4 Dec 2003
Editor: Nishant Sivakumar
Copyright 2003 by Thommy Mewes
Everything else Copyright © CodeProject, 1999-2009
Web18 | Advertise on the Code Project