形势与任务
我有一个很大的音乐收藏,我想用PowerShell和利普清洗他们的音乐。有些标记如comment或encoding应该删除,而其他如artist或title则不应该删除。
通常您以这种方式操作ID3标记(简化版本)
# Add taglib dll
[Void][System.Reflection.Assembly]::LoadFrom("$PSScriptRoot\taglib-sharp.dll")
# Load example mp3 into memory as [taglib.file]
$media = [TagLib.File]::Create("C:\path\to\musicFile.mp3")
# Change comment tag
$media.tag.tags[0].Comment = "Hello World"
# Save tags back to mp3 file
$Media.Save()问题
许多音乐文件将自定义信息(如URL或Shop Name )存储在帧TXXX中。不幸的是,上述方法无法访问此框架。或者我还没找到办法。
相反,你用
# Read UserTextInformationFrame
$media.GetTag([TagLib.TagTypes]::Id3v2).GetFrames("TXXX")此用户定义的文本信息框架可以保存多个值。还有一些是有用的,因为音乐播放器,如Foobar商店PERFORMER,DATE或replay_track_gain标签在TXXX。
上面一行的示例输出可以是:
Description : replaygain_track_gain
Text : {-5.00 dB}
FieldList : {-5.00 dB}
TextEncoding : Latin1
FrameId : {84, 88, 88, 88}
Size : 32
Flags : None
GroupId : -1
EncryptionId : -1
Description : URL
Text : {www.amazon.com}
FieldList : {www.amazon.com}
TextEncoding : UTF16
FrameId : {84, 88, 88, 88}
Size : 43
Flags : None
GroupId : -1
EncryptionId : -1之后,我能够过滤掉所有不必要的TXXX值。
# Create a whitelist of TXXX frames
$goodTXXX = 'performer','replaygain_track_gain','date'
# Read UserTextInformationFrame AND filter it
$newTXXX = $Media.GetTag([TagLib.TagTypes]::Id3v2).GetFrames("TXXX") |
where { $goodTXXX -contains $_.Description } 问题:如何将多个值写入TXXX框架
因此,我的问题是,如何将过滤后的结果保存回mp3文件?
我的失败尝试是:
$media.GetTag([TagLib.TagTypes]::Id3v2).RemoveFrames("TXXX")
$media.GetTag([TagLib.TagTypes]::Id3v2).SetTextFrame("TXXX",$newTXXX)
# Removes old values, but does not show anything in Foobar
#$media.GetTag([TagLib.TagTypes]::Id3v2).GetFrames("TXXX").SetText("Hello World")
# Shows garbage in Foobar. And it's not usable for multiple valuesSetTextFrame的Taglib-Sharp文档
的额外问题:是标签库-能够去掉Id3v1和ID3v2.4标签,同时将新标签保存为ID3v2.3标记?(相关答案,但不区分v2.3和v2.4)
发布于 2015-08-24 12:18:52
我找到了一种尝试和错误的方法。这并不优雅,因为如果您只想更改一个TXXX值,则必须删除所有TXXX值并将它们添加回
# Add taglib dll
[Void][System.Reflection.Assembly]::LoadFrom("$PSScriptRoot\taglib-sharp.dll")
# Load example mp3 into memory as [taglib.file]
$media = [TagLib.File]::Create("C:\path\to\musicFile.mp3")
# Get or create the ID3v2 tag.
[TagLib.Id3v2.Tag]$id3v2tag = $media.GetTag([TagLib.TagTypes]::Id3v2, 1)
# Create new 'TXXX frame' object
$TXXXFrame = [TagLib.Id3v2.UserTextInformationFrame]("WWW")
# Delete complete TXXX frame first, or else all values are just appended
$id3v2tag.RemoveFrames("TXXX")
# Set the value/text in the newly created TXXX frame, default Text encoding is UTF8
# Use curly brackets instead of single quotation marks
$TXXXFrame.Text = {www.myurl.com}
# Add TXXX frame to tag
$id3v2tag.AddFrame($TXXXFrame)
# Write all changed tags back to file
$media.Save()https://stackoverflow.com/questions/32168877
复制相似问题