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}