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

时间:2012-11-13 12:54:32

标签: c# .net id3 taglib-sharp

我正在尝试使用Taglib-sharp更新标签/发布商字段,但我无法使用对象浏览器在其对象层次结构中的任何位置看到它。

我搜索了谷歌和文档,看起来这是一个没有照顾的字段。

在我寻找可以编辑这些字段的备选方案(可以任何人建议吗?)之前,我认为我有最后一个问题,并在StackOverflow社区内询问熟悉TagLib-sharp的人是否有更明智的意见?

先谢谢,

弗朗西斯

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

4 个答案:

答案 0 :(得分:5)

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

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

  1. 下载Source

  2. 打开文件 TagLib / Tag.cs​​ 并插入以下代码(我将其插入PerformersSort,250行下方)

    public virtual string Publisher
    {
        get { return ""; }
        set { }
    }
    
  3. 打开文件 TagLib / Id3v2 / Tag.cs​​ 并插入以下代码(我在PerformersSort下面插入了第1292行)

    public override string Publisher
    {
        get { return GetTextAsString(FrameType.TPUB); }
        set { SetTextFrame(FrameType.TPUB, value); }
    }
    
  4. 打开文件 TagLib / Id3v2 / FrameTypes.cs 并插入以下代码(我将其插入TPOS第71行下方)

    public static readonly ReadOnlyByteVector TPUB = "TPUB";
    
  5. 现在出现了“啊哈”的事情。打开文件 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;
        }
    }
    
  6. 最后,编译代码。

  7. 重要:我在编译代码时遇到了问题。您必须下载SharpZipLib dll(.NET 2.0)并在taglib项目中包含此dll。另外,我需要安装NUnit,这是我用Nuget制作的。最后,我评论了GDK lib及其在测试代码中的所有错误,因为在生产中它不会被使用。

答案 1 :(得分:1)

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);}
}

然后,您可以使用类似

的内容访问发布商字段
TagLib.File tf = TagLib.File.Create(...);   // open file
tf.Tag.Publisher = "Label XY";              // write new Publisher
tf.Save();                                  // save tags

请注意,这是一个丑陋的黑客,但适用于MP3文件。

答案 2 :(得分:0)

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

希望TagLib#有这种方法。

答案 3 :(得分:0)

更新2019-12-30:

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