Я хотел бы использовать Hazel ( автоматизатор файловой системы на основе правил) для macOS, чтобы автоматически перемещать аудиофайлы микстейпа из одной папки в другую, если их продолжительность превышает 30 минут.
Желто не предоставляет встроенный метод проверки аудио длину файла (что я знаю), но он дает возможность запускать правила , если передается условие AppleScript, то есть return true
.
Судя по скриншоту ниже, я думаю, что это работает, если length of theFile > 30*60 seconds: return true
(псевдокод) .
Однако я не уверен, как это сделать через AppleScript. Есть идеи как это сделать или с чего начать? Поиск в Интернете не дал много базовых идей, но, похоже, это возможно.
Примечание . Предоставление рекомендаций по AppleScripts выходит за рамки поддержки Hazel AFAIK, поэтому я не могу получить от них никакой помощи.
источник
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
соответственно.do shell script
команды , чтобы работать быстрее, а затем использовать следующее:»Ответы:
Хорошо, я скачал Hazel и протестировал следующий код AppleScript на новом правиле, чтобы проверить его работоспособность. Следующий код при использовании в встроенном сценарии будет установлен
theResult
вtrue
наtheFile
, звуковой файл , который больше , чем 30 минут. Любой файл 30 минут или меньше, или не аудио файл будет установленtheResult
наfalse
:theFileName
наPOSIX path of theFile
, и, как вы можете видеть на изображении ниже, он утвердил правило. Затем он также успешно обработал правило, как я его определил.-gt 30
на желаемое время, например-gt 20
. Оператор также может быть изменен на любой одной из следующих причин :-eq
,-ne
,-lt
,-le
,-gt
или-ge
Понимание, немного, содержание
do shell script
команды :afinfo
не так много, как на странице руководства , так что просто введитеafinfo
в Терминале и нажмите Enter для его вариантов .afinfo -r
-{-r --real} get the estimated duration after obtaining the real packet count
Пример вывода
afinfo -r
:|
) в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
команды , чтобы работать быстрее, а затем использовать следующее:afinfo -b
-{-b --brief} print a brief (one line) description of the audio file
-r
поскольку он не считает пакеты, а получает информацию из встроенных данных. Обратите внимание, что хотя в справке говорится «(одна строка)», на самом деле выходные данные состоят из трех строк, но все же быстрее, чем длинная форма, особенно если она не используется-r
.Пример вывода из
afinfo -b
:|
) вawk
.awk 'FNR == 3 {print int($1/60)}'
awk
печатает первое поле ($1
) третьей записи (строки) вывода, переданной по конвейеруafinfo -b
,2127.935
в виде целого числа, на которое делится60
количество минут и значение времени в секундах. В выходном примереawk
возвращено:35
источник
do shell script
команда . Кстати +1 для вас на выборах модератора сообщества! :)