Gflix
Open Source

Open source in Gflix

Where the source is, and how to swap in your own builds.

Gflix is built with open-source software. Most of it is under permissive licences, listed in the app under Settings › About › Open Source with each component's version and licence text. AetherEngine, FFmpeg (twice: AetherEngine's and GPlayer's), libzvbi and GNU FriBidi are under the GNU Lesser General Public License, which lets you replace them with builds of your own. Gflix ships each of them as a framework of its own, never compiled into its own code, so you can.

Where the source is

  • AetherEngine 7.51.0, Gflix's package that makes it a framework, and FFmpegBuild 3.10.1 and 3.10.2 with the exact FFmpeg n8.1.3, dav1d 1.5.4, zimg 3.0.6 and libzvbi 0.2.46 sources they build: https://github.com/G00380316/gflix-library-source, release aetherengine-7.51.0-ffmpegbuild-3.10.2, each archive with its SHA-256 checksum. Builds before 28 October 2026 shipped AetherEngine 7.44.0 and FFmpegBuild 3.9.0, in the release aetherengine-7.44.0-ffmpegbuild-3.9.0 there.
  • GPlayer's FFmpeg 9.0.2 with its five changes, and the scripts that build GPlayer's FFmpeg and FriBidi frameworks: https://github.com/G00380316/ffmpeg-patched, tag v9.0.2-1.
  • GNU FriBidi 1.0.16 as GPlayer builds it, the release archive unchanged: https://github.com/G00380316/ffmpeg-patched, release fribidi-1.0.16.

Each release stays available for at least three years after the last Gflix build that shipped it. For the source on a physical medium, write to the address under Contact.

Replacing AetherEngine

AetherEngine ships as AetherEngineDynamic.framework, in Gflix.app/Frameworks (on a Mac, Gflix.app/Contents/Frameworks). It holds AetherEngine and AetherEngineSMB and re-exports both, and it is the whole interface between Gflix and AetherEngine.

  1. Get AetherEngine's source at the version above and make your changes. Keep its public interface exactly as that version declares it: the same functions and types, and for its public structs and enums the same stored properties and cases, in the same order, and the same default argument values. AetherEngine is built without library evolution, so Gflix has those layouts and defaults compiled into it.
  2. Unpack AetherEngineDynamic-gflix.tar.xz and point its package at your AetherEngine, for example with .package(path: "../AetherEngine").
  3. Build it for your platform with the Xcode version that built your Gflix (Swift modules are tied to their compiler), for example xcodebuild -scheme AetherEngineDynamic -configuration Release -destination 'generic/platform=macOS' -derivedDataPath build. The framework is build/Build/Products/Release/PackageFrameworks/AetherEngineDynamic.framework.
  4. Put it in place of the one in the app and sign the app again. On a Mac, sign it with your own development identity and a provisioning profile carrying Gflix's entitlements (App Sandbox, iCloud, its app group) so it keeps its settings and iCloud Sync; an ad hoc signature runs it without them. On iPhone, iPad and Apple TV, install it with your own developer account.

A replacement missing a function or type Gflix uses fails to load. One that changes a public type's layout or a default value still loads, and then misbehaves or crashes: Gflix checks neither.

Replacing AetherEngine's FFmpeg and libzvbi

FFmpeg, dav1d, zimg and libzvbi ship as AetherLibavcodec.framework, AetherLibavformat.framework and the seven others beside it. FFmpegBuild's build.sh (3.10.1's compiled them; 3.10.2 only repackaged them) builds all nine for every Apple platform: it fetches the four sources at the tags above, applies its changes to FFmpeg and libzvbi (its patch_ffmpeg… and patch_zvbi functions, and patches/dca-xll-x-heights.patch), and configures FFmpeg as LGPL, without --enable-gpl or --enable-version3. The configure line is also recorded in each library, where avcodec_configuration() returns it.

A framework you build keeps the install name Gflix loads it by, @rpath/AetherLibavcodec.framework/AetherLibavcodec and the rest (on a Mac, @rpath/AetherLibavcodec.framework/Versions/A/AetherLibavcodec), so it can replace the one in the app, which you then sign again as above.

Replacing GPlayer's FFmpeg and FriBidi

GPlayer, Gflix's own player, ships FFmpeg as GPlayerFFmpegBinary.framework, loaded by its install name @rpath/GPlayerFFmpegBinary.framework/GPlayerFFmpegBinary (on a Mac, .../Versions/A/GPlayerFFmpegBinary). A framework built by build-ffmpeg.sh from ffmpeg-patched, keeping that install name and exporting the same gpff_-prefixed interface, can replace it.

GNU FriBidi ships as GPlayerFriBidiBinary.framework, loaded by its install name @rpath/GPlayerFriBidiBinary.framework/GPlayerFriBidiBinary (on a Mac, .../Versions/A/GPlayerFriBidiBinary), compatibility version 1.0.0, with its fribidi_* functions unprefixed. build-fribidi.sh builds one that can replace it.

Either way the app is then signed again with your own Apple developer account. Gflix never downloads or runs a replacement library itself: replacing one is something you do to a copy of the app you build or sign.