#!/usr/bin/env bash
#
# flv2rtsp.sh - 用 Docker 中的 static-ffmpeg 将 FLV 输入推到 RTSP
#
# 用法:
#   ./flv2rtsp.sh <FLV输入> <推流名字>
#
# 参数:
#   FLV输入   完整 URL（http/https/rtmp/rtsp/flv）或本地 .flv 文件路径
#   推流名字  输出路径中的流名：rtsp://192.168.3.60/live/<名字>
#
# 示例:
#   ./flv2rtsp.sh 'http://example.com/live/cam1.flv' cam1
#   ./flv2rtsp.sh ./sample.flv demo
#
# 拉流:
#   ffplay -rtsp_transport tcp rtsp://192.168.3.60/live/<名字>
#

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

usage() {
    echo "用法: $0 <FLV输入> <推流名字>" >&2
    echo "  FLV输入: 完整 URL 或本地 flv 文件路径" >&2
    echo "  推流名字: 输出到 rtsp://192.168.3.60/live/<名字>" >&2
    echo "示例: $0 'http://host/path/stream.flv' mycam" >&2
    exit 1
}

if [[ $# -ne 2 ]]; then
    usage
fi

INPUT="$1"
STREAM_NAME="$2"

if [[ -z "${INPUT}" || -z "${STREAM_NAME}" ]]; then
    echo "错误: FLV 输入与推流名字均不能为空" >&2
    usage
fi

# 流名做最小安全约束，避免破坏 URL 路径
if [[ "${STREAM_NAME}" == *"/"* || "${STREAM_NAME}" == *" "* ]]; then
    echo "错误: 推流名字不能包含空格或 '/'" >&2
    exit 1
fi

SERVER="192.168.3.60"
PUSH_URL="rtsp://${SERVER}/live/${STREAM_NAME}"
IMAGE="mwader/static-ffmpeg:7.1"
CONTAINER_NAME="flv2rtsp60"

# 判断本地文件：非 URL scheme 且路径存在时挂载进容器
DOCKER_VOL=()
FF_INPUT="${INPUT}"

is_url() {
    case "$1" in
        http://*|https://*|rtmp://*|rtmps://*|rtsp://*|rtsps://*|flv://*) return 0 ;;
        *) return 1 ;;
    esac
}

if ! is_url "${INPUT}"; then
    # 相对路径相对脚本目录解析
    if [[ "${INPUT}" != /* ]]; then
        INPUT="${SCRIPT_DIR}/${INPUT}"
    fi
    if [[ ! -f "${INPUT}" ]]; then
        echo "错误: 本地 FLV 文件不存在: ${INPUT}" >&2
        exit 1
    fi
    # 挂载文件所在目录，容器内用固定路径
    SRC_DIR="$(cd "$(dirname "${INPUT}")" && pwd)"
    SRC_BASE="$(basename "${INPUT}")"
    DOCKER_VOL=(-v "${SRC_DIR}:/input:ro")
    FF_INPUT="/input/${SRC_BASE}"
fi

echo "  输入: ${INPUT}"
echo "  容器内输入: ${FF_INPUT}"
echo "  流名: ${STREAM_NAME}"
echo "  推送: ${PUSH_URL}"
echo "  镜像: ${IMAGE}"
echo "  容器: ${CONTAINER_NAME}"
echo "  网络: host | 传输: RTSP TCP | 视频: copy | 音频: 无"
echo ""

# 已在运行则先停
if [[ -n "$(docker ps -q --filter "name=^/${CONTAINER_NAME}$")" ]]; then
    echo "检测到运行中的容器 ${CONTAINER_NAME}，正在停止..."
    docker stop "${CONTAINER_NAME}" >/dev/null
fi

# 清理同名已停止容器，避免 run 名称冲突（--rm 未生效的残留）
if [[ -n "$(docker ps -aq --filter "name=^/${CONTAINER_NAME}$")" ]]; then
    echo "清理已停止的同名容器 ${CONTAINER_NAME}..."
    docker rm "${CONTAINER_NAME}" >/dev/null
fi

exec docker run --rm --network host --name "${CONTAINER_NAME}" \
    "${DOCKER_VOL[@]}" \
    "${IMAGE}" \
    -hide_banner \
    -i "${FF_INPUT}" \
    -c:v copy \
    -an \
    -f rtsp \
    -rtsp_transport tcp \
    "${PUSH_URL}"
