use xvfb-run to create headless anki if no running instance is available

This commit is contained in:
andromeda
2026-04-18 10:08:48 +02:00
parent da93183389
commit 219930f3c6
2 changed files with 35 additions and 3 deletions

View File

@@ -20,7 +20,7 @@
toolchain = fenix.packages.x86_64-linux.minimal.toolchain; toolchain = fenix.packages.x86_64-linux.minimal.toolchain;
in { in {
devShells.x86_64-linux.default = pkgs.mkShell { devShells.x86_64-linux.default = pkgs.mkShell {
buildInputs = [toolchain]; buildInputs = [toolchain pkgs.xvfb-run];
shellHook = '' shellHook = ''
export RUSTUP_TOOLCHAIN=${toolchain} export RUSTUP_TOOLCHAIN=${toolchain}
''; '';
@@ -30,7 +30,12 @@
cargo = toolchain; cargo = toolchain;
rustc = toolchain; rustc = toolchain;
}).buildPackage { }).buildPackage {
nativeBuildInputs = [pkgs.makeWrapper];
src = ./.; src = ./.;
postInstall = ''
wrapProgram $out/bin/anki-cli \
--prefix PATH : ${pkgs.xvfb-run}/bin
'';
}; };
}; };
} }

View File

@@ -7,7 +7,12 @@ use crossterm::{
terminal::*, terminal::*,
}; };
use nanohtml2text::html2text; use nanohtml2text::html2text;
use std::io::stdout; use std::{
io::stdout,
process::{Command, Stdio},
thread,
time::Duration,
};
const GOOD: char = '3'; const GOOD: char = '3';
const AGAIN: char = '1'; const AGAIN: char = '1';
@@ -22,7 +27,29 @@ fn main() {
fn init(anki: &AnkiClient) { fn init(anki: &AnkiClient) {
clear_screen(); clear_screen();
let decks = anki.request(DeckNamesRequest {}).unwrap(); let mut decks = anki.request(DeckNamesRequest {});
if let Err(_) = decks {
clear_screen();
display_text("initializing headless anki...");
Command::new("bash")
.arg("-c")
.arg("QT_QPA_PLATFORM=xcb xvfb-run -a anki")
.stdin(Stdio::null())
.stdout(Stdio::null())
.stderr(Stdio::null())
.spawn()
.unwrap();
loop {
thread::sleep(Duration::from_secs(1));
display_text(".");
decks = anki.request(DeckNamesRequest {});
if let Ok(_) = decks {
clear_screen();
break;
}
}
}
let decks = decks.unwrap();
for (index, title) in decks.clone().into_iter().enumerate() { for (index, title) in decks.clone().into_iter().enumerate() {
// 0th index is Default, which is not predictable // 0th index is Default, which is not predictable
if index > 0 { if index > 0 {