使用 taglib-sharp 和 Powershell 更新歌曲元数据
Update a song metadata with taglib-sharp and Powershell
我正在尝试使用 taglib-sharp
和 powershell
更新歌曲元数据。
它适用于大多数文件,但某些 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
如果我手动编辑标签(右键单击文件 -> 属性)或重命名文件,程序运行没有问题并且标签被更新。奇怪!
我的猜测基于 source code is that you reached a ByteVector size (probably file size or some list) limit which is 2,147,483,647 - int 溢出。
如果 .wma
文件或列表的文件大小大于 2,147,483,647
字节,您将得到负数(溢出)并因此出现此异常。
您必须使用此项目在 github 上开票,他们应该使用 long
类型,该类型有限制 9,223,372,036,854,775,807
.
当您手动编辑时,您不会达到此限制,所以它可以工作。
正如@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"
...
希望对您有所帮助!
我正在尝试使用 taglib-sharp
和 powershell
更新歌曲元数据。
它适用于大多数文件,但某些 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
如果我手动编辑标签(右键单击文件 -> 属性)或重命名文件,程序运行没有问题并且标签被更新。奇怪!
我的猜测基于 source code is that you reached a ByteVector size (probably file size or some list) limit which is 2,147,483,647 - int 溢出。
如果 .wma
文件或列表的文件大小大于 2,147,483,647
字节,您将得到负数(溢出)并因此出现此异常。
您必须使用此项目在 github 上开票,他们应该使用 long
类型,该类型有限制 9,223,372,036,854,775,807
.
当您手动编辑时,您不会达到此限制,所以它可以工作。
正如@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"
...
希望对您有所帮助!