#!/usr/bin/env bash
# ============================================================
# Autor: kamowski & AI
# Názov: rozdel skladbu
# Popis:
# Rozdelenie dlhej zvukovej nahravky na jednotlive skladby
# podla casovych znaciek a nazvov v **tracklist.txt**.
# Vystup: samostatne MP3 subory v adresari s nazvom
# vstupnej nahravky.
# Verzia: 14.10.2026–07:51
# Spúšťanie: CLI ./rozdel.sh vstup.mp3 tracklist.txt
# ============================================================
set -euo pipefail

if [[ $# -ne 2 ]]; then
    echo "Použitie: $0 vstupny_subor tracklist.txt"
    exit 1
fi

INPUT="$1"
LIST="$2"
OUTDIR="${INPUT%.*}"

[[ -f "$INPUT" ]] || { echo "Subor neexistuje: $INPUT"; exit 1; }
[[ -f "$LIST" ]] || { echo "Zoznam neexistuje: $LIST"; exit 1; }

command -v ffmpeg >/dev/null || {
    echo "Najprv nainstaluj ffmpeg."
    exit 1
}

declare -a TIMES=()
declare -a NAMES=()

while IFS= read -r line || [[ -n "$line" ]]; do
    # Preskoc prazdne riadky a nadpisy.
    [[ "$line" =~ ^[[:space:]]*$ ]] && continue

    if [[ "$line" =~ ^[[:space:]]*([0-9]+:[0-9]{2}(:[0-9]{2})?)[[:space:]]*(\|[[:space:]]*)?(.*)$ ]]; then
        stamp="${BASH_REMATCH[1]}"
        name="${BASH_REMATCH[4]}"

        IFS=: read -r -a parts <<< "$stamp"

        if (( ${#parts[@]} == 3 )); then
            seconds=$((10#${parts[0]} * 3600 + 10#${parts[1]} * 60 + 10#${parts[2]}))
        else
            seconds=$((10#${parts[0]} * 60 + 10#${parts[1]}))
        fi

        # Odstranenie uvodnych cisiel tracku, ak su uvedene.
        name="${name# }"
        name="${name#|}"
        name="${name# }"

        [[ -z "$name" ]] && name="Skladba"

        TIMES+=("$seconds")
        NAMES+=("$name")
    fi
done < "$LIST"

if (( ${#TIMES[@]} == 0 )); then
    echo "V trackliste sa nenasli ziadne casove znacky."
    exit 1
fi

mkdir -p "$OUTDIR"

for ((i=0; i<${#TIMES[@]}; i++)); do
    start=${TIMES[i]}
    number=$(printf "%02d" "$((i+1))")
    safe_name="${NAMES[i]//\//-}"
    output="$OUTDIR/${number} - ${safe_name}.mp3"

    echo "[$((i+1))/${#TIMES[@]}] ${NAMES[i]}"

    if (( i + 1 < ${#TIMES[@]} )); then
        duration=$((TIMES[i+1] - start))
        if (( duration <= 0 )); then
            echo "Chyba: casy v trackliste nie su vzostupne."
            exit 1
        fi

        ffmpeg -nostdin -hide_banner -loglevel error -y \
            -ss "$start" -i "$INPUT" -t "$duration" \
            -vn -c:a libmp3lame -q:a 2 "$output"
    else
        ffmpeg -nostdin -hide_banner -loglevel error -y \
            -ss "$start" -i "$INPUT" \
            -vn -c:a libmp3lame -q:a 2 "$output"
    fi
done

echo
echo "Hotovo! Pocet skladieb: ${#TIMES[@]}"
echo "Vystupny priecinok: $OUTDIR"
