Skip to content

How to batch process videos using HandBrake and Hazel

I’ve tried just about every video encoding product for MacOS X, and always keep returning to the venerable HandBrake.

Why haven’t I just stuck with HandBrake in the first place? One reason — its UI for batch converting videos sucks. Unlike all other products, you can’t just drag a bunch of videos into HandBrake. No, you have to chose them one at a time, and manually add them to the HandBrake queue.

Why haven’t I stuck with one of the other products? Because none of them have presets that are as good as HandBrake’s, and I couldn’t be bothered to learn the FFMPEG syntax. For example, all the presets in something like RoadMovie will change the resolution of the encoded video. HandBrake’s “Normal” preset will preserve the video’s original dimensions.

This weekend, with the help of Super-Makalu Justin Driscoll (@jdriscoll), I finally created a batch processing system, based on HandBrake. This article documents the setup.

What you need

  • (HandBrakeCLI). This is a version of HandBrake that can be run from the command line. Don’t expect the “doc” folder that comes with this utility to actually tell you how to install it. That’d be asking too much. Fire up Terminal, navigate to wherever HandBrakeCLI is, and move it to your /usr/bin directory with this command (you’ll be asked for your admin password).
  sudo mv ./HandBrakeCLI /usr/bin
  • Hazel. Hazel is a System Preference utility for the MacOS X, that allows you to schedule regular actions to be made on the contents of folders. Download and install.
  • This bash shell script, which you can copy and paste later from Pastie.

Basic idea

I have the following folder structure:


We’re going to tell Hazel to watch the “input-ipod” folder, and whenever it finds a new video file, to process that file with HandBrakeCLI, and then move the original into the “processed” folder.


  • Once Hazel is installed, add the “input-ipod” folder to its watch list.
  • On that folder, create the following rule with two steps: (1) the first runs an embedded shell script (passing each video file to HandBrakeCLI for processing) and, (2) when done, move the original video to the “processed” folder, which you can later delete or whatever.

One setup, all you have to do is drop videos into the “input-ipod” folder, wait a few moments, and watch Hazel kick into action. I set this up on our 8-core iMac at home, and watched it blow through 100 videos. Yeah!


The Hazel embedded script will fail if the original video has spaces in the name. So be sure to change “My Home” to “” before dropping into the input folder. I haven’t taken the time to sort that out yet, but will update this blog when I do.


You’ll notice that I’ve named my watch folder “input-ipod”. As you can imagine, I have other input folders named “input-appletv” and “input-normal”, for dropping videos I want processed with HandBrake’s “AppleTV 2” and “Normal” presets. I modify the Hazel embedded script accordingly for those rules. A complete list of HandBrake’s presets can be found here.

Hope this article helps others wanting to do the same. If you do, I’d love for you to drop a “Hello” message in the comments below.

Published inTechnology


  1. Niall Niall

    Your problem with filenames with embedded spaces should be resolved by putting “” around $output_filename in the HandBrakeCLI command line.

  2. Ralph Ralph

    Thanks for this post!
    With Niall’s hint it worked quite well.

  3. Luis Luis


    Thanks, very helpful…however, I am still not getting HandbrakeCLI to convert when there are spaces in the input file name ie., My New Movie.avi

    I’ve tried the double quotes around the $output_filename but no joy…any suggestions?


  4. Luis Luis


    Thanks, very helpful…however, I am still not getting HandbrakeCLI to convert when there are spaces in the input file name ie., My New Movie.avi

    I’ve tried the double quotes around the $output_filename but no joy…any suggestions?

    The only difference I changed the preset to “iPhone 4”



  5. Ralph Ralph

    Hi Luis,

    I modified Matts script a little bit to the following:


    filename=$(basename “$1″)

    HandBrakeCLI -i “$1” -o “$output_filename” -e x264 -q 20.0 -a 1,1 -E faac,copy:ac3 -B 160,160 -6 dpl2,auto -R Auto,Auto -D 0.0,0.0 -f mp4 –detelecine –decomb –loose-anamorphic -m -x b-adapt=2:rc-lookahead=50

    mkdir -p $dir

    if [ -f “$outputfilename” ]
    mv “$output
    filename” “$dir/$output_filename”
    rm “$1”

    — SCRIPT-END —

    This works quite well even if the names contain spaces.

  6. Matt Henderson Matt Henderson

    Hi guys,

    Since writing this article, a GUI utility — called HandBrakeBatch — has come out that I’ve started using, rather than the CLI approach I described in this article. Have a look:

  7. Power Penguin Power Penguin

    How can I change the code to convert an ISO image automatically to the mp4?

  8. Georg Georg

    I struggled to use the pushover gem. After installing it I couldnt find the executable to start it. The path in the provided script was not correct on my system. Not sure why.

    I ended up using just “curl” like described here:

    Thanks for the rest, excellent idea to use Pushover.

    For easily creating the scheduled scripts I used Lingon X.

What do you think?

This site uses Akismet to reduce spam. Learn how your comment data is processed.