#!/bin/bash # Configuration QUEUE_DIR="/var/www/download/queue" READY_DIR="/var/www/download/ready" SETTINGS_FILE="/path/to/settings/settings.json" LOG_FILE="/var/log/convert.log" LOGO_FILE="/var/www/settings/logo.png" # Create directories if they don't exist mkdir -p "$QUEUE_DIR" mkdir -p "$READY_DIR" # Load settings from JSON file load_settings() { VIDEO_FORMAT=$(jq -r '.video_format' "$SETTINGS_FILE") AUDIO_FORMAT=$(jq -r '.audio_format' "$SETTINGS_FILE") VIDEO_BITRATE=$(jq -r '.video_bitrate' "$SETTINGS_FILE") AUDIO_BITRATE=$(jq -r '.audio_bitrate' "$SETTINGS_FILE") RESOLUTION=$(jq -r '.resolution' "$SETTINGS_FILE") FRAME_RATE=$(jq -r '.frame_rate' "$SETTINGS_FILE") GOP=$(jq -r '.gop' "$SETTINGS_FILE") } # Function to sanitize filename sanitize_filename() { local filename="$1" # Remove special characters, keep only a-z, A-Z, 0-9, and . local sanitized=$(echo "$filename" | sed 's/[^a-zA-Z0-9.]*//g') # If filename starts with number, add prefix if [[ "$sanitized" =~ ^[0-9] ]]; then sanitized="dev_${sanitized}" fi # If filename is empty after sanitization, use timestamp if [[ -z "$sanitized" ]]; then sanitized="dev_$(date +%s)" fi echo "$sanitized" } # Function to get video resolution get_video_resolution() { local input_file="$1" ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 "$input_file" } # Function to calculate logo size based on video resolution calculate_logo_size() { local video_width="$1" local video_height="$2" # Calculate 10% of video width/height for logo size local logo_width=$((video_width / 10)) local logo_height=$((video_height / 10)) # Ensure minimum size of 64x64 if [ "$logo_width" -lt 64 ]; then logo_width=64; fi if [ "$logo_height" -lt 64 ]; then logo_height=64; fi # Ensure maximum size of 128x128 if [ "$logo_width" -gt 128 ]; then logo_width=128; fi if [ "$logo_height" -gt 128 ]; then logo_height=128; fi echo "${logo_width}x${logo_height}" } # Main processing loop while true; do # Load settings at start of each loop load_settings # Find all files in queue directory for file in "$QUEUE_DIR"/*; do # Skip if no files found [ -f "$file" ] || continue # Get original filename original_name=$(basename "$file") # Sanitize filename sanitized_name=$(sanitize_filename "$original_name") # Add .ts extension sanitized_name="${sanitized_name}.ts" # Set output path output_file="$READY_DIR/$sanitized_name" # Check if logo file exists if [ -f "$LOGO_FILE" ]; then # Get video resolution video_res=$(get_video_resolution "$file") video_width=$(echo "$video_res" | cut -d'x' -f1) video_height=$(echo "$video_res" | cut -d'x' -f2) # Calculate logo size logo_size=$(calculate_logo_size "$video_width" "$video_height") # Convert file with ffmpeg using settings from JSON and logo overlay if ffmpeg -i "$file" \ -c:v "$VIDEO_FORMAT" \ -b:v "$VIDEO_BITRATE" \ -c:a "$AUDIO_FORMAT" \ -b:a "$AUDIO_BITRATE" \ -s "$RESOLUTION" \ -r "$FRAME_RATE" \ -g "$GOP" \ -vf "scale=iw:ih,overlay=W-w-10:10" \ "$output_file" 2>>"$LOG_FILE"; then # If conversion successful, remove original file rm "$file" echo "$(date): Successfully converted $original_name to $sanitized_name" >> "$LOG_FILE" else # If conversion failed, log error echo "$(date): Failed to convert $original_name" >> "$LOG_FILE" fi else # Convert file without logo if logo file doesn't exist if ffmpeg -i "$file" \ -c:v "$VIDEO_FORMAT" \ -b:v "$VIDEO_BITRATE" \ -c:a "$AUDIO_FORMAT" \ -b:a "$AUDIO_BITRATE" \ -s "$RESOLUTION" \ -r "$FRAME_RATE" \ -g "$GOP" \ "$output_file" 2>>"$LOG_FILE"; then # If conversion successful, remove original file rm "$file" echo "$(date): Successfully converted $original_name to $sanitized_name" >> "$LOG_FILE" else # If conversion failed, log error echo "$(date): Failed to convert $original_name" >> "$LOG_FILE" fi fi done # Wait before checking for new files sleep 5 done