#!/bin/sh
# dvd2mp4 --- rip dvds
# Author: Noah Friedman <friedman@splode.com>
# Created: 2013-10-18
# Public domain.

# $Id: dvd2mp4,v 1.4 2016/01/17 05:19:26 friedman Exp $

handbrake()
{
    HandBrakeCLI \
        --preset     "$preset" \
        \
        --two-pass \
        --turbo \
        \
        --format     "$format" \
        --optimize \
        --markers \
        \
        --use-opencl \
        --use-hwd \
        \
        "$@"
}

num_chapters()
{
    HandBrakeCLI -t 1 --scan -i "$1" 2>&1 \
        | sed -ne 's/^.*has \([0-9]*\) chapter.*$/\1/p'
}

chapters()
{
    basename=`echo "$1" | sed -e 's=.*/==' -e 's/\.[^.]*$//'`
    last=`num_chapters "$1"`

    for c in `seq --equal-width 1 $last`; do
        handbrake -c $c -i "$1" -o "$basename - Chapter $c.$format"
    done
}

single()
{
    basename=`echo "$1" | sed -e 's=.*/==' -e 's/\.[^.]*$//'`
    handbrake -i "$1" -o "$basename.$format"
}

# HandBrakeCLI -z
preset()
{
    case $1 in
        universal      ) preset='Universal'            ;; #  720
        normal         ) preset='Normal'               ;;
        high-profile   ) preset='High Profile'         ;;

        720p           ) preset='AppleTV 2'            ;;
        1080p          ) preset='AppleTV 3'            ;;

        *              ) preset=$1                     ;;
    esac
}

main()
{
    preset='AppleTV 3'
    format=mp4
    split=single

    while : ; do
        case $# in 0) break ;; esac

        case $1 in
            --*=* )
                opt=${1%=*}
                val=${1#*=}
                shift
                set fnord "$opt" "$val" "$@"
                shift ;;
        esac

        case $1 in
            -p | --preset   | --p* ) preset "$2" ; shift ;;
            -f | --format   | --f* ) format=$2   ; shift ;;

            -s | --single   | --s* ) split=single   ;;
            -c | --chapters | --c* ) split=chapters ;;

            -* )
                echo "${0##*/}: $1: Invalid option" 1>&2
                exit 1 ;;

            * ) break ;;
        esac

        shift
    done

    for dvd in "$@"; do
        $split "$dvd"
    done
}

main "$@"

# eof
