AppleScript para devolver la condición según la longitud del archivo de audio

5

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

Hazel no proporciona un método incorporado para verificar la longitud del archivo de audio (que yo sepa), pero brinda 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 (pseudo código) .

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 AFAIK de soporte de Hazel, por lo que no puedo obtener ayuda de ellos.

    
pregunta Winterflags 08.07.2017 - 20:16

1 respuesta

6

Bien, he descargado Hazel y he probado el siguiente código de AppleScript en una Nueva Regla para validarlo. El siguiente código cuando se usa en un script incrustado establecerá theResult en true en theFile , un archivo de audio que dura 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, cambié de theFileName a POSIX path of theFile , y como puede ver en la imagen a continuación, validó la regla. Luego, también procesó la regla, como la definí, con éxito.
  • Para cambiar la cantidad de minutos, cambie el valor en el lado derecho del operador , por ejemplo,
    -gt 30 a la hora deseada, por ejemplo. %código%. El operador también se puede cambiar a cualquiera de los siguientes: -gt 20 , -eq , -ne , -lt , -le o -gt

Comprendiendo,unpoco,elcontenidodelcomando-ge:

  • doshellscriptnotienemuchoenlaformadeunapáginademanual,asíquesimplementeescribaafinfoenTerminalypresioneingresarparasusopciones.
  • afinfo-afinfo-r
  • Salidadeejemplode{-r--real}gettheestimateddurationafterobtainingtherealpacketcount:

    $afinfo-r'09KarnEvil9.mp3'File:09KarnEvil9.mp3FiletypeID:MPG3NumTracks:1----Dataformat:2ch,44100Hz,'.mp3'(0x00000000)0bits/channel,0bytes/packet,1152frames/packet,0bytes/framenochannellayout.audiobytes:85117515audiopackets:81460estimatedduration:2127.935secbitrate:320000bitspersecondpacketsizeupperbound:1052maximumpacketsize:1045audiodatafileoffset:275530optimized----$
    • Lasalidaanteriorsecanaliza(afinfo-r)a|.
  • %código%
    • awkencuentraelregistro(línea)quecontieneawk'/estimatedduration:/{printint($3/60)}'enlasalidadeawkcanalizadoeimprimeeltercercampo,estimatedduration:,afinfocomounentero,quesedividiópor$3paraobtenerelnúmerodeminutos,yaqueelvalordeltiempoestáensegundos.Enelejemplooutput,2127.935devolvió:60
  • awkLapartedesustitucióndecomandopasó35alaprueba$(...),porloqueseequiparóa35y,comoresultado,utilizandooperadoreslógicos,sehizoecode[[$(...)-gt30]].Sielvalorhubierasidoigualomenora30,ounarchivoquenoseadeaudio,habríatenidounecode[[35-gt30]].

Sideseaqueelcontenidodetruecomandoseejecutemásrápido,uselosiguiente:

settheResultto(doshellscript"[[ $(afinfo -b '" & POSIX path of theFile & "' | awk 'FNR == 3 {print int($1/60)}') -gt 30 ]] && echo 'true' || echo 'false'") as boolean
return theResult
  • false - do shell script
    • Esto se ejecuta más rápido que con afinfo -b , ya que no cuenta los paquetes, sino que obtiene la información de los datos incrustados. Tenga en cuenta que, si bien la ayuda dice "(una línea)", la salida es en realidad tres líneas, pero aún más rápida que la forma larga, especialmente si no se usa {-b --brief} print a brief (one line) description of the audio file .
  • Ejemplo salida de -r :

    $ 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 ( -r ) a afinfo -b .
  • %código%
    • | imprime el primer campo ( awk ) del tercer registro (línea) de salida canalizado desde awk 'FNR == 3 {print int($1/60)}' , awk como un entero, habiendo sido dividido por $1 para obtener el número de minutos, ya que el valor de tiempo es en segundos. En la salida de ejemplo, afinfo -b devolvió: 2127.935
respondido por el user3439894 09.07.2017 - 13:39

Lea otras preguntas en las etiquetas