AppleScript para devolver condición dependiendo de la longitud del file de audio

Me gustaría utilizar Hazel (un automatizador de sistema de files basado en reglas) para que macOS mueva automáticamente los files de audio mixtape de una carpeta a otra, si su duración es superior a 30 minutos.

Hazel no proporciona un método integrado para verificar la longitud del file de audio (que yo sepa), pero proporciona la capacidad de ejecutar reglas si se pasa una condición AppleScript, es decir, return true .

  • Inicie QuickTime y configure la camera en iPhone desde la línea de command
  • Ejecutando una gota de AS desde la Terminal
  • ¿Ejecuta una secuencia de commands personalizada cuando OS X 10.8 está en Power Nap?
  • ¿Cómo invocar osascript 'Generic Scripting System'?
  • Script / aplicación constante para la comprobación / assembly de unidades compartidas
  • AppleScript para cerrar la window "Acerca de esta Mac"
  • A juzgar por la captura de pantalla siguiente, creo que funciona si la length of theFile > 30*60 seconds: return true (pseudo código) .

    enter image description here

    Sin embargo, no estoy seguro de cómo lograr esto a través de AppleScript. ¿Alguna idea de cómo hacerlo o por dónde empezar? Una búsqueda en línea no proporcionó muchas ideas básicas, pero parece posible.


    Nota : Dar consejos sobre AppleScripts está fuera del scope de Hazel AFAIK, por lo que no puedo get ayuda de ellos.

  • Mavericks Random Spinning Beach Ball aparece por less de un segundo y luego desaparece
  • Eliminar una dirección de correo electrónico errónea de la list de invitados de iCal
  • ¿Cuál es el beneficio adicional del proveedor FTDI USB para el controller en serie?
  • ¿Cerrar la tapa pone a la MacBook Pro a dormir? ¿Haría daño a la computadora si la llevo sin cerrarla?
  • No se puede eliminar la partición de Windows desde mac
  • Mi macbook piensa que los files .as son files zip (y no se abrirán en XCode)
  • One Solution collect form web for “AppleScript para devolver condición dependiendo de la longitud del file de audio”

    De acuerdo, descargué Hazel y probé el siguiente código AppleScript en una nueva regla para validar que funciona. El siguiente código, cuando se usa en un script embedded , configurará el theResult en true en el theFile , un file de audio que dura más de 30 minutos. Cualquier file de 30 minutos o less, o un file que no sea de audio establecerá el theResult en 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 
    • Tenga en count que desde mi primer comentario antes de publicar esta respuesta, he cambiado el theFileName de theFileName a la POSIX path of theFile y, como puede ver en la image a continuación, validó la regla. Luego también procesó la regla, como lo definí, con éxito.
    • Para cambiar la cantidad de minutos, cambie el valor en el lado derecho del operador , por ej.
      -gt 30 al time deseado, por ejemplo, -gt 20 . El operador también puede cambiarse a cualquiera de los siguientes: -eq , -ne , -lt , -le , -gt o -ge

    Hazel Preference Panel

    Comprender, un poco, el contenido del command do shell script :

    • afinfo no tiene mucho en el path de una página de manual , así que simplemente escriba afinfo en Terminal y presione enter para sus opciones .
    • afinfo -r{-r --real} get the estimated duration after obtaining the real packet count
    • Ejemplo de salida de 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 ---- $ 
      • El resultado anterior se canaliza ( | ) a awk .
    • awk '/estimated duration:/{print int($3/60)}'
      • awk encuentra el logging (línea) que contiene la estimated duration: en la salida de afinfo conectado a él e imprime el tercer campo , $3 , 2127.935 como un integer, habiendo sido dividido por 60 para get el número de minutos, ya que el valor del time está en segundos. En la salida del ejemplo, awk devolvió: 35
    • $(...) La porción de sustitución de command pasó 35 a la testing [[ $(...) -gt 30 ]] , por lo que se equiparó a [[ 35 -gt 30 ]] y como resultado, utilizando operadores lógicos, se hizo eco de true . Si el valor hubiera sido igual o inferior a 30, o un file que no es de audio, se hubiera hecho eco de false .

    Si desea que el contenido del command do shell script ejecute más rápido, use lo siguiente:

     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
      • Esto funciona más rápido que usar -r ya que no count los packages, sino que obtiene la información de los datos integrados. Tenga en count que, si bien la ayuda dice "(una línea)", el resultado es en realidad tres líneas, pero aún más rápido que la forma larga, especialmente si no se utiliza -r .
    • Ejemplo de salida de 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 $ 
      • El resultado anterior se canaliza ( | ) a awk .
    • awk 'FNR == 3 {print int($1/60)}'
      • awk imprime el primer campo ( $1 ) del tercer logging (línea) de salida canalizado desde afinfo -b , 2127.935 como un integer, habiendo sido dividido por 60 para get el número de minutos, ya que el valor del time está en segundos. En la salida del ejemplo, awk devolvió: 35
    Loving Apple Products like poisoning (iPhone, iPad, iMac, Macbook, iWatch).