5 votos

AppleScript para devolver la condición en función de la longitud del archivo de audio

Me gustaría utilizar Hazel (un automatizador del sistema de archivos basado en reglas) para MacOS para mover automáticamente los archivos de audio de las cintas mixtas de una carpeta a otra, si su duración es superior a 30 minutos.

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

A juzgar por la captura de pantalla de abajo, creo que funciona si length of theFile > 30*60 seconds: return true (pseudocó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 ser posible.


Nota : Dar consejos sobre AppleScripts está fuera del alcance del soporte de Hazel AFAIK, así que no puedo obtener ninguna ayuda de ellos.

2 votos

No tengo Hazel, así que no puedo probar con él y por qué un comentario frente a una respuesta, sin embargo aquí es un AppleScript do shell script comando que fijará theResult a true o false si puedes averiguar cómo pasarlo 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 . A continuación, puede añadir esta línea, return theResult y será equivalente a return true o return false en consecuencia.

1 votos

@user3439894 Entiendo por qué no has publicado esto como respuesta, pero sigo pensando que deberías hacerlo porque así evitas que el OP borre la pregunta (por el motivo que sea). Y, en este caso, es probable que tu respuesta lleve a una solución que ayude a otros :)

0 votos

@Monomeeth, me adelanté y descargué Hazel y después de una ligera modificación, validé el código en mi comentario. Por cierto, no creo que añadir una respuesta pueda impedir que el autor del OP borre su pregunta.

6voto

user3439894 Puntos 5883

Bien, he descargado Hazel y probado el siguiente AppleScript código en una nueva regla para validar su funcionamiento. Lo siguiente código cuando se utiliza en un embedded script se fijará theResult a true en theFile un archivo de audio de más de 30 minutos. Cualquier archivo de 30 minutos o menos, o un archivo que no sea de audio, establecerá theResult a 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 cuenta que desde mi primer comentario antes de publicar esta respuesta, he cambiado theFileName a POSIX path of theFile y, como puede ver en la imagen siguiente, validó la regla. A continuación, también procesó la regla, tal y como la definí, con éxito.
  • Para cambiar el número de minutos, cambie el valor en el lado derecho de la operador Por ejemplo
    -gt 30 a la hora deseada, por ejemplo -gt 20 . El operador también se puede cambiar a cualquiera de los siguientes: -eq , -ne , -lt , -le , -gt o -ge

Hazel Preference Pane

Entendiendo, un poco, el contenido de la do shell script comando :

  • afinfo no tiene mucho de página del manual Así que sólo tienes que escribir afinfo en el Terminal y pulse entrar en por su 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
    ----
     $
    • La salida anterior se canaliza ( | ) a awk .
  • awk '/estimated duration:/{print int($3/60)}'
    • awk encuentra el registro (línea) que contiene estimated duration: en el salida de afinfo y se imprime la tercera campo , $3 , 2127.935 como un número entero, habiendo sido dividido por 60 para obtener el número de minutos, ya que el valor del tiempo está en segundos. En el ejemplo salida , awk devuelto: 35
  • $(...) El sustitución de comandos parte aprobada 35 a la prueba [[ $(...) -gt 30 ]] , por lo que equivale a [[ 35 -gt 30 ]] y como resultado, utilizando operadores lógicos, se hizo eco de true . Si el valor hubiera sido igual o menor que 30, o un archivo que no fuera de audio, se habría hecho eco de false .

Si quiere el contenido de do shell script comando para que se ejecute más rápido, entonces utilice 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 se ejecuta más rápido que el uso de -r ya que no cuenta los paquetes, sino que obtiene la información de los datos incrustados. Tenga en cuenta que mientras el ayuda dice "(una línea)", el salida es en realidad tres líneas, pero sigue siendo más rápido que la forma larga, especialmente si no se utiliza -r .
  • Ejemplo 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
    $
    • La salida anterior se canaliza ( | ) a awk .
  • awk 'FNR == 3 {print int($1/60)}'
    • awk imprime el primer campo ( $1 ) de la tercera registro (línea) de salida canalizado desde afinfo -b , 2127.935 como un número entero, habiendo sido dividido por 60 para obtener el número de minutos, ya que el valor del tiempo está en segundos. En la salida del ejemplo, awk devuelto: 35

4 votos

+1 ¡Buen trabajo! Estoy seguro de que a otros les será útil saberlo :)

1 votos

@Monomeeth, para estar a la altura de tu amable comentario, he actualizado la respuesta para incluir un poco de comprensión de lo que el do shell script comando está haciendo. Por cierto, +1 para ti en la elección de moderador de la Comunidad. :)

2 votos

Gracias por la solución y, sobre todo, por añadir el contexto y la explicación, que creo que serán muy beneficiosos para un público más amplio.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X