diff --git a/flake.nix b/flake.nix index 8106847..346c559 100644 --- a/flake.nix +++ b/flake.nix @@ -20,7 +20,7 @@ toolchain = fenix.packages.x86_64-linux.minimal.toolchain; in { devShells.x86_64-linux.default = pkgs.mkShell { - buildInputs = [toolchain]; + buildInputs = [toolchain pkgs.xvfb-run]; shellHook = '' export RUSTUP_TOOLCHAIN=${toolchain} ''; @@ -30,7 +30,12 @@ cargo = toolchain; rustc = toolchain; }).buildPackage { + nativeBuildInputs = [pkgs.makeWrapper]; src = ./.; + postInstall = '' + wrapProgram $out/bin/anki-cli \ + --prefix PATH : ${pkgs.xvfb-run}/bin + ''; }; }; } diff --git a/src/main.rs b/src/main.rs index 5eb84b4..15e12dc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,7 +7,12 @@ use crossterm::{ terminal::*, }; use nanohtml2text::html2text; -use std::io::stdout; +use std::{ + io::stdout, + process::{Command, Stdio}, + thread, + time::Duration, +}; const GOOD: char = '3'; const AGAIN: char = '1'; @@ -22,7 +27,29 @@ fn main() { fn init(anki: &AnkiClient) { 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() { // 0th index is Default, which is not predictable if index > 0 {