AppleScript для возврата условия в зависимости от длины аудиофайла

5

Я хотел бы использовать Hazel ( автоматизатор файловой системы на основе правил) для macOS, чтобы автоматически перемещать аудиофайлы микстейпа из одной папки в другую, если их продолжительность превышает 30 минут.

Желто не предоставляет встроенный метод проверки аудио длину файла (что я знаю), но он дает возможность запускать правила , если передается условие AppleScript, то есть return true.

Судя по скриншоту ниже, я думаю, что это работает, если length of theFile > 30*60 seconds: return true (псевдокод) .

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

Однако я не уверен, как это сделать через AppleScript. Есть идеи как это сделать или с чего начать? Поиск в Интернете не дал много базовых идей, но, похоже, это возможно.


Примечание . Предоставление рекомендаций по AppleScripts выходит за рамки поддержки Hazel AFAIK, поэтому я не могу получить от них никакой помощи.

Winterflags
источник
2
У меня нет Хейзел, поэтому я не могу проверить с ним и почему комментарий по сравнению с ответом, однако вот AppleScript do shell script команда , которая будет установлена theResultна trueили , falseесли вы можете выяснить , как передать его theFileName: set theResult to (do shell script "[[ $(afinfo -r '" & theFileName & "' | awk '/estimated duration:/{print int($3/60)}') -gt 30 ]] && echo 'true' || echo 'false'") as boolean. Затем вы можете добавить эту строку после нее, return theResultи она будет эквивалентна return trueили return falseсоответственно.
user3439894
1
@ user3439894 Я понимаю, почему вы не опубликовали это как ответ, но я все еще думаю, что вы должны это сделать, потому что это не позволяет ОП удалить вопрос (по какой-либо причине). И в этом случае ваш ответ может привести к решению, которое поможет другим. :)
Мономет
@Monomeeth, я скачал Hazel и после небольшой модификации проверил код в моем комментарии. Кстати, я не верю, что добавление ответа может помешать автору ФП удалить свой вопрос.
user3439894
1
@Winterflags, Я обновить ответ , чтобы добавить информацию о том , как сделать это быстрее, прочитайте раздел в конце ответа после: «Если вы хотите , чтобы содержимое из do shell script команды , чтобы работать быстрее, а затем использовать следующее:»
user3439894

Ответы:

6

Хорошо, я скачал Hazel и протестировал следующий код AppleScript на новом правиле, чтобы проверить его работоспособность. Следующий код при использовании в встроенном сценарии будет установлен theResultв trueна theFile, звуковой файл , который больше , чем 30 минут. Любой файл 30 минут или меньше, или не аудио файл будет установлен theResultна false:

set theResult to (do shell script "[[ $(afinfo -r '" & POSIX path of theFile & "' | awk '/estimated duration:/{print int($3/60)}') -gt 30 ]] && echo 'true' || echo 'false'") as boolean
return theResult
  • Обратите внимание, что с моего первого комментария до публикации этого ответа я изменился theFileNameна POSIX path of theFile, и, как вы можете видеть на изображении ниже, он утвердил правило. Затем он также успешно обработал правило, как я его определил.
  • Чтобы изменить количество минут, измените значение в правой части оператора , например,
    -gt 30на желаемое время, например -gt 20. Оператор также может быть изменен на любой одной из следующих причин : -eq, -ne, -lt, -le, -gtили-ge

Панель предпочтений Hazel

Понимание, немного, содержание do shell script команды :

  • afinfoне так много, как на странице руководства , так что просто введите afinfoв Терминале и нажмите Enter для его вариантов .
  • afinfo -r - {-r --real} get the estimated duration after obtaining the real packet count
  • Пример вывода afinfo -r:

     $ afinfo -r '09 Karn Evil 9.mp3'
     File:           09 Karn Evil 9.mp3
     File type ID:   MPG3
     Num Tracks:     1
    ----
     Data format:     2 ch,  44100 Hz, '.mp3' (0x00000000) 0 bits/channel, 0 bytes/packet, 1152 frames/packet, 0 bytes/frame
                        no channel layout.
     audio bytes: 85117515
     audio packets: 81460
     estimated duration: 2127.935 sec
     bit rate: 320000 bits per second
     packet size upper bound: 1052
     maximum packet size: 1045
     audio data file offset: 275530
     optimized
    ----
     $
    
    • Приведенный выше вывод получает piped ( |) в awk.
  • awk '/estimated duration:/{print int($3/60)}'
    • awkнаходит запись (строка) , содержащую estimated duration:в выходе из afinfoводопроводных к нему и выводит третье поле , $3, 2127.935как целое, будучи разделено , 60чтобы получить число минут, так как значение времени в секундах. В приведенном примере выход , awkвозвращается:35
  • $(...)Часть подстановки команд передается 35в тест [[ $(...) -gt 30 ]], поэтому она приравнивается к эхолоту [[ 35 -gt 30 ]]и, в результате, с помощью логических операторов true. Если бы это значение было равно или меньше 30, или файл не являлся аудио, он бы отражался false.

Если вы хотите , чтобы содержимое из do shell script команды , чтобы работать быстрее, а затем использовать следующее:

set theResult to (do shell script "[[ $(afinfo -b '" & POSIX path of theFile & "' | awk 'FNR == 3 {print int($1/60)}') -gt 30 ]] && echo 'true' || echo 'false'") as boolean
return theResult
  • afinfo -b - {-b --brief} print a brief (one line) description of the audio file
    • Это работает быстрее, чем при использовании, -rпоскольку он не считает пакеты, а получает информацию из встроенных данных. Обратите внимание, что хотя в справке говорится «(одна строка)», на самом деле выходные данные состоят из трех строк, но все же быстрее, чем длинная форма, особенно если она не используется -r.
  • Пример вывода из afinfo -b:

    $ afinfo -b '09 Karn Evil 9.mp3'
    09 Karn Evil 9.mp3, MPG3, Num Tracks:     1
    ----
    2127.938 sec, format:   2 ch,  44100 Hz, '.mp3' (0x00000000) 0 bits/channel, 0 bytes/packet, 1152 frames/packet, 0 bytes/frame
    $
    
    • Приведенный выше вывод получает piped ( |) в awk.
  • awk 'FNR == 3 {print int($1/60)}'
    • awkпечатает первое поле ( $1) третьей записи (строки) вывода, переданной по конвейеру afinfo -b, 2127.935в виде целого числа, на которое делится 60количество минут и значение времени в секундах. В выходном примере awkвозвращено:35
user3439894
источник
4
+1 Отличная работа! Я уверен, что другие найдут это полезным знать. :)
Мономет
1
@Monomeeth, чтобы соответствовать вашему любезному комментарию, я обновил ответ, чтобы включить немного понимания того, что делает do shell script команда . Кстати +1 для вас на выборах модератора сообщества! :)
user3439894
2
Спасибо за решение, и особенно за добавление контекста и объяснений, которые, я думаю, будут наиболее полезны для более широкой аудитории!
Winterflags