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

if [[ $# == 1 && ($1 == -h || $1 == --help) ]]; then
    echo "Usage: ${0##*/} AUDIO_FILE"
    echo 'Transcribe audio using OPENROUTER_API_KEY; print the text to stdout.'
    exit 0
fi
if [[ $# != 1 ]]; then
    echo "Usage: ${0##*/} AUDIO_FILE" >&2
    exit 1
fi
if [[ ! -f $1 || ! -r $1 ]]; then
    echo "Cannot read audio file: $1" >&2
    exit 1
fi
: "${OPENROUTER_API_KEY:?Set OPENROUTER_API_KEY first}"
for tool in ffmpeg curl jq base64 mktemp; do
    command -v "$tool" >/dev/null || {
        echo "Missing dependency: $tool" >&2
        exit 1
    }
done

tmp=$(mktemp -d)
trap 'rm -rf -- "$tmp"' EXIT
trap 'exit 130' INT
trap 'exit 143' TERM

# Normalize any FFmpeg-readable audio (or the first audio track in a video).
ffmpeg -nostdin -hide_banner -loglevel error -i "$(realpath -- "$1")" \
    -map 0:a:0 -ac 1 -ar 16000 -c:a pcm_s16le "$tmp/audio.wav"

# Keep large audio payloads out of shell arguments (which have a size limit).
base64 <"$tmp/audio.wav" | tr -d '\n\r' >"$tmp/audio.b64"
jq -n --rawfile data "$tmp/audio.b64" \
    '{model: "microsoft/mai-transcribe-2", input_audio: {data: $data, format: "wav"}}' \
    >"$tmp/request.json"

curl --silent --show-error --fail-with-body \
    https://openrouter.ai/api/v1/audio/transcriptions \
    -H "Authorization: Bearer $OPENROUTER_API_KEY" \
    -H 'Content-Type: application/json' \
    --data-binary @"$tmp/request.json" -o "$tmp/response.json" || {
    cat "$tmp/response.json" >&2
    exit 1
}
jq -r 'if (.text | type) == "string" then .text
       else error("Transcription failed: " + (.error.message // tojson)) end' \
    "$tmp/response.json"
