biome: 1.9.2 -> 1.9.3
[NixPkgs.git] / pkgs / tools / audio / beets / common.nix
blobac1b59a4f28908a49f711d7b56d538051abcb745
1 { fetchpatch
2 , bashInteractive
3 , diffPlugins
4 , glibcLocales
5 , gobject-introspection
6 , gst_all_1
7 , lib
8 , python3Packages
9 , sphinxHook
10 , runtimeShell
11 , writeScript
13   # plugin deps
14 , aacgain
15 , essentia-extractor
16 , ffmpeg
17 , flac
18 , imagemagick
19 , keyfinder-cli
20 , mp3gain
21 , mp3val
23 , src
24 , version
25 , extraPatches ? [ ]
26 , pluginOverrides ? { }
27 , disableAllPlugins ? false
28 , disabledTests ? []
29 , extraNativeBuildInputs ? []
31   # tests
32 , runCommand
33 , beets
34 }@inputs:
35 let
36   inherit (lib) attrNames attrValues concatMap;
38   mkPlugin = { name
39   , enable ? !disableAllPlugins
40   , builtin ? false
41   , propagatedBuildInputs ? [ ]
42   , testPaths ? [
43     # NOTE: This conditional can be removed when beets-stable is updated and
44     # the default plugins test path is changed
45     (if (lib.versions.majorMinor version) == "1.6" then
46       "test/test_${name}.py"
47     else
48       "test/plugins/test_${name}.py"
49     )
50   ]
51   , wrapperBins ? [ ]
52   }: {
53     inherit name enable builtin propagatedBuildInputs testPaths wrapperBins;
54   };
56   basePlugins = lib.mapAttrs (_: a: { builtin = true; } // a) (import ./builtin-plugins.nix inputs);
57   pluginOverrides' = lib.mapAttrs
58     (plugName: lib.throwIf
59       (basePlugins.${plugName}.deprecated or false)
60       "beets evaluation error: Plugin ${plugName} was enabled in pluginOverrides, but it has been removed. Remove the override to fix evaluation."
61     )
62     pluginOverrides
63   ;
65   allPlugins = lib.mapAttrs ( n: a: mkPlugin { name = n; } // a) (lib.recursiveUpdate basePlugins pluginOverrides');
66   builtinPlugins = lib.filterAttrs (_: p: p.builtin) allPlugins;
67   enabledPlugins = lib.filterAttrs (_: p: p.enable) allPlugins;
68   disabledPlugins = lib.filterAttrs (_: p: !p.enable) allPlugins;
70   pluginWrapperBins = concatMap (p: p.wrapperBins) (attrValues enabledPlugins);
72 python3Packages.buildPythonApplication {
73   pname = "beets";
74   inherit src version;
76   patches = extraPatches;
78   propagatedBuildInputs = with python3Packages; [
79     confuse
80     gst-python
81     jellyfish
82     mediafile
83     munkres
84     musicbrainzngs
85     mutagen
86     pygobject3
87     pyyaml
88     reflink
89     unidecode
90     typing-extensions
91   ] ++ (concatMap (p: p.propagatedBuildInputs) (attrValues enabledPlugins));
93   nativeBuildInputs = [
94     gobject-introspection
95     sphinxHook
96     python3Packages.pydata-sphinx-theme
97   ] ++ extraNativeBuildInputs;
99   buildInputs = [
100   ] ++ (with gst_all_1; [
101     gst-plugins-base
102     gst-plugins-good
103     gst-plugins-ugly
104   ]);
106   outputs = [ "out" "doc" "man" ];
107   sphinxBuilders = [ "html" "man" ];
109   postInstall = ''
110     mkdir -p $out/share/zsh/site-functions
111     cp extra/_beet $out/share/zsh/site-functions/
112   '';
114   makeWrapperArgs = [
115     "--set GI_TYPELIB_PATH \"$GI_TYPELIB_PATH\""
116     "--set GST_PLUGIN_SYSTEM_PATH_1_0 \"$GST_PLUGIN_SYSTEM_PATH_1_0\""
117     "--prefix PATH : ${lib.makeBinPath pluginWrapperBins}"
118   ];
120   nativeCheckInputs = with python3Packages; [
121     pytestCheckHook
122     pytest-cov
123     mock
124     rarfile
125     responses
126   ] ++ pluginWrapperBins;
128   disabledTestPaths = lib.flatten (attrValues (lib.mapAttrs (_: v: v.testPaths) disabledPlugins));
129   inherit disabledTests;
131   # Perform extra "sanity checks", before running pytest tests.
132   preCheck = ''
133     # Check for undefined plugins
134     find beetsplug -mindepth 1 \
135       \! -path 'beetsplug/__init__.py' -a \
136       \( -name '*.py' -o -path 'beetsplug/*/__init__.py' \) -print \
137       | sed -n -re 's|^beetsplug/([^/.]+).*|\1|p' \
138       | sort -u > plugins_available
139     ${diffPlugins (attrNames builtinPlugins) "plugins_available"}
141     export BEETS_TEST_SHELL="${bashInteractive}/bin/bash --norc"
142     export HOME="$(mktemp -d)"
144     env EDITOR="${writeScript "beetconfig.sh" ''
145       #!${runtimeShell}
146       cat > "$1" <<CFG
147       plugins: ${lib.concatStringsSep " " (attrNames enabledPlugins)}
148       CFG
149     ''}" "$out/bin/beet" config -e
150     env EDITOR=true "$out/bin/beet" config -e
151   '';
154   passthru.plugins = allPlugins;
156   passthru.tests.gstreamer = runCommand "beets-gstreamer-test" {
157     meta.timeout = 60;
158   } ''
159     set -euo pipefail
160     export HOME=$(mktemp -d)
161     mkdir $out
163     cat << EOF > $out/config.yaml
164 replaygain:
165   backend: gstreamer
168     ${beets}/bin/beet -c $out/config.yaml > /dev/null
169   '';
171   meta = with lib; {
172     description = "Music tagger and library organizer";
173     homepage = "https://beets.io";
174     license = licenses.mit;
175     maintainers = with maintainers; [ aszlig doronbehar lovesegfault pjones ];
176     platforms = platforms.linux;
177     mainProgram = "beet";
178   };