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,23 @@
{
lib,
anki-utils,
fetchFromGitHub,
nix-update-script,
}:
anki-utils.buildAnkiAddon (finalAttrs: {
pname = "adjust-sound-volume";
version = "0.0.6";
src = fetchFromGitHub {
owner = "mnogu";
repo = "adjust-sound-volume";
rev = "v${finalAttrs.version}";
hash = "sha256-6reIUz+tHKd4KQpuofLa/tIL5lCloj3yODZ8Cz29jFU=";
};
passthru.updateScript = nix-update-script { };
meta = {
description = "Add a new menu item for adjusting the sound volume";
homepage = "https://github.com/mnogu/adjust-sound-volume";
license = lib.licenses.agpl3Plus;
maintainers = with lib.maintainers; [ junestepp ];
};
})

View File

@@ -0,0 +1,27 @@
{
lib,
anki-utils,
fetchFromSourcehut,
nix-update-script,
}:
anki-utils.buildAnkiAddon (finalAttrs: {
pname = "anki-connect";
version = "24.7.25.0";
src = fetchFromSourcehut {
owner = "~foosoft";
repo = "anki-connect";
rev = finalAttrs.version;
hash = "sha256-N98EoCE/Bx+9QUQVeU64FXHXSek7ASBVv1b9ltJ4G1U=";
};
sourceRoot = "${finalAttrs.src.name}/plugin";
passthru.updateScript = nix-update-script { };
meta = {
description = ''
Enable external applications such as Yomichan to communicate
with Anki over a simple HTTP API
'';
homepage = "https://foosoft.net/projects/anki-connect/";
license = lib.licenses.gpl3Plus;
maintainers = with lib.maintainers; [ junestepp ];
};
})

View File

@@ -0,0 +1,27 @@
{
lib,
anki-utils,
fetchFromGitHub,
nix-update-script,
}:
anki-utils.buildAnkiAddon (finalAttrs: {
pname = "anki-quizlet-importer-extended";
version = "2025.03.13";
src = fetchFromGitHub {
owner = "sviatoslav-lebediev";
repo = "anki-quizlet-importer-extended";
tag = "v${finalAttrs.version}";
hash = "sha256-46j/CXhsrehu00P5QLuOj/08gNlFeJttslAFLgz7AJ8=";
};
passthru.updateScript = nix-update-script { };
meta = {
description = "Import Quizlet Decks into Anki";
homepage = "https://ankiweb.net/shared/info/1362209126";
downloadPage = "https://github.com/sviatoslav-lebediev/anki-quizlet-importer-extended";
changelog = "https://github.com/sviatoslav-lebediev/anki-quizlet-importer-extended/releases/tag/v${finalAttrs.version}";
# No license file, but it can be assumed to be AGPL3 based on
# https://ankiweb.net/account/terms.
license = lib.licenses.agpl3Only;
maintainers = with lib.maintainers; [ ethancedwards8 ];
};
})

View File

