1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
|
{
lib,
python3,
fetchFromGitHub,
ffmpeg-headless,
librespot,
nixosTests,
replaceVars,
providers ? [ ],
}:
let
python = python3.override {
self = python;
packageOverrides = self: super: {
music-assistant-frontend = self.callPackage ./frontend.nix { };
music-assistant-models = super.music-assistant-models.overridePythonAttrs (oldAttrs: rec {
version = "1.1.45";
src = fetchFromGitHub {
owner = "music-assistant";
repo = "models";
tag = version;
hash = "sha256-R1KkMe9dVl5J1DjDsFhSYVebpiqBkXZSqkLrd7T8gFg=";
};
postPatch = ''
substituteInPlace pyproject.toml \
--replace-fail "0.0.0" "${version}"
'';
});
};
};
providerPackages = (import ./providers.nix).providers;
providerNames = lib.attrNames providerPackages;
providerDependencies = lib.concatMap (
provider: (providerPackages.${provider} python.pkgs)
) providers;
pythonPath = python.pkgs.makePythonPath providerDependencies;
in
assert
(lib.elem "airplay" providers)
-> throw "music-assistant: airplay support is missing libraop, a library we will not package because it depends on OpenSSL 1.1.";
python.pkgs.buildPythonApplication rec {
pname = "music-assistant";
version = "2.5.0";
pyproject = true;
src = fetchFromGitHub {
owner = "music-assistant";
repo = "server";
tag = version;
hash = "sha256-yugtL3dCuGb2OSTy49V4mil9EnfACcGrYCA1rW/lo+4=";
};
patches = [
(replaceVars ./ffmpeg.patch {
ffmpeg = "${lib.getBin ffmpeg-headless}/bin/ffmpeg";
ffprobe = "${lib.getBin ffmpeg-headless}/bin/ffprobe";
})
(replaceVars ./librespot.patch {
librespot = lib.getExe librespot;
})
# Disable interactive dependency resolution, which clashes with the immutable Python environment
./dont-install-deps.patch
];
postPatch = ''
substituteInPlace pyproject.toml \
--replace-fail "0.0.0" "${version}"
rm -rv music_assistant/providers/spotify/bin
'';
build-system = with python.pkgs; [
setuptools
];
pythonRelaxDeps = [
"aiohttp"
"aiosqlite"
"certifi"
"colorlog"
"cryptography"
"mashumaro"
"orjson"
"pillow"
"xmltodict"
"zeroconf"
];
dependencies =
with python.pkgs;
[
aiohttp
mashumaro
orjson
]
++ optional-dependencies.server;
optional-dependencies = with python.pkgs; {
server = [
aiodns
aiofiles
aiohttp
aiorun
aiosqlite
asyncio-throttle
brotli
certifi
colorlog
cryptography
eyed3
faust-cchardet
ifaddr
mashumaro
memory-tempfile
music-assistant-frontend
music-assistant-models
mutagen
orjson
pillow
podcastparser
python-slugify
shortuuid
unidecode
xmltodict
zeroconf
];
};
nativeCheckInputs =
with python.pkgs;
[
pytest-aiohttp
pytest-cov-stub
pytest-timeout
pytestCheckHook
syrupy
pytest-timeout
]
++ lib.flatten (lib.attrValues optional-dependencies)
++ (providerPackages.jellyfin python.pkgs)
++ (providerPackages.opensubsonic python.pkgs);
pytestFlagsArray = [
# blocks in poll()
"--deselect=tests/providers/jellyfin/test_init.py::test_initial_sync"
"--deselect=tests/core/test_server_base.py::test_start_and_stop_server"
"--deselect=tests/core/test_server_base.py::test_events"
];
pythonImportsCheck = [ "music_assistant" ];
postFixup = ''
# binary native code, segfaults when autopatchelf'd, requires openssl 1.1 to build
rm $out/${python3.sitePackages}/music_assistant/providers/airplay/bin/cliraop-*
'';
passthru = {
inherit
python
pythonPath
providerPackages
providerNames
;
tests = nixosTests.music-assistant;
};
meta = with lib; {
changelog = "https://github.com/music-assistant/server/releases/tag/${version}";
description = "Music Assistant is a music library manager for various music sources which can easily stream to a wide range of supported players";
longDescription = ''
Music Assistant is a free, opensource Media library manager that connects to your streaming services and a wide
range of connected speakers. The server is the beating heart, the core of Music Assistant and must run on an
always-on device like a Raspberry Pi, a NAS or an Intel NUC or alike.
'';
homepage = "https://github.com/music-assistant/server";
license = licenses.asl20;
maintainers = with maintainers; [ hexa ];
mainProgram = "mass";
};
}
|