Chciałbym użyć Hazel (automatyzatora systemu plików opartego na regułach) dla systemu macOS, aby automatycznie przenosić pliki audio mixtape z jednego folderu do drugiego, jeśli ich czas trwania jest dłuższy niż 30 minut.
Hazel nie zapewnia wbudowanej metody sprawdzania długości pliku audio (o której wiem), ale zapewnia możliwość uruchamiania reguł, jeśli warunek AppleScript zostanie spełniony, tj return true
.
Sądząc z poniższego zrzutu ekranu, myślę, że to działa, jeśli length of theFile > 30*60 seconds: return true
(pseudo kod) .
Nie jestem jednak pewien, jak to osiągnąć za pomocą AppleScript. Wszelkie pomysły, jak to zrobić lub od czego zacząć? Wyszukiwanie online nie dostarczyło wielu podstawowych pomysłów, ale wydaje się możliwe.
Uwaga : Udzielanie porad na temat AppleScripts jest poza zakresem AFAIK obsługi Hazel, więc nie mogę uzyskać od nich żadnej pomocy.
źródło
do shell script
komenda , która będzie ustawionatheResult
natrue
lubfalse
czy można dowiedzieć się, jak ją przekazać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
. Możesz następnie dodać ten wiersz po nim,return theResult
a będzie on równoważnyreturn true
lubreturn false
odpowiednio.do shell script
poleceniem , aby działać szybciej, a następnie kliknąć na poniższy:”Odpowiedzi:
OK, pobrałem Hazel i przetestowałem następujący kod AppleScript na nowej regule, aby sprawdzić, czy działa. Poniższy kod stosowany w osadzonym skryptem ustawi
theResult
siętrue
natheFile
, plik audio, który jest dłuższy niż 30 minut. Dowolny plik o długości 30 minut lub mniej lub plik inny niż dźwięk zostanie ustawionytheResult
nafalse
:theFileName
naPOSIX path of theFile
i, jak widać na poniższym obrazku, potwierdziła ona regułę. Następnie pomyślnie przetworzył regułę, tak jak ją zdefiniowałem.-gt 30
Na żądany czas, np-gt 20
. Operatora można również zmienić któregokolwiek z następujących powodów:-eq
,-ne
,-lt
,-le
,-gt
lub-ge
Zrozumienie trochę treści
do shell script
polecenia :afinfo
nie ma wiele na temat strony podręcznika , więc po prostu wpiszafinfo
Terminal i naciśnij Enter, aby wyświetlić opcje .afinfo -r
-{-r --real} get the estimated duration after obtaining the real packet count
Przykładowe dane wyjściowe
afinfo -r
:|
) doawk
.awk '/estimated duration:/{print int($3/60)}'
awk
wyszukuje rekord (linii), zawierającyestimated duration:
w wyjściu zafinfo
odprowadzone do niej i drukuje trzeciego pola ,$3
,2127.935
jako liczba całkowita, został podzielony przez60
uzyskać liczbę minut, a wartości czasu w sekundach. Na przykład wyjścia ,awk
zwrócone:35
$(...)
Część substytucji poleceń przeszła35
do testu[[ $(...) -gt 30 ]]
, więc zrównała się[[ 35 -gt 30 ]]
iw rezultacie, używając operatorów logicznych, powtórzyła echotrue
. Gdyby wartość była równa lub mniejsza niż 30, lub plik nie-dźwiękowy, odbijałby się echemfalse
.Jeśli chcesz, aby zawartość z
do shell script
poleceniem , aby działać szybciej, a następnie użyć następujących:afinfo -b
-{-b --brief} print a brief (one line) description of the audio file
-r
ponieważ nie zlicza pakietów, ale pobiera informacje z osadzonych danych. Zauważ, że chociaż pomoc mówi „(jedna linia)”, dane wyjściowe są w rzeczywistości trzema liniami, ale nadal są szybsze niż długa forma, szczególnie jeśli nie są używane-r
.Przykład wyjście z
afinfo -b
:|
) doawk
.awk 'FNR == 3 {print int($1/60)}'
awk
wypisuje pierwsze pole ($1
) trzeciego rekordu (linii) danych wyjściowych przesyłanych potokowoafinfo -b
,2127.935
jako liczbę całkowitą, podzielone przez,60
aby uzyskać liczbę minut, ponieważ wartość czasu jest w sekundach. W przykładowym wynikuawk
zwrócono:35
źródło
do shell script
polecenie . BTW +1 dla Ciebie w wyborach moderatora społeczności! :)