@@ -0,0 +1,127 @@
{
lib,
stdenv,
symlinkJoin,
lndir,
formats,
runCommand,
}:
{
buildAnkiAddon = lib.extendMkDerivation {
constructDrv = stdenv.mkDerivation;
extendDrvArgs =
finalAttrs:
{
pname,
version,
src,
sourceRoot ? "",
configurePhase ? ''
runHook preConfigure
runHook postConfigure
'',
buildPhase ? ''
runHook preBuild
runHook postBuild
'',
dontPatchELF ? true,
dontStrip ? true,
nativeBuildInputs ? [ ],
passthru ? { },
meta ? { },
# Script run after "user_files" folder is populated.
# Used when an add-on needs to process and change "user_files" based
# on what the user added to it.
processUserFiles ? "",
...
}:
{
inherit
version
src
sourceRoot
configurePhase
buildPhase
dontPatchELF
dontStrip
nativeBuildInputs
;
pname = "anki-addon-${pname}";
installPrefix = "share/anki/addons/${pname}";
installPhase = ''
runHook preInstall
mkdir -p "$out/$installPrefix/user_files"
find . -mindepth 1 -maxdepth 1 | xargs -d'\n' mv -t "$out/$installPrefix/"
runHook postInstall
'';
passthru = {
withConfig =
{
# JSON add-on config. The available options for an add-on are in its
# config.json file.
# See https://addon-docs.ankiweb.net/addon-config.html#config-json
config ? { },
# Path to a folder to be merged with the add-on "user_files" folder.
# See https://addon-docs.ankiweb.net/addon-config.html#user-files.
userFiles ? null,
}:
let
metaConfigFormat = formats.json { };
addonMetaConfig = metaConfigFormat.generate "meta.json" { inherit config; };
in
symlinkJoin {
pname = "${finalAttrs.pname}-with-config";
inherit (finalAttrs) version meta;
paths = [
finalAttrs.finalPackage
];
postBuild = ''
cd $out/${finalAttrs.installPrefix}
rm -f meta.json
ln -s ${addonMetaConfig} meta.json
${
if (userFiles != null) then
''
${lndir}/bin/lndir -silent "${userFiles}" user_files
''
else
""
}
${processUserFiles}
'';
};
}
// passthru;
meta = {
platforms = lib.platforms.all;
}
// meta;
};
};
buildAnkiAddonsDir =
addonPackages:
let
addonDirs = map (pkg: "${pkg}/share/anki/addons") addonPackages;
addons = lib.concatMapStringsSep " " (p: "${p}/*") addonDirs;
in
runCommand "anki-addons" { } ''
mkdir $out
[[ '${addons}' ]] || exit 0
for addon in ${addons}; do
ln -s "$addon" $out/
done
'';
}

View File

@@ -0,0 +1,24 @@
{
callPackage,
}:
{
adjust-sound-volume = callPackage ./adjust-sound-volume { };
anki-connect = callPackage ./anki-connect { };
anki-quizlet-importer-extended = callPackage ./anki-quizlet-importer-extended { };
local-audio-yomichan = callPackage ./local-audio-yomichan { };
passfail2 = callPackage ./passfail2 { };
puppy-reinforcement = callPackage ./puppy-reinforcement { };
recolor = callPackage ./recolor { };
reviewer-refocus-card = callPackage ./reviewer-refocus-card { };
review-heatmap = callPackage ./review-heatmap { };
yomichan-forvo-server = callPackage ./yomichan-forvo-server { };
}

View File

@@ -0,0 +1,73 @@
{
lib,
anki-utils,
fetchFromGitHub,
python3,
nix-update-script,
}:
anki-utils.buildAnkiAddon (finalAttrs: {
pname = "local-audio-yomichan";
version = "0-unstable-2025-04-26";
src = fetchFromGitHub {
owner = "yomidevs";
repo = "local-audio-yomichan";
rev = "34750f1d8ca1cb473128fea7976a4d981e5e78a4";
sparseCheckout = [ "plugin" ];
hash = "sha256-2gyggcvxParay+1B7Sg2COKyocoxaRO1WTz+ymdRp4w=";
};
sourceRoot = "${finalAttrs.src.name}/plugin";
processUserFiles = ''
# Addon will try to load extra stuff unless Python package name is "plugin".
temp=$(mktemp -d)
ln -s $PWD $temp/plugin
# Addoon expects `user_files` dir at `$XDG_DATA_HOME/local-audio-yomichan`
ln -s $PWD/user_files $temp/local-audio-yomichan
PYTHONPATH=$temp \
WO_ANKI=1 \
XDG_DATA_HOME=$temp \
${lib.getExe python3} -c \
"from plugin import db_utils; \
db_utils.init_db()"
'';
passthru.updateScript = nix-update-script {
extraArgs = [ "--version=branch" ];
};
meta = {
description = "Run a local audio server for Yomitan";
longDescription = ''
This add-on must be configured with an audio collection.
Example:
```nix
pkgs.ankiAddons.local-audio-yomichan.withConfig {
userFiles =
let
audio-collection =
pkgs.runCommand "local-yomichan-audio-collection"
{
outputHashMode = "recursive";
outputHash = "sha256-NxbcXh2SDPfCd+ZHAWT5JdxRecNbT4Xpo0pxX5/DOfo=";
src = pkgs.requireFile {
name = "local-yomichan-audio-collection-2023-06-11-opus.tar.xz";
url = "https://github.com/yomidevs/local-audio-yomichan?tab=readme-ov-file#steps";
sha256 = "1xsxp8iggklv77rj972mqaa1i8f9hvr3ir0r2mwfqcdz4q120hr1";
};
}
'''
mkdir -p $out
cd $out
tar -xf "$src"
''';
in
"''${audio-collection}/user_files";
}
```
'';
homepage = "https://github.com/yomidevs/local-audio-yomichan";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ junestepp ];
};
})

