#!/usr/bin/env bash

## rofi-screenshot
## Author: ceuk @ github
## Licence: WTFPL
## Usage: 
##    show the menu with rofi-screenshot
##    stop recording with rofi-screenshot -s

# Screenshot directory
screenshot_directory="$HOME/Pictures/Screenshots"

# set ffmpeg defaults
ffmpeg() {
    command ffmpeg -hide_banner -loglevel error -nostdin "$@"
}

video_to_gif() {
    ffmpeg -i "$1" -vf palettegen -f image2 -c:v png - |
    ffmpeg -i "$1" -i - -filter_complex paletteuse "$2"
}

countdown() {
  notify-send "Screenshot" "Recording in 3 seconds" -t 1000
  sleep 1
  notify-send "Screenshot" "Recording in 2 seconds" -t 1000
  sleep 1
  notify-send "Screenshot" "Recording in 1 seconds" -t 1000
  sleep 1
}

crtc() {
  notify-send "Screenshot" "Select a region to capture"
  ffcast -q $(slop -n -f '-g %g ') png /tmp/screenshot_clip.png
  xclip -selection clipboard -t image/png /tmp/screenshot_clip.png
  rm /tmp/screenshot_clip.png
  notify-send "Screenshot" "Region copied to Clipboard"
}

crtf() {
  notify-send "Screenshot" "Select a region to capture"
  dt=$(date '+%d-%m-%Y %H:%M:%S')
  ffcast -q $(slop -n -f '-g %g ') png "$screenshot_directory/$dt.png"
  notify-send "Screenshot" "Region saved to $screenshot_directory"
}

cstc() {
  ffcast -q png /tmp/screenshot_clip.png
  xclip -selection clipboard -t image/png /tmp/screenshot_clip.png
  rm /tmp/screenshot_clip.png
  notify-send "Screenshot" "Screenshot copied to Clipboard"
}

cstf() {
  dt=$(date '+%d-%m-%Y %H:%M:%S')
  ffcast -q png "$screenshot_directory/$dt.png"
  notify-send "Screenshot" "Screenshot saved to $screenshot_directory"
}

rgrtf() {
  notify-send "Screenshot" "Select a region to record"
  dt=$(date '+%d-%m-%Y %H:%M:%S')
  ffcast -q $(slop -n -f '-g %g ' && countdown) rec /tmp/screenshot_gif.mp4
  notify-send "Screenshot" "Converting to gif... (this can take a while)"
  video_to_gif /tmp/screenshot_gif.mp4 "$screenshot_directory/$dt.gif"
  rm /tmp/screenshot_gif.mp4
  notify-send "Screenshot" "Recording saved to $screenshot_directory"
}

rgstf() {
  countdown
  dt=$(date '+%d-%m-%Y %H:%M:%S')
  ffcast -q rec /tmp/screenshot_gif.mp4
  notify-send "Screenshot" "Converting to gif... (this can take a while)"
  video_to_gif /tmp/screenshot_gif.mp4 "$screenshot_directory/$dt.gif"
  rm /tmp/screenshot_gif.mp4
  notify-send "Screenshot" "Recording saved to $screenshot_directory"
}

rvrtf() {
  notify-send "Screenshot" "Select a region to record"
  dt=$(date '+%d-%m-%Y %H:%M:%S')
  ffcast -q $(slop -n -f '-g %g ' && countdown) rec "$screenshot_directory/$dt.mp4"
  notify-send "Screenshot" "Recording saved to $screenshot_directory"
}

rvstf() {
  countdown
  dt=$(date '+%d-%m-%Y %H:%M:%S')
  ffcast -q rec "$screenshot_directory/$dt.mp4"
  notify-send "Screenshot" "Recording saved to $screenshot_directory"
}

get_options() {
  echo "  Capture Region  Clip"
  echo "  Capture Region  File"
  echo "  Capture Screen  Clip"
  echo "  Capture Screen  File"
  echo "  Record Region  File (GIF)"
  echo "  Record Screen  File (GIF)"
  echo "  Record Region  File (MP4)"
  echo "  Record Screen  File (MP4)"
}

check_deps() {
  if ! hash $1 2>/dev/null; then
    echo "Error: This script requires $1"
    exit 1
  fi
}

main() {
  # check dependencies
  check_deps slop
  check_deps ffcast
  check_deps ffmpeg
  check_deps xclip
  check_deps rofi

  if [[ $1 == '--help' ]] || [[ $1 = '-h' ]]
  then
    echo ### rofi-screenshot
    echo USAGE: rofi-screenshot [OPTION]
    echo \(no option\)
    echo "    show the screenshot menu"
    echo -s, --stop
    echo "    stop recording"
    echo -h, --help
    echo "    this screen"
    exit 1
  fi

  if [[ $1 = '--stop' ]] || [[ $1 = '-s' ]]
  then
    pkill -fxn '(/\S+)*ffmpeg\s.*\sx11grab\s.*'
    exit 1
  fi

  # Get choice from rofi
  choice=$( (get_options) | rofi -dmenu -i -fuzzy -p "Screenshot" )

  # If user has not picked anything, exit
  if [[ -z "${choice// }" ]]; then
      exit 1
  fi

  # run the selected command
  case $choice in
    '  Capture Region  Clip')
      crtc
      ;;
    '  Capture Region  File')
      crtf
      ;;
    '  Capture Screen  Clip')
      cstc
      ;;
    '  Capture Screen  File')
      cstf
      ;;
    '  Record Region  File (GIF)')
      rgrtf
      ;;
    '  Record Screen  File (GIF)')
      rgstf
      ;;
    '  Record Region  File (MP4)')
      rvrtf
      ;;
    '  Record Screen  File (MP4)')
      rvstf
      ;;
  esac

  # done
  set -e
}

main $1 &

exit 0

!/bin/bash

