taglib-sharp 中是不是有与 Label/Publisher 等效的字段?

Posted

技术标签:

【中文标题】taglib-sharp 中是不是有与 Label/Publisher 等效的字段?【英文标题】:Is there an equivalent field to Label/Publisher in taglib-sharp?taglib-sharp 中是否有与 Label/Publisher 等效的字段? 【发布时间】:2012-11-13 12:54:32 【问题描述】:

我正在尝试使用 Taglib-sharp 更新标签/发布者字段,但使用对象浏览器在其对象层次结构中的任何地方都看不到它。

我搜索了谷歌和文档,看起来这是一个不适合的领域。

在我寻找可以编辑这些字段的替代方案(有人可以提出任何建议吗?)之前,我想我会最后一次尝试并在 *** 社区中询问熟悉 TagLib-sharp 的人,他们有更明智的意见?

提前致谢,

弗朗西斯

更新:我调查了其他库,例如 mpg123 和 UltraID3Lib,但它们似乎有相同的限制。

【问题讨论】:

【参考方案1】:

好吧,Daniel Fuchs 的回答对我不起作用。但是,这只是一个开始。

在TagLib-sharp代码中添加字段的步骤是:

    下载Source

    打开文件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 库及其所有错误,因为在生产中不会使用它。

【讨论】:

感谢您的精彩跟进。 我可以确认这是可行的。非常详细的答案。很棒的东西 JoaoBrenoah!【参考方案2】:

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 文件。

【讨论】:

嗨丹尼尔,我刚刚看到你的回复。我现在就试试看它是否适合我。谢谢一百万! 它对我不起作用。弗朗西斯,它对你有用吗? 我还无法测试您的解决方案或 Daniel 的解决方案,因为我在我的项目中遇到了数据提供者的技术问题 (Json) 并且提供者 (Beatport) 不是很好即将得到支持。如果有任何新的更新,我会更新这篇文章。【参考方案3】:

我不习惯 TagLib#,但我在 Qt 项目中使用 TagLib,我在其中检索此信息以检查 TagLib::File::properties。 看一下文档,它只是一个包含每个属性和值的字符串映射。

希望 TagLib# 有这个方法。

【讨论】:

感谢维尼修斯的建议。我想我已经迫不及待地想看看 TagLib-sharp 源代码,看看我是否能够自己扩展代码。如果有人在这方面有过一些经验,可以给我一些建议,我们将不胜感激。 您好,刚刚检查过了,事实上,TagLib# 并没有像 TagLib 那样暴露 TagLib::File::properties。也许您可以使用 C TagLib C API,但是您必须为 C 函数声明 C# 包装器。另外,如果你是 Windows,你将需要 TagLib C++ DLL,在 Windows 下构建有点困难,但我可以发给你一个我自己编译的。 感谢您的跟进。如果您可以通过 C++ dll 发送,将不胜感激。是的,我使用的是 Windows 7 64 位。 请告诉我您的电子邮件地址,或其他方式为您发送图书馆。 是的,您可以通过 francis.c.chung 的 googlemail 将其通过电子邮件发送给我。再次感谢。【参考方案4】:

2019 年 12 月 30 日更新:

看起来主要的taglib 项目已包含发布者字段,因此您应该只使用最新版本。我已经从我的 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。

【讨论】:

以上是关于taglib-sharp 中是不是有与 Label/Publisher 等效的字段?的主要内容,如果未能解决你的问题,请参考以下文章

如果没有关键字,则无法添加图像关键字,Taglib-Sharp

在我当前的 vb.net 解决方案中添加 taglib-sharp 项目解决方案时遇到困难

使用 taglib-sharp 删除 ID3 标签的所有图片

TagLib-Sharp - 重新标记文件

使用 Taglib-Sharp 操作用户定义的标签(TXXX 帧)

CORBA 中是不是有与 writeReplace 等价的方法?