ElektroStudios ElektroStudios - 5 months ago 49
Vb.net Question

Is it possible, using TagLibSharp, to remove a Lyrics3v2 tag from a MP3 file?

I wonder if it's possible to remove a Lyrics3v2 tag type from a MP3 file using TagLibSharp library.

This documentation says that the block entry starts with word "LYRICSBEGIN" and ends with "LYRICS200", also it says that the ID3 tag should be present to let exists the Lyrics3v2 tag ...but it doesn't specifies if reffers to ID3v1 or ID3v2 tag, or any of them, anyways I don't understand that part, because Lyrics3v2 tag is a single tag type, is not part of an ID3v1/ID3v2 tag type, it has its own entry on the mp3 header so... I don't understand what it means about the ID3v1/ID3v2 "dependancy".

Anyways assuming that info is correct, then I should be able to use TagLibSharp to remove the ID3v1 and ID3v2 tags from the mp3 file containing the Lyrics3v2 tag then that tag will be removed too?, however, the tag still exists.

Also, the

property that exposes TagLibSharp's classes seems doesn't affect to the Lyrics3v2 tag, all this is very confussing.


I wrote this solution using taglibsharp:

' *************************************************************
' *************************************************************

Imports System.IO
Imports System.Text
Imports TagLib

''' <summary>
''' Represents the <c>Lyrics3</c> tag for a MP3 file.
''' </summary>
Public Class Lyrics3Tag

    Protected ReadOnly mp3File As Mpeg.AudioFile

    ''' <summary>
    ''' The maximum length for the <c>Lyrics3</c> block to prevent issues like removing a false-positive block of data.
    ''' <para></para>
    ''' Note that this is a personal attempt to prevent catastrophes, not based on any official info.
    ''' </summary>
    Private ReadOnly maxLength As Integer = 512 ' bytes

    Private Sub New()
    End Sub

    Public Sub New(ByVal mp3File As Mpeg.AudioFile)
        Me.mp3File = mp3File
    End Sub

    ''' <summary>
    ''' Entirely removes the <c>Lyrics3</c> tag.
    ''' </summary>
    Public Overridable Sub Remove()

        Dim initVector As New ByteVector(Encoding.UTF8.GetBytes("LYRICSBEGIN"))
        Dim initOffset As Long = Me.mp3File.Find(initVector, startPosition:=0)

        If (initOffset <> -1) Then

            ' The Lyrics3 block can end with one of these two markups, so we need to evaluate both.
            For Each str As String In {"LYRICS200", "LYRICSEND"}

                Dim endVector As New ByteVector(Encoding.UTF8.GetBytes(str))
                Dim endOffset As Long = Me.mp3File.Find(endVector, startPosition:=initOffset)

                If (endOffset <> -1) Then

                    Dim length As Integer = CInt(endOffset - initOffset) + (str.Length)
                    If (length < Me.maxLength) Then
                            Me.mp3File.Seek(initOffset, SeekOrigin.Begin)
                            ' Dim raw As String = Me.mp3File.ReadBlock(length).ToString()
                            Me.mp3File.RemoveBlock(initOffset, length)
                            Exit Sub

                        Catch ex As Exception

                            Me.mp3File.Seek(0, SeekOrigin.Begin)

                        End Try

                    Else ' Length exceeds the max length.
                         ' We can handle it or continue...
                        Continue For

                    End If

                End If

            Next str

        End If

    End Sub

End Class

Example usage:

Dim mp3File As New Taglib.Mpeg.AudioFile("filepath")

Using lyrics As New Lyrics3Tag(mp3File)
End Using