Skip to content
/ apy Public
forked from lervag/apy

CLI script for interacting with local Anki collection

License

Notifications You must be signed in to change notification settings

ckp95/apy

 
 

Repository files navigation

apy

Anki is a flash card program which makes remembering things easy. apy is a Python script for easily adding cards to Anki.

Important

  • apy is WORK IN PROGRESS, and there may still be some major changes.
  • The current version should be compatible with Anki versions 2.1.45 to 2.1.55 (see the changelog to find versions compatible with older versions of Anki).
  • This script and its author(s) are not affiliated/associated with the main Anki project in any way.
  • Use this software entirely at your own risk. Frequent backups are encouraged.

Table of Contents

Install instructions

To install apy, you can do something like this:

# Install apy from github
pip install --user git+https://github.com/lervag/apy.git#egg=apy

# One can also do
git clone https://github.com/lervag/apy.git
pip install -e .

Please also notice the following requirements specification!

Requirements

apy should work well for Python 3.9 and later.

apy uses the Anki Python packages, similar to how Anki addons do. We therefore need these available for apy to work! Some relevant references:

apy assumes that the Anki source is available at /usr/share/anki. If you put it somewhere else, then you may have to set the environment variable APY_ANKI_PATH, e.g. export APY_ANKI_PATH=/my/path/to/anki.

The following guides should help for some users on some specified systems.

Arch Linux

It should suffice to install Anki from AUR with e.g.

paru -S anki

Ubuntu

The following should work and will install the latest Anki version as well as apy itself at user level with pip.

sudo apt install git
sudo apt install python3-pip
sudo apt install python3-pyqt5.qtwebengine python3-pyqt5.qtmultimedia

pip install --user aqt
pip install --user git+https://github.com/lervag/apy.git#egg=apy

Other

In other environments, one must first ensure that Python is installed with the venv package and pip available. Also, the PyQt5 libraries are necessary and must be installed at the system level. These are named something like: python3-pyqt5.qtwebengine and python3-pyqt5.qtmultimedia. Then, one can install Anki and apy inside a virtual environment like this:

python3 -m venv .venv
source .venv/bin/activate

pip install --upgrade pip
pip install aqt==2.1.53
pip install git+https://github.com/lervag/apy.git#egg=apy

# Need to allow system site packages for the PyQt5 stuff
sed -i 's/false/true/' .venv/pyvenv.cfg

Usage

apy --help

Some examples:

# Add card with interactive editor session
apy add

# Add single card with specified preset (see configuration for more info on
# presets)
apy add-single -s preset "Question/Front" "Answer/Back"

# List leech cards (will show cid values for each card). Note that the query
# should be similar to a search query in the Anki browser.
apy list -v tag:leech

# Review and possibly edit file with given cid
apy review cid:12345678

apy can be combined with editor specific configuration and workflows to improve the process of adding and editing cards. For more information about this, see the Wiki.

Configuration

apy loads configuration from ~/.config/apy/apy.json. The following keys are currently recognized:

  • base: Specify where apy should look for your Anki database. This is usually something like /home/your_name/.local/share/Anki2/.
  • img_viewers: Specify a dictionary of image viewer commands. Each key is a file extension. The value is a command list, e.g. ['display', 'density', '300'] which specifies the command and its options to use for the corresponding key (file extension).
  • img_viewers_default: Specify the default command to show an image. Must be provided as a list of the command and desired options, such as ['feh', '-d'].
  • markdown_models: Specify a list of models for which apy will use a markdown converter.
  • pngCommands/svgCommands: Set LaTeX commands to generate PNG/SVG files. This is inspired by the Edit LaTeX build process addon to Anki.
  • presets: Specify preset combination of model and tags for use with apy add-single.
  • profile: Specify which profile to load by default.
  • query: Specify default query for apy list, apy review and apy tag.

An example configuration:

{
  "base": "/home/your_name/.local/share/Anki2/",
  "profile": "MyAnkiProfile",
  "query": "tag:leech",
  "presets": {
    "default": { "model": "Custom", "tags": ["marked"] }
  },
  "pngCommands": [
    ["latex", "-interaction=nonstopmode", "tmp.tex"],
    ["dvipng", "-D", "150", "-T", "tight", "-bg", "Transparent",
      "tmp.dvi", "-o", "tmp.png"]
  ],
  "svgCommands": [
    ["lualatex", "-interaction=nonstopmode", "tmp.tex"],
    ["pdfcrop", "tmp.pdf", "tmp.pdf"],
    ["pdf2svg", "tmp.pdf", "tmp.svg"]
  ]
}

Zsh completion

