Обновите метаданные песни с помощью taglib-sharp и 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.


ИЗМЕНИТЬ

С попыткой поймать, чтобы показать ошибку:

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

В консоли отображается:

введите здесь описание изображения


ИЗМЕНИТЬ 2

Если я редактирую теги вручную (правый клик по файлу -> свойства) или переименовываю файл, программа запускается без проблем и теги обновляются. Странный!


person rom    schedule 21.02.2018    source источник
comment
Вроде проблема с taglib-sharp. Осмотрите $Error[0].Exception.StackTrace, чтобы увидеть, где в коде все это падает   -  person Mathias R. Jessen    schedule 21.02.2018
comment
Я только что отредактировал свой пост с трассировкой.   -  person rom    schedule 21.02.2018
comment
Я почти уверен, что файлы на самом деле не называются Artist_Artists.wma, верно? Посмотрите на фактическое имя файла одного из файлов, который вызывает исключение, и одного, который этого не делает.   -  person Fᴀʀʜᴀɴ Aɴᴀᴍ    schedule 24.02.2018


Ответы (2)


Как предположил @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"
...

Надеюсь это поможет!

person rom    schedule 28.02.2018
comment
Я рад, что это получилось! Надеюсь кому-нибудь поможет решение. - person tukan; 28.02.2018

Мое предположение, основанное на исходном коде: что вы достигли предела размера ByteVector (возможно, размера файла или некоторого списка), который составляет 2,147,483,647 - переполнение int.

Если размер файла .wma файлов или списка больше 2,147,483,647 байт (ов), вы получите отрицательные числа (переполнение) и, таким образом, получите это исключение.

Вы должны открыть тикет на github с этим проектом, и они должны использовать там тип long с ограничением 9,223,372,036,854,775,807.

Когда вы редактируете вручную, вы не достигаете этого предела, поэтому он работает.

person tukan    schedule 28.02.2018
comment
Я не думаю, что это проблема размера файла, файлы довольно маленькие, от 2 до 5 МБ. - person rom; 28.02.2018
comment
@rom, тогда это какой-то внутренний список, который вы пытаетесь обновить. Не могли бы вы перечислить $song.Tag.* поддельных .wma файлов? - person tukan; 28.02.2018
comment
Спасибо, как вы и предположили, проблема заключалась в длине некоторых тегов. Я собираюсь опубликовать свое решение. - person rom; 28.02.2018