#!/bin/sh

# Usage:
# `$0`: Ask for recording type via dmenu
# `$0 screencast`: Record both audio and screen
# `$0 video`: Record only screen
# `$0 audio`: Record only audio
# `$0 kill`: Kill existing recording
#
# If there is already a running instance, user will be prompted to end it.

updateicon() {
    echo "$1" >/tmp/recordingicon
    pkill -RTMIN+9 "${STATUSBAR:-dwmblocks}"
}

killrecording() {
    recpid="$(cat /tmp/recordingpid)"
    # kill with SIGTERM, allowing finishing touches.
    kill -15 "$recpid"
    rm -f /tmp/recordingpid
    updateicon ""
    pkill -RTMIN+9 "${STATUSBAR:-dwmblocks}"
    # even after SIGTERM, ffmpeg may still run, so SIGKILL it.
    sleep 3
    kill -9 "$recpid"
    exit
}

screencast() {
    mkdir -p "$XDG_VIDEOS_DIR/Captures"
    ffmpeg -y \
        -f x11grab \
        -framerate 60 \
        -s "$(xdpyinfo | awk '/dimensions/ {print $2;}')" \
        -i "$DISPLAY" \
        -f alsa -i default \
        -r 30 \
        -c:v h264 -crf 0 -preset ultrafast -c:a aac \
        "$XDG_VIDEOS_DIR/Captures/screencast-$(date '+%y%m%d-%H%M-%S').mp4" &
    echo $! >/tmp/recordingpid
    updateicon "󰍹 󰍬"
}

video() {
    mkdir -p "$XDG_VIDEOS_DIR/Captures"
    ffmpeg \
        -f x11grab \
        -s "$(xdpyinfo | awk '/dimensions/ {print $2;}')" \
        -i "$DISPLAY" \
        -c:v libx264 -qp 0 -r 30 \
        "$XDG_VIDEOS_DIR/Captures/video-$(date '+%y%m%d-%H%M-%S').mp4" &
    echo $! >/tmp/recordingpid
    updateicon "󰍹"
}

webcamhidef() {
    ffmpeg \
        -f v4l2 \
        -i /dev/video0 \
        -video_size 1920x1080 \
        "$XDG_VIDEOS_DIR/Captures/webcam-$(date '+%y%m%d-%H%M-%S').mkv" &
    echo $! >/tmp/recordingpid
    updateicon "󰄀"
}

webcam() {
    ffmpeg \
        -f v4l2 \
        -i /dev/video0 \
        -video_size 640x480 \
        "$XDG_VIDEOS_DIR/Captures/webcam-$(date '+%y%m%d-%H%M-%S').mkv" &
    echo $! >/tmp/recordingpid
    updateicon "󰖠"
}

audio() {
    ffmpeg \
        -f alsa -i default \
        -c:a flac \
        "$XDG_VIDEOS_DIR/Captures/audio-$(date '+%y%m%d-%H%M-%S').flac" &
    echo $! >/tmp/recordingpid
    updateicon "󰍬"
}

askrecording() {
    choice=$(printf "screencast\\nvideo\\nvideo selected\\naudio\\nwebcam\\nwebcam (hi-def)" | dmenu -i -p "Select recording style:")
    case "$choice" in
        screencast) screencast ;;
        audio) audio ;;
        video) video ;;
        *selected) videoselected ;;
        webcam) webcam ;;
        "webcam (hi-def)") webcamhidef ;;
    esac
}

videoselected() {
    mkdir -p "$XDG_VIDEOS_DIR/Captures"
    eval "$(slop -f "X=%x Y=%y W=%w H=%h")"
    ffmpeg \
        -f x11grab \
        -video_size "$W"x"$H" \
        -i "$DISPLAY+$X,$Y" \
        -c:v libx264 -qp 0 -r 30 \
        "$XDG_VIDEOS_DIR/Captures/box-$(date '+%y%m%d-%H%M-%S').mkv" &
    echo $! >/tmp/recordingpid
    updateicon "󰍹"
}

asktoend() {
    response=$(printf "No\\nYes" | dmenu -i -p "Recording still active. End recording?") &&
        [ "$response" = "Yes" ] && killrecording
}

case "$1" in
    screencast) screencast ;;
    audio) audio ;;
    video) video ;;
    *selected) videoselected ;;
    kill) killrecording ;;
    *) ([ -f /tmp/recordingpid ] && asktoend && exit) || askrecording ;;
esac