问题
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