#!/bin/sh

set -eu

RESOLUTION="$(xdpyinfo | grep dimensions | awk 'NR==1{print $2}')"
SOFTWARE_ENCODE=false
FPS="60" 
ENCODER_STANDARD=h264
REPLAY_BUFFER="5"

if ls "$HOME"/Videos;then
    VIDEO_FOLDER="$HOME"/Videos
elif ls /usr/bin/xdg-user-dir;then
    VIDEO_FOLDER="$(xdg-user-dir VIDEOS)" 
else
    mkdir "$HOME"/Videos
    VIDEO_FOLDER="$HOME"/Videos
fi

BUFFER_SEC=$((REPLAY_BUFFER * 60))
BUFFER_SEGMENT_LENGTH="30"
BUFFER_SEGMENTS=$((BUFFER_SEC / BUFFER_SEGMENT_LENGTH))

# Source user-specific config
. $HOME/.config/shadowreplay

if $NONFREE_AMD_ENCODER;then
    ENCODER_API=amf
elif lspci | grep 'VGA.*ATI' >/dev/null;then
    ENCODER_API=vaapi
elif lspci | grep 'VGA.*NVIDIA' >/dev/null;then
    ENCODER_API=nvenc
elif lspci | grep 'VGA.*Intel' >/dev/null;then
    ENCODER_API=qsv
fi

ENCODER="$ENCODER_STANDARD"_"$ENCODER_API"

if $SOFTWARE_ENCODE;then
    ENCODER_API=
    ENCODER=libx264
fi

BASEDIR=$(dirname "$0")

DATE=$(date +%Y-%d-%m-%H:%M:%S)
FILE="$VIDEO_FOLDER/replay-$DATE.mp4"

case $ENCODER_API in
    "vaapi") 
        ENCODER_OPTS="-c:v $ENCODER -vf format='nv12|vaapi,hwupload' -vaapi_device /dev/dri/renderD128"
        ;;
    "amf") 
        export VK_ICD_FILENAMES=/opt/amdgpu-pro/etc/vulkan/icd.d/amd_icd64.json:/opt/amdgpu-pro/etc/vulkan/icd.d/amd_icd32.json 
        ENCODER_OPTS="-c:v $ENCODER"
        ;;
    "nvenc") 
        ENCODER_OPTS="-c:v $ENCODER -preset:v llhq -profile:v high -pix_fmt nv12 -b:v 15M -acodec aac"
        ;;
    "qsv") 
        ENCODER_OPTS="-c:v $ENCODER"
        ;;
    *) 
        ENCODER_OPTS="-c:v $ENCODER -preset medium"
        ;;
esac

ffmpeg_command(){
    ffmpeg \
        -f x11grab \
        -s "$RESOLUTION" \
        -r ${FPS} \
        -i "$DISPLAY" \
        -f pulse -i default \
        -ar 44100 \
        $ENCODER_OPTS \
        -f segment \
        -segment_time 30 \
        -segment_wrap "$BUFFER_SEGMENTS" \
        -segment_list /tmp/ShadowRePlay.m3u8 \
        -segment_list_size 6 /tmp/ShadowRePlaySeg%d.ts
    }

ffmpeg_command ||

ffmpeg \
    -i /tmp/ShadowRePlay.m3u8 \
    -c copy "$FILE" -loglevel quiet &&

find  /tmp -name 'ShadowRePlay*' -exec rm {} \; && 

notify-send -i video \
	"ShadowRePlay" \
	"Replay saved to $FILE"

cd "$BASEDIR" &&
    
./shadowreplay
