Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
4a749c4
added flake and .envrc
schembriaiden Nov 24, 2025
16f41ed
changed package name
schembriaiden Nov 24, 2025
d9b622b
added flake lock
schembriaiden Nov 24, 2025
423e5b7
added mesa-demos to fix eglinfo error
schembriaiden Nov 24, 2025
2df516b
Added libass
schembriaiden Nov 24, 2025
6810b2d
adding a bunch of packages (working copy)
schembriaiden Nov 24, 2025
bb5ec49
removed extra packages
schembriaiden Nov 24, 2025
706cd82
removed more packages
schembriaiden Nov 24, 2025
241b66e
added nix condition in .envrc
schembriaiden Nov 24, 2025
f0e6310
added mesa demos and removed custom xdg directories
schembriaiden Nov 24, 2025
55c88d0
removed extra comments
schembriaiden Nov 24, 2025
4e37156
updated package names
schembriaiden Nov 25, 2025
59fdce9
Separate into flake.nix and shell.nix
schembriaiden Dec 21, 2025
bbd7c5c
Added media kit and fvp patches
schembriaiden Dec 21, 2025
1656271
Merge branch 'develop' into nix-development
schembriaiden Dec 21, 2025
38cac44
Linting
schembriaiden Dec 21, 2025
976747d
Updated case
schembriaiden Dec 21, 2025
76fd26e
Version inherited from pubspec.yaml
schembriaiden Dec 21, 2025
1e2b658
Reduced buildInputs
schembriaiden Dec 21, 2025
36eaa3b
Stop re-downloading of pubspec
schembriaiden Dec 22, 2025
978c9e3
Fix pubspec building everytime
schembriaiden Dec 22, 2025
ac5372e
Merge branch 'develop' into nix-development
schembriaiden Jan 3, 2026
60db8ac
update media_kit hash
schembriaiden Jan 3, 2026
802e62a
add workflow to auto update media kit hash
schembriaiden Jan 3, 2026
e89c8c3
update flake.lock
schembriaiden Jan 3, 2026
1f225cc
updated workflow to check for changes and remove fvp update
schembriaiden Jan 3, 2026
1cb9712
Merge branch 'develop' into nix-development
schembriaiden Jan 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .envrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# This ensures 'use flake' only runs if the user has Nix installed.
if has nix; then
use flake
fi
78 changes: 78 additions & 0 deletions .github/workflows/update-nix-hashes.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
name: Update Nix Hashes

on:
push:
paths:
- 'pubspec.lock'
- 'pubspec.yaml'
workflow_dispatch:

jobs:
update-hashes:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps:
- uses: actions/checkout@v6.0.1

- name: Install Nix
uses: cachix/install-nix-action@v31.9.0
with:
nix_path: nixpkgs=channel:nixos-unstable

- name: Update Nix Hashes
run: |
FLAKE_FILE="flake.nix"
LOCK_FILE="pubspec.lock"
CHANGES_MADE=false

# 1. Update media_kit hash
echo "Checking media_kit..."
MEDIA_KIT_REF=$(grep -A 15 "media_kit:" "$LOCK_FILE" | grep "resolved-ref:" | head -n 1 | awk '{print $2}')

if [ -n "$MEDIA_KIT_REF" ]; then
echo "Found media_kit ref: $MEDIA_KIT_REF"
CURRENT_HASH=$(grep 'media_kit-hash = ' "$FLAKE_FILE" | head -n 1 | awk -F'"' '{print $2}')

# Calculate the Nix hash using nix-prefetch-git
HASH_JSON=$(nix-shell -p nix-prefetch-git --run "nix-prefetch-git https://github.com/DonutWare/media-kit.git --rev $MEDIA_KIT_REF")
MEDIA_KIT_HASH=$(echo "$HASH_JSON" | grep '"hash":' | cut -d'"' -f4)

