Files
go2rtc/docker/download_cdn.sh
T

106 lines
3.0 KiB
Bash

#!/bin/sh
# Downloads CDN dependencies from jsdelivr for offline web UI.
# Automatically parses CDN URLs from HTML files, so updating
# a library version in HTML is all that's needed.
#
# Usage: download_cdn.sh <web_dir>
set -e
WEB_DIR="${1:?Usage: download_cdn.sh <web_dir>}"
CDN_DIR="$WEB_DIR/cdn"
mkdir -p "$CDN_DIR"
# Step 1: Extract all jsdelivr CDN URLs from HTML files
URLS=$(grep -roh 'https://cdn\.jsdelivr\.net/npm/[^"'"'"' )`]*' "$WEB_DIR"/*.html | sort -u)
echo "=== Found CDN URLs ==="
echo "$URLS"
echo ""
# Step 2: Process each URL
MONACO_VER=""
for url in $URLS; do
# Remove CDN prefix to get npm path
npm_path="${url#https://cdn.jsdelivr.net/npm/}"
# Extract package@version and file path
pkg_ver=$(echo "$npm_path" | cut -d/ -f1)
remaining=$(echo "$npm_path" | cut -d/ -f2-)
if [ "$remaining" = "$npm_path" ]; then
file_path=""
else
file_path="$remaining"
fi
pkg_name=$(echo "$pkg_ver" | sed 's/@[^@]*$//')
# Monaco editor: remember version, download as tarball later
case "$pkg_name" in
monaco-editor)
MONACO_VER=$(echo "$pkg_ver" | sed 's/.*@//')
echo "Monaco editor v$MONACO_VER (will download tarball)"
continue
;;
esac
# Determine local file path
if [ -n "$file_path" ]; then
local_file="$CDN_DIR/$pkg_name/$file_path"
else
local_file="$CDN_DIR/$pkg_name/index.js"
fi
mkdir -p "$(dirname "$local_file")"
echo "Downloading $pkg_ver -> $local_file"
wget -q -O "$local_file" "$url"
done
# Step 3: Download monaco-editor tarball and extract min/ directory
# The AMD loader dynamically loads modules, so we need the entire min/vs/ tree
if [ -n "$MONACO_VER" ]; then
echo ""
echo "=== Downloading monaco-editor@$MONACO_VER tarball ==="
TARBALL_URL=$(wget -q -O - "https://registry.npmjs.org/monaco-editor/$MONACO_VER" | \
grep -o '"tarball":"[^"]*"' | head -1 | cut -d'"' -f4)
mkdir -p /tmp/monaco "$CDN_DIR/monaco-editor"
wget -q -O /tmp/monaco.tgz "$TARBALL_URL"
tar xzf /tmp/monaco.tgz -C /tmp/monaco
cp -r /tmp/monaco/package/min "$CDN_DIR/monaco-editor/"
rm -rf /tmp/monaco /tmp/monaco.tgz
echo " Extracted min/ directory ($(du -sh "$CDN_DIR/monaco-editor/min" | cut -f1))"
fi
# Step 4: Patch HTML files to use local paths instead of CDN URLs
echo ""
echo "=== Patching HTML files ==="
for url in $URLS; do
npm_path="${url#https://cdn.jsdelivr.net/npm/}"
pkg_ver=$(echo "$npm_path" | cut -d/ -f1)
remaining=$(echo "$npm_path" | cut -d/ -f2-)
if [ "$remaining" = "$npm_path" ]; then
file_path=""
else
file_path="$remaining"
fi
pkg_name=$(echo "$pkg_ver" | sed 's/@[^@]*$//')
if [ -n "$file_path" ]; then
local_url="cdn/$pkg_name/$file_path"
else
local_url="cdn/$pkg_name/index.js"
fi
echo " $url -> $local_url"
sed -i "s|$url|$local_url|g" "$WEB_DIR"/*.html
done
echo ""
echo "=== Done ==="
du -sh "$CDN_DIR"