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

本秂侑毒 提交于 2019-12-21 20:29:22

问题


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 Lyrics property that exposes TagLibSharp's classes seems doesn't affect to the Lyrics3v2 tag, all this is very confussing.


回答1:


According to How to remove Lyrics3 v2 tag from id3? the answer is "No". You will find a workaround in the linked answer below.




回答2:


I wrote this solution using taglibsharp:

' *************************************************************
' THIS CLASS IS PARTIALLY DEFINED FOR THIS STACKOVERFLOW ANSWER
' *************************************************************

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>
    <DebuggerStepThrough>
    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
                        Try
                            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
                            Throw

                        Finally
                            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)
    lyrics.Remove()
End Using


来源:https://stackoverflow.com/questions/36963163/is-it-possible-using-taglibsharp-to-remove-a-lyrics3v2-tag-from-a-mp3-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!