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