#!/usr/bin/env bash
set -euo pipefail
GSC_VIDEO_ROOT="${GSC_VIDEO_ROOT:-GSC-videos}"
GSC_MANIFEST_URL="${GSC_MANIFEST_URL:-https://mpeg.expert/gsc/cfp/content/api/video-manifest.php?format=tsv}"
need(){ command -v "$1" >/dev/null 2>&1 || { echo "ERROR: '$1' is required." >&2; exit 1; }; }
need curl; need mkdir; need mv; need dirname; need awk; need mktemp
if [ -z "${MPEG_USER:-}" ]; then printf "content.mpeg.expert username: "; IFS= read -r MPEG_USER; fi
if [ -z "${MPEG_PASS:-}" ]; then printf "content.mpeg.expert password: "; IFS= read -r -s MPEG_PASS; printf "\n"; fi
mkdir -p "$GSC_VIDEO_ROOT"
TMP_MANIFEST="$(mktemp "${TMPDIR:-/tmp}/gsc-video-manifest.XXXXXX")"
trap 'rm -f "$TMP_MANIFEST"' EXIT INT TERM
echo "Fetching current GSC video manifest..."
curl --fail --silent --show-error --location "$GSC_MANIFEST_URL" -o "$TMP_MANIFEST"
TOTAL="$(awk 'NF {n++} END {print n+0}' "$TMP_MANIFEST")"
echo "$TOTAL video(s) currently referenced by the GSC voting portal."
echo "Destination: $GSC_VIDEO_ROOT"
echo
DONE=0; SKIPPED=0; FAILED=0; INDEX=0
while IFS=$'\t' read -r URL RELPATH SEQUENCE CONTRIBUTION; do
  [ -n "${URL:-}" ] || continue
  [ -n "${RELPATH:-}" ] || continue
  INDEX=$((INDEX + 1)); DST="$GSC_VIDEO_ROOT/$RELPATH"; PART="$DST.part"
  mkdir -p "$(dirname "$DST")"
  if [ -s "$DST" ]; then echo "[$INDEX/$TOTAL] SKIP  $RELPATH"; SKIPPED=$((SKIPPED + 1)); continue; fi
  echo "[$INDEX/$TOTAL] GET   $RELPATH"
  if curl --fail --location --retry 3 --retry-delay 2 --continue-at - --user "$MPEG_USER:$MPEG_PASS" --output "$PART" "$URL"; then
    mv "$PART" "$DST"; DONE=$((DONE + 1))
  else
    echo "WARNING: failed: $URL" >&2; FAILED=$((FAILED + 1))
  fi
done < "$TMP_MANIFEST"
echo
echo "Finished."
echo "  downloaded: $DONE"
echo "  already present: $SKIPPED"
echo "  failed: $FAILED"
echo "  root: $GSC_VIDEO_ROOT"
if [ "$FAILED" -ne 0 ]; then echo "Re-run the same script to retry failed or interrupted downloads." >&2; exit 2; fi