#!/usr/bin/env bash
set -euo pipefail

if [ $# -ne 1 ]; then
    echo "Please provide the path to one video file"
    $(exit 1); echo "$?"
fi

echo "Getting black screen times"

# reads the output of ffprobe into an array
mapfile -t timings < <(ffprobe -f lavfi -i "movie=$1,blackdetect[out0]" -show_entries frame_tags=lavfi.black_start,lavfi.black_end -of default=nw=1 -v quiet -print_format flat)

#timings=(frames.frame.0.tags.lavfi_black_start="0.389" frames.frame.1.tags.lavfi_black_end="0.431" frames.frame.255.tags.lavfi_black_start="11.025" frames.frame.256.tags.lavfi_black_end="11.067")

seltimings=()

for i in "${!timings[@]}"; do
    # cut timing to only output the time
    timing="$(echo ${timings[$i]} | cut -d= -f2 | tr -d '"')"
    if [ $((${i}%2)) -eq 0 ]; then
        starttime=$timing
        #echo "Start time: $starttime"
    else
        endtime=$timing
        #echo "End time: $endtime"
        timediff="$(echo "(($endtime - $starttime))" | bc -l)"
        #echo "Difference: $timediff"
        # check for sections longer than 2 seconds
        if (( $(echo "$timediff > 2" | bc -l) )); then
            echo "Start time: $starttime"
            echo "End time: $endtime"
            echo "Difference: $timediff"
            seltimings+=($starttime)
            seltimings+=($endtime)
        fi
    fi
done

# TODO check whether seltimings is set/filled at all

for i in "${seltimings[@]}"; do
    echo $i
done

# track split files created
splitfiles=()

# build command
command="ffmpeg -i "$1" -c copy -map 0 -t ${seltimings[0]} "1.mkv""
splitfiles+=("1.mkv")
echo "file 1.mkv" > "list.txt"

tmp=$(( ${#seltimings[@]} - 2 ))
length=$(( $tmp / 2 ))

selector=1

n=0

while [[ $n -lt $length ]]; do
    n=$((n+1))
    up=$(( $selector + 1 ))
    low=$selector
    command+=" -c copy -map 0 -ss ${seltimings[$low]} -t $(echo "${seltimings[$up]} - ${seltimings[$low]}" | bc -l) "$(( $n + 1 )).mkv""
    splitfiles+=("$(( $n + 1 )).mkv")
    echo "file $(( $n + 1 )).mkv" >> "list.txt"
    selector=$(( $selector + 2 ))
done

lastsel=$(( ${#seltimings[@]} - 1 ))
command+=" -c copy -map 0 -ss ${seltimings[$lastsel]} "$(( $n + 2 )).mkv""
splitfiles+=("$(( $n + 2 )).mkv")
echo "file $(( $n + 2)).mkv" >> "list.txt"

echo "Running command"
echo "$command" | tee command.sh
bash command.sh

ffmpeg -f concat -i "list.txt" -c copy -map 0 "out-${1}"

# cleanup
rm command.sh
rm list.txt
for file in ${splitfiles[@]}; do
    rm "$file"
done

exit 0