push sheeet
Some checks failed
Periodic Merges (6h) / master → staging-nixos (push) Failing after 12m50s
Periodic Merges (6h) / master → staging-next (push) Failing after 12m54s
Periodic Merges (24h) / merge-base(master,staging) → haskell-updates (push) Failing after 11m54s
Periodic Merges (6h) / staging-next → staging (push) Failing after 12m13s
Periodic Merges (24h) / staging-next-25.05 → staging-25.05 (push) Failing after 13m24s
Periodic Merges (24h) / release-25.05 → staging-next-25.05 (push) Failing after 14m28s

This commit is contained in:
Dark Steveneq
2025-10-09 14:15:47 +02:00
commit 646b892680
49168 changed files with 5897842 additions and 0 deletions

View File

@@ -0,0 +1,183 @@
{
aacgain,
chromaprint,
ffmpeg,
flac,
imagemagick,
keyfinder-cli,
mp3gain,
mp3val,
python3Packages,
version,
lib,
...
}:
{
absubmit = {
deprecated = true;
testPaths = [ ];
};
advancedrewrite = {
testPaths = [ ];
};
acousticbrainz = {
deprecated = true;
propagatedBuildInputs = [ python3Packages.requests ];
};
albumtypes = { };
aura = {
propagatedBuildInputs = with python3Packages; [
flask
flask-cors
pillow
];
};
autobpm = {
propagatedBuildInputs = with python3Packages; [
librosa
# An optional dependency of librosa, needed for beets' autobpm
resampy
];
};
badfiles = {
testPaths = [ ];
wrapperBins = [
mp3val
flac
];
};
bareasc = { };
beatport.propagatedBuildInputs = [ python3Packages.requests-oauthlib ];
bench.testPaths = [ ];
bpd.testPaths = [ ];
bpm.testPaths = [ ];
bpsync.testPaths = [ ];
bucket = { };
chroma = {
propagatedBuildInputs = [ python3Packages.pyacoustid ];
testPaths = [ ];
wrapperBins = [
chromaprint
];
};
convert.wrapperBins = [ ffmpeg ];
deezer = {
propagatedBuildInputs = [ python3Packages.requests ];
testPaths = [ ];
};
discogs.propagatedBuildInputs = with python3Packages; [
discogs-client
requests
];
duplicates.testPaths = [ ];
edit = { };
embedart = {
propagatedBuildInputs = with python3Packages; [ pillow ];
wrapperBins = [ imagemagick ];
};
embyupdate.propagatedBuildInputs = [ python3Packages.requests ];
export = { };
fetchart = {
propagatedBuildInputs = with python3Packages; [
beautifulsoup4
langdetect
pillow
requests
];
wrapperBins = [ imagemagick ];
};
filefilter = { };
fish.testPaths = [ ];
freedesktop.testPaths = [ ];
fromfilename.testPaths = [ ];
ftintitle = { };
fuzzy.testPaths = [ ];
gmusic.testPaths = [ ];
hook = { };
ihate = { };
importadded = { };
importfeeds = { };
info = { };
inline.testPaths = [ ];
ipfs = { };
keyfinder.wrapperBins = [ keyfinder-cli ];
kodiupdate = {
propagatedBuildInputs = [ python3Packages.requests ];
testPaths = [ ];
};
lastgenre.propagatedBuildInputs = [ python3Packages.pylast ];
lastimport = {
propagatedBuildInputs = [ python3Packages.pylast ];
testPaths = [ ];
};
limit = { };
listenbrainz = {
testPaths = [ ];
};
loadext = {
propagatedBuildInputs = [ python3Packages.requests ];
testPaths = [ ];
};
lyrics.propagatedBuildInputs = with python3Packages; [
beautifulsoup4
langdetect
requests
];
mbcollection.testPaths = [ ];
mbsubmit = { };
mbsync = { };
metasync.testPaths = [ ];
missing.testPaths = [ ];
mpdstats.propagatedBuildInputs = [ python3Packages.mpd2 ];
mpdupdate = {
propagatedBuildInputs = [ python3Packages.mpd2 ];
testPaths = [ ];
};
musicbrainz = { };
parentwork = { };
permissions = { };
play = { };
playlist.propagatedBuildInputs = [ python3Packages.requests ];
plexupdate = { };
random = { };
replace = { };
replaygain.wrapperBins = [
aacgain
ffmpeg
mp3gain
];
rewrite.testPaths = [ ];
scrub.testPaths = [ ];
smartplaylist = { };
sonosupdate = {
propagatedBuildInputs = [ python3Packages.soco ];
testPaths = [ ];
};
spotify = { };
subsonicplaylist = {
propagatedBuildInputs = [ python3Packages.requests ];
testPaths = [ ];
};
subsonicupdate.propagatedBuildInputs = [ python3Packages.requests ];
substitute = {
testPaths = [ ];
};
the = { };
thumbnails = {
propagatedBuildInputs = with python3Packages; [
pillow
pyxdg
];
wrapperBins = [ imagemagick ];
};
types.testPaths = [ "test/plugins/test_types_plugin.py" ];
unimported.testPaths = [ ];
web.propagatedBuildInputs = with python3Packages; [
flask
flask-cors
];
zero = { };
_typing = {
testPaths = [ ];
};
}

