working version
This commit is contained in:
13
.gitignore
vendored
Normal file
13
.gitignore
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Nix build outputs
|
||||||
|
result
|
||||||
|
result-*
|
||||||
|
|
||||||
|
# Nix evaluation caches
|
||||||
|
.direnv/
|
||||||
|
.envrc
|
||||||
|
|
||||||
|
# Editor noise
|
||||||
|
.vscode/
|
||||||
|
.idea/
|
||||||
|
*.swp
|
||||||
|
*~
|
||||||
159
README.md
Normal file
159
README.md
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
# fladder — NixOS package
|
||||||
|
|
||||||
|
Unofficial NixOS package for [Fladder](https://github.com/DonutWare/Fladder),
|
||||||
|
a cross-platform [Jellyfin](https://jellyfin.org/) client built on Flutter.
|
||||||
|
|
||||||
|
## Files
|
||||||
|
|
||||||
|
| File | Purpose |
|
||||||
|
|---|---|
|
||||||
|
| `package.nix` | The derivation (import this into your config or flake) |
|
||||||
|
| `default.nix` | Convenience wrapper for `nix-build` local testing |
|
||||||
|
|
||||||
|
## Quick start
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Build and test locally
|
||||||
|
nix-build # produces ./result/bin/fladder
|
||||||
|
./result/bin/fladder
|
||||||
|
```
|
||||||
|
|
||||||
|
## Adding to your NixOS configuration
|
||||||
|
|
||||||
|
### Standalone (no flake)
|
||||||
|
|
||||||
|
Copy this repo somewhere (e.g. `~/nixpkgs-overlays/fladder/`) then in
|
||||||
|
`/etc/nixos/configuration.nix`:
|
||||||
|
|
||||||
|
```nix
|
||||||
|
{ pkgs, ... }:
|
||||||
|
let
|
||||||
|
fladder = pkgs.callPackage /path/to/this/repo/package.nix { };
|
||||||
|
in
|
||||||
|
{
|
||||||
|
environment.systemPackages = [ fladder ];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### As an overlay
|
||||||
|
|
||||||
|
```nix
|
||||||
|
# In configuration.nix or a separate overlay file:
|
||||||
|
nixpkgs.overlays = [
|
||||||
|
(final: prev: {
|
||||||
|
fladder = final.callPackage /path/to/this/repo/package.nix { };
|
||||||
|
})
|
||||||
|
];
|
||||||
|
|
||||||
|
environment.systemPackages = [ pkgs.fladder ];
|
||||||
|
```
|
||||||
|
|
||||||
|
### With flakes
|
||||||
|
|
||||||
|
```nix
|
||||||
|
# flake.nix
|
||||||
|
{
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11";
|
||||||
|
fladder-pkg.url = "path:/path/to/this/repo"; # or a github: URL
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { nixpkgs, fladder-pkg, ... }: {
|
||||||
|
nixosConfigurations.mymachine = nixpkgs.lib.nixosSystem {
|
||||||
|
system = "x86_64-linux";
|
||||||
|
modules = [
|
||||||
|
({ pkgs, ... }: {
|
||||||
|
environment.systemPackages = [
|
||||||
|
fladder-pkg.packages.x86_64-linux.fladder
|
||||||
|
];
|
||||||
|
})
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Package notes
|
||||||
|
|
||||||
|
### AppImage type
|
||||||
|
|
||||||
|
Fladder distributes a **Type 2 (SquashFS)** AppImage built with
|
||||||
|
[appimage-builder](https://appimage-builder.readthedocs.io/). The derivation
|
||||||
|
uses `appimageTools.wrapType2`, which:
|
||||||
|
|
||||||
|
1. Extracts the SquashFS filesystem.
|
||||||
|
2. Patches the ELF interpreter and `RPATH` to point at the Nix store.
|
||||||
|
3. Wraps the binary in a minimal FHS environment that provides the expected
|
||||||
|
shared libraries.
|
||||||
|
|
||||||
|
### Runtime dependencies
|
||||||
|
|
||||||
|
The main external shared libraries are:
|
||||||
|
|
||||||
|
| Library | Why needed |
|
||||||
|
|---|---|
|
||||||
|
| `libmpv` | Media playback (video/audio streaming) |
|
||||||
|
| `gtk3` | Flutter Linux window embedder |
|
||||||
|
| `libGL` / `mesa` | Flutter Impeller / OpenGL compositor |
|
||||||
|
| `libxkbcommon` | Keyboard input |
|
||||||
|
| `wayland` | Native Wayland support (Flutter ≥ 3.13) |
|
||||||
|
| `libpulseaudio` | Audio (mpv PulseAudio / PipeWire-pulse back-end) |
|
||||||
|
| `python3` | `libmpv` in nixpkgs pulls in `vapoursynth` which `dlopen`s `libpython` |
|
||||||
|
|
||||||
|
The `python3` dependency is subtle but important: without it the app exits
|
||||||
|
immediately with `libpython3.x.so.1.0: cannot open shared object file`
|
||||||
|
([upstream issue #724](https://github.com/DonutWare/Fladder/issues/724)).
|
||||||
|
|
||||||
|
### AMD GPU (RX 580)
|
||||||
|
|
||||||
|
The RX 580 uses the open-source `amdgpu` / `radeonsi` Mesa driver stack,
|
||||||
|
which is included via `pkgs.mesa` in `extraPkgs`. No additional configuration
|
||||||
|
should be required. If you encounter rendering artefacts, try:
|
||||||
|
|
||||||
|
```nix
|
||||||
|
# In configuration.nix
|
||||||
|
hardware.opengl.enable = true; # (or hardware.graphics.enable on 25.05+)
|
||||||
|
hardware.opengl.driSupport = true;
|
||||||
|
```
|
||||||
|
|
||||||
|
### X11 / Wayland
|
||||||
|
|
||||||
|
Fladder runs on both. Flutter will prefer Wayland when `WAYLAND_DISPLAY` is
|
||||||
|
set; it falls back to X11/XWayland otherwise. No special flags are needed.
|
||||||
|
|
||||||
|
### Updating to a new version
|
||||||
|
|
||||||
|
1. Update `version` in `package.nix`.
|
||||||
|
2. Update the `hash` field — get the new hash with:
|
||||||
|
```bash
|
||||||
|
nix-prefetch-url --type sha256 \
|
||||||
|
https://github.com/DonutWare/Fladder/releases/download/vNEW/Fladder-Linux-NEW.AppImage
|
||||||
|
# Convert to SRI format:
|
||||||
|
nix hash to-sri --type sha256 <raw-hash>
|
||||||
|
```
|
||||||
|
3. Run `nix-build` and test.
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
**`libmpv.so: cannot open shared object file`**
|
||||||
|
: Ensure `pkgs.mpv` is in `extraPkgs`. If you build mpv yourself with custom
|
||||||
|
options, the `.so` name or version may differ — check with
|
||||||
|
`nix run nixpkgs#patchelf -- --print-needed result/bin/.fladder-wrapped`.
|
||||||
|
|
||||||
|
**`libpython3.x.so.1.0: cannot open shared object file`**
|
||||||
|
: The `python3` package in `extraPkgs` should fix this. If it persists, pin
|
||||||
|
the python version to match the one nixpkgs' mpv was linked against.
|
||||||
|
|
||||||
|
**App window is black / no video**
|
||||||
|
: Make sure Mesa / OpenGL is enabled in your NixOS config (see AMD GPU section
|
||||||
|
above). Also try setting `LIBGL_ALWAYS_SOFTWARE=0` to rule out Mesa's
|
||||||
|
software rasterizer being selected.
|
||||||
|
|
||||||
|
**Wayland: window appears but is blank**
|
||||||
|
: Try forcing X11 as a workaround: `WAYLAND_DISPLAY="" ./result/bin/fladder`.
|
||||||
|
This is a known Flutter/Wayland edge case on some compositor versions.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
The Nix packaging files in this repo are released under the MIT license.
|
||||||
|
Fladder itself is [GPL-3.0](https://github.com/DonutWare/Fladder/blob/develop/LICENSE).
|
||||||
22
default.nix
Normal file
22
default.nix
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# default.nix — local test entry-point
|
||||||
|
#
|
||||||
|
# Usage
|
||||||
|
# -----
|
||||||
|
# nix-build # build the package
|
||||||
|
# nix-build -A fladder # explicit attribute (same result)
|
||||||
|
# ./result/bin/fladder # run the built binary
|
||||||
|
#
|
||||||
|
# To drop into a shell with the package available:
|
||||||
|
# nix-shell -p "$(nix-build --no-out-link)"
|
||||||
|
#
|
||||||
|
# Or with nix shell (flake-agnostic):
|
||||||
|
# nix shell "$(nix-build --no-out-link)"
|
||||||
|
|
||||||
|
let
|
||||||
|
# Pin to a recent nixpkgs revision that ships NixOS 25.11 packages.
|
||||||
|
# Replace <nixpkgs> with a pinned fetchTarball for fully reproducible builds.
|
||||||
|
pkgs = import <nixpkgs> { };
|
||||||
|
in
|
||||||
|
{
|
||||||
|
fladder = pkgs.callPackage ./package.nix { };
|
||||||
|
}
|
||||||
125
package.nix
Normal file
125
package.nix
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
{
|
||||||
|
lib,
|
||||||
|
appimageTools,
|
||||||
|
fetchurl,
|
||||||
|
makeDesktopItem,
|
||||||
|
copyDesktopItems,
|
||||||
|
imagemagick,
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
pname = "fladder";
|
||||||
|
version = "0.10.3";
|
||||||
|
|
||||||
|
src = fetchurl {
|
||||||
|
url = "https://github.com/DonutWare/Fladder/releases/download/v${version}/Fladder-Linux-${version}.AppImage";
|
||||||
|
hash = "sha256-t9/rB7Iv0GI5HJWwBUQwfxISPpbYPeRouS6oD8BKMEY=";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Extract the AppImage contents so we can pull out the icon.
|
||||||
|
# Fladder uses appimage-builder → Type 2 (SquashFS) AppImage.
|
||||||
|
appimageContents = appimageTools.extractType2 { inherit pname version src; };
|
||||||
|
|
||||||
|
in
|
||||||
|
appimageTools.wrapType2 rec {
|
||||||
|
inherit pname version src;
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Extra libraries injected into the FHS environment that wrapType2 creates.
|
||||||
|
#
|
||||||
|
# Why these?
|
||||||
|
# • libmpv – Fladder is a media client; it links against libmpv at
|
||||||
|
# runtime (confirmed by AUR fladder-bin/fladder-git and the
|
||||||
|
# INSTALL.md "libmpv shared library errors" note).
|
||||||
|
# • gtk3 – Flutter on Linux uses GTK3 for window management.
|
||||||
|
# • glib / pango / cairo / harfbuzz / fontconfig
|
||||||
|
# – Transitive GTK3 / Flutter rendering dependencies.
|
||||||
|
# • libGL / mesa-gl-headers
|
||||||
|
# – Flutter's Linux embedder always links libGL even when
|
||||||
|
# the app itself is not "GPU heavy". Needed for the
|
||||||
|
# OpenGL compositor / Impeller.
|
||||||
|
# • xorg.libX11 / libxkbcommon
|
||||||
|
# – X11 window system support; also required under Wayland
|
||||||
|
# (XWayland path).
|
||||||
|
# • wayland – Native Wayland support (Flutter >= 3.13 supports it).
|
||||||
|
# • dbus – System notifications and D-Bus IPC.
|
||||||
|
# • alsa-lib – Audio output via mpv's ALSA back-end.
|
||||||
|
# • libpulseaudio
|
||||||
|
# – Audio output via mpv's PulseAudio / PipeWire-pulse
|
||||||
|
# back-end (preferred over bare ALSA on most desktops).
|
||||||
|
# • python3 – libmpv in nixpkgs is built with vapoursynth support
|
||||||
|
# which dlopen's libpython at runtime. Without this the
|
||||||
|
# binary exits with "cannot open shared object file:
|
||||||
|
# libpython3.x.so.1.0" (upstream issue #724).
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
extraPkgs = pkgs: [
|
||||||
|
pkgs.mpv
|
||||||
|
pkgs.gtk3
|
||||||
|
pkgs.glib
|
||||||
|
pkgs.pango
|
||||||
|
pkgs.cairo
|
||||||
|
pkgs.harfbuzz
|
||||||
|
pkgs.fontconfig
|
||||||
|
pkgs.freetype
|
||||||
|
pkgs.libGL
|
||||||
|
pkgs.mesa
|
||||||
|
pkgs.xorg.libX11
|
||||||
|
pkgs.xorg.libXext
|
||||||
|
pkgs.xorg.libXrender
|
||||||
|
pkgs.libxkbcommon
|
||||||
|
pkgs.wayland
|
||||||
|
pkgs.dbus
|
||||||
|
pkgs.alsa-lib
|
||||||
|
pkgs.libpulseaudio
|
||||||
|
pkgs.python3
|
||||||
|
# Needed by some AppImageLauncher / appimage-builder runtime stubs
|
||||||
|
pkgs.fuse
|
||||||
|
pkgs.libepoxy
|
||||||
|
pkgs.lz4
|
||||||
|
];
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Post-install: wire up the .desktop file and icon.
|
||||||
|
#
|
||||||
|
# appimage-builder places the icon at:
|
||||||
|
# AppDir/usr/share/icons/fladder_icon_desktop.png
|
||||||
|
# and the upstream .desktop ID is nl.jknaapen.fladder.
|
||||||
|
# We install both a correctly-named .desktop file and a hicolor icon so
|
||||||
|
# the app appears in application launchers without extra config.
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
extraInstallCommands = ''
|
||||||
|
# ── Icon ──────────────────────────────────────────────────────────────────
|
||||||
|
install -Dm644 \
|
||||||
|
${appimageContents}/usr/share/icons/fladder_icon_desktop.png \
|
||||||
|
$out/share/icons/hicolor/256x256/apps/fladder.png
|
||||||
|
|
||||||
|
# ── Desktop file ──────────────────────────────────────────────────────────
|
||||||
|
install -Dm644 \
|
||||||
|
${appimageContents}/nl.jknaapen.fladder.desktop \
|
||||||
|
$out/share/applications/fladder.desktop
|
||||||
|
|
||||||
|
# Fix the Exec line so it points at the wrapped binary in $out/bin.
|
||||||
|
substituteInPlace $out/share/applications/fladder.desktop \
|
||||||
|
--replace-fail 'Exec=Fladder' 'Exec=fladder' \
|
||||||
|
--replace-quiet 'Icon=fladder_icon_desktop' 'Icon=fladder'
|
||||||
|
'';
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
description = "Cross-platform Jellyfin frontend built on Flutter";
|
||||||
|
longDescription = ''
|
||||||
|
Fladder is a feature-rich Jellyfin client that supports streaming,
|
||||||
|
offline sync, trickplay scrubbing, intro/credits skipping, Jellyseerr
|
||||||
|
integration, comic-book reading, and more. It targets Linux, Windows,
|
||||||
|
macOS, Android, iOS, and Web from a single Flutter codebase.
|
||||||
|
'';
|
||||||
|
homepage = "https://github.com/DonutWare/Fladder";
|
||||||
|
downloadPage = "https://github.com/DonutWare/Fladder/releases";
|
||||||
|
changelog = "https://github.com/DonutWare/Fladder/releases/tag/v${version}";
|
||||||
|
license = lib.licenses.gpl3Only;
|
||||||
|
sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
|
||||||
|
# AppImage is x86_64-only upstream.
|
||||||
|
platforms = [ "x86_64-linux" ];
|
||||||
|
mainProgram = "fladder";
|
||||||
|
maintainers = [ ]; # add yourself: lib.maintainers.yourhandle
|
||||||
|
};
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user