1{
2 lib,
3 stdenv,
4 makeWrapper,
5 fetchFromGitHub,
6 fetchpatch,
7 which,
8 pkg-config,
9 libjpeg,
10 ocamlPackages,
11 awscli2,
12 bubblewrap,
13 curl,
14 ffmpeg,
15 yt-dlp,
16 runtimePackages ? [
17 awscli2
18 bubblewrap
19 curl
20 ffmpeg
21 yt-dlp
22 ],
23}:
24
25let
26 pname = "liquidsoap";
27 version = "2.3.0";
28in
29stdenv.mkDerivation {
30 inherit pname version;
31
32 src = fetchFromGitHub {
33 owner = "savonet";
34 repo = "liquidsoap";
35 rev = "refs/tags/v${version}";
36 hash = "sha256-wNOENkIQw8LWfceI24aa8Ja3ZkePgTIGdIpGgqs/3Ss=";
37 };
38
39 patches = [
40 # Compatibility with saturn_lockfree 0.5.0
41 (fetchpatch {
42 url = "https://github.com/savonet/liquidsoap/commit/3d6d2d9cd1c7750f2e97449516235a692b28bf56.patch";
43 includes = [ "src/*" ];
44 hash = "sha256-pmC3gwmkv+Hat61aulNkTKS4xMz+4D94OCMtzhzNfT4=";
45 })
46 ];
47
48 postPatch = ''
49 substituteInPlace src/lang/dune \
50 --replace-warn "(run git rev-parse --short HEAD)" "(run echo -n nixpkgs)"
51 # Compatibility with camlimages 5.0.5
52 substituteInPlace src/core/dune \
53 --replace-warn camlimages.all_formats camlimages.core
54 '';
55
56 dontConfigure = true;
57
58 buildPhase = ''
59 runHook preBuild
60
61 dune build
62
63 runHook postBuild
64 '';
65
66 installPhase = ''
67 runHook preInstall
68
69 dune install --prefix "$out"
70
71 runHook postInstall
72 '';
73
74 fixupPhase = ''
75 runHook preFixup
76
77 wrapProgram $out/bin/liquidsoap \
78 --set LIQ_LADSPA_PATH /run/current-system/sw/lib/ladspa \
79 --prefix PATH : ${lib.makeBinPath runtimePackages}
80
81 runHook postFixup
82 '';
83
84 strictDeps = true;
85
86 nativeBuildInputs = [
87 makeWrapper
88 pkg-config
89 which
90 ocamlPackages.ocaml
91 ocamlPackages.dune_3
92 ocamlPackages.findlib
93 ocamlPackages.menhir
94 ];
95
96 buildInputs = [
97 libjpeg
98
99 # Mandatory dependencies
100 ocamlPackages.dtools
101 ocamlPackages.duppy
102 ocamlPackages.mm
103 ocamlPackages.ocurl
104 ocamlPackages.re
105 ocamlPackages.cry
106 ocamlPackages.camomile
107 ocamlPackages.uri
108 ocamlPackages.fileutils
109 ocamlPackages.magic-mime
110 ocamlPackages.menhir # liquidsoap-lang
111 ocamlPackages.menhirLib
112 ocamlPackages.mem_usage
113 ocamlPackages.metadata
114 ocamlPackages.dune-build-info
115 ocamlPackages.re
116 ocamlPackages.saturn_lockfree # liquidsoap-lang
117 ocamlPackages.sedlex # liquidsoap-lang
118 ocamlPackages.ppx_hash # liquidsoap-lang
119 ocamlPackages.ppx_string
120
121 # Recommended dependencies
122 ocamlPackages.ffmpeg
123
124 # Optional dependencies
125 ocamlPackages.alsa
126 ocamlPackages.ao
127 ocamlPackages.bjack
128 ocamlPackages.camlimages
129 ocamlPackages.dssi
130 ocamlPackages.faad
131 ocamlPackages.fdkaac
132 ocamlPackages.flac
133 ocamlPackages.frei0r
134 ocamlPackages.gd
135 ocamlPackages.graphics
136 # ocamlPackages.gstreamer # Broken but advertised feature
137 ocamlPackages.imagelib
138 ocamlPackages.inotify
139 ocamlPackages.ladspa
140 ocamlPackages.lame
141 ocamlPackages.lastfm
142 ocamlPackages.lilv
143 ocamlPackages.lo
144 ocamlPackages.mad
145 ocamlPackages.ogg
146 ocamlPackages.opus
147 ocamlPackages.portaudio
148 ocamlPackages.posix-time2
149 ocamlPackages.pulseaudio
150 ocamlPackages.samplerate
151 ocamlPackages.shine
152 ocamlPackages.soundtouch
153 ocamlPackages.speex
154 ocamlPackages.srt
155 ocamlPackages.ssl
156 ocamlPackages.taglib
157 ocamlPackages.theora
158 ocamlPackages.tsdl
159 ocamlPackages.tsdl-image
160 ocamlPackages.tsdl-ttf
161 ocamlPackages.vorbis
162 ocamlPackages.xmlplaylist
163 ocamlPackages.yaml
164 ];
165
166 meta = {
167 description = "Swiss-army knife for multimedia streaming";
168 mainProgram = "liquidsoap";
169 homepage = "https://www.liquidsoap.info/";
170 changelog = "https://raw.githubusercontent.com/savonet/liquidsoap/main/CHANGES.md";
171 maintainers = with lib.maintainers; [
172 dandellion
173 ehmry
174 ];
175 license = lib.licenses.gpl2Plus;
176 platforms = ocamlPackages.ocaml.meta.platforms or [ ];
177 };
178}