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 .

  • Formato de salida del dialog estándar de selector de color de Mac OS (elija color)
  • Cómo ejecutar Diga "algo" en segundo plano en AppleScript
  • Guarde el file .mov con applescript
  • AppleScript se ejecuta de nuevo después de reiniciarlo. ¿Cómo evitar eso?
  • ¿Cómo automatizar el cambio de configuraciones cuando conecta el mouse?
  • Apple Script para autotipear
  • 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.

  • ¿Cómo renunciar por nombre del process?
  • ¿Hay una buena herramienta de command-line ID3 para OS X?
  • Súbitos sonidos en Mountain Lion
  • Administrador de descarga para Mac OS X
  • ¿Cómo puedo ajustar la temperatura de color aparente de mi pantalla en OS X?
  • ¿Cómo hacer doble clic en la barra de título para maximizar una window para llenar la pantalla?
  • 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).