mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-02-16 09:03:42 +00:00
beets: refactor
Highlights: * We now have a beets-unstable * We now run tests for beets-minimal * We're much more strict about the effects of enabling/disabling plugins * All patches but one were dropped * Removal of deprecated nose in favor of pytest * Art resizing is working better now
This commit is contained in:
parent
d4aca509e6
commit
d9910fc928
@ -1,21 +0,0 @@
|
|||||||
diff --git i/beetsplug/badfiles.py w/beetsplug/badfiles.py
|
|
||||||
index 36b45de3..5208b696 100644
|
|
||||||
--- i/beetsplug/badfiles.py
|
|
||||||
+++ w/beetsplug/badfiles.py
|
|
||||||
@@ -71,14 +71,14 @@ class BadFiles(BeetsPlugin):
|
|
||||||
return status, errors, [line for line in output.split("\n") if line]
|
|
||||||
|
|
||||||
def check_mp3val(self, path):
|
|
||||||
- status, errors, output = self.run_command(["mp3val", path])
|
|
||||||
+ status, errors, output = self.run_command(["@mp3val@/bin/mp3val", path])
|
|
||||||
if status == 0:
|
|
||||||
output = [line for line in output if line.startswith("WARNING:")]
|
|
||||||
errors = len(output)
|
|
||||||
return status, errors, output
|
|
||||||
|
|
||||||
def check_flac(self, path):
|
|
||||||
- return self.run_command(["flac", "-wst", path])
|
|
||||||
+ return self.run_command(["@flac@/bin/flac", "-wst", path])
|
|
||||||
|
|
||||||
def check_custom(self, command):
|
|
||||||
def checker(path):
|
|
94
pkgs/tools/audio/beets/builtin-plugins.nix
Normal file
94
pkgs/tools/audio/beets/builtin-plugins.nix
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
{ stdenv, lib
|
||||||
|
, aacgain ? null
|
||||||
|
, essentia-extractor ? null
|
||||||
|
, ffmpeg ? null
|
||||||
|
, flac ? null
|
||||||
|
, imagemagick ? null
|
||||||
|
, keyfinder-cli ? null
|
||||||
|
, mp3gain ? null
|
||||||
|
, mp3val ? null
|
||||||
|
, python3Packages
|
||||||
|
, ...
|
||||||
|
}: {
|
||||||
|
absubmit = {
|
||||||
|
enable = lib.elem stdenv.hostPlatform essentia-extractor.meta.platforms;
|
||||||
|
wrapperBins = [ essentia-extractor ];
|
||||||
|
};
|
||||||
|
acousticbrainz.propagatedBuildInputs = [ python3Packages.requests ];
|
||||||
|
albumtypes = { };
|
||||||
|
aura.propagatedBuildInputs = with python3Packages; [ flask pillow ];
|
||||||
|
badfiles.wrapperBins = [ mp3val flac ];
|
||||||
|
bareasc = { };
|
||||||
|
beatport.propagatedBuildInputs = [ python3Packages.requests-oauthlib ];
|
||||||
|
bench = { };
|
||||||
|
bpd = { };
|
||||||
|
bpm = { };
|
||||||
|
bpsync = { };
|
||||||
|
bucket = { };
|
||||||
|
chroma.propagatedBuildInputs = [ python3Packages.pyacoustid ];
|
||||||
|
convert.wrapperBins = [ ffmpeg ];
|
||||||
|
deezer.propagatedBuildInputs = [ python3Packages.requests ];
|
||||||
|
discogs.propagatedBuildInputs = with python3Packages; [ discogs-client requests ];
|
||||||
|
duplicates = { };
|
||||||
|
edit = { };
|
||||||
|
embedart = {
|
||||||
|
propagatedBuildInputs = with python3Packages; [ pillow ];
|
||||||
|
wrapperBins = [ imagemagick ];
|
||||||
|
};
|
||||||
|
embyupdate.propagatedBuildInputs = [ python3Packages.requests ];
|
||||||
|
export = { };
|
||||||
|
fetchart = {
|
||||||
|
propagatedBuildInputs = with python3Packages; [ requests pillow ];
|
||||||
|
wrapperBins = [ imagemagick ];
|
||||||
|
};
|
||||||
|
filefilter = { };
|
||||||
|
fish = { };
|
||||||
|
freedesktop = { };
|
||||||
|
fromfilename = { };
|
||||||
|
ftintitle = { };
|
||||||
|
fuzzy = { };
|
||||||
|
gmusic = { };
|
||||||
|
hook = { };
|
||||||
|
ihate = { };
|
||||||
|
importadded = { };
|
||||||
|
importfeeds = { };
|
||||||
|
info = { };
|
||||||
|
inline = { };
|
||||||
|
ipfs = { };
|
||||||
|
keyfinder.wrapperBins = [ keyfinder-cli ];
|
||||||
|
kodiupdate.propagatedBuildInputs = [ python3Packages.requests ];
|
||||||
|
lastgenre.propagatedBuildInputs = [ python3Packages.pylast ];
|
||||||
|
lastimport.propagatedBuildInputs = [ python3Packages.pylast ];
|
||||||
|
loadext.propagatedBuildInputs = [ python3Packages.requests ];
|
||||||
|
lyrics.propagatedBuildInputs = [ python3Packages.beautifulsoup4 ];
|
||||||
|
mbcollection = { };
|
||||||
|
mbsubmit = { };
|
||||||
|
mbsync = { };
|
||||||
|
metasync = { };
|
||||||
|
missing = { };
|
||||||
|
mpdstats.propagatedBuildInputs = [ python3Packages.mpd2 ];
|
||||||
|
mpdupdate.propagatedBuildInputs = [ python3Packages.mpd2 ];
|
||||||
|
parentwork = { };
|
||||||
|
permissions = { };
|
||||||
|
play = { };
|
||||||
|
playlist.propagatedBuildInputs = [ python3Packages.requests ];
|
||||||
|
plexupdate = { };
|
||||||
|
random = { };
|
||||||
|
replaygain.wrapperBins = [ aacgain ffmpeg mp3gain ];
|
||||||
|
rewrite = { };
|
||||||
|
scrub = { };
|
||||||
|
smartplaylist = { };
|
||||||
|
sonosupdate.propagatedBuildInputs = [ python3Packages.soco ];
|
||||||
|
spotify = { };
|
||||||
|
subsonicplaylist.propagatedBuildInputs = [ python3Packages.requests ];
|
||||||
|
subsonicupdate.propagatedBuildInputs = [ python3Packages.requests ];
|
||||||
|
the = { };
|
||||||
|
thumbnails = {
|
||||||
|
propagatedBuildInputs = with python3Packages; [ pillow pyxdg ];
|
||||||
|
wrapperBins = [ imagemagick ];
|
||||||
|
};
|
||||||
|
types.testPaths = [ "test/test_types_plugin.py" ];
|
||||||
|
unimported = { };
|
||||||
|
web.propagatedBuildInputs = [ python3Packages.flask ];
|
||||||
|
zero = { };
|
||||||
|
}
|
147
pkgs/tools/audio/beets/common.nix
Normal file
147
pkgs/tools/audio/beets/common.nix
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
{ stdenv, lib
|
||||||
|
, bashInteractive
|
||||||
|
, diffPlugins
|
||||||
|
, glibcLocales
|
||||||
|
, gobject-introspection
|
||||||
|
, gst_all_1
|
||||||
|
, python3Packages
|
||||||
|
, runtimeShell
|
||||||
|
, writeScript
|
||||||
|
|
||||||
|
# plugin deps
|
||||||
|
, aacgain ? null
|
||||||
|
, essentia-extractor ? null
|
||||||
|
, ffmpeg ? null
|
||||||
|
, flac ? null
|
||||||
|
, imagemagick ? null
|
||||||
|
, keyfinder-cli ? null
|
||||||
|
, mp3gain ? null
|
||||||
|
, mp3val ? null
|
||||||
|
|
||||||
|
, src
|
||||||
|
, version
|
||||||
|
, pluginOverrides ? { }
|
||||||
|
, disableAllPlugins ? false
|
||||||
|
}@inputs:
|
||||||
|
let
|
||||||
|
inherit (lib) attrNames attrValues concatMap;
|
||||||
|
|
||||||
|
builtinPlugins = import ./builtin-plugins.nix inputs;
|
||||||
|
|
||||||
|
mkPlugin = { enable ? !disableAllPlugins, propagatedBuildInputs ? [ ], testPaths ? [ ], wrapperBins ? [ ] }: {
|
||||||
|
inherit enable propagatedBuildInputs testPaths wrapperBins;
|
||||||
|
};
|
||||||
|
|
||||||
|
allPlugins = lib.mapAttrs (_: mkPlugin) (lib.recursiveUpdate builtinPlugins pluginOverrides);
|
||||||
|
enabledPlugins = lib.filterAttrs (_: p: p.enable) allPlugins;
|
||||||
|
disabledPlugins = lib.filterAttrs (_: p: !p.enable) allPlugins;
|
||||||
|
|
||||||
|
pluginWrapperBins = concatMap (p: p.wrapperBins) (attrValues enabledPlugins);
|
||||||
|
in
|
||||||
|
python3Packages.buildPythonApplication rec {
|
||||||
|
pname = "beets";
|
||||||
|
inherit src version;
|
||||||
|
|
||||||
|
patches = [
|
||||||
|
# Bash completion fix for Nix
|
||||||
|
./patches/bash-completion-always-print.patch
|
||||||
|
];
|
||||||
|
|
||||||
|
propagatedBuildInputs = with python3Packages; [
|
||||||
|
confuse
|
||||||
|
enum34
|
||||||
|
gobject-introspection
|
||||||
|
gst-python
|
||||||
|
jellyfish
|
||||||
|
mediafile
|
||||||
|
munkres
|
||||||
|
musicbrainzngs
|
||||||
|
mutagen
|
||||||
|
pygobject3
|
||||||
|
pyyaml
|
||||||
|
reflink
|
||||||
|
unidecode
|
||||||
|
] ++ (concatMap (p: p.propagatedBuildInputs) (attrValues enabledPlugins));
|
||||||
|
|
||||||
|
buildInputs = [
|
||||||
|
] ++ (with gst_all_1; [
|
||||||
|
gst-plugins-base
|
||||||
|
gst-plugins-good
|
||||||
|
gst-plugins-ugly
|
||||||
|
]);
|
||||||
|
|
||||||
|
postInstall = ''
|
||||||
|
mkdir -p $out/share/zsh/site-functions
|
||||||
|
cp extra/_beet $out/share/zsh/site-functions/
|
||||||
|
'';
|
||||||
|
|
||||||
|
doInstallCheck = true;
|
||||||
|
|
||||||
|
installCheckPhase = ''
|
||||||
|
runHook preInstallCheck
|
||||||
|
|
||||||
|
tmphome="$(mktemp -d)"
|
||||||
|
|
||||||
|
EDITOR="${writeScript "beetconfig.sh" ''
|
||||||
|
#!${runtimeShell}
|
||||||
|
cat > "$1" <<CFG
|
||||||
|
plugins: ${lib.concatStringsSep " " (attrNames enabledPlugins)}
|
||||||
|
CFG
|
||||||
|
''}" HOME="$tmphome" "$out/bin/beet" config -e
|
||||||
|
EDITOR=true HOME="$tmphome" "$out/bin/beet" config -e
|
||||||
|
|
||||||
|
runHook postInstallCheck
|
||||||
|
'';
|
||||||
|
|
||||||
|
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}"
|
||||||
|
];
|
||||||
|
|
||||||
|
checkInputs = with python3Packages; [
|
||||||
|
pytest
|
||||||
|
mock
|
||||||
|
rarfile
|
||||||
|
responses
|
||||||
|
] ++ pluginWrapperBins;
|
||||||
|
|
||||||
|
disabledTestPaths = lib.flatten (attrValues (lib.mapAttrs (n: v: v.testPaths ++ [ "test/test_${n}.py" ]) disabledPlugins));
|
||||||
|
|
||||||
|
checkPhase = ''
|
||||||
|
runHook 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 allPlugins) "plugins_available"}
|
||||||
|
|
||||||
|
export BEETS_TEST_SHELL="${bashInteractive}/bin/bash --norc"
|
||||||
|
export HOME="$(mktemp -d)"
|
||||||
|
|
||||||
|
args=" -m pytest -r fEs"
|
||||||
|
eval "disabledTestPaths=($disabledTestPaths)"
|
||||||
|
for path in ''${disabledTestPaths[@]}; do
|
||||||
|
if [ -e "$path" ]; then
|
||||||
|
args+=" --ignore \"$path\""
|
||||||
|
else
|
||||||
|
echo "Skipping non-existent test path '$path'"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
eval "python $args"
|
||||||
|
|
||||||
|
runHook postCheck
|
||||||
|
'';
|
||||||
|
|
||||||
|
meta = with lib; {
|
||||||
|
description = "Music tagger and library organizer";
|
||||||
|
homepage = "https://beets.io";
|
||||||
|
license = licenses.mit;
|
||||||
|
maintainers = with maintainers; [ aszlig doronbehar lovesegfault pjones ];
|
||||||
|
platforms = platforms.linux;
|
||||||
|
};
|
||||||
|
}
|
@ -1,34 +0,0 @@
|
|||||||
diff --git i/beetsplug/convert.py w/beetsplug/convert.py
|
|
||||||
index 6bc07c28..039fb452 100644
|
|
||||||
--- i/beetsplug/convert.py
|
|
||||||
+++ w/beetsplug/convert.py
|
|
||||||
@@ -118,22 +118,22 @@ class ConvertPlugin(BeetsPlugin):
|
|
||||||
'id3v23': 'inherit',
|
|
||||||
'formats': {
|
|
||||||
'aac': {
|
|
||||||
- 'command': 'ffmpeg -i $source -y -vn -acodec aac '
|
|
||||||
+ 'command': '@ffmpeg@/bin/ffmpeg -i $source -y -vn -acodec aac '
|
|
||||||
'-aq 1 $dest',
|
|
||||||
'extension': 'm4a',
|
|
||||||
},
|
|
||||||
'alac': {
|
|
||||||
- 'command': 'ffmpeg -i $source -y -vn -acodec alac $dest',
|
|
||||||
+ 'command': '@ffmpeg@/bin/ffmpeg -i $source -y -vn -acodec alac $dest',
|
|
||||||
'extension': 'm4a',
|
|
||||||
},
|
|
||||||
- 'flac': 'ffmpeg -i $source -y -vn -acodec flac $dest',
|
|
||||||
- 'mp3': 'ffmpeg -i $source -y -vn -aq 2 $dest',
|
|
||||||
+ 'flac': '@ffmpeg@/bin/ffmpeg -i $source -y -vn -acodec flac $dest',
|
|
||||||
+ 'mp3': '@ffmpeg@/bin/ffmpeg -i $source -y -vn -aq 2 $dest',
|
|
||||||
'opus':
|
|
||||||
- 'ffmpeg -i $source -y -vn -acodec libopus -ab 96k $dest',
|
|
||||||
+ '@ffmpeg@/bin/ffmpeg -i $source -y -vn -acodec libopus -ab 96k $dest',
|
|
||||||
'ogg':
|
|
||||||
- 'ffmpeg -i $source -y -vn -acodec libvorbis -aq 3 $dest',
|
|
||||||
+ '@ffmpeg@/bin/ffmpeg -i $source -y -vn -acodec libvorbis -aq 3 $dest',
|
|
||||||
'wma':
|
|
||||||
- 'ffmpeg -i $source -y -vn -acodec wmav2 -vn $dest',
|
|
||||||
+ '@ffmpeg@/bin/ffmpeg -i $source -y -vn -acodec wmav2 -vn $dest',
|
|
||||||
},
|
|
||||||
'max_bitrate': 500,
|
|
||||||
'auto': False,
|
|
@ -1,279 +1,37 @@
|
|||||||
{ stdenv
|
{ lib
|
||||||
, lib
|
, callPackage
|
||||||
, fetchFromGitHub
|
, fetchFromGitHub
|
||||||
, writeScript
|
|
||||||
, glibcLocales
|
|
||||||
, diffPlugins
|
|
||||||
, substituteAll
|
|
||||||
, pythonPackages
|
|
||||||
# can be null, if you wish to disable a reference to it. It's needed for the
|
|
||||||
# artresizer, see:
|
|
||||||
# https://beets.readthedocs.io/en/v1.6.0/plugins/fetchart.html#image-resizing
|
|
||||||
, imagemagick
|
|
||||||
, gobject-introspection
|
|
||||||
, gst_all_1
|
|
||||||
, runtimeShell
|
|
||||||
|
|
||||||
# external plugins package set
|
|
||||||
, beetsExternalPlugins
|
|
||||||
|
|
||||||
, enableAbsubmit ? lib.elem stdenv.hostPlatform.system essentia-extractor.meta.platforms, essentia-extractor
|
|
||||||
, enableAcousticbrainz ? true
|
|
||||||
, enableAcoustid ? true
|
|
||||||
, enableAura ? true
|
|
||||||
, enableBadfiles ? true, flac, mp3val
|
|
||||||
, enableBeatport ? true
|
|
||||||
, enableBpsync ? true
|
|
||||||
, enableConvert ? true, ffmpeg
|
|
||||||
, enableDeezer ? true
|
|
||||||
, enableDiscogs ? true
|
|
||||||
, enableEmbyupdate ? true
|
|
||||||
, enableFetchart ? true
|
|
||||||
, enableKeyfinder ? true, keyfinder-cli
|
|
||||||
, enableKodiupdate ? true
|
|
||||||
, enableLastfm ? true
|
|
||||||
, enableLoadext ? true
|
|
||||||
, enableLyrics ? true
|
|
||||||
, enableMpd ? true
|
|
||||||
, enablePlaylist ? true
|
|
||||||
, enableReplaygain ? true
|
|
||||||
, enableSonosUpdate ? true
|
|
||||||
, enableSubsonicplaylist ? true
|
|
||||||
, enableSubsonicupdate ? true
|
|
||||||
, enableThumbnails ? true
|
|
||||||
, enableWeb ? true
|
|
||||||
|
|
||||||
# External plugins
|
|
||||||
, enableAlternatives ? false
|
|
||||||
, enableCopyArtifacts ? false
|
|
||||||
, enableExtraFiles ? false
|
|
||||||
|
|
||||||
, bashInteractive, bash-completion
|
|
||||||
}:
|
}:
|
||||||
|
|
||||||
assert enableBpsync -> enableBeatport;
|
lib.makeExtensible (self: {
|
||||||
|
beets = self.beets-stable;
|
||||||
|
|
||||||
let
|
beets-stable = callPackage ./common.nix rec {
|
||||||
optionalPlugins = {
|
version = "1.6.0";
|
||||||
absubmit = enableAbsubmit;
|
src = fetchFromGitHub {
|
||||||
acousticbrainz = enableAcousticbrainz;
|
owner = "beetbox";
|
||||||
aura = enableAura;
|
repo = "beets";
|
||||||
badfiles = enableBadfiles;
|
rev = "v${version}";
|
||||||
beatport = enableBeatport;
|
hash = "sha256-fT+rCJJQR7bdfAcmeFRaknmh4ZOP4RCx8MXpq7/D8tM=";
|
||||||
bpsync = enableBpsync;
|
};
|
||||||
chroma = enableAcoustid;
|
|
||||||
convert = enableConvert;
|
|
||||||
deezer = enableDeezer;
|
|
||||||
discogs = enableDiscogs;
|
|
||||||
embyupdate = enableEmbyupdate;
|
|
||||||
fetchart = enableFetchart;
|
|
||||||
keyfinder = enableKeyfinder;
|
|
||||||
kodiupdate = enableKodiupdate;
|
|
||||||
lastgenre = enableLastfm;
|
|
||||||
lastimport = enableLastfm;
|
|
||||||
loadext = enableLoadext;
|
|
||||||
lyrics = enableLyrics;
|
|
||||||
mpdstats = enableMpd;
|
|
||||||
mpdupdate = enableMpd;
|
|
||||||
playlist = enablePlaylist;
|
|
||||||
replaygain = enableReplaygain;
|
|
||||||
sonosupdate = enableSonosUpdate;
|
|
||||||
subsonicplaylist = enableSubsonicplaylist;
|
|
||||||
subsonicupdate = enableSubsonicupdate;
|
|
||||||
thumbnails = enableThumbnails;
|
|
||||||
web = enableWeb;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
pluginsWithoutDeps = [
|
beets-minimal = self.beets.override { disableAllPlugins = true; };
|
||||||
"albumtypes" "bareasc" "bench" "bpd" "bpm" "bucket" "duplicates" "edit" "embedart"
|
|
||||||
"export" "filefilter" "fish" "freedesktop" "fromfilename" "ftintitle" "fuzzy"
|
|
||||||
"hook" "ihate" "importadded" "importfeeds" "info" "inline" "ipfs" "gmusic"
|
|
||||||
"mbcollection" "mbsubmit" "mbsync" "metasync" "missing" "parentwork" "permissions" "play"
|
|
||||||
"plexupdate" "random" "rewrite" "scrub" "smartplaylist" "spotify" "the"
|
|
||||||
"types" "unimported" "zero"
|
|
||||||
];
|
|
||||||
|
|
||||||
enabledOptionalPlugins = lib.attrNames (lib.filterAttrs (_: lib.id) optionalPlugins);
|
beets-unstable = callPackage ./common.nix {
|
||||||
|
version = "unstable-2022-05-08";
|
||||||
allPlugins = pluginsWithoutDeps ++ lib.attrNames optionalPlugins;
|
src = fetchFromGitHub {
|
||||||
allEnabledPlugins = pluginsWithoutDeps ++ enabledOptionalPlugins;
|
owner = "beetbox";
|
||||||
|
repo = "beets";
|
||||||
testShell = "${bashInteractive}/bin/bash --norc";
|
rev = "e06cf7969bfdfa4773049699320471be45d56054";
|
||||||
completion = "${bash-completion}/share/bash-completion/bash_completion";
|
hash = "sha256-yWwxYSzSSmx2UfCn0EBH23hQGZKSRn/c8ryvxLUeHdM=";
|
||||||
|
};
|
||||||
in pythonPackages.buildPythonApplication rec {
|
pluginOverrides = {
|
||||||
pname = "beets";
|
limit = { };
|
||||||
version = "1.6.0";
|
};
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
|
||||||
owner = "beetbox";
|
|
||||||
repo = "beets";
|
|
||||||
rev = "v${version}";
|
|
||||||
sha256 = "sha256-fT+rCJJQR7bdfAcmeFRaknmh4ZOP4RCx8MXpq7/D8tM=";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
propagatedBuildInputs = [
|
beets-alternatives = callPackage ./plugins/alternatives.nix { beets = self.beets-minimal; };
|
||||||
pythonPackages.six
|
beets-copyartifacts = callPackage ./plugins/copyartifacts.nix { beets = self.beets-minimal; };
|
||||||
pythonPackages.enum34
|
beets-extrafiles = callPackage ./plugins/extrafiles.nix { beets = self.beets-minimal; };
|
||||||
pythonPackages.jellyfish
|
})
|
||||||
pythonPackages.munkres
|
|
||||||
pythonPackages.musicbrainzngs
|
|
||||||
pythonPackages.mutagen
|
|
||||||
pythonPackages.pyyaml
|
|
||||||
pythonPackages.unidecode
|
|
||||||
pythonPackages.gst-python
|
|
||||||
pythonPackages.pygobject3
|
|
||||||
pythonPackages.reflink
|
|
||||||
pythonPackages.confuse
|
|
||||||
pythonPackages.mediafile
|
|
||||||
gobject-introspection
|
|
||||||
] ++ lib.optional enableAbsubmit essentia-extractor
|
|
||||||
++ lib.optional enableAcoustid pythonPackages.pyacoustid
|
|
||||||
++ lib.optional enableBeatport pythonPackages.requests-oauthlib
|
|
||||||
++ lib.optional enableConvert ffmpeg
|
|
||||||
++ lib.optional enableDiscogs pythonPackages.discogs-client
|
|
||||||
++ lib.optional (enableFetchart
|
|
||||||
|| enableDeezer
|
|
||||||
|| enableEmbyupdate
|
|
||||||
|| enableKodiupdate
|
|
||||||
|| enableLoadext
|
|
||||||
|| enablePlaylist
|
|
||||||
|| enableSubsonicplaylist
|
|
||||||
|| enableSubsonicupdate
|
|
||||||
|| enableAcousticbrainz) pythonPackages.requests
|
|
||||||
++ lib.optional enableKeyfinder keyfinder-cli
|
|
||||||
++ lib.optional enableLastfm pythonPackages.pylast
|
|
||||||
++ lib.optional enableLyrics pythonPackages.beautifulsoup4
|
|
||||||
++ lib.optional enableMpd pythonPackages.mpd2
|
|
||||||
++ lib.optional enableSonosUpdate pythonPackages.soco
|
|
||||||
++ lib.optional enableThumbnails pythonPackages.pyxdg
|
|
||||||
++ lib.optional (enableAura
|
|
||||||
|| enableWeb) pythonPackages.flask
|
|
||||||
++ lib.optional enableAlternatives beetsExternalPlugins.alternatives
|
|
||||||
++ lib.optional enableCopyArtifacts beetsExternalPlugins.copyartifacts
|
|
||||||
++ lib.optional enableExtraFiles beetsExternalPlugins.extrafiles
|
|
||||||
;
|
|
||||||
|
|
||||||
buildInputs = [
|
|
||||||
] ++ (with gst_all_1; [
|
|
||||||
gst-plugins-base
|
|
||||||
gst-plugins-good
|
|
||||||
gst-plugins-ugly
|
|
||||||
]);
|
|
||||||
|
|
||||||
checkInputs = with pythonPackages; [
|
|
||||||
beautifulsoup4
|
|
||||||
mock
|
|
||||||
nose
|
|
||||||
rarfile
|
|
||||||
responses
|
|
||||||
# Although considered as plugin dependencies, they are needed for the
|
|
||||||
# tests, for disabling them via an override makes the build fail. see:
|
|
||||||
# https://github.com/beetbox/beets/blob/v1.6.0/setup.py
|
|
||||||
pylast
|
|
||||||
mpd2
|
|
||||||
discogs-client
|
|
||||||
pyxdg
|
|
||||||
];
|
|
||||||
|
|
||||||
patches = [
|
|
||||||
# Bash completion fix for Nix
|
|
||||||
./bash-completion-always-print.patch
|
|
||||||
]
|
|
||||||
# Fix path to imagemagick, used for the artresizer.py file. This reference
|
|
||||||
# to imagemagick might be expensive for some people, so the patch can be
|
|
||||||
# disabled if imagemagick is set to null
|
|
||||||
++ lib.optional (imagemagick != null) (substituteAll {
|
|
||||||
src = ./imagemagick-nix-path.patch;
|
|
||||||
inherit imagemagick;
|
|
||||||
})
|
|
||||||
# We need to force ffmpeg as the default, since we do not package
|
|
||||||
# bs1770gain, and set the absolute path there, to avoid impurities.
|
|
||||||
++ lib.optional enableReplaygain (substituteAll {
|
|
||||||
src = ./replaygain-default-ffmpeg.patch;
|
|
||||||
ffmpeg = lib.getBin ffmpeg;
|
|
||||||
})
|
|
||||||
# Put absolute Nix paths in place
|
|
||||||
++ lib.optional enableConvert (substituteAll {
|
|
||||||
src = ./convert-plugin-ffmpeg-path.patch;
|
|
||||||
ffmpeg = lib.getBin ffmpeg;
|
|
||||||
})
|
|
||||||
++ lib.optional enableBadfiles (substituteAll {
|
|
||||||
src = ./badfiles-plugin-nix-paths.patch;
|
|
||||||
inherit mp3val flac;
|
|
||||||
})
|
|
||||||
;
|
|
||||||
|
|
||||||
# Disable failing tests
|
|
||||||
postPatch = ''
|
|
||||||
echo echo completion tests passed > test/rsrc/test_completion.sh
|
|
||||||
|
|
||||||
# https://github.com/beetbox/beets/issues/1187
|
|
||||||
sed -i -e 's/len(mf.images)/0/' test/test_zero.py
|
|
||||||
'';
|
|
||||||
|
|
||||||
postInstall = ''
|
|
||||||
mkdir -p $out/share/zsh/site-functions
|
|
||||||
cp extra/_beet $out/share/zsh/site-functions/
|
|
||||||
'';
|
|
||||||
|
|
||||||
doCheck = true;
|
|
||||||
|
|
||||||
preCheck = ''
|
|
||||||
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 allPlugins "plugins_available"}
|
|
||||||
'';
|
|
||||||
|
|
||||||
checkPhase = ''
|
|
||||||
runHook preCheck
|
|
||||||
|
|
||||||
LANG=en_US.UTF-8 \
|
|
||||||
LOCALE_ARCHIVE=${assert stdenv.isLinux; glibcLocales}/lib/locale/locale-archive \
|
|
||||||
BEETS_TEST_SHELL="${testShell}" \
|
|
||||||
BASH_COMPLETION_SCRIPT="${completion}" \
|
|
||||||
HOME="$(mktemp -d)" nosetests -v
|
|
||||||
|
|
||||||
runHook postCheck
|
|
||||||
'';
|
|
||||||
|
|
||||||
doInstallCheck = true;
|
|
||||||
|
|
||||||
installCheckPhase = ''
|
|
||||||
runHook preInstallCheck
|
|
||||||
|
|
||||||
tmphome="$(mktemp -d)"
|
|
||||||
|
|
||||||
EDITOR="${writeScript "beetconfig.sh" ''
|
|
||||||
#!${runtimeShell}
|
|
||||||
cat > "$1" <<CFG
|
|
||||||
plugins: ${lib.concatStringsSep " " allEnabledPlugins}
|
|
||||||
CFG
|
|
||||||
''}" HOME="$tmphome" "$out/bin/beet" config -e
|
|
||||||
EDITOR=true HOME="$tmphome" "$out/bin/beet" config -e
|
|
||||||
|
|
||||||
runHook postInstallCheck
|
|
||||||
'';
|
|
||||||
|
|
||||||
makeWrapperArgs = [
|
|
||||||
"--set GI_TYPELIB_PATH \"$GI_TYPELIB_PATH\""
|
|
||||||
"--set GST_PLUGIN_SYSTEM_PATH_1_0 \"$GST_PLUGIN_SYSTEM_PATH_1_0\""
|
|
||||||
];
|
|
||||||
|
|
||||||
passthru = {
|
|
||||||
# FIXME: remove in favor of pkgs.beetsExternalPlugins
|
|
||||||
externalPlugins = beetsExternalPlugins;
|
|
||||||
};
|
|
||||||
|
|
||||||
meta = with lib; {
|
|
||||||
description = "Music tagger and library organizer";
|
|
||||||
homepage = "https://beets.io";
|
|
||||||
license = licenses.mit;
|
|
||||||
maintainers = with maintainers; [ aszlig doronbehar lovesegfault pjones ];
|
|
||||||
platforms = platforms.linux;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
@ -1,20 +0,0 @@
|
|||||||
diff --git i/beets/util/artresizer.py w/beets/util/artresizer.py
|
|
||||||
index 8683e228..2f38b4d6 100644
|
|
||||||
--- i/beets/util/artresizer.py
|
|
||||||
+++ w/beets/util/artresizer.py
|
|
||||||
@@ -334,13 +334,8 @@ class ArtResizer(metaclass=Shareable):
|
|
||||||
# not, fall back to the older, separate convert and identify
|
|
||||||
# commands.
|
|
||||||
if self.method[0] == IMAGEMAGICK:
|
|
||||||
- self.im_legacy = self.method[2]
|
|
||||||
- if self.im_legacy:
|
|
||||||
- self.im_convert_cmd = ['convert']
|
|
||||||
- self.im_identify_cmd = ['identify']
|
|
||||||
- else:
|
|
||||||
- self.im_convert_cmd = ['magick']
|
|
||||||
- self.im_identify_cmd = ['magick', 'identify']
|
|
||||||
+ self.im_convert_cmd = ['@imagemagick@/bin/magick']
|
|
||||||
+ self.im_identify_cmd = ['@imagemagick@/bin/magick', 'identify']
|
|
||||||
|
|
||||||
def resize(
|
|
||||||
self, maxwidth, path_in, path_out=None, quality=0, max_filesize=0
|
|
@ -1,6 +1,6 @@
|
|||||||
{ lib, fetchFromGitHub, beets, pythonPackages }:
|
{ lib, fetchFromGitHub, beets, python3Packages }:
|
||||||
|
|
||||||
pythonPackages.buildPythonApplication rec {
|
python3Packages.buildPythonApplication rec {
|
||||||
pname = "beets-alternatives";
|
pname = "beets-alternatives";
|
||||||
version = "unstable-2021-02-01";
|
version = "unstable-2021-02-01";
|
||||||
|
|
||||||
@ -18,7 +18,7 @@ pythonPackages.buildPythonApplication rec {
|
|||||||
|
|
||||||
nativeBuildInputs = [ beets ];
|
nativeBuildInputs = [ beets ];
|
||||||
|
|
||||||
checkInputs = with pythonPackages; [
|
checkInputs = with python3Packages; [
|
||||||
pytestCheckHook
|
pytestCheckHook
|
||||||
mock
|
mock
|
||||||
];
|
];
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{ lib, fetchFromGitHub, beets, pythonPackages, glibcLocales }:
|
{ lib, fetchFromGitHub, beets, python3Packages, glibcLocales }:
|
||||||
|
|
||||||
pythonPackages.buildPythonApplication {
|
python3Packages.buildPythonApplication {
|
||||||
pname = "beets-copyartifacts";
|
pname = "beets-copyartifacts";
|
||||||
version = "unstable-2020-02-15";
|
version = "unstable-2020-02-15";
|
||||||
|
|
||||||
@ -22,7 +22,7 @@ pythonPackages.buildPythonApplication {
|
|||||||
tests/test_reimport.py
|
tests/test_reimport.py
|
||||||
'';
|
'';
|
||||||
|
|
||||||
nativeBuildInputs = [ beets pythonPackages.nose glibcLocales ];
|
nativeBuildInputs = [ beets python3Packages.nose glibcLocales ];
|
||||||
|
|
||||||
checkPhase = "LANG=en_US.UTF-8 nosetests";
|
checkPhase = "LANG=en_US.UTF-8 nosetests";
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{ lib, fetchFromGitHub, beets, pythonPackages }:
|
{ lib, fetchFromGitHub, beets, python3Packages }:
|
||||||
|
|
||||||
pythonPackages.buildPythonApplication rec {
|
python3Packages.buildPythonApplication rec {
|
||||||
pname = "beets-extrafiles";
|
pname = "beets-extrafiles";
|
||||||
version = "unstable-2020-12-13";
|
version = "unstable-2020-12-13";
|
||||||
|
|
||||||
@ -19,7 +19,7 @@ pythonPackages.buildPythonApplication rec {
|
|||||||
|
|
||||||
nativeBuildInputs = [ beets ];
|
nativeBuildInputs = [ beets ];
|
||||||
|
|
||||||
propagatedBuildInputs = with pythonPackages; [ mediafile ];
|
propagatedBuildInputs = with python3Packages; [ mediafile ];
|
||||||
|
|
||||||
preCheck = ''
|
preCheck = ''
|
||||||
HOME=$TEMPDIR
|
HOME=$TEMPDIR
|
||||||
|
@ -1,26 +0,0 @@
|
|||||||
diff --git i/beetsplug/replaygain.py w/beetsplug/replaygain.py
|
|
||||||
index b6297d93..5c1cbbc0 100644
|
|
||||||
--- i/beetsplug/replaygain.py
|
|
||||||
+++ w/beetsplug/replaygain.py
|
|
||||||
@@ -139,7 +139,7 @@ class FfmpegBackend(Backend):
|
|
||||||
|
|
||||||
def __init__(self, config, log):
|
|
||||||
super().__init__(config, log)
|
|
||||||
- self._ffmpeg_path = "ffmpeg"
|
|
||||||
+ self._ffmpeg_path = "@ffmpeg@/bin/ffmpeg"
|
|
||||||
|
|
||||||
# check that ffmpeg is installed
|
|
||||||
try:
|
|
||||||
@@ -975,11 +975,10 @@ class ReplayGainPlugin(BeetsPlugin):
|
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
|
|
||||||
- # default backend is 'command' for backward-compatibility.
|
|
||||||
self.config.add({
|
|
||||||
'overwrite': False,
|
|
||||||
'auto': True,
|
|
||||||
- 'backend': 'command',
|
|
||||||
+ 'backend': 'ffmpeg',
|
|
||||||
'threads': cpu_count(),
|
|
||||||
'parallel_on_import': False,
|
|
||||||
'per_disc': False,
|
|
@ -107,6 +107,7 @@ mapAliases ({
|
|||||||
bazaar = throw "bazaar has been deprecated by breezy"; # Added 2020-04-19
|
bazaar = throw "bazaar has been deprecated by breezy"; # Added 2020-04-19
|
||||||
bazaarTools = throw "bazaar has been deprecated by breezy"; # Added 2020-04-19
|
bazaarTools = throw "bazaar has been deprecated by breezy"; # Added 2020-04-19
|
||||||
bcat = throw "bcat has been removed because upstream is dead"; # Added 2021-08-22
|
bcat = throw "bcat has been removed because upstream is dead"; # Added 2021-08-22
|
||||||
|
beetsExternalPlugins = throw "beetsExternalPlugins has been deprecated, use beetsPackages.beets-$pluginname"; # Added 2022-05-07
|
||||||
beret = throw "beret has been removed"; # Added 2021-11-16
|
beret = throw "beret has been removed"; # Added 2021-11-16
|
||||||
bin_replace_string = throw "bin_replace_string has been removed: deleted by upstream"; # Added 2022-01-07
|
bin_replace_string = throw "bin_replace_string has been removed: deleted by upstream"; # Added 2022-01-07
|
||||||
bird2 = bird; # Added 2022-02-21
|
bird2 = bird; # Added 2022-02-21
|
||||||
|
@ -4411,28 +4411,8 @@ with pkgs;
|
|||||||
|
|
||||||
bee-clef = callPackage ../applications/networking/bee/bee-clef.nix { };
|
bee-clef = callPackage ../applications/networking/bee/bee-clef.nix { };
|
||||||
|
|
||||||
beets = callPackage ../tools/audio/beets {
|
beetsPackages = lib.recurseIntoAttrs (callPackage ../tools/audio/beets { });
|
||||||
pythonPackages = python3Packages;
|
inherit (beetsPackages) beets beets-unstable;
|
||||||
};
|
|
||||||
|
|
||||||
beetsExternalPlugins =
|
|
||||||
let
|
|
||||||
pluginArgs = {
|
|
||||||
# This is a stripped down beets for testing of the external plugins.
|
|
||||||
beets = (beets.override {
|
|
||||||
enableAlternatives = false;
|
|
||||||
enableCopyArtifacts = false;
|
|
||||||
enableExtraFiles = false;
|
|
||||||
}).overrideAttrs (lib.const {
|
|
||||||
doInstallCheck = false;
|
|
||||||
});
|
|
||||||
pythonPackages = python3Packages;
|
|
||||||
};
|
|
||||||
in lib.recurseIntoAttrs {
|
|
||||||
alternatives = callPackage ../tools/audio/beets/plugins/alternatives.nix pluginArgs;
|
|
||||||
copyartifacts = callPackage ../tools/audio/beets/plugins/copyartifacts.nix pluginArgs;
|
|
||||||
extrafiles = callPackage ../tools/audio/beets/plugins/extrafiles.nix pluginArgs;
|
|
||||||
};
|
|
||||||
|
|
||||||
bento4 = callPackage ../tools/video/bento4 { };
|
bento4 = callPackage ../tools/video/bento4 { };
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user