AppleScript per restituire le condizioni in base alla lunghezza del file audio

5

Vorrei usare Hazel (un sistema di automazione di file system basato su regole) per macOS a sposta automaticamente i file audio mixtape da una cartella all'altra, se la loro durata è superiore a 30 minuti.

Hazel non fornisce un metodo integrato per verificare la lunghezza del file audio (che io sappia), ma fornisce la possibilità di eseguire regole se viene passata una condizione AppleScript, cioè return true .

A giudicare dallo screenshot qui sotto, penso che funzioni se length of theFile > 30*60 seconds: return true (pseudo codice) .

Non sono comunque sicuro di come farlo tramite AppleScript. Qualche idea su come farlo, o da dove cominciare? Una ricerca online non ha fornito molte idee di base, ma sembra possibile.

Nota : dare consigli su AppleScript non rientra nell'ambito del supporto Hazel AFAIK, quindi non posso ricevere alcun aiuto da loro.

    
posta Winterflags 08.07.2017 - 20:16
fonte

1 risposta

6

Ok, ho scaricato Hazel e ho testato il seguente codice AppleScript su una nuova regola per convalidarlo. Il seguente codice quando usato in uno script incorporato imposterà theResult in true in theFile , un file audio che dura più di 30 minuti. Qualsiasi file di 30 minuti o meno o un file non audio imposterà theResult in 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
  • Da notare che dal mio primo commento prima di pubblicare questa risposta, ho modificato theFileName in POSIX path of theFile e, come puoi vedere nell'immagine qui sotto, ha convalidato la regola. Ha poi elaborato anche la regola, come l'ho definita, con successo.
  • Per modificare il numero di minuti, modifica il valore sul lato destro dell'operatore , ad esempio -gt 30 sul tempo desiderato, ad es. %codice%. L'operatore può anche essere modificato in uno dei seguenti: -gt 20 , -eq , -ne , -lt , -le o -gt

Comprensione,unpo',delcontenutodelcomando-ge:

  • doshellscriptnonhamoltointerminidipaginamanuale,quindiscriviafinfoinTerminalepremiinvioperlesueopzioni.
  • afinfo-afinfo-r
  • Esempiodioutputdi{-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----$
    • L'outputsoprariportatovieneinviatotramitepipe(afinfo-r)a|.
  • %codice%
    • awktrovailrecord(riga)contenenteawk'/estimatedduration:/{printint($3/60)}'neloutputdiawkconvogliatosudiessoestampailterzocampo,estimatedduration:,afinfocomenumerointero,essendostatodivisoper$3perottenereilnumerodiminuti,poichéilvaloretemporaleèespressoinsecondi.Nell'esempiooutput,2127.935restituito:60
  • awkLapartedisostituzionedelcomandohapassato35altest$(...),quindièstataequiparataa35ecomerisultato,utilizzandoglioperatorilogici,hafattoeco[[$(...)-gt30]].Seilvalorefosseugualeoinferiorea30ounfilenonaudio,avrebbeecho[[35-gt30]].

Sedesidericheilcontenutoditruecomandovengaeseguitopiùvelocemente,utilizzaquantosegue:

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
    • Viene eseguito più velocemente utilizzando afinfo -b poiché non conteggia i pacchetti, ma recupera le informazioni dai dati incorporati. Nota che mentre aiuto dice "(una riga)", l' output è in realtà tre righe, ma ancora più veloce della forma lunga, specialmente se non si usa {-b --brief} print a brief (one line) description of the audio file .
  • Esempio di output di -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
    $
    
    • L'output sopra riportato viene inviato tramite pipe ( -r ) a afinfo -b .
  • %codice%
    • | stampa il primo campo ( awk ) del terzo record (riga) di output convogliato da awk 'FNR == 3 {print int($1/60)}' , awk come numero intero, diviso per $1 per ottenere il numero di minuti, poiché il valore temporale è espresso in secondi. Nell'output di esempio, afinfo -b restituito: 2127.935
risposta data 09.07.2017 - 13:39
fonte

Leggi altre domande sui tag