main
  1{
  2  lib,
  3  stdenv,
  4  fetchurl,
  5  unzip,
  6  fetchFromGitHub,
  7  flutter344,
  8  libappindicator,
  9  mpv-unwrapped,
 10  copyDesktopItems,
 11  makeDesktopItem,
 12}:
 13flutter344.buildFlutterApplication rec {
 14  pname = "sylvakru";
 15  version = "3.6.0";
 16
 17  src = fetchFromGitHub {
 18    owner = "AfalpHy";
 19    repo = "sylvakru";
 20    tag = "v${version}";
 21    hash = "sha256-uOmn8FYTgdb8rszHwJeqU1m+YSy5mPvkVGWUtFSYXSY=";
 22  };
 23
 24  pubspecLock = lib.importJSON ./pubspec.lock.json;
 25
 26  riveLinuxLibs = fetchurl {
 27    url = "https://rive-flutter-artifacts.rive.app/rive_native_versions/0.1.10%2B2/rive_native_artifacts_linux.zip";
 28    hash = "sha512-5420epvMhyfbth0au+OhOiNQG1sU7hnRjnaAdGQmKumOKJmVN2zVbq2NVwlM9vL9ZzgW41jiM+S/T3e95zkhEg==";
 29  };
 30
 31  customSourceBuilders = {
 32    sqlite3_flutter_libs = {
 33      version,
 34      src,
 35      ...
 36    }:
 37      stdenv.mkDerivation {
 38        pname = "sqlite3_flutter_libs";
 39        inherit version src;
 40        inherit (src) passthru;
 41
 42        installPhase = ''
 43          runHook preInstall
 44
 45          cp -r . $out
 46
 47          runHook postInstall
 48        '';
 49      };
 50    sqlcipher_flutter_libs = {
 51      version,
 52      src,
 53      ...
 54    }:
 55      stdenv.mkDerivation {
 56        pname = "sqlcipher_flutter_libs";
 57        inherit version src;
 58        inherit (src) passthru;
 59
 60        installPhase = ''
 61          runHook preInstall
 62
 63          cp -r . $out
 64
 65          runHook postInstall
 66        '';
 67      };
 68    rive_native = {
 69      version,
 70      src,
 71      ...
 72    }:
 73      stdenv.mkDerivation {
 74        pname = "rive_native";
 75        inherit version src;
 76        inherit (src) passthru;
 77
 78        nativeBuildInputs = [unzip];
 79
 80        postPatch = ''
 81          pushd ${src.passthru.packageRoot}
 82          mkdir -p linux/bin
 83          unzip -q ${riveLinuxLibs} -d linux/bin
 84          touch linux/rive_marker_linux_development
 85          popd
 86        '';
 87
 88        installPhase = ''
 89          runHook preInstall
 90
 91          cp -r . $out
 92
 93          runHook postInstall
 94        '';
 95      };
 96  };
 97
 98  gitHashes = let
 99    media-kit-hash = "sha256-6dDr1PeAQc3tkHB9Cjrw2GIytSo/97Z6Vj/3zxyg4hI=";
100  in {
101    audio_service_win = "sha256-wbE9F2GruM6yl7Xa5XuTPnfqy5YBqCOUObTCA1zI8iY=";
102    file_picker = "sha256-oMacfNTrKSnkjqEB6JWD9Yc8ANRIZT0TwHLdZI+bq4Q=";
103    media_kit = media-kit-hash;
104    media_kit_libs_android_audio = media-kit-hash;
105    media_kit_libs_ios_audio = media-kit-hash;
106    media_kit_libs_macos_audio = media-kit-hash;
107    media_kit_libs_windows_audio = media-kit-hash;
108    tray_manager = "sha256-JvT62iBbTVr2CAyCoAVpAoIywCqjxx4TkTgljH6BnYE=";
109    window_manager = "sha256-Xt9m+YzLTVKDF5Gk165MVy6yx81O/1Arqqk0caTGoXc=";
110  };
111
112  postPatch = ''
113    substituteInPlace pubspec.yaml \
114      --replace-fail "flutter: 3.44.8" "flutter: ^3.44.8"
115
116    # Don't statically link mimalloc into the main executable: its global
117    # operator new override trips a libc++ assertion in Flutter >= 3.44
118    # (exceptions-disabled build), crashing the app.
119    # https://github.com/flutter/flutter/issues/188877
120    substituteInPlace linux/CMakeLists.txt \
121      --replace-fail 'target_link_libraries(''${BINARY_NAME} PRIVATE ''${MIMALLOC_LIB})' ""
122  '';
123
124  nativeBuildInputs = [copyDesktopItems];
125
126  buildInputs = [
127    libappindicator
128  ];
129
130  extraWrapProgramArgs = ''
131    --prefix LD_LIBRARY_PATH : $out/app/sylvakru/lib:${lib.makeLibraryPath [mpv-unwrapped]}
132  '';
133
134  desktopItems = [
135    (makeDesktopItem {
136      name = "sylvakru";
137      exec = pname;
138      icon = "${src}/assets/app_icon.png";
139      genericName = "Music Player";
140      desktopName = "Sylvakru";
141      categories = ["AudioVideo" "Audio" "Player" "Music"];
142    })
143  ];
144
145  meta = {
146    description = "A cross-platform music player for local and self-hosted libraries";
147    homepage = "https://github.com/AfalpHy/sylvakru";
148    license = with lib.licenses; [asl20];
149    platforms = lib.platforms.linux;
150  };
151}