if [ -n "$MEDIA_KIT_HASH" ]; then
echo "Calculated media_kit hash: $MEDIA_KIT_HASH"
if [ "$CURRENT_HASH" != "$MEDIA_KIT_HASH" ]; then
echo "media_kit hash changed from $CURRENT_HASH to $MEDIA_KIT_HASH"
sed -i "s/media_kit-hash = \".*\";/media_kit-hash = \"$MEDIA_KIT_HASH\";/" "$FLAKE_FILE"
CHANGES_MADE=true
else
echo "media_kit hash unchanged"
fi
fi
fi

# Exit with status to indicate if changes were made
if [ "$CHANGES_MADE" = true ]; then
echo "Changes detected"
exit 0
else
echo "No changes detected"
exit 1
fi

- name: Create Pull Request
if: success()
uses: peter-evans/create-pull-request@v8.0.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: "chore(nix): update media_kit and fvp hashes"
committer: GitHub <noreply@github.com>
author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
signoff: false
branch: nix-hash-update
delete-branch: true
title: "chore(nix): update media_kit and fvp hashes"
body: |
Automated update of Nix hashes in `flake.nix` based on changes in `pubspec.lock`.

- Updated `media_kit` hash
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -78,3 +78,9 @@ Output

# Generated localizations
lib/l10n/generated

# Direnv
.direnv/

# Nix Build
result
61 changes: 61 additions & 0 deletions flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

141 changes: 141 additions & 0 deletions flake.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
{
description = "Fladder - A simple cross-platform Jellyfin client";

inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
};

