#!/usr/bin/env bash

# Utility to get the .mkv out of .rar/blueray files from the current directory
# and subdirectories.

set -Eeuo pipefail
shopt -s nullglob

OUT="${OUT:-$PWD}"
echo "output: $OUT"

pick_rar() {
  # prefer part01, else any .rar, else .r00
  for p in *.[Pp][Aa][Rr][Tt]01.[Rr][Aa][Rr] *.[Pp][Aa][Rr][Tt]001.[Rr][Aa][Rr]; do [[ -f "$p" ]] && { echo "$p"; return; }; done
  for r in *.[Rr][Aa][Rr]; do [[ -f "$r" ]] && { echo "$r"; return; }; done
  for r in *.[Rr]00; do [[ -f "$r" ]] && { echo "$r"; return; }; done
  return 1
}

pick_video() {
  find "$1" -type f \
    \( -iname '*.mkv' -o -iname '*.mp4' -o -iname '*.avi' -o -iname '*.m2ts' \) \
    ! -iname '*sample*' \
    -printf '%s\t%p\n' 2>/dev/null \
  | sort -nr | head -n1 | cut -f2-
}

process_dir() {
  local dir="$1"
  echo "==> $dir"
  pushd "$dir" >/dev/null

  local rar
  if ! rar="$(pick_rar)"; then
    echo "  no rar found, skipping"
    popd >/dev/null
    return
  fi

  local base out tmp video
  base="$(basename "$(pwd)")"
  out="$OUT/${base}.mkv"

  tmp="$(mktemp -d)"
  trap 'rm -rf "$tmp"' RETURN

  unrar x -o+ -idq "$rar" "$tmp/" || { echo "  extract failed"; popd >/dev/null; return; }

  video="$(pick_video "$tmp")"
  [[ -n "${video:-}" ]] || { echo "  no video found"; popd >/dev/null; return; }

  echo "  muxing -> $out"
  mkvmerge -o "$out" "$video"

  popd >/dev/null
}

for d in . */; do
  [[ -d "$d" ]] || continue
  process_dir "$d"
done
