- Create standalone web UI at /peertube-analyse/ - Add CGI backend (peertube-analyse, peertube-analyse-status) - Add RPCD methods: analyse, analyse_status - Update portal with Intelligence & Analyse section - Expose via analyse.gk2.secubox.in with SSL Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
152 lines
4.5 KiB
Bash
152 lines
4.5 KiB
Bash
#!/bin/sh
|
|
# CGI endpoint for PeerTube video analysis
|
|
# Returns JSON response
|
|
|
|
# Set headers
|
|
printf "Content-Type: application/json\r\n"
|
|
printf "Access-Control-Allow-Origin: *\r\n"
|
|
printf "Access-Control-Allow-Methods: POST, OPTIONS\r\n"
|
|
printf "Access-Control-Allow-Headers: Content-Type\r\n"
|
|
printf "\r\n"
|
|
|
|
# Handle OPTIONS (CORS preflight)
|
|
if [ "$REQUEST_METHOD" = "OPTIONS" ]; then
|
|
exit 0
|
|
fi
|
|
|
|
# Only allow POST
|
|
if [ "$REQUEST_METHOD" != "POST" ]; then
|
|
echo '{"error": "Method not allowed"}'
|
|
exit 0
|
|
fi
|
|
|
|
# Read input
|
|
INPUT=$(cat)
|
|
|
|
# Parse JSON (use jq if available, else jsonfilter)
|
|
if command -v jq >/dev/null 2>&1; then
|
|
URL=$(echo "$INPUT" | jq -r '.url // empty')
|
|
FORCE_WHISPER=$(echo "$INPUT" | jq -r '.force_whisper // "0"')
|
|
NO_ANALYSE=$(echo "$INPUT" | jq -r '.no_analyse // "0"')
|
|
MODEL=$(echo "$INPUT" | jq -r '.model // "medium"')
|
|
LANG=$(echo "$INPUT" | jq -r '.lang // "fr"')
|
|
else
|
|
URL=$(echo "$INPUT" | jsonfilter -e '@.url' 2>/dev/null)
|
|
FORCE_WHISPER=$(echo "$INPUT" | jsonfilter -e '@.force_whisper' 2>/dev/null)
|
|
NO_ANALYSE=$(echo "$INPUT" | jsonfilter -e '@.no_analyse' 2>/dev/null)
|
|
MODEL=$(echo "$INPUT" | jsonfilter -e '@.model' 2>/dev/null)
|
|
LANG=$(echo "$INPUT" | jsonfilter -e '@.lang' 2>/dev/null)
|
|
fi
|
|
|
|
# Validate URL
|
|
if [ -z "$URL" ]; then
|
|
echo '{"error": "URL is required"}'
|
|
exit 0
|
|
fi
|
|
|
|
# Sanitize URL (basic security check)
|
|
case "$URL" in
|
|
http://*|https://*)
|
|
# Valid URL prefix
|
|
;;
|
|
*)
|
|
echo '{"error": "Invalid URL format"}'
|
|
exit 0
|
|
;;
|
|
esac
|
|
|
|
# Set defaults
|
|
[ -z "$MODEL" ] && MODEL="medium"
|
|
[ -z "$LANG" ] && LANG="fr"
|
|
|
|
# Generate job ID
|
|
JOB_ID="analyse_$(date +%s)_$$"
|
|
OUTPUT_DIR="/tmp/peertube-analyse/${JOB_ID}"
|
|
STATUS_FILE="/tmp/peertube-analyse-${JOB_ID}.status"
|
|
RESULT_FILE="/tmp/peertube-analyse-${JOB_ID}.json"
|
|
LOG_FILE="/tmp/peertube-analyse-${JOB_ID}.log"
|
|
|
|
mkdir -p "$OUTPUT_DIR"
|
|
|
|
# Check for existing analysis script
|
|
if [ ! -x "/usr/sbin/peertube-analyse" ]; then
|
|
echo '{"error": "peertube-analyse not installed"}'
|
|
exit 0
|
|
fi
|
|
|
|
# Build command arguments
|
|
ARGS=""
|
|
[ "$FORCE_WHISPER" = "1" ] || [ "$FORCE_WHISPER" = "true" ] && ARGS="$ARGS --force-whisper"
|
|
[ "$NO_ANALYSE" = "1" ] || [ "$NO_ANALYSE" = "true" ] && ARGS="$ARGS --no-analyse"
|
|
[ -n "$MODEL" ] && ARGS="$ARGS --model $MODEL"
|
|
[ -n "$LANG" ] && ARGS="$ARGS --lang $LANG"
|
|
ARGS="$ARGS --output $OUTPUT_DIR"
|
|
|
|
# Start analysis in background
|
|
echo "starting" > "$STATUS_FILE"
|
|
(
|
|
echo "extracting" > "$STATUS_FILE"
|
|
|
|
# Run the analysis
|
|
OUTPUT_BASE="$OUTPUT_DIR" /usr/sbin/peertube-analyse $ARGS "$URL" > "$LOG_FILE" 2>&1
|
|
RC=$?
|
|
|
|
if [ $RC -eq 0 ]; then
|
|
echo "completed" > "$STATUS_FILE"
|
|
|
|
# Find output files
|
|
META_FILE=$(find "$OUTPUT_DIR" -name "*.meta.json" -type f 2>/dev/null | head -1)
|
|
TRANSCRIPT_FILE=$(find "$OUTPUT_DIR" -name "*.transcript.txt" -type f 2>/dev/null | head -1)
|
|
ANALYSIS_FILE=$(find "$OUTPUT_DIR" -name "*.analyse.md" -type f 2>/dev/null | head -1)
|
|
|
|
# Build result JSON
|
|
{
|
|
echo '{'
|
|
echo '"success": true,'
|
|
echo '"job_id": "'"$JOB_ID"'",'
|
|
|
|
# Metadata
|
|
if [ -f "$META_FILE" ]; then
|
|
echo '"metadata": '
|
|
cat "$META_FILE"
|
|
echo ','
|
|
else
|
|
echo '"metadata": null,'
|
|
fi
|
|
|
|
# Transcript
|
|
if [ -f "$TRANSCRIPT_FILE" ]; then
|
|
printf '"transcript": '
|
|
if command -v jq >/dev/null 2>&1; then
|
|
cat "$TRANSCRIPT_FILE" | jq -Rs '.'
|
|
else
|
|
printf '"%s"' "$(cat "$TRANSCRIPT_FILE" | sed 's/\\/\\\\/g; s/"/\\"/g; s/$/\\n/' | tr -d '\n')"
|
|
fi
|
|
echo ','
|
|
else
|
|
echo '"transcript": null,'
|
|
fi
|
|
|
|
# Analysis
|
|
if [ -f "$ANALYSIS_FILE" ]; then
|
|
printf '"analysis": '
|
|
if command -v jq >/dev/null 2>&1; then
|
|
cat "$ANALYSIS_FILE" | jq -Rs '.'
|
|
else
|
|
printf '"%s"' "$(cat "$ANALYSIS_FILE" | sed 's/\\/\\\\/g; s/"/\\"/g; s/$/\\n/' | tr -d '\n')"
|
|
fi
|
|
else
|
|
echo '"analysis": null'
|
|
fi
|
|
|
|
echo '}'
|
|
} > "$RESULT_FILE"
|
|
else
|
|
echo "failed" > "$STATUS_FILE"
|
|
echo '{"success": false, "error": "Analysis failed", "job_id": "'"$JOB_ID"'"}' > "$RESULT_FILE"
|
|
fi
|
|
) &
|
|
|
|
# Return job ID for polling
|
|
echo "{\"success\": true, \"message\": \"Analysis started\", \"job_id\": \"$JOB_ID\"}"
|