mirror of
https://github.com/Ld-Hagen/fix-opera-linux-ffmpeg-widevine.git
synced 2026-07-11 23:37:27 +03:00
match underlying Chromium version to the compatible ffmpeg and widevine version, repeat this procedure for all installed variants of Opera browser by using temp cache for downloaded assets
This commit is contained in:
@@ -9,9 +9,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
|
- version-aware ffmpeg selection: detect Opera's bundled Chromium version and download the matching nwjs-ffmpeg release instead of always using the latest
|
||||||
|
- per-variant Chromium detection via binary inspection (`get_chromium_major`)
|
||||||
|
- ffmpeg download caching: skip re-download when multiple Opera variants share the same Chromium version
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
- universal shebang bash interpreter to safely find bash on `$PATH`
|
- universal shebang bash interpreter to safely find bash on `$PATH`
|
||||||
|
- Widevine CDM is now downloaded once before the main loop instead of redundantly per variant
|
||||||
|
- release data is fetched once upfront (`?per_page=50`) and reused for version matching
|
||||||
|
|
||||||
### Removed
|
### Removed
|
||||||
|
|
||||||
@@ -20,3 +26,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
- in the preflight check: Prefer our user-friendly error messages while avoiding double error message from the operating system by redirecting also `stderr` to `/dev/null`
|
- in the preflight check: Prefer our user-friendly error messages while avoiding double error message from the operating system by redirecting also `stderr` to `/dev/null`
|
||||||
- potential runtime error: prefer `command -v` over `which`-command, which can have different behaviour on different Linux distributions and always use the first result in `PATH` independently of multiple defined commands
|
- potential runtime error: prefer `command -v` over `which`-command, which can have different behaviour on different Linux distributions and always use the first result in `PATH` independently of multiple defined commands
|
||||||
|
- `grep` error when `CDM_FLAG` starts with `--` by adding explicit end-of-options separator (`grep -qF -- "$CDM_FLAG"`)
|
||||||
|
|||||||
@@ -53,51 +53,88 @@ if [ -x "$(command -v opera-gx)" ]; then
|
|||||||
OPERA_VERSIONS+=("opera-gx")
|
OPERA_VERSIONS+=("opera-gx")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
get_chromium_major() {
|
||||||
|
local opera_dir="$1"
|
||||||
|
local opera_name="$2"
|
||||||
|
local version=""
|
||||||
|
for bin in "$opera_dir/$opera_name" "$opera_dir/opera"; do
|
||||||
|
if [[ -f "$bin" ]]; then
|
||||||
|
version=$(grep -ao 'Chrome/[0-9]\+' "$bin" 2>/dev/null | head -1 | grep -o '[0-9]\+')
|
||||||
|
if [[ -n "$version" ]]; then
|
||||||
|
echo "$version"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
get_ffmpeg_url_for_chromium() {
|
||||||
|
local chromium_major="$1"
|
||||||
|
local best_tag=""
|
||||||
|
local best_url=""
|
||||||
|
for releases_json in "$RELEASES_MAIN" "$RELEASES_ALT"; do
|
||||||
|
local match
|
||||||
|
match=$(echo "$releases_json" | jq -r --arg ver "$chromium_major" '
|
||||||
|
[.[] | select((.body // "") | test("Chromium " + $ver + "\\."))]
|
||||||
|
| sort_by(.published_at)
|
||||||
|
| if length > 0 then .[-1] | "\(.tag_name)\t\(.assets[0].browser_download_url)" else empty end
|
||||||
|
')
|
||||||
|
if [[ -n "$match" ]]; then
|
||||||
|
local tag url
|
||||||
|
tag=$(echo "$match" | cut -f1)
|
||||||
|
url=$(echo "$match" | cut -f2)
|
||||||
|
if [[ -z "$best_tag" || "$tag" > "$best_tag" ]]; then
|
||||||
|
best_tag="$tag"
|
||||||
|
best_url="$url"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [[ -n "$best_url" ]]; then
|
||||||
|
printf '%s\t%s' "$best_tag" "$best_url"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
get_latest_ffmpeg_url() {
|
||||||
|
local url_main url_alt
|
||||||
|
url_main=$(echo "$RELEASES_MAIN" | jq -rS 'sort_by(.published_at) | .[-1].assets[0].browser_download_url')
|
||||||
|
url_alt=$(echo "$RELEASES_ALT" | jq -rS 'sort_by(.published_at) | .[-1].assets[0].browser_download_url')
|
||||||
|
if [[ $(basename "$url_alt") < $(basename "$url_main") ]]; then
|
||||||
|
echo "$url_main"
|
||||||
|
else
|
||||||
|
echo "$url_alt"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
#Getting download links
|
#Getting download links
|
||||||
printf 'Getting download links...\n'
|
printf 'Getting download links...\n'
|
||||||
|
|
||||||
##ffmpeg
|
##Fetch all release data once
|
||||||
readonly FFMPEG_URL_MAIN=$(curl -sL4 $FFMPEG_SRC_MAIN | jq -rS 'sort_by(.published_at) | .[-1].assets[0].browser_download_url')
|
RELEASES_MAIN=$(curl -sL4 "$FFMPEG_SRC_MAIN?per_page=50")
|
||||||
readonly FFMPEG_URL_ALT=$(curl -sL4 $FFMPEG_SRC_ALT | jq -rS 'sort_by(.published_at) | .[-1].assets[0].browser_download_url')
|
RELEASES_ALT=$(curl -sL4 "$FFMPEG_SRC_ALT?per_page=50")
|
||||||
[[ $(basename $FFMPEG_URL_ALT) < $(basename $FFMPEG_URL_MAIN) ]] && readonly FFMPEG_URL=$FFMPEG_URL_MAIN || readonly FFMPEG_URL=$FFMPEG_URL_ALT
|
|
||||||
if [[ -z $FFMPEG_URL ]]; then
|
|
||||||
printf 'Failed to get ffmpeg download URL. Exiting...\n'
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
##Widevine
|
##Widevine
|
||||||
if $FIX_WIDEVINE; then
|
if $FIX_WIDEVINE; then
|
||||||
readonly WIDEVINE_URL=$(curl -sL4 $WIDEVINE_SRC | jq -r '.vendors."gmp-widevinecdm".platforms."Linux_x86_64-gcc3".mirrorUrls[0]')
|
readonly WIDEVINE_URL=$(curl -sL4 $WIDEVINE_SRC | jq -r '.vendors."gmp-widevinecdm".platforms."Linux_x86_64-gcc3".mirrorUrls[0]')
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#Downloading files
|
#Downloading Widevine
|
||||||
printf 'Downloading files...\n'
|
|
||||||
mkdir -p "$FIX_DIR"
|
mkdir -p "$FIX_DIR"
|
||||||
##ffmpeg
|
if $FIX_WIDEVINE; then
|
||||||
|
printf 'Downloading Widevine CDM...\n'
|
||||||
curl -L4 --progress-bar $FFMPEG_URL -o "$FIX_DIR/ffmpeg.zip"
|
echo -e "From URL: $WIDEVINE_URL\n"
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
printf 'Failed to download ffmpeg. Check your internet connection or try later\n'
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
##Widevine
|
|
||||||
if $FIX_WIDEVINE; then
|
|
||||||
curl -L4 --progress-bar "$WIDEVINE_URL" -o "$FIX_DIR/widevine.zip"
|
curl -L4 --progress-bar "$WIDEVINE_URL" -o "$FIX_DIR/widevine.zip"
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
printf 'Failed to download Widevine CDM. Check your internet connection or try later\n'
|
printf 'Failed to download Widevine CDM. Check your internet connection or try later\n'
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
echo "Extracting WidevineCDM..."
|
||||||
|
unzip -oj "$FIX_DIR/widevine.zip" -d "$FIX_DIR" > /dev/null 2>/dev/null
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#Extracting files
|
LAST_FFMPEG_TAG=""
|
||||||
##ffmpeg
|
|
||||||
echo "Extracting ffmpeg..."
|
|
||||||
unzip -o "$FIX_DIR/ffmpeg.zip" -d $FIX_DIR > /dev/null
|
|
||||||
##Widevine
|
|
||||||
if $FIX_WIDEVINE; then
|
|
||||||
echo "Extracting WidevineCDM..."
|
|
||||||
unzip -oj "$FIX_DIR/widevine.zip" -d $FIX_DIR > /dev/null 2>/dev/null
|
|
||||||
fi
|
|
||||||
|
|
||||||
for opera in ${OPERA_VERSIONS[@]}; do
|
for opera in ${OPERA_VERSIONS[@]}; do
|
||||||
echo "Doing $opera"
|
echo "Doing $opera"
|
||||||
@@ -117,6 +154,40 @@ for opera in ${OPERA_VERSIONS[@]}; do
|
|||||||
else
|
else
|
||||||
OPERA_DIR=$(dirname $(readlink -f $EXECUTABLE))
|
OPERA_DIR=$(dirname $(readlink -f $EXECUTABLE))
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
CHROMIUM_MAJOR=$(get_chromium_major "$OPERA_DIR" "$opera")
|
||||||
|
if [[ -n "$CHROMIUM_MAJOR" ]]; then
|
||||||
|
printf 'Detected Chromium %s for %s\n' "$CHROMIUM_MAJOR" "$opera"
|
||||||
|
FFMPEG_MATCH=$(get_ffmpeg_url_for_chromium "$CHROMIUM_MAJOR")
|
||||||
|
if [[ -n "$FFMPEG_MATCH" ]]; then
|
||||||
|
FFMPEG_TAG=$(echo "$FFMPEG_MATCH" | cut -f1)
|
||||||
|
FFMPEG_URL=$(echo "$FFMPEG_MATCH" | cut -f2)
|
||||||
|
else
|
||||||
|
printf 'WARNING: No ffmpeg release found for Chromium %s, using latest\n' "$CHROMIUM_MAJOR"
|
||||||
|
FFMPEG_TAG="latest"
|
||||||
|
FFMPEG_URL=$(get_latest_ffmpeg_url)
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printf 'WARNING: Could not detect Chromium version for %s, using latest ffmpeg\n' "$opera"
|
||||||
|
FFMPEG_TAG="latest"
|
||||||
|
FFMPEG_URL=$(get_latest_ffmpeg_url)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$FFMPEG_TAG" != "$LAST_FFMPEG_TAG" ]]; then
|
||||||
|
printf 'Downloading ffmpeg (%s)...\n' "$FFMPEG_TAG"
|
||||||
|
echo -e "From: $FFMPEG_URL\n"
|
||||||
|
curl -L4 --progress-bar "$FFMPEG_URL" -o "$FIX_DIR/ffmpeg.zip"
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
printf 'Failed to download ffmpeg. Check your internet connection or try later\n'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "Extracting ffmpeg..."
|
||||||
|
unzip -o "$FIX_DIR/ffmpeg.zip" -d "$FIX_DIR" > /dev/null
|
||||||
|
LAST_FFMPEG_TAG="$FFMPEG_TAG"
|
||||||
|
else
|
||||||
|
printf 'Using cached ffmpeg (%s)\n' "$FFMPEG_TAG"
|
||||||
|
fi
|
||||||
|
|
||||||
OPERA_LIB_DIR="$OPERA_DIR/lib_extra"
|
OPERA_LIB_DIR="$OPERA_DIR/lib_extra"
|
||||||
OPERA_WIDEVINE_DIR="$OPERA_LIB_DIR/WidevineCdm"
|
OPERA_WIDEVINE_DIR="$OPERA_LIB_DIR/WidevineCdm"
|
||||||
OPERA_WIDEVINE_SO_DIR="$OPERA_WIDEVINE_DIR/_platform_specific/linux_x64"
|
OPERA_WIDEVINE_SO_DIR="$OPERA_WIDEVINE_DIR/_platform_specific/linux_x64"
|
||||||
|
|||||||
Reference in New Issue
Block a user