There is also a zsh completion file available. To use it, one may symlink or copy it to a location that is already in ones fpath variable, or one may add the apy/completion directory to the fpath list.

As an example, one may first symlink the _apy file:

mkdir -p ~/.local/zsh-functions
ln -s /path/to/apy/completion/_apy ~/.local/zsh-functions

Then add the following line to ones .zshrc file:

fpath=($HOME/.local/zsh-functions $fpath)

Changelog

This is just a simple changelog. See the commit history and issue threads for details. The main purpose of the changelog is to show which versions of apy are compatible with which versions of Anki.

Version Version note
HEAD Development branch (works with Anki 2.1.55)
0.9 Compatible with Anki 2.1.49
0.8 Compatible with Anki 2.1.35--2.1.44
0.7 Several improvements
0.6 Presets, choose profile, add-single
0.5 Minor improvements
0.4 Minor improvements
0.3 Compatible with Anki 2.1.26
0.2 Compatible with Anki 2.1.23
0.1 Compatible with Anki 2.1.13

Relevant resources

Here are a list of relevant resources for learning how to work with the Anki databases and code:

Alternatives

Here are some alternatives to apy from which I've drawn inspiration. I've also added a short note on why I did not just settle for the alternative.

Ankiconnect

Ankiconnect is an Anki plugin 2055492159) hosted on github.

Ankiconnect enables external applications to communicate with Anki over a network interface. The exposed API makes it possible to execute queries against the user’s card deck, automatically create new vocabulary and Kanji flash cards, and more.

A couple of relevant applications that use Ankiconnect:

  • Anki Quick Adder: A Chrome extension to add words to Anki desktop quickly.

  • Anki-editor is an emacs plugin for making Anki cards with Org.

  • anki-cli is a simple nodejs based command-line interface for Anki.

The Dealbreaker: I wanted a script that does not require Anki to be running.

Anki::Import - Anki note generation made easy

Anki::Import (see also here) allows one to "Efficiently generate Anki notes with your text editor for easy import into Anki". Quote:

Inputting notes into Anki can be a tedious chore. Anki::Import lets you you generate Anki notes with your favorite text editor (e.g. vim, BBEdit, Atom, etc.) so you can enter formatted notes into Anki's database more efficiently.

The Dealbreaker: This sounds very good, except there are too many steps. I didn't want to have to open Anki desktop. It should work flawlessly directly from the terminal.

AnkiVim

AnkiVim may be used to "Use vim to rapidly write textfiles immediately importable into anki(1)."

The Dealbreaker: Similar to Anki::Import: I didn't want to have to open Anki desktop. It should work flawlessly directly from the terminal.

Knowledge (Vim plugin)

Knowledge is a Vim plugin for generating flash cards to either Anki or Mnemosyne.

The Dealbreaker: It has a single, open issue, which seems to indicate that the application does not work very well and/or is not well maintained.

Ankisync

Ankisync seems somewhat promising, in that it exposes an API for working with Anki collections from Python. It is a successor to AnkiTools, which is stated to be "an Anki *.apkg and collection.anki2 reader and editor".

The Dealbreaker: It does not include any features to add or edit notes (as far as I could tell).

Genanki

Genanki is a library for generating Anki decks.

The Dealbreaker: It is quite close to being something I wanted, except that it needs to run as a plugin to Anki desktop to generate notes to a local collection. It does not seem to allow editing/adding to a local collection outside of Anki desktop.

inka

inka is a CLI utility for adding flashcards from Markdown files to Anki.

The Dealbreaker: This did not exist when apy was created. It seems to be close to what I would personally be interested in, but today I find apy solves all (or most) of my requirements. Also, inka requires the AnkiConnect plugin.

Obsidian_to_Anki

Obsidian_to_Anki is a plugin to add flashcards from a text or markdown file to Anki. It can also be run from the command-line as a python script. Built with Obsidian markdown syntax in mind.

The Dealbreaker: Requires AnkiConnect.

Contributing

The following is a short and simple guide to getting started with contributing and developing the apy code.

Setup

First, fork the repository. Then clone your fork and install the package dependencies. The following listing should give an indication of how to get started.

# Clone the forked repo
git clone [email protected]:<username>/apy.git
cd apy/

# Create a virtualenv
mkvirtualenv anki -p python3.8

# The following is convenient if you use a virtualenv loader like
# zsh-autoswitch-virtualenv
echo "anki" > .venv

# Activate the virtualenv, then:
./setup.py install
pip install -r requirements-dev.txt

Tests

To run the tests, do this:

pytest

About

CLI script for interacting with local Anki collection

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Python 99.5%
  • Dockerfile 0.5%