jeffsi-meet/deploy/meeting-intelligence/jibri/config/finalize.sh

105 lines
2.8 KiB
Bash
Executable File

#!/bin/bash
# Jibri Recording Finalize Script
# Called when Jibri finishes recording a meeting
#
# Arguments:
# $1 - Recording directory path (e.g., /recordings/<conference_id>/<timestamp>)
#
# This script:
# 1. Finds the recording file
# 2. Notifies the Meeting Intelligence API to start processing
set -e
RECORDING_DIR="$1"
API_URL="${MEETING_INTELLIGENCE_API:-http://api:8000}"
LOG_FILE="/var/log/jibri/finalize.log"
log() {
echo "[$(date -Iseconds)] $1" >> "$LOG_FILE"
echo "[$(date -Iseconds)] $1"
}
log "=== Finalize script started ==="
log "Recording directory: $RECORDING_DIR"
# Validate recording directory
if [ -z "$RECORDING_DIR" ] || [ ! -d "$RECORDING_DIR" ]; then
log "ERROR: Invalid recording directory: $RECORDING_DIR"
exit 1
fi
# Find the recording file (MP4 or WebM)
RECORDING_FILE=$(find "$RECORDING_DIR" -type f \( -name "*.mp4" -o -name "*.webm" \) | head -1)
if [ -z "$RECORDING_FILE" ]; then
log "ERROR: No recording file found in $RECORDING_DIR"
exit 1
fi
log "Found recording file: $RECORDING_FILE"
# Get file info
FILE_SIZE=$(stat -c%s "$RECORDING_FILE" 2>/dev/null || echo "0")
log "Recording file size: $FILE_SIZE bytes"
# Extract conference info from path
# Expected format: /recordings/<conference_id>/<timestamp>/recording.mp4
CONFERENCE_ID=$(echo "$RECORDING_DIR" | awk -F'/' '{print $(NF-1)}')
if [ -z "$CONFERENCE_ID" ]; then
CONFERENCE_ID=$(basename "$(dirname "$RECORDING_DIR")")
fi
# Look for metadata file (Jibri sometimes creates this)
METADATA_FILE="$RECORDING_DIR/metadata.json"
if [ -f "$METADATA_FILE" ]; then
log "Found metadata file: $METADATA_FILE"
METADATA=$(cat "$METADATA_FILE")
else
METADATA="{}"
fi
# Prepare webhook payload
PAYLOAD=$(cat <<EOF
{
"event_type": "recording_completed",
"conference_id": "$CONFERENCE_ID",
"recording_path": "$RECORDING_FILE",
"recording_dir": "$RECORDING_DIR",
"file_size_bytes": $FILE_SIZE,
"completed_at": "$(date -Iseconds)",
"metadata": $METADATA
}
EOF
)
log "Sending webhook to $API_URL/webhooks/recording-complete"
log "Payload: $PAYLOAD"
# Send webhook to Meeting Intelligence API
RESPONSE=$(curl -s -w "\n%{http_code}" \
-X POST \
-H "Content-Type: application/json" \
-d "$PAYLOAD" \
"$API_URL/webhooks/recording-complete" 2>&1)
HTTP_CODE=$(echo "$RESPONSE" | tail -1)
BODY=$(echo "$RESPONSE" | head -n -1)
if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "201" ] || [ "$HTTP_CODE" = "202" ]; then
log "SUCCESS: Webhook accepted (HTTP $HTTP_CODE)"
log "Response: $BODY"
else
log "WARNING: Webhook returned HTTP $HTTP_CODE"
log "Response: $BODY"
# Don't fail the script - the recording is still saved
# The API can be retried later
fi
# Optional: Clean up old recordings (keep last 30 days)
# find /recordings -type f -mtime +30 -delete
log "=== Finalize script completed ==="
exit 0