#!/bin/sh

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

DMENU="dmenu -x 300 -y 220 -w 800 -fn Iosevka-11 -l 5 -i"

updateicon() { \
  echo "$1" > ~/.recordingicon
  pkill -RTMIN+9 i3blocks
}

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

screencast() { \
  ffmpeg -y \
  -f x11grab \
  -framerate 60 \
  -s $(xdpyinfo | grep dimensions | awk '{print $2;}') \
  -i :0.0 \
  -f alsa -i default \
  -r 30 \
  -c:v libx264rgb -crf 0 -preset ultrafast -c:a flac \
  "$HOME/screencast-$(date '+%y%m%d-%H%M-%S').mkv" &
  echo $! > ~/.recordingpid
  updateicon "⏺️🎙️"
}

video() { ffmpeg \
  -f x11grab \
  -s $(xdpyinfo | grep dimensions | awk '{print $2;}') \
  -i :0.0 \
  -c:v libx264 -qp 0 -r 30 \
  "$HOME/video-$(date '+%y%m%d-%H%M-%S').mkv" &
  echo $! > ~/.recordingpid
  updateicon "⏺️"
}

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

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


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

askrecording() { \
  choice=$(printf "screencast\\nvideo\\naudio\\nwebcam\\nwebcam (hi-def)" | $DMENU -p "Select recording style:")
  case "$choice" in
    screencast) screencast;;
    audio) audio;;
    video) video;;
    webcam) webcamrecord;;
    "webcam (hi-def)") webcamrecord;;
  esac
}

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


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