Задать вопрос
@pavelzabavin

Как массово записать теги из текстовых файлов нужным музыкальным файлам в PowerShell?

Привет!

В папке лежат файлы 01.mp3, 01.mp3_dig, 02.mp3, 02.mp3_dig.

Например, файл 01.mp3_dig описывает файл 01.mp3 и имеет вид:

Artist=Иван Иванов/Петя/Катя
Title=Супер Песня

Каким образом в PowerShell отредактировать код так, чтобы пакетом преобразовать все музыкальные файлы, а именно записать информацию в ID3v2 теги Artist и Title?

Проблема в том, что если
Title=Название, Artist=Иван/Петя — то данные записываются корректно.

В случае, если Title=Название Хорошее, Artist=Иван Романов/Петя Иванов (т.е. добавляется пробел или дефис, ничего не работает...).

# Устанавливаем путь к директориям
$path = "C:\Users\pavel\Desktop\base2"
$ffmpeg = "C:\Program Files\ffmpeg\bin\ffmpeg.exe"

# Заходим в нужную директорию с файлами
Set-Location $path

# Получаем список файлов в директории
$files = Get-ChildItem -Filter "*.mp3_dig"

# Перебираем каждый файл
foreach ($file in $files) {
    # Проверяем наличие файла NAME.mp3_dig
    if (Test-Path $file.FullName) {
        # Получаем информацию из файла NAME.mp3_dig
        $title = Select-String -Pattern 'Title=' -Path $file.FullName | ForEach-Object { $_.Line -replace 'Title=' }
        $artist = Select-String -Pattern 'Artist=' -Path $file.FullName | ForEach-Object { $_.Line -replace 'Artist='}

        # Записываем информацию в ID3 tag с помощью ffmpeg
        Start-Process -FilePath $ffmpeg -ArgumentList "-i $($file.BaseName).mp3 -metadata title='$title' -metadata artist='$artist' -c copy -y $($file.BaseName)_edited.mp3" -Wait
       
        # Показываем сообщение об успешной записи или ошибки
        Write-Host "Информация записана в файл $($file.BaseName)_edited.mp3"
    } else {
        Write-Host "Файл $($file.Name) не найден"
    }
}


Заранее спасибо!
  • Вопрос задан
  • 129 просмотров
Подписаться 1 Простой 2 комментария
Решения вопроса 1
@MaxKozlov Куратор тега PowerShell
Вы используете параметр -argumentlist, а фактически передаете туда одну строку ограниченную внешними двойными кавычками. Что там из этого наинтерпретирует ffmpeg, извесно только ffmpeg
Попробуйте аргументы передавать именно списком
То есть типа
'-i', "$($file.BaseName).mp3", '-metadata', "title=`"$title`""

То есть через запятую, каждый параметр в кавычках. Можно всегда двойных, можно одинарных, если интерпретировать внутри нечего, title в дополнительные экранированные кавычки
А еще лучше будет не использовать start-process, а использовать &
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Alex_Geer
@Alex_Geer
System Engineer
Если кратко то:
1. Открываем PS и подгружаем библиотеку которая умеет работать с тегами если не ошибаюсь, это TagLib.
2. Прописываем путь к папке с музыкальными файлами.
3. Получаем список файлов .mp3 в папке
4. В цикле получаем пути к файлу .mp3_dig, читаем информацию из них, разделяем на теги, и наконец то записываем информацию в mp3.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы