【问题标题】:Update a song metadata with taglib-sharp and Powershell使用 taglib-sharp 和 Powershell 更新歌曲元数据
【发布时间】:2018-02-21 12:42:55
【问题描述】:

我正在尝试使用taglib-sharppowershell 更新歌曲元数据。 它适用于大多数文件,但某些 wma 文件有错误(我可以播放这些文件)。

# Load the tag-lib assembly
[Reflection.Assembly]::LoadFrom( (Resolve-Path ("D:\zic\lib\taglib-sharp.dll")))

# Load up the song file and its metadata
$path_file="‪D:\zic\misc\Artist_Title.wma"
$song = [TagLib.File]::Create((resolve-path $path_file))
$file_name = [System.IO.Path]::GetFileNameWithoutExtension($path_file) 
$file_name_array=$file_name.Split("_")
$artist=$file_name_array[0]
$title=$file_name_array[1]

#set the artist and title (metadata)
$song.Tag.Artists = $artist 
$song.Tag.AlbumArtists = $artist 
$song.Tag.Title = $title

# Save the metadata 
$song.Save() 

文件保存时出现错误:

这是powershell 的问题吗? taglib-sharp 问题? 我正在使用taglib_sharp 2.0.50727 版和powershell 5.1.16299.248 版。


编辑

使用 try catch 来显示错误:

# Save the metadata
try
{
    $song.Save() 
}
catch [Exception]
{
    Write-Host $_.Exception|format-list -force
}

控制台显示:


编辑 2

如果我手动编辑标签(右键单击文件-> 属性)或重命名文件,程序运行没有问题并且标签被更新。奇怪!

【问题讨论】:

  • 喜欢taglib-sharp 的问题。检查$Error[0].Exception.StackTrace 看看代码中的哪些地方都失败了
  • 我刚刚用跟踪编辑了我的帖子。
  • 我很确定这些文件实际上并没有命名为Artist_Artists.wma 对吗?查看引发异常的文件之一和不引发异常的文件的实际文件名。

标签: powershell metadata taglib-sharp


【解决方案1】:

正如@tukan 所建议的,一些标签的长度是个问题。

让我们显示一首歌的所有标签:

$song = [TagLib.File]::Create((resolve-path $path_file))
foreach ($tag in $song.Tag)
{
    Write-Host "tag:" $tag
}

输出:

tag:
tag: {D1607DBC-E323-4BE2-86A1-48A42A28441E}
tag: 10.00.00.3802
tag: 0.0.0.0000
tag: 0
tag: 2007
tag: 128317523430000000
tag: AMGa_id=R  1411185;AMGp_id=VA;AMGt_id=T 14593744
tag: Éri Tabuhci
tag: Universal
tag: World
tag: Les 100 Plus Grands Tubes Disc 3
tag: Unknown Artist
tag: 14+96+34B7+ADE8+E42D+11DF5+15230+196F2+1C2D1+1FC01+257E9+29612+2D100+30FB0+34ECE+3923F+3D39B+40CF6+454FF+49162+4D5D0+521B0
tag: AMG
tag: World
tag: 5

倒数第四个标签太长,是问题的原因。 解决方案是加载文件,删除所有现有标签,保存,再次加载,然后设置您想要的标签。 例如:

$song = [TagLib.File]::Create((resolve-path $path_file))
$song.RemoveTags($song.TagTypes)
$song.Save()

$song = [TagLib.File]::Create((resolve-path $path_file))
$song.Tag.Artists = "blabla"
...

希望这会有所帮助!

【讨论】:

  • 我很高兴它成功了!我希望解决方案能对某人有所帮助。
【解决方案2】:

我基于source code 的猜测是您达到了2,147,483,647 的ByteVector 大小(可能是文件大小或某些列表)限制- int 溢出。

如果.wma 文件或列表的文件大小大于2,147,483,647 字节,您将得到负数(溢出)并因此得到此异常。

你必须在 github 上为这个项目开一张票,他们应该在那里使用 long 类型,它有限制 9,223,372,036,854,775,807

当您手动编辑时,您不会达到此限制,因此它可以工作。

【讨论】:

  • 我认为不是文件大小的问题,文件很小,在 2 到 5 MB 之间。
  • @rom 那么这是您尝试更新的一些内部列表。您能列出伪造的.wma 文件中的$song.Tag.* 吗?
  • 谢谢,正如你所建议的,一些标签的长度是问题所在。我将发布我的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多