我正在尝试使用 Taglib-sharp 更新标签/发布者字段,但使用对象浏览器在其对象层次结构中的任何地方都看不到它。
我搜索了谷歌和文档,看起来这是一个不适合的领域。
在我寻找可以编辑这些字段的替代方案(任何人都可以提出任何建议?)之前,我想我会最后一次破解并在 StackOverflow 社区中询问熟悉 TagLib-sharp 的人是否有更明智的意见?
提前致谢,
弗朗西斯
更新:我调查了其他库,例如 mpg123 和 UltraID3Lib,但它们似乎有相同的限制。
我正在尝试使用 Taglib-sharp 更新标签/发布者字段,但使用对象浏览器在其对象层次结构中的任何地方都看不到它。
我搜索了谷歌和文档,看起来这是一个不适合的领域。
在我寻找可以编辑这些字段的替代方案(任何人都可以提出任何建议?)之前,我想我会最后一次破解并在 StackOverflow 社区中询问熟悉 TagLib-sharp 的人是否有更明智的意见?
提前致谢,
弗朗西斯
更新:我调查了其他库,例如 mpg123 和 UltraID3Lib,但它们似乎有相同的限制。
好吧,丹尼尔福克斯的回答对我不起作用。但是,这只是一个开始。
在 TagLib-sharp 代码中添加字段的步骤是:
下载源
打开文件TagLib/Tag.cs 并插入以下代码(我将其插入到 PerformersSort 下方,第 250 行):
public virtual string Publisher
{
get { return ""; }
set { }
}
打开文件TagLib/Id3v2/Tag.cs 并插入以下代码(我将其插入到 PerformersSort 下方,第 1292 行):
public override string Publisher
{
get { return GetTextAsString(FrameType.TPUB); }
set { SetTextFrame(FrameType.TPUB, value); }
}
打开文件TagLib/Id3v2/FrameTypes.cs并插入以下代码(我将其插入到 TPOS 下方,第 71 行):
public static readonly ReadOnlyByteVector TPUB = "TPUB";
现在是“啊哈”的事情。打开文件TagLib/CombinedTag.cs 并插入以下代码(我将其插入到 PerformersSort 下方,第 318 行):
public override string Publisher
{
get
{
foreach (Tag tag in tags)
{
if (tag == null)
continue;
string value = tag.Publisher;
if (value != null)
return value;
}
return null;
}
set
{
foreach (Tag tag in tags)
if (tag != null)
tag.Publisher = value;
}
}
最后,编译代码。
重要提示:我在编译代码时也遇到了问题。您必须下载SharpZipLib dll (.NET 2.0) 并将此 dll 包含在 taglib 项目中。另外,我需要安装我用 Nuget 制作的 NUnit。最后,我在测试代码中注释了 GDK 库及其所有错误,因为在生产中不会使用它。
那么 TagLib# 无法读取发布者标签。即使是目前的最新版本(2.1.0.0)也无法做到这一点。作为替代方案,您可以使用免费提供的 TagLib# 的源代码自己添加此功能。
为此,请打开文件TagLib/Id3v2/FrameTypes.cs并在某处添加以下行:
public static readonly ReadOnlyByteVector TPUB = "TPUB"; // Publisher field
在文件TagLib/Id3v2/Tag.cs 中:
public string Publisher {
get {return GetTextAsString (FrameType.TPUB);}
set {SetTextFrame (FrameType.TPUB, value);}
}
然后,您可以使用类似这样的方式访问 Publisher 字段
TagLib.File tf = TagLib.File.Create(...); // open file
tf.Tag.Publisher = "Label XY"; // write new Publisher
tf.Save(); // save tags
请注意,这是一个丑陋的 hack,但适用于 MP3 文件。
我不习惯 TagLib#,但我在 Qt 项目中使用 TagLib,我在其中检索此信息检查TagLib::File::properties
. 看一下文档,它只是一个包含每个属性和值的字符串映射。
希望 TagLib# 有这个方法。
2019 年 12 月 30 日更新:
看起来主要的taglib项目已经包含了 publisher 字段,所以你应该只使用最新版本。我已经从我的 fork 更新到最新的 TagLib,并且可以证明它按预期工作。
提示:如果您想更改 TagLib 编译到的框架版本(在编写时默认为 462 和 .NET STD 2.0),您需要更改位于 Solutions 文件夹中的 Directory.Build.Props 文件。
<Project>
<PropertyGroup>
<ReleaseVersion>2.2.0.0-beta</ReleaseVersion>
<RepositoryUrl>https://github.com/mono/taglib-sharp</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<TaglibSharpTargetFramework>net472;netstandard2.0</TaglibSharpTargetFramework>
<LangVersion>latest</LangVersion>
</PropertyGroup>
</Project>
我在上面粘贴了我的版本,这表明我已将其更改为编译为 .NET 4.7.2。