all repos — dotfiles @ 7aea05e57ad97627f5907f1e8e220b61cc467254

my *nix dotfiles

home/bin/record (view raw)

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
#!/bin/sh
# stolen from mitch weaver

: "${RECORD_FRAMERATE:=30}"
: "${RECORD_OUTPUT_DIR:=$PWD}"

mkdir -p /tmp/record
sock=/tmp/record/sock
pidfile=/tmp/record/pidfile

msg() { printf '* %s\n' "$*" ; }
die() { >&2 msg "$*" ; exit 1 ; }

usage() {
    die "Usage: ${0##*/} [-o output dir] [-r rate] [-f foreground]"
}

isrunning() { kill -0 "$(getpid)" 2>/dev/null ; return $? ; }

getpid() {
    [ -s $pidfile ] && read -r pid <$pidfile
    echo "${pid:-?}"
}

start() {
    isrunning && die "Another instance already exists: $(getpid)"

    file="$RECORD_OUTPUT_DIR/record-$(date "+%Y.%m.%d-%H:%M:%S").mp4"
    :>$sock

    if command -v xrectsel >/dev/null ; then
        xrectsel -f '%x %y %w %h'
    elif command -v slop >/dev/null ; then
        slop -f '%x %y %w %h'
    else
        die 'Needs xrectsel or slop'
    fi | {
        read -r x y w h

        <$sock ffmpeg -y -f x11grab -s "${w}x${h}" -r $RECORD_FRAMERATE \
        -i "${DISPLAY:-:0}+${x},${y}" -vcodec libx264 \
        -pix_fmt yuv420p -filter:v "crop=iw-mod(iw\\,2):ih-mod(ih\\,2)" \
        "$file" >/tmp/record/log 2>&1 &

        msg "recording on pid $!"

        if ${FOREGROUND:-false} ; then
            trap 'rm "$sock" /tmp/record/log 2>/dev/null ||: ; rmdir /tmp/record 2>/dev/null ||:' EXIT INT TERM
            wait
        else
            echo $! >$pidfile
            echo "$file" >/tmp/record/file
        fi
    }
}

end() {
    if isrunning ; then
        echo q >>$sock
        read -r name </tmp/record/file
        msg "Success! Saved as $name"
        rm /tmp/record/* 2>/dev/null ||:
        rmdir /tmp/record 2>/dev/null ||:
        exit
    else
        die 'Nothing being recorded.'
    fi
}

toggle() {
    if isrunning ; then
        end
    else
        start
    fi
}

while [ "$1" ] ; do
    case $1 in
        -f)
            FOREGROUND=true
            ;;
        -r)
            RECORD_FRAMERATE=$1
            ;;
        -o)
            [ -d "$2" ] || usage
            RECORD_OUTPUT_DIR=$2
            shift
            ;;
         *) usage
    esac
    shift
done

toggle