View File

@@ -0,0 +1,253 @@
{
lib,
stdenv,
src,
version,
fetchpatch,
bashInteractive,
diffPlugins,
gobject-introspection,
gst_all_1,
python3Packages,
sphinxHook,
writableTmpDirAsHomeHook,
runtimeShell,
writeScript,
# plugin deps, used indirectly by the @inputs when we `import ./builtin-plugins.nix`
aacgain,
chromaprint,
essentia-extractor,
ffmpeg,
flac,
imagemagick,
keyfinder-cli,
mp3gain,
mp3val,
extraPatches ? [ ],
pluginOverrides ? { },
disableAllPlugins ? false,
disabledTests ? [ ],
extraNativeBuildInputs ? [ ],
# tests
runCommand,
beets,
}@inputs:
let
inherit (lib) attrNames attrValues concatMap;
mkPlugin =
{
name,
enable ? !disableAllPlugins,
builtin ? false,
propagatedBuildInputs ? [ ],
testPaths ? [
"test/plugins/test_${name}.py"
],
wrapperBins ? [ ],
}:
{
inherit
name
enable
builtin
propagatedBuildInputs
testPaths
wrapperBins
;
};
basePlugins = lib.mapAttrs (_: a: { builtin = true; } // a) (import ./builtin-plugins.nix inputs);
pluginOverrides' = lib.mapAttrs (
plugName:
lib.throwIf (basePlugins.${plugName}.deprecated or false)
"beets evaluation error: Plugin ${plugName} was enabled in pluginOverrides, but it has been removed. Remove the override to fix evaluation."
) pluginOverrides;
allPlugins = lib.mapAttrs (n: a: mkPlugin { name = n; } // a) (
lib.recursiveUpdate basePlugins pluginOverrides'
);
builtinPlugins = lib.filterAttrs (_: p: p.builtin) allPlugins;
enabledPlugins = lib.filterAttrs (_: p: p.enable) allPlugins;
disabledPlugins = lib.filterAttrs (_: p: !p.enable) allPlugins;
disabledTestPaths = lib.flatten (attrValues (lib.mapAttrs (_: v: v.testPaths) disabledPlugins));
pluginWrapperBins = concatMap (p: p.wrapperBins) (attrValues enabledPlugins);
in
python3Packages.buildPythonApplication {
pname = "beets";
inherit src version;
pyproject = true;
patches = [
]
++ extraPatches;
build-system = [
python3Packages.poetry-core
];
dependencies =
with python3Packages;
[
confuse
gst-python
jellyfish
mediafile
munkres
musicbrainzngs
platformdirs
pyyaml
unidecode
typing-extensions
lap
]
++ (concatMap (p: p.propagatedBuildInputs) (attrValues enabledPlugins));
nativeBuildInputs = [
gobject-introspection
sphinxHook
python3Packages.pydata-sphinx-theme
]
++ extraNativeBuildInputs;
buildInputs = [
]
++ (with gst_all_1; [
gst-plugins-base
gst-plugins-good
gst-plugins-ugly
]);
outputs = [
"out"
"doc"
"man"
];
sphinxBuilders = [
"html"
"man"
];
postInstall = ''
mkdir -p $out/share/zsh/site-functions
cp extra/_beet $out/share/zsh/site-functions/
'';
makeWrapperArgs = [
"--set GI_TYPELIB_PATH \"$GI_TYPELIB_PATH\""
"--set GST_PLUGIN_SYSTEM_PATH_1_0 \"$GST_PLUGIN_SYSTEM_PATH_1_0\""
"--prefix PATH : ${lib.makeBinPath pluginWrapperBins}"
];
nativeCheckInputs =
with python3Packages;
[
pytestCheckHook
pytest-cov-stub
mock
rarfile
responses
requests-mock
pillow
]
++ [
writableTmpDirAsHomeHook
]
++ pluginWrapperBins;
__darwinAllowLocalNetworking = true;
disabledTestPaths =
disabledTestPaths
++ [
# touches network
"test/plugins/test_aura.py"
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
# Flaky: several tests fail randomly with:
# if not self._poll(timeout):
# raise Empty
# _queue.Empty
"test/plugins/test_bpd.py"
]
++ lib.optionals stdenv.hostPlatform.isLinux [
# fail on Hydra with `RuntimeError: image cannot be obtained without artresizer backend`
"test/plugins/test_art.py::AlbumArtOperationConfigurationTest::test_enforce_ratio"
"test/plugins/test_art.py::AlbumArtOperationConfigurationTest::test_enforce_ratio_with_percent_margin"
"test/plugins/test_art.py::AlbumArtOperationConfigurationTest::test_enforce_ratio_with_px_margin"
"test/plugins/test_art.py::AlbumArtOperationConfigurationTest::test_minwidth"
"test/plugins/test_art.py::AlbumArtPerformOperationTest::test_deinterlaced"
"test/plugins/test_art.py::AlbumArtPerformOperationTest::test_deinterlaced_and_resized"
"test/plugins/test_art.py::AlbumArtPerformOperationTest::test_file_not_resized"
"test/plugins/test_art.py::AlbumArtPerformOperationTest::test_file_resized"
"test/plugins/test_art.py::AlbumArtPerformOperationTest::test_file_resized_and_scaled"
"test/plugins/test_art.py::AlbumArtPerformOperationTest::test_file_resized_but_not_scaled"
"test/plugins/test_art.py::AlbumArtPerformOperationTest::test_resize"
];
disabledTests = disabledTests ++ [
# https://github.com/beetbox/beets/issues/5880
"test_reject_different_art"
# touches network
"test_merge_duplicate_album"
];
# Perform extra "sanity checks", before running pytest tests.
preCheck = ''
# Check for undefined plugins
find beetsplug -mindepth 1 \
\! -path 'beetsplug/__init__.py' -a \
\( -name '*.py' -o -path 'beetsplug/*/__init__.py' \) -print \
| sed -n -re 's|^beetsplug/([^/.]+).*|\1|p' \
| sort -u > plugins_available
${diffPlugins (attrNames builtinPlugins) "plugins_available"}
export BEETS_TEST_SHELL="${lib.getExe bashInteractive} --norc"
env EDITOR="${writeScript "beetconfig.sh" ''
#!${runtimeShell}
cat > "$1" <<CFG
plugins: ${lib.concatStringsSep " " (attrNames enabledPlugins)}
CFG
''}" "$out/bin/beet" config -e
env EDITOR=true "$out/bin/beet" config -e
'';
passthru.plugins = allPlugins;
passthru.tests.gstreamer =
runCommand "beets-gstreamer-test"
{
meta.timeout = 60;
}
''
set -euo pipefail
export HOME=$(mktemp -d)
mkdir $out
cat << EOF > $out/config.yaml
replaygain:
backend: gstreamer
EOF
${beets}/bin/beet -c $out/config.yaml > /dev/null
'';
meta = {
description = "Music tagger and library organizer";
homepage = "https://beets.io";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [
aszlig
doronbehar
lovesegfault
montchr
pjones
];
platforms = lib.platforms.linux ++ lib.platforms.darwin;
mainProgram = "beet";
};
}

