From fddd3c96265e7981c5450c8736e583d60b07a561 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Tue, 30 Sep 2025 16:06:50 +0200 Subject: [PATCH] Scripts: Update dist/install-yt-dlp.sh Signed-off-by: Michael Mayer --- scripts/dist/install-yt-dlp.sh | 83 +++++++++++++++++++++++++++++----- 1 file changed, 71 insertions(+), 12 deletions(-) diff --git a/scripts/dist/install-yt-dlp.sh b/scripts/dist/install-yt-dlp.sh index 4bea6c10a..1238827ac 100755 --- a/scripts/dist/install-yt-dlp.sh +++ b/scripts/dist/install-yt-dlp.sh @@ -3,10 +3,15 @@ # Installs the yt-dlp binary, a vector search engine, on Linux. # bash <(curl -s https://raw.githubusercontent.com/photoprism/photoprism/develop/scripts/dist/install-yt-dlp.sh) -set -e +set -euo pipefail + +if ! command -v jq >/dev/null 2>&1; then + echo "Error: jq is required but not installed." 1>&2 + exit 1 +fi # Show usage information if first argument is --help. -if [[ ${1} == "--help" ]]; then +if [[ ${1:-} == "--help" ]]; then echo "Usage: ${0##*/} [destdir] [version]" 1>&2 exit 0 fi @@ -15,7 +20,7 @@ fi DESTDIR=$(realpath "${1:-/usr/local}") # Determine target architecture. -if [[ $PHOTOPRISM_ARCH ]]; then +if [[ -n ${PHOTOPRISM_ARCH:-} ]]; then SYSTEM_ARCH=$PHOTOPRISM_ARCH else SYSTEM_ARCH=$(uname -m) @@ -52,21 +57,75 @@ fi echo "Installing yt-dlp for ${DESTARCH^^}..." -# Alternatively, users can specify a custom version to install as the second argument. -GITHUB_LATEST=$(curl --silent "https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') -VERSION=${2:-$GITHUB_LATEST} -BINARY="yt-dlp_linux" +# Determine the list of acceptable asset names for the requested architecture. +case $DESTARCH in + x86_64) + ASSET_CANDIDATES=("yt-dlp_linux" "yt-dlp_linux_x86_64" "yt-dlp") + ;; + aarch64) + ASSET_CANDIDATES=("yt-dlp_linux_aarch64" "yt-dlp_linux_arm64") + ;; + armv7l) + ASSET_CANDIDATES=("yt-dlp_linux_armv7l" "yt-dlp_linux_armv7" "yt-dlp_linux_armhf") + ;; + *) + echo "Unsupported Machine Architecture: \"$DESTARCH\"" 1>&2 + exit 1 + ;; +esac -if [[ $DESTARCH != "x86_64" ]]; then - BINARY="${BINARY}_${DESTARCH}" +DEFAULT_RELEASES_URL="https://api.github.com/repos/yt-dlp/yt-dlp/releases?per_page=5" + +if [[ -n ${2:-} ]]; then + VERSION=${2} + RELEASES_JSON=$(curl --fail --silent --show-error "https://api.github.com/repos/yt-dlp/yt-dlp/releases/tags/${VERSION}" || true) + if [[ -z $RELEASES_JSON ]]; then + echo "Error: Unable to fetch release metadata for tag ${VERSION}." 1>&2 + exit 1 + fi + RELEASES_JSON="[${RELEASES_JSON}]" +else + RELEASES_JSON=$(curl --fail --silent --show-error "$DEFAULT_RELEASES_URL" || true) + if [[ -z $RELEASES_JSON ]]; then + echo "Error: Unable to fetch release metadata from GitHub." 1>&2 + exit 1 + fi fi -GITHUB_URL="https://github.com/yt-dlp/yt-dlp/releases/download/${VERSION}/${BINARY}" +TAG_NAME="" +ASSET_NAME="" +ASSET_URL="" + +while IFS= read -r release; do + tag=$(echo "$release" | jq -r '.tag_name // empty') + [[ -z $tag ]] && continue + + for candidate in "${ASSET_CANDIDATES[@]}"; do + url=$(echo "$release" | jq -r --arg name "$candidate" '.assets[]? | select(.name == $name) | .browser_download_url' | head -n1) + if [[ -n $url && $url != "null" ]]; then + TAG_NAME=$tag + ASSET_NAME=$candidate + ASSET_URL=$url + break 2 + fi + done +done < <(echo "$RELEASES_JSON" | jq -c '.[]') + +if [[ -z ${TAG_NAME} || -z ${ASSET_URL} ]]; then + echo "Error: Could not resolve a downloadable asset for architecture ${DESTARCH}." 1>&2 + exit 1 +fi + +# Capture the most recent release tag for informational purposes. +LATEST_TAG=$(echo "$RELEASES_JSON" | jq -r '.[0].tag_name // empty') +VERSION=$TAG_NAME +GITHUB_URL=$ASSET_URL DESTBIN="${DESTDIR}/bin/yt-dlp" echo "--------------------------------------------------------------------------------" echo "VERSION : ${VERSION}" -echo "LATEST : ${GITHUB_LATEST}" +echo "LATEST : ${LATEST_TAG:-unknown}" +echo "ASSET : ${ASSET_NAME}" echo "DOWNLOAD: ${GITHUB_URL}" echo "DESTDIR : ${DESTDIR}" echo "DESTBIN : ${DESTBIN}" @@ -74,7 +133,7 @@ echo "-------------------------------------------------------------------------- echo "Downloading the yt-dlp binary to \"${DESTBIN}\"..." mkdir -p "${DESTDIR}" -curl -fsSL "${GITHUB_URL}" -o "${DESTBIN}" +curl --fail --silent --show-error --location "${GITHUB_URL}" -o "${DESTBIN}" echo "Changing permissions of \"${DESTBIN}\" to 755..." chmod 755 "${DESTBIN}"