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}