outputs = {
self,
nixpkgs,
flake-utils,
}:
flake-utils.lib.eachDefaultSystem (
system: let
pkgs = import nixpkgs {
inherit system;
config = {
allowUnfree = true;
};
};

version = let
lines = pkgs.lib.splitString "\n" (builtins.readFile ./pubspec.yaml);
versionLine = pkgs.lib.findFirst (l: pkgs.lib.hasPrefix "version:" l) "version: 0.0.0" lines;
versionRaw = pkgs.lib.removePrefix "version:" versionLine;
versionNoBuild = pkgs.lib.head (pkgs.lib.splitString "+" versionRaw);
in
pkgs.lib.strings.trim versionNoBuild;

pubspecLock = builtins.path {
path = ./pubspec.lock;
name = "pubspec.lock";
};
in {
packages.fladder = pkgs.flutter335.buildFlutterApplication {
pname = "fladder";
inherit version;
src = pkgs.lib.cleanSource ./.;

autoPubspecLock = pubspecLock;

customSourceBuilders = let
mkMediaKitSource = subDir: {
version,
src,
...
}:
pkgs.stdenv.mkDerivation {
pname = "media-kit-source";
inherit version src;
installPhase = ''
mkdir -p $out
cp -r ${subDir}/* $out
'';
passthru = {
packageRoot = ".";
};
};
in {
media_kit = mkMediaKitSource "media_kit";
media_kit_video = mkMediaKitSource "media_kit_video";
media_kit_libs_video = mkMediaKitSource "libs/universal/media_kit_libs_video";
media_kit_libs_android_video = mkMediaKitSource "libs/android/media_kit_libs_android_video";
media_kit_libs_ios_video = mkMediaKitSource "libs/ios/media_kit_libs_ios_video";
media_kit_libs_macos_video = mkMediaKitSource "libs/macos/media_kit_libs_macos_video";
media_kit_libs_windows_video = mkMediaKitSource "libs/windows/media_kit_libs_windows_video";
media_kit_libs_linux = pkgs.callPackage ./nix/media_kit_libs_linux_donutware.nix {
miMallocVersion = "2.1.2";
miMallocHash = "sha256-Kxv/b3F/lyXHC/jXnkeG2hPeiicAWeS6C90mKue+Rus=";
};

fvp = pkgs.callPackage ./nix/fvp.nix {
fvpVersion = "0.35.0";
fvpHash = "sha256-GaHaNYGUANhosX1Aq7ehGeGGwCxu3Ar1NxgTSyPhnhA=";
};
};

gitHashes = let
media_kit-hash = "sha256-oJQ9sRQI4HpAIzoS995yfnzvx5ZzIubVANzbmxTt6LE=";
in {
media_kit = media_kit-hash;
media_kit_video = media_kit-hash;
media_kit_libs_linux = media_kit-hash;
media_kit_libs_video = media_kit-hash;
media_kit_libs_android_video = media_kit-hash;
media_kit_libs_ios_video = media_kit-hash;
media_kit_libs_macos_video = media_kit-hash;
media_kit_libs_windows_video = media_kit-hash;
};

nativeBuildInputs = with pkgs; [
copyDesktopItems
];

buildInputs = with pkgs; [
mpv-unwrapped
sqlite
alsa-lib
libepoxy
];

postInstall = ''
# Install SVG icon
install -Dm644 icons/fladder_icon.svg \
$out/share/icons/hicolor/scalable/apps/fladder.svg
'';

desktopItems = [
(pkgs.makeDesktopItem {
name = "fladder";
desktopName = "Fladder";
genericName = "Jellyfin Client";
exec = "Fladder";
icon = "fladder";
comment = "A simple cross-platform Jellyfin client";
categories = [
"AudioVideo"
"Video"
"Player"
];
})
];

meta = with pkgs.lib; {
description = "A simple cross-platform Jellyfin client";
homepage = "https://github.com/DonutWare/Fladder";
license = licenses.gpl3Plus;
platforms = platforms.linux;
mainProgram = "Fladder";
};
};

packages.default = self.packages.${system}.fladder;

formatter = pkgs.nixpkgs-fmt;

devShells.default = import ./shell.nix {inherit pkgs;};
}
);
}
39 changes: 39 additions & 0 deletions nix/fvp.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
{
stdenv,
fetchurl,
fvpVersion,
fvpHash,
}: {
version,
src,
...
}: let
# MDK SDK required by fvp plugin
mdk-sdk = fetchurl {
url = "https://github.com/wang-bin/mdk-sdk/releases/download/v${fvpVersion}/mdk-sdk-linux-x64.tar.xz";
hash = fvpHash;
};
in
stdenv.mkDerivation {
pname = "fvp";
inherit version src;

postPatch = ''
# Pre-provision the MDK SDK by extracting it directly to avoid downloading during build
mkdir -p linux
tar -xf ${mdk-sdk} -C linux
'';

installPhase = ''
runHook preInstall

mkdir $out
cp -r ./* $out/

runHook postInstall
'';

passthru = {
packageRoot = ".";
};
}
57 changes: 57 additions & 0 deletions nix/media_kit_libs_linux_donutware.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
{
stdenv,
fetchurl,
lib,
writeScript,
libpulseaudio,
alsa-lib,
libGL,
libx11,
libgbm,
libdrm,
miMallocVersion,
miMallocHash,
}: {
version,
src,
...
}: let
mimalloc = fetchurl {
url = "https://github.com/microsoft/mimalloc/archive/refs/tags/v${miMallocVersion}.tar.gz";
hash = miMallocHash;
};
in
stdenv.mkDerivation {
pname = "media_kit_libs_linux";
inherit version src;
inherit (src) passthru;

setupHook = writeScript "media-kit-libs-linux-setup-hook" ''
mediaKitLibsLinuxFixupHook() {
runtimeDependencies+=('${lib.getLib libpulseaudio}')
runtimeDependencies+=('${lib.getLib alsa-lib}')
runtimeDependencies+=('${lib.getLib libGL}')
runtimeDependencies+=('${lib.getLib libx11}')
runtimeDependencies+=('${lib.getLib libgbm}')
runtimeDependencies+=('${lib.getLib libdrm}')
}
preFixupHooks+=(mediaKitLibsLinuxFixupHook)
'';

postPatch = ''
sed -i '/download_and_verify(/,/)/{
/download_and_verify(/c\ execute_process(COMMAND ''${CMAKE_COMMAND} -E copy ${mimalloc} ''${MIMALLOC_ARCHIVE})
/MIMALLOC_URL/d
/MIMALLOC_MD5/d
/MIMALLOC_ARCHIVE/d
/^ )$/d
}' libs/linux/media_kit_libs_linux/linux/CMakeLists.txt
'';

installPhase = ''
runHook preInstall
mkdir $out
cp -r ./* $out/
runHook postInstall
'';
}
Loading