I am attempting to create an Automator application that will launch Quicktime, create a new audio capture, start that capture, and then save it with a specific filename after the stop button is clicked in the capture window. Although I was able to do this in Lion without any difficulty, I keep running into problems with the Start Capture action in Mountain Lion. Even though the "Wait for capture to complete" checkbox is checked, the action doesn't seem to detect when the stop button is clicked in Quicktime. Any solutions, tricks, or workarounds that would get this working properly would be greatly appreciated!
2 Answers
There's a lot that doesn't work with respect to automating QuickTime under Mountain Lion. This is ugly, but it appears to be a workaround that has the key virtue of actually working.
In your automator flow, use the action "Run AppleScript". Use this as the script:
tell application "QuickTime Player"
activate
set x to new audio recording
tell x to start
delay 1
set lastLength to duration of x
delay 1
set newLength to duration of x
try
repeat while lastLength is not equal to newLength
delay 1
set lastLength to newLength
set newLength to duration of x
end repeat
end try
-- display alert name of document 1
set v to file of front document
set thePath to POSIX path of (path to desktop)
tell x to activate
delay 1
tell application "System Events"
keystroke "S" using {command down, shift down}
delay 1
keystroke thePath
delay 1
keystroke return
delay 1
keystroke "specific file name"
keystroke return
end tell
end tell
This isn't pretty, but it's a workaround.
Just about all the code-based ways to script the save command in QuickTime via AppleScript appear to be broken in Mountain Lion. I can't access the path of the frontmost document. I can't export. I can't close saving. It all fails either silently or with an error message. What does seem to work is to send the appropriate keystrokes to simulate a manual file export. So that's what I've done here.
I suspect you want your file saved with a name different than "specific file name" and perhaps somewhere other than your desktop. Make the appropriate substitutions in the script so that can happen. The file will then be there on disk; subsequent actions in your workflow can take advantage of it.
Note that if your file already exists, you'll get a confirmation dialog in the QT save command, and the script doesn't handle that automatically.
Rather than using the built-in start capture actions, use an AppleScript action as the trigger to start the recording (and wait for it to stop), then pass the resulting file to Automator to do whatever else you need with it.
I modified Daniel Lawson's script slightly:
tell application "QuickTime Player"
activate
new audio recording
tell front document to start
delay 1
set lastLength to duration of front document
delay 1
set newLength to duration of front document
try
repeat while lastLength is not equal to newLength
delay 1
set lastLength to newLength
set newLength to duration of x
end repeat
end try
set theFile to file of front document
return POSIX path of theFile
end tell
I removed the export lines1, and changed the references from a variable to simply the front document
(which avoids some errors if the recording is short, which I ran into during my testing). Finally, I added a return statement with the POSIX path of the resulting file, which Automator can take as input for subsequent actions.
Put that in an AppleScript action, and the resulting file will be properly passed to any other actions you have (such as moving/renaming it, or re-encoding).
Notes
1 QuickTime Player's save
and export
AppleScript functions are broken to the point of being useless. My theory is that this happened when 10.7 introduced autosaving, as all recordings are automatically saved to your ~/Movies
directory, and the quality settings need to be adjusted manually beforehand (they're not exposed to AppleScript).
-
Have you tested this in ML? I like the idea a lot, but I'm getting the same crash here as I did with the first version of my script.– Daniel ♦Dec 1, 2012 at 19:57