View File

@@ -0,0 +1,55 @@
{
lib,
callPackage,
config,
fetchFromGitHub,
python3Packages,
}:
/*
** To customize the enabled beets plugins, use the pluginOverrides input to the
** derivation.
** Examples:
**
** Disabling a builtin plugin:
** beets.override { pluginOverrides = { beatport.enable = false; }; }
**
** Enabling an external plugin:
** beets.override { pluginOverrides = {
** alternatives = { enable = true; propagatedBuildInputs = [ beetsPackages.alternatives ]; };
** }; }
*/
let
extraPatches = [
# Bash completion fix for Nix
./patches/bash-completion-always-print.patch
];
in
lib.makeExtensible (
self:
{
beets = self.beets-stable;
beets-stable = callPackage ./common.nix rec {
inherit python3Packages extraPatches;
version = "2.4.0";
src = fetchFromGitHub {
owner = "beetbox";
repo = "beets";
tag = "v${version}";
hash = "sha256-BM4NW8iukw9+zLD2cfAETmFYNAiNPUn9cLrkVlCE+jM=";
};
};
beets-minimal = self.beets.override { disableAllPlugins = true; };
alternatives = callPackage ./plugins/alternatives.nix { beets = self.beets-minimal; };
audible = callPackage ./plugins/audible.nix { beets = self.beets-minimal; };
copyartifacts = callPackage ./plugins/copyartifacts.nix { beets = self.beets-minimal; };
filetote = callPackage ./plugins/filetote.nix { beets = self.beets-minimal; };
}
// lib.optionalAttrs config.allowAliases {
beets-unstable = lib.warn "beets-unstable was aliased to beets, since upstream releases are frequent nowadays" self.beets;
extrafiles = throw "extrafiles is unmaintained since 2020 and broken since beets 2.0.0";
}
)