View File

@@ -0,0 +1,34 @@
{
lib,
anki-utils,
fetchFromGitHub,
nix-update-script,
}:
anki-utils.buildAnkiAddon (finalAttrs: {
pname = "passfail2";
version = "0.3.0-unstable-2024-10-17";
src = fetchFromGitHub {
owner = "lambdadog";
repo = "passfail2";
rev = "d5313e4f1217e968b36edbc0a4fe92386209ffe6";
hash = "sha256-HMe6/fHpYj/MN0dUFj3W71vK7qqcp9l1xm8SAiKkJLs=";
};
buildPhase = ''
runHook preBuild
substitute build_info.py.in build_info.py \
--replace-fail '$version' '"${finalAttrs.version}"'
runHook postBuild
'';
passthru.updateScript = nix-update-script { };
meta = {
description = ''
Replaces the default Anki review buttons with only two options:
Fail and Pass
'';
homepage = "https://github.com/lambdadog/passfail2";
license = lib.licenses.gpl3Plus;
maintainers = with lib.maintainers; [ junestepp ];
};
})

View File

@@ -0,0 +1,39 @@
{
lib,
anki-utils,
fetchFromGitHub,
nix-update-script,
}:
anki-utils.buildAnkiAddon (finalAttrs: {
pname = "puppy-reinforcement";
version = "1.1.1";
src = fetchFromGitHub {
owner = "glutanimate";
repo = "puppy-reinforcement";
tag = "v${finalAttrs.version}";
hash = "sha256-y52AjmYrFTcTwd4QAcJzK5R9wwxUSlvnN3C2O/r5cHk=";
};
sourceRoot = "${finalAttrs.src.name}/src/puppy_reinforcement";
passthru.updateScript = nix-update-script { };
meta = {
description = "Encourage learners with pictures of cute puppies";
longDescription = ''
The options to configure this add-on can be found [here](https://github.com/glutanimate/puppy-reinforcement/blob/v${finalAttrs.version}/src/puppy_reinforcement/config.md).
Extra images can also be added with `userFiles`.
Example:
```nix
pkgs.ankiAddons.puppy-reinforcement.withConfig {
config = {
encourage_every = 5;
};
userFiles = ./my-folder-of-the-most-cute-dogos;
}
```
'';
homepage = "https://ankiweb.net/shared/info/1722658993";
license = lib.licenses.agpl3Plus;
maintainers = with lib.maintainers; [ lomenzel ];
};
})

View File

@@ -0,0 +1,27 @@
{
lib,
anki-utils,
fetchFromGitHub,
nix-update-script,
}:
anki-utils.buildAnkiAddon (finalAttrs: {
pname = "recolor";
version = "3.1";
src = fetchFromGitHub {
owner = "AnKing-VIP";
repo = "AnkiRecolor";
rev = finalAttrs.version;
sparseCheckout = [ "src/addon" ];
hash = "sha256-28DJq2l9DP8O6OsbNQCZ0pm4S6CQ3Yz0Vfvlj+iQw8Y=";
};
sourceRoot = "${finalAttrs.src.name}/src/addon";
passthru.updateScript = nix-update-script { };
meta = {
description = "ReColor your Anki desktop to whatever aesthetic you like";
homepage = "https://github.com/AnKing-VIP/AnkiRecolor";
# No license file, but it can be assumed to be AGPL3 based on
# https://ankiweb.net/account/terms.
license = lib.licenses.agpl3Only;
maintainers = with lib.maintainers; [ junestepp ];
};
})

View File

@@ -0,0 +1,26 @@
---
src/web/main.ts | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/src/web/main.ts b/src/web/main.ts
index 389c7fc..0b7c702 100644
--- a/src/web/main.ts
+++ b/src/web/main.ts
@@ -29,8 +29,12 @@ listed here: <https://glutanimate.com/contact/>.
Any modifications to this file must keep this entire header intact.
*/
-import "./_vendor/cal-heatmap.css";
-import "./css/review-heatmap.css";
+import calHeatmapCss from "./_vendor/cal-heatmap.css";
+import reviewHeatmapCss from "./css/review-heatmap.css";
+
+var __vite_style__ = document.createElement('style');
+__vite_style__.textContent = calHeatmapCss + "\n" + reviewHeatmapCss;
+document.head.appendChild(__vite_style__);
import { CalHeatMap } from "./_vendor/cal-heatmap.js";
import { ReviewHeatmapOptions, ReviewHeatmapData } from "./types";
--
2.49.0

View File

@@ -0,0 +1,60 @@
{
lib,
anki-utils,
fetchFromGitHub,
esbuild,
aab,
}:
anki-utils.buildAnkiAddon (finalAttrs: {
pname = "review-heatmap";
version = "1.0.1";
src = fetchFromGitHub {
owner = "glutanimate";
repo = "review-heatmap";
tag = "v${finalAttrs.version}";
hash = "sha256-CL98DYikumoPR/QTWcMMwpd/tEpKLIDVC1Rj5NEvWJ8=";
# Needed files are set to export-ignore in .gitattributes
forceFetchGit = true;
};
patches = [ ./0001-Apply-vite-style-to-anki-review-heatmap.js.patch ];
nativeBuildInputs = [
aab
esbuild
];
buildPhase = ''
runHook preBuild
# Work around missing icons
mkdir resources/icons/optional
touch resources/icons/optional/{patreon.svg,thanks.svg,twitter.svg,youtube.svg}
mkdir -p build/dist
cp -r src resources designer --target-directory build/dist
aab build_dist ${finalAttrs.version} --modtime -1
# build anki-review-heatmap.js
esbuild \
src/web/main.ts \
--bundle \
--minify \
--target=es2015 \
--loader:.css=text \
--outfile=build/dist/src/review_heatmap/web/anki-review-heatmap.js
cd build/dist/src/review_heatmap
runHook postBuild
'';
meta = {
description = "Anki add-on to help you keep track of your review activity";
homepage = "https://github.com/glutanimate/review-heatmap";
changelog = "https://github.com/glutanimate/review-heatmap/blob/v${finalAttrs.version}/CHANGELOG.md";
license = lib.licenses.agpl3Only;
maintainers = with lib.maintainers; [ eljamm ];
};
})

View File

@@ -0,0 +1,30 @@
{
lib,
anki-utils,
fetchFromGitHub,
nix-update-script,
}:
anki-utils.buildAnkiAddon (finalAttrs: {
pname = "reviewer-refocus-card";
version = "0-unstable-2022-12-24";
src = fetchFromGitHub {
owner = "glutanimate";
repo = "anki-addons-misc";
rev = "7b981836e0a6637a1853f3e8d73d022ab95fed31";
sparseCheckout = [ "src/reviewer_refocus_card" ];
hash = "sha256-181hyc4ED+0lBzn1FnrBvNIYIUQF8xEDB3uHK6SkpHw=";
};
sourceRoot = "${finalAttrs.src.name}/src/reviewer_refocus_card";
passthru.updateScript = nix-update-script {
extraArgs = [ "--version=branch" ];
};
meta = {
description = ''
Set focus to the card area, allowing you to scroll through your cards using
Page Up / Page Down, etc
'';
homepage = "https://github.com/glutanimate/anki-addons-misc";
license = lib.licenses.agpl3Only;
maintainers = with lib.maintainers; [ junestepp ];
};
})

View File

@@ -0,0 +1,25 @@
{
lib,
anki-utils,
fetchFromGitHub,
nix-update-script,
}:
anki-utils.buildAnkiAddon {
pname = "yomichan-forvo-server";
version = "0-unstable-2024-10-21";
src = fetchFromGitHub {
owner = "jamesnicolas";
repo = "yomichan-forvo-server";
rev = "364fc6d5d10969f516e0fa283460dfaf08c98e15";
hash = "sha256-Jpee9hkXCiBmSW7hzJ1rAg45XVIiLC8WENc09+ySFVI=";
};
passthru.updateScript = nix-update-script {
extraArgs = [ "--version=branch" ];
};
meta = {
description = "Audio server for yomichan that scrapes forvo for audio files";
homepage = "https://github.com/jamesnicolas/yomichan-forvo-server";
license = lib.licenses.unlicense;
maintainers = with lib.maintainers; [ junestepp ];
};
}