mirror of
				https://github.com/community-scripts/ProxmoxVE.git
				synced 2025-11-04 10:22:50 +00:00 
			
		
		
		
	tools.func: add ffmpeg + minor improvement (#5834)
This commit is contained in:
		
							
								
								
									
										165
									
								
								misc/tools.func
									
									
									
									
									
								
							
							
						
						
									
										165
									
								
								misc/tools.func
									
									
									
									
									
								
							@@ -442,7 +442,6 @@ function setup_php() {
 | 
				
			|||||||
    fi
 | 
					    fi
 | 
				
			||||||
  done
 | 
					  done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  
 | 
					 | 
				
			||||||
  IFS=',' read -ra MODULES <<<"$COMBINED_MODULES"
 | 
					  IFS=',' read -ra MODULES <<<"$COMBINED_MODULES"
 | 
				
			||||||
  for mod in "${MODULES[@]}"; do
 | 
					  for mod in "${MODULES[@]}"; do
 | 
				
			||||||
    MODULE_LIST+=" php${PHP_VERSION}-${mod}"
 | 
					    MODULE_LIST+=" php${PHP_VERSION}-${mod}"
 | 
				
			||||||
@@ -952,7 +951,7 @@ function fetch_and_deploy_gh_release() {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    mkdir -p "$target"
 | 
					    mkdir -p "$target"
 | 
				
			||||||
        if [[ "$filename" == *.zip ]]; then
 | 
					    if [[ "$filename" == *.zip ]]; then
 | 
				
			||||||
      if ! command -v unzip &>/dev/null; then
 | 
					      if ! command -v unzip &>/dev/null; then
 | 
				
			||||||
        $STD apt-get install -y unzip
 | 
					        $STD apt-get install -y unzip
 | 
				
			||||||
      fi
 | 
					      fi
 | 
				
			||||||
@@ -1013,13 +1012,20 @@ function fetch_and_deploy_gh_release() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    filename="${asset_url##*/}"
 | 
					    filename="${asset_url##*/}"
 | 
				
			||||||
    mkdir -p "$target"
 | 
					    mkdir -p "$target"
 | 
				
			||||||
    curl $download_timeout -fsSL -o "$target/$app" "$asset_url" || {
 | 
					
 | 
				
			||||||
 | 
					    local use_filename="${USE_ORIGINAL_FILENAME:-false}"
 | 
				
			||||||
 | 
					    local target_file="$app"
 | 
				
			||||||
 | 
					    [[ "$use_filename" == "true" ]] && target_file="$filename"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    curl $download_timeout -fsSL -o "$target/$target_file" "$asset_url" || {
 | 
				
			||||||
      msg_error "Download failed: $asset_url"
 | 
					      msg_error "Download failed: $asset_url"
 | 
				
			||||||
      rm -rf "$tmpdir"
 | 
					      rm -rf "$tmpdir"
 | 
				
			||||||
      return 1
 | 
					      return 1
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    chmod +x "$target/$app"
 | 
					    if [[ "$target_file" != *.jar && -f "$target/$target_file" ]]; then
 | 
				
			||||||
 | 
					      chmod +x "$target/$target_file"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    msg_error "Unknown mode: $mode"
 | 
					    msg_error "Unknown mode: $mode"
 | 
				
			||||||
@@ -1698,3 +1704,154 @@ function setup_imagemagick() {
 | 
				
			|||||||
  ensure_usr_local_bin_persist
 | 
					  ensure_usr_local_bin_persist
 | 
				
			||||||
  msg_ok "Setup ImageMagick $VERSION"
 | 
					  msg_ok "Setup ImageMagick $VERSION"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					# Installs FFmpeg from source or prebuilt binary (Debian/Ubuntu only).
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Description:
 | 
				
			||||||
 | 
					#   - Downloads and builds FFmpeg from GitHub (https://github.com/FFmpeg/FFmpeg)
 | 
				
			||||||
 | 
					#   - Supports specific version override via FFMPEG_VERSION (e.g. n7.1.1)
 | 
				
			||||||
 | 
					#   - Supports build profile via FFMPEG_TYPE:
 | 
				
			||||||
 | 
					#       - minimal : x264, vpx, mp3 only
 | 
				
			||||||
 | 
					#       - medium  : adds subtitles, fonts, opus, vorbis
 | 
				
			||||||
 | 
					#       - full    : adds dav1d, svt-av1, zlib, numa
 | 
				
			||||||
 | 
					#       - binary  : downloads static build (johnvansickle.com)
 | 
				
			||||||
 | 
					#   - Defaults to latest stable version and full feature set
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Notes:
 | 
				
			||||||
 | 
					#   - Requires: curl, jq, build-essential, and matching codec libraries
 | 
				
			||||||
 | 
					#   - Result is installed to /usr/local/bin/ffmpeg
 | 
				
			||||||
 | 
					# ------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function setup_ffmpeg() {
 | 
				
			||||||
 | 
					  local TMP_DIR
 | 
				
			||||||
 | 
					  TMP_DIR=$(mktemp -d)
 | 
				
			||||||
 | 
					  local GITHUB_REPO="FFmpeg/FFmpeg"
 | 
				
			||||||
 | 
					  local VERSION="${FFMPEG_VERSION:-latest}"
 | 
				
			||||||
 | 
					  local TYPE="${FFMPEG_TYPE:-full}"
 | 
				
			||||||
 | 
					  local BIN_PATH="/usr/local/bin/ffmpeg"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Binary fallback mode
 | 
				
			||||||
 | 
					  if [[ "$TYPE" == "binary" ]]; then
 | 
				
			||||||
 | 
					    msg_info "Installing FFmpeg (static binary)"
 | 
				
			||||||
 | 
					    curl -fsSL https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz -o "$TMP_DIR/ffmpeg.tar.xz"
 | 
				
			||||||
 | 
					    tar -xf "$TMP_DIR/ffmpeg.tar.xz" -C "$TMP_DIR"
 | 
				
			||||||
 | 
					    local EXTRACTED_DIR
 | 
				
			||||||
 | 
					    EXTRACTED_DIR=$(find "$TMP_DIR" -maxdepth 1 -type d -name "ffmpeg-*")
 | 
				
			||||||
 | 
					    cp "$EXTRACTED_DIR/ffmpeg" "$BIN_PATH"
 | 
				
			||||||
 | 
					    cp "$EXTRACTED_DIR/ffprobe" /usr/local/bin/ffprobe
 | 
				
			||||||
 | 
					    chmod +x "$BIN_PATH" /usr/local/bin/ffprobe
 | 
				
			||||||
 | 
					    rm -rf "$TMP_DIR"
 | 
				
			||||||
 | 
					    msg_ok "Installed FFmpeg binary ($($BIN_PATH -version | head -n1))"
 | 
				
			||||||
 | 
					    return
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if ! command -v jq &>/dev/null; then
 | 
				
			||||||
 | 
					    $STD apt-get update
 | 
				
			||||||
 | 
					    $STD apt-get install -y jq
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Auto-detect latest stable version if none specified
 | 
				
			||||||
 | 
					  if [[ "$VERSION" == "latest" || -z "$VERSION" ]]; then
 | 
				
			||||||
 | 
					    msg_info "Resolving latest FFmpeg tag"
 | 
				
			||||||
 | 
					    VERSION=$(curl -fsSL "https://api.github.com/repos/${GITHUB_REPO}/tags" |
 | 
				
			||||||
 | 
					      jq -r '.[].name' |
 | 
				
			||||||
 | 
					      grep -E '^n[0-9]+\.[0-9]+\.[0-9]+$' |
 | 
				
			||||||
 | 
					      sort -V | tail -n1)
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if [[ -z "$VERSION" ]]; then
 | 
				
			||||||
 | 
					    msg_error "Could not determine FFmpeg version"
 | 
				
			||||||
 | 
					    rm -rf "$TMP_DIR"
 | 
				
			||||||
 | 
					    return 1
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  msg_info "Installing FFmpeg ${VERSION} ($TYPE)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Dependency selection
 | 
				
			||||||
 | 
					  local DEPS=(build-essential yasm nasm pkg-config)
 | 
				
			||||||
 | 
					  case "$TYPE" in
 | 
				
			||||||
 | 
					  minimal)
 | 
				
			||||||
 | 
					    DEPS+=(libx264-dev libvpx-dev libmp3lame-dev)
 | 
				
			||||||
 | 
					    ;;
 | 
				
			||||||
 | 
					  medium)
 | 
				
			||||||
 | 
					    DEPS+=(libx264-dev libvpx-dev libmp3lame-dev libfreetype6-dev libass-dev libopus-dev libvorbis-dev)
 | 
				
			||||||
 | 
					    ;;
 | 
				
			||||||
 | 
					  full)
 | 
				
			||||||
 | 
					    DEPS+=(
 | 
				
			||||||
 | 
					      libx264-dev libx265-dev libvpx-dev libmp3lame-dev
 | 
				
			||||||
 | 
					      libfreetype6-dev libass-dev libopus-dev libvorbis-dev
 | 
				
			||||||
 | 
					      libdav1d-dev libsvtav1-dev zlib1g-dev libnuma-dev
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    ;;
 | 
				
			||||||
 | 
					  *)
 | 
				
			||||||
 | 
					    msg_error "Invalid FFMPEG_TYPE: $TYPE"
 | 
				
			||||||
 | 
					    rm -rf "$TMP_DIR"
 | 
				
			||||||
 | 
					    return 1
 | 
				
			||||||
 | 
					    ;;
 | 
				
			||||||
 | 
					  esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  $STD apt-get update
 | 
				
			||||||
 | 
					  $STD apt-get install -y "${DEPS[@]}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  curl -fsSL "https://github.com/${GITHUB_REPO}/archive/refs/tags/${VERSION}.tar.gz" -o "$TMP_DIR/ffmpeg.tar.gz"
 | 
				
			||||||
 | 
					  tar -xzf "$TMP_DIR/ffmpeg.tar.gz" -C "$TMP_DIR"
 | 
				
			||||||
 | 
					  cd "$TMP_DIR/FFmpeg-"* || {
 | 
				
			||||||
 | 
					    msg_error "Source extraction failed"
 | 
				
			||||||
 | 
					    rm -rf "$TMP_DIR"
 | 
				
			||||||
 | 
					    return 1
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  local args=(
 | 
				
			||||||
 | 
					    --enable-gpl
 | 
				
			||||||
 | 
					    --enable-shared
 | 
				
			||||||
 | 
					    --enable-nonfree
 | 
				
			||||||
 | 
					    --disable-static
 | 
				
			||||||
 | 
					    --enable-libx264
 | 
				
			||||||
 | 
					    --enable-libvpx
 | 
				
			||||||
 | 
					    --enable-libmp3lame
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if [[ "$TYPE" != "minimal" ]]; then
 | 
				
			||||||
 | 
					    args+=(--enable-libfreetype --enable-libass --enable-libopus --enable-libvorbis)
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if [[ "$TYPE" == "full" ]]; then
 | 
				
			||||||
 | 
					    args+=(--enable-libx265 --enable-libdav1d --enable-zlib)
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if [[ ${#args[@]} -eq 0 ]]; then
 | 
				
			||||||
 | 
					    msg_error "FFmpeg configure args array is empty – aborting."
 | 
				
			||||||
 | 
					    rm -rf "$TMP_DIR"
 | 
				
			||||||
 | 
					    return 1
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ./configure "${args[@]}" >"$TMP_DIR/configure.log" 2>&1 || {
 | 
				
			||||||
 | 
					    msg_error "FFmpeg ./configure failed (see $TMP_DIR/configure.log)"
 | 
				
			||||||
 | 
					    cat "$TMP_DIR/configure.log" | tail -n 20
 | 
				
			||||||
 | 
					    rm -rf "$TMP_DIR"
 | 
				
			||||||
 | 
					    return 1
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  $STD make -j"$(nproc)"
 | 
				
			||||||
 | 
					  $STD make install
 | 
				
			||||||
 | 
					  echo "/usr/local/lib" >/etc/ld.so.conf.d/ffmpeg.conf
 | 
				
			||||||
 | 
					  ldconfig
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ldconfig -p | grep libavdevice >/dev/null || {
 | 
				
			||||||
 | 
					    msg_error "libavdevice not registered with dynamic linker"
 | 
				
			||||||
 | 
					    return 1
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if ! command -v ffmpeg &>/dev/null; then
 | 
				
			||||||
 | 
					    msg_error "FFmpeg installation failed"
 | 
				
			||||||
 | 
					    rm -rf "$TMP_DIR"
 | 
				
			||||||
 | 
					    return 1
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  local FINAL_VERSION
 | 
				
			||||||
 | 
					  FINAL_VERSION=$(ffmpeg -version | head -n1 | awk '{print $3}')
 | 
				
			||||||
 | 
					  rm -rf "$TMP_DIR"
 | 
				
			||||||
 | 
					  ensure_usr_local_bin_persist
 | 
				
			||||||
 | 
					  msg_ok "Setup FFmpeg $FINAL_VERSION"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user