fix again opera build.

it seems that the latest opera build is not the latest chromium version anymore and thats why ffmpeg is not compatible with the current version.
This commit is contained in:
Miroslav Šedivý 2025-12-09 11:16:21 +01:00
parent 552e6225cf
commit 7624bbb6c1
3 changed files with 121 additions and 10 deletions

View file

@ -2,7 +2,8 @@ ARG BASE_IMAGE=ghcr.io/m1k1o/neko/base:latest
FROM $BASE_IMAGE
ARG API_URL="https://download5.operacdn.com/pub/opera/desktop/"
ARG LIBFFMPEG_API_URL="https://api.github.com/repos/nwjs-ffmpeg-prebuilt/nwjs-ffmpeg-prebuilt/releases/latest"
COPY fix-ffmpeg-widevine.sh /tmp/fix-ffmpeg-widevine.sh
#
# install opera
@ -23,16 +24,12 @@ RUN set -eux; apt-get update; \
fi; \
echo "Using Opera version: $VERSION"; \
wget -O /tmp/opera.deb "${API_URL}${VERSION}/linux/opera-stable_${VERSION}_amd64.deb"; \
apt-get install -y --no-install-recommends openbox jq unzip /tmp/opera.deb; \
#
# install libffmpeg
LIBFFMPEG_URL="$(wget -O - "${LIBFFMPEG_API_URL}" 2>/dev/null | jq -r "[.assets[] | select(.browser_download_url | contains(\"linux-x64.zip\"))][-1] | .browser_download_url")"; \
wget -O /tmp/libffmpeg.zip $LIBFFMPEG_URL; \
unzip -o /tmp/libffmpeg.zip libffmpeg.so -d /usr/lib/x86_64-linux-gnu/opera/lib_extra; \
echo '[]' > /usr/lib/x86_64-linux-gnu/opera/resources/ffmpeg_preload_config.json; \
apt-get install -y --no-install-recommends openbox curl jq unzip /tmp/opera.deb; \
/tmp/fix-ffmpeg-widevine.sh; \
rm -f /tmp/opera.deb /tmp/fix-ffmpeg-widevine.sh; \
#
# clean up
apt-get --purge autoremove -y unzip jq; \
apt-get --purge autoremove -y curl jq unzip; \
apt-get clean -y; \
rm -rf /var/lib/apt/lists/* /var/cache/apt/*

114
apps/opera/fix-ffmpeg-widevine.sh Executable file
View file

@ -0,0 +1,114 @@
#!/bin/bash
# From https://github.com/Ld-Hagen/fix-opera-linux-ffmpeg-widevine.
# Config section
readonly FIX_FFMPEG=true
readonly FIX_WIDEVINE=true
readonly FIX_DIR='/tmp/opera-fix'
# readonly FFMPEG_SRC_MAIN='https://api.github.com/repos/nwjs-ffmpeg-prebuilt/nwjs-ffmpeg-prebuilt/releases'
readonly FFMPEG_SRC_MAIN='https://api.github.com/repos/Ld-Hagen/nwjs-ffmpeg-prebuilt/releases'
readonly FFMPEG_SRC_ALT='https://api.github.com/repos/Ld-Hagen/fix-opera-linux-ffmpeg-widevine/releases'
readonly WIDEVINE_SRC='https://raw.githubusercontent.com/mozilla-firefox/firefox/refs/heads/main/toolkit/content/gmp-sources/widevinecdm.json'
readonly FFMPEG_SO_NAME='libffmpeg.so'
readonly WIDEVINE_SO_NAME='libwidevinecdm.so'
readonly WIDEVINE_MANIFEST_NAME='manifest.json'
OPERA_VERSIONS=()
if [ -x "$(command -v opera)" ]; then
OPERA_VERSIONS+=("opera")
fi
if [ -x "$(command -v opera-beta)" ]; then
OPERA_VERSIONS+=("opera-beta")
fi
# Getting download links
printf 'Getting download links...\n'
## ffmpeg
if $FIX_FFMPEG; then
readonly FFMPEG_URL_MAIN=$(curl -sL4 $FFMPEG_SRC_MAIN | jq -rS 'sort_by(.published_at) | .[-1].assets[0].browser_download_url')
readonly FFMPEG_URL_ALT=$(curl -sL4 $FFMPEG_SRC_ALT | jq -rS 'sort_by(.published_at) | .[-1].assets[0].browser_download_url')
[[ $(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
fi
## Widevine
if $FIX_WIDEVINE; then
readonly WIDEVINE_URL=$(curl -sL4 $WIDEVINE_SRC | jq -r '.vendors."gmp-widevinecdm".platforms."Linux_x86_64-gcc3".mirrorUrls[0]')
fi
# Downloading files
printf 'Downloading files...\n'
mkdir -p "$FIX_DIR"
## ffmpeg
if $FIX_FFMPEG; then
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
fi
## Widevine
if $FIX_WIDEVINE; then
curl -L4 --progress-bar "$WIDEVINE_URL" -o "$FIX_DIR/widevine.zip"
if [ $? -ne 0 ]; then
printf 'Failed to download Widevine CDM. Check your internet connection or try later\n'
exit 1
fi
fi
# Extracting files
## ffmpeg
if $FIX_FFMPEG; then
echo "Extracting ffmpeg..."
unzip -o "$FIX_DIR/ffmpeg.zip" -d $FIX_DIR > /dev/null
fi
## 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
echo "Doing $opera"
EXECUTABLE=$(command -v "$opera")
OPERA_DIR=$(dirname $(readlink -f $EXECUTABLE))
OPERA_LIB_DIR="$OPERA_DIR/lib_extra"
OPERA_WIDEVINE_DIR="$OPERA_LIB_DIR/WidevineCdm"
OPERA_WIDEVINE_SO_DIR="$OPERA_WIDEVINE_DIR/_platform_specific/linux_x64"
OPERA_WIDEVINE_CONFIG="$OPERA_DIR/resources/widevine_config.json"
# Removing old libraries and preparing directories
printf 'Removing old libraries & making directories...\n'
## ffmpeg
if $FIX_FFMPEG; then
rm -f "$OPERA_LIB_DIR/$FFMPEG_SO_NAME"
mkdir -p "$OPERA_LIB_DIR"
fi
## Widevine
if $FIX_WIDEVINE; then
rm -rf "$OPERA_WIDEVINE_DIR"
mkdir -p "$OPERA_WIDEVINE_SO_DIR"
fi
# Moving libraries to their place
printf 'Moving libraries to their places...\n'
## ffmpeg
if $FIX_FFMPEG; then
cp -f "$FIX_DIR/$FFMPEG_SO_NAME" "$OPERA_LIB_DIR"
chmod 0644 "$OPERA_LIB_DIR/$FFMPEG_SO_NAME"
fi
## Widevine
if $FIX_WIDEVINE; then
cp -f "$FIX_DIR/$WIDEVINE_SO_NAME" "$OPERA_WIDEVINE_SO_DIR"
chmod 0644 "$OPERA_WIDEVINE_SO_DIR/$WIDEVINE_SO_NAME"
cp -f "$FIX_DIR/$WIDEVINE_MANIFEST_NAME" "$OPERA_WIDEVINE_DIR"
chmod 0644 "$OPERA_WIDEVINE_DIR/$WIDEVINE_MANIFEST_NAME"
printf "[\n {\n \"preload\": \"$OPERA_WIDEVINE_DIR\"\n }\n]\n" > "$OPERA_WIDEVINE_CONFIG"
fi
done
# Removing temporary files
printf 'Removing temporary files...\n'
rm -rf "$FIX_DIR"

View file

@ -13,7 +13,7 @@
<applications>
<!-- Match all windows and remove their decorations (obxprop | grep "^_OB_APP") -->
<application class="Opera" name="Opera" role="browser">
<application class="Opera" name="Opera" type="normal">
<decor>no</decor>
<maximized>true</maximized>
<focus>yes</focus>