View File

@@ -0,0 +1,45 @@
diff --git i/beets/ui/commands.py w/beets/ui/commands.py
index ad4f7821..5077191d 100755
--- i/beets/ui/commands.py
+++ w/beets/ui/commands.py
@@ -2381,22 +2381,6 @@ default_commands.append(config_cmd)
def print_completion(*args):
for line in completion_script(default_commands + plugins.commands()):
print_(line, end="")
- if not any(os.path.isfile(syspath(p)) for p in BASH_COMPLETION_PATHS):
- log.warning(
- "Warning: Unable to find the bash-completion package. "
- "Command line completion might not work."
- )
-
-
-BASH_COMPLETION_PATHS = [
- b"/etc/bash_completion",
- b"/usr/share/bash-completion/bash_completion",
- b"/usr/local/share/bash-completion/bash_completion",
- # SmartOS
- b"/opt/local/share/bash-completion/bash_completion",
- # Homebrew (before bash-completion2)
- b"/usr/local/etc/bash_completion",
-]
def completion_script(commands):
diff --git i/test/test_ui.py w/test/test_ui.py
index cae86148..faf266a8 100644
--- i/test/test_ui.py
+++ w/test/test_ui.py
@@ -1434,12 +1434,7 @@ class CompletionTest(_common.TestCase, TestHelper):
)
# Load bash_completion library.
- for path in commands.BASH_COMPLETION_PATHS:
- if os.path.exists(syspath(path)):
- bash_completion = path
- break
- else:
- self.skipTest("bash-completion script not found")
+ self.skipTest("bash-completion script not found")
try:
with open(util.syspath(bash_completion), "rb") as f:
tester.stdin.writelines(f)

View File

@@ -0,0 +1,53 @@
{
lib,
fetchFromGitHub,
beets,
python3Packages,
writableTmpDirAsHomeHook,
}:
python3Packages.buildPythonApplication rec {
pname = "beets-alternatives";
version = "0.13.4";
pyproject = true;
src = fetchFromGitHub {
repo = "beets-alternatives";
owner = "geigerzaehler";
tag = "v${version}";
hash = "sha256-jGHRoBBXqJq0r/Gbp7gkuaEFPVMGE6cqQRi84AHTXxQ=";
};
nativeBuildInputs = [
beets
];
dependencies = [
python3Packages.poetry-core
];
nativeCheckInputs =
with python3Packages;
[
pytestCheckHook
pytest-cov-stub
mock
pillow
tomli
typeguard
]
++ [
writableTmpDirAsHomeHook
];
meta = {
description = "Beets plugin to manage external files";
homepage = "https://github.com/geigerzaehler/beets-alternatives";
changelog = "https://github.com/geigerzaehler/beets-alternatives/blob/v${version}/CHANGELOG.md";
maintainers = with lib.maintainers; [
aszlig
lovesegfault
];
license = lib.licenses.mit;
};
}

View File

@@ -0,0 +1,47 @@
{
beets,
fetchFromGitHub,
lib,
nix-update-script,
python3Packages,
}:
python3Packages.buildPythonApplication rec {
pname = "beets-audible";
version = "1.0.2";
pyproject = true;
src = fetchFromGitHub {
owner = "Neurrone";
repo = "beets-audible";
rev = "v${version}";
hash = "sha256-6rf8U63SW+gwfT7ZdN/ymYKHRs0HSMDTP2ZBfULLsJs=";
};
nativeBuildInputs = [
beets
];
pythonRelaxDeps = true;
build-system = with python3Packages; [
hatchling
];
dependencies = with python3Packages; [
markdownify
natsort
tldextract
];
passthru = {
updateScript = nix-update-script { };
};
meta = {
description = "Beets-audible: Organize Your Audiobook Collection With Beets";
homepage = "https://github.com/Neurrone/beets-audible";
platforms = with lib.platforms; linux ++ darwin ++ windows;
license = with lib.licenses; [ mit ];
maintainers = with lib.maintainers; [ jwillikers ];
};
}

View File

@@ -0,0 +1,62 @@
{
lib,
beets,
fetchFromGitHub,
python3Packages,
writableTmpDirAsHomeHook,
}:
python3Packages.buildPythonApplication rec {
pname = "beets-copyartifacts";
version = "0.1.5";
pyproject = true;
src = fetchFromGitHub {
repo = "beets-copyartifacts";
owner = "adammillerio";
tag = "v${version}";
hash = "sha256-UTZh7T6Z288PjxFgyFxHnPt0xpAH3cnr8/jIrlJhtyU=";
};
postPatch = ''
sed -i -e '/namespace_packages/d' setup.py
printf 'from pkgutil import extend_path\n__path__ = extend_path(__path__, __name__)\n' >beetsplug/__init__.py
# beets v2.1.0 compat
# <https://github.com/beetbox/beets/commit/0e87389994a9969fa0930ffaa607609d02e286a8>
sed -i -e 's/util\.py3_path/os.fsdecode/g' tests/_common.py
'';
nativeBuildInputs = [
beets
];
build-system = with python3Packages; [
setuptools
];
dependencies = with python3Packages; [
six
];
nativeCheckInputs = [
python3Packages.pytestCheckHook
writableTmpDirAsHomeHook
];
pytestFlags = [
# This is the same as:
# -r fEs
"-rfEs"
];
meta = {
description = "Beets plugin to move non-music files during the import process";
homepage = "https://github.com/adammillerio/beets-copyartifacts";
changelog = "https://github.com/adammillerio/beets-copyartifacts/releases/tag/${src.tag}";
license = lib.licenses.mit;
inherit (beets.meta) platforms;
# Isn't compatible with beets >= 2.3
broken = true;
};
}

View File

@@ -0,0 +1,90 @@
{
lib,
fetchFromGitHub,
python3Packages,
beets,
beetsPackages,
writableTmpDirAsHomeHook,
}:
python3Packages.buildPythonApplication rec {
pname = "beets-filetote";
version = "1.1.0";
pyproject = true;
src = fetchFromGitHub {
owner = "gtronset";
repo = "beets-filetote";
tag = "v${version}";
hash = "sha256-5o0Hif0dNavYRH1pa1ZPTnOvk9VPXCU/Lqpg2rKzU/I=";
};
postPatch = ''
substituteInPlace pyproject.toml --replace-fail "poetry-core<2.0.0" "poetry-core"
'';
nativeBuildInputs = [
beets
];
build-system = [ python3Packages.poetry-core ];
dependencies = with python3Packages; [
mediafile
reflink
toml
typeguard
];
optional-dependencies = {
lint = with python3Packages; [
black
check-manifest
flake8
flake8-bugbear
flake8-bugbear-pyi
isort
mypy
pylint
typing_extensions
];
test = with python3Packages; [
beetsPackages.audible
mediafile
pytest
reflink
toml
typeguard
];
dev = optional-dependencies.lint ++ optional-dependencies.test ++ [ python3Packages.tox ];
};
pytestFlags = [
# This is the same as:
# -r fEs
"-rfEs"
];
disabledTestPaths = [
"tests/test_cli_operation.py"
"tests/test_pruning.py"
"tests/test_version.py"
];
nativeCheckInputs = [
python3Packages.pytestCheckHook
writableTmpDirAsHomeHook
]
++ optional-dependencies.test;
meta = with lib; {
description = "Beets plugin to move non-music files during the import process";
homepage = "https://github.com/gtronset/beets-filetote";
changelog = "https://github.com/gtronset/beets-filetote/blob/${src.tag}/CHANGELOG.md";
maintainers = with maintainers; [ dansbandit ];
license = licenses.mit;
inherit (beets.meta) platforms;
# https://github.com/gtronset/beets-filetote/issues/211
broken = true;
};
}