#!/bin/bash
#
# NYC Traffic Camera → YouTube Stream Rotator
# Pulls live HLS streams from NY State DOT 511 traffic cameras
# and rotates between them on your YouTube live stream.
#
# Source: 511ny.org public API (1,541 cameras statewide, 316 in NYC)
# Streams: HLS m3u8 via nysdot.skyvdn.com (publicly accessible worldwide)
#
# Usage:
#   ./nyc_stream_rotator.sh YOUR_YOUTUBE_STREAM_KEY
#   ./nyc_stream_rotator.sh YOUR_YOUTUBE_STREAM_KEY 300  # rotate every 5 min
#
# Requirements: ffmpeg, curl

YOUTUBE_KEY="$1"
ROTATE_SECONDS="${2:-120}"

if [ -z "$YOUTUBE_KEY" ]; then
  echo "Usage: $0 <youtube-stream-key> [rotate-seconds]"
  echo "Example: $0 abcd-1234-efgh-5678 120"
  exit 1
fi

YOUTUBE_URL="rtmp://a.rtmp.youtube.com/live2/${YOUTUBE_KEY}"

# NYC Traffic Cameras - HLS streams from 511ny.org / NYS DOT
# All publicly accessible, no auth needed
STREAMS=(
  # === Manhattan ===
  "Harlem River Dr @ 127 St|https://s7.nysdot.skyvdn.com:443/rtplive/R11_153/playlist.m3u8"
  "Harlem River Dr @ 135 St|https://s9.nysdot.skyvdn.com:443/rtplive/R11_251/playlist.m3u8"
  "West St @ West Houston St|https://s9.nysdot.skyvdn.com:443/rtplive/R11_271/playlist.m3u8"
  "West St @ W 34 St|https://s9.nysdot.skyvdn.com:443/rtplive/R11_272/playlist.m3u8"
  "West St @ W 57 St|https://s9.nysdot.skyvdn.com:443/rtplive/R11_273/playlist.m3u8"
  "Henry Hudson Pkwy @ La Salle St|https://s7.nysdot.skyvdn.com:443/rtplive/R11_258/playlist.m3u8"
  "Henry Hudson Pkwy @ W 66 St|https://s9.nysdot.skyvdn.com:443/rtplive/R11_242/playlist.m3u8"
  "Henry Hudson Pkwy @ W 119 St|https://s9.nysdot.skyvdn.com:443/rtplive/R11_260/playlist.m3u8"

  # === Bridges & Tunnels ===
  "I-495 Queens Midtown Tunnel|https://s51.nysdot.skyvdn.com:443/rtplive/R11_127/playlist.m3u8"
  "I-87 @ Macombs Dam Bridge|https://s52.nysdot.skyvdn.com:443/rtplive/R11_044/playlist.m3u8"
  "I-278 Verrazzano Approach|https://s7.nysdot.skyvdn.com:443/rtplive/R11_216/playlist.m3u8"
  "I-87 Gov Mario Cuomo Bridge|https://s53.nysdot.skyvdn.com:443/rtplive/TA_028/playlist.m3u8"
  "I-87 Gov Mario Cuomo Bridge 2|https://s53.nysdot.skyvdn.com:443/rtplive/TA_030/playlist.m3u8"

  # === BQE / Brooklyn-Queens ===
  "I-278 @ Richmond Ave (Staten Island)|https://s7.nysdot.skyvdn.com:443/rtplive/R11_211/playlist.m3u8"
  "I-278 @ Victory Blvd|https://s7.nysdot.skyvdn.com:443/rtplive/R11_213/playlist.m3u8"
  "I-278 @ Bradley Ave|https://s7.nysdot.skyvdn.com:443/rtplive/R11_216/playlist.m3u8"

  # === Van Wyck / JFK area ===
  "I-678 Van Wyck @ North Conduit Ave|https://s7.nysdot.skyvdn.com:443/rtplive/R11_157/playlist.m3u8"
  "I-678 Van Wyck @ LIE|https://s7.nysdot.skyvdn.com:443/rtplive/R11_183/playlist.m3u8"
  "I-678 Van Wyck @ Northern Blvd|https://s7.nysdot.skyvdn.com:443/rtplive/R11_186/playlist.m3u8"
  "I-678 Whitestone @ 14th Ave|https://s7.nysdot.skyvdn.com:443/rtplive/R11_188/playlist.m3u8"

  # === LIE / I-495 ===
  "I-495 LIE @ 220th St|https://s7.nysdot.skyvdn.com:443/rtplive/R11_154/playlist.m3u8"
  "I-495 LIE @ 254th St|https://s7.nysdot.skyvdn.com:443/rtplive/R11_155/playlist.m3u8"

  # === Bronx / I-95 ===
  "I-95 Bruckner @ Buhre Ave|https://s52.nysdot.skyvdn.com:443/rtplive/R11_012/playlist.m3u8"
  "I-95 @ Hutchinson River Pkwy|https://s53.nysdot.skyvdn.com:443/rtplive/TA_051/playlist.m3u8"
  "I-95 @ New Rochelle|https://s53.nysdot.skyvdn.com:443/rtplive/TA_052/playlist.m3u8"

  # === Major Deegan / I-87 ===
  "I-87 Deegan @ Macombs Dam Bridge|https://s52.nysdot.skyvdn.com:443/rtplive/R11_044/playlist.m3u8"
  "I-87 @ Ardsley (Interchange 7)|https://s53.nysdot.skyvdn.com:443/rtplive/TA_021/playlist.m3u8"
  "I-87 @ Saw Mill River Pkwy|https://s53.nysdot.skyvdn.com:443/rtplive/TA_022/playlist.m3u8"

  # === Staten Island ===
  "Korean War Vets Pkwy @ Tyrellan Ave|https://s7.nysdot.skyvdn.com:443/rtplive/R11_189/playlist.m3u8"
  "Korean War Vets Pkwy @ Bloomingdale Rd|https://s7.nysdot.skyvdn.com:443/rtplive/R11_190/playlist.m3u8"
)

TOTAL=${#STREAMS[@]}
echo "============================================"
echo "  NYC Traffic Cam -> YouTube Rotator"
echo "============================================"
echo "  Cameras: $TOTAL"
echo "  Rotate every: ${ROTATE_SECONDS}s"
echo "  Source: 511ny.org / NYS DOT (public)"
echo "  YouTube: rtmp://a.rtmp.youtube.com/live2/****"
echo ""

# Shuffle
shuffle_streams() {
  local i j tmp
  for ((i = ${#STREAMS[@]} - 1; i > 0; i--)); do
    j=$((RANDOM % (i + 1)))
    tmp="${STREAMS[$i]}"
    STREAMS[$i]="${STREAMS[$j]}"
    STREAMS[$j]="$tmp"
  done
}

# Stream one camera to YouTube
stream_one() {
  local name="$1"
  local url="$2"

  echo "[$(date '+%H:%M:%S')] NOW: $name"

  timeout $((ROTATE_SECONDS + 15)) ffmpeg -y \
    -reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5 \
    -i "$url" \
    -f lavfi -i "anullsrc=channel_layout=stereo:sample_rate=44100" \
    -t "$ROTATE_SECONDS" \
    -map 0:v:0 -map 1:a:0 \
    -c:v libx264 -preset veryfast -maxrate 4500k -bufsize 9000k \
    -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,drawtext=text='NYC - $name':fontsize=28:fontcolor=white:borderw=2:bordercolor=black:x=20:y=h-50" \
    -g 60 -keyint_min 60 \
    -c:a aac -b:a 128k -ar 44100 \
    -f flv "$YOUTUBE_URL" \
    2>/dev/null

  local rc=$?
  if [ $rc -ne 0 ] && [ $rc -ne 124 ]; then
    echo "  [SKIP] Stream failed (exit $rc)"
    return 1
  fi
  return 0
}

# Main loop
echo "Starting stream rotation... (Ctrl+C to stop)"
echo ""

while true; do
  shuffle_streams
  for entry in "${STREAMS[@]}"; do
    IFS='|' read -r name url <<< "$entry"
    stream_one "$name" "$url"
    sleep 1
  done
  echo "=== Full rotation done, restarting ==="
done
