anki-share

Web pro sdílení balíčků Anki
Python
Flask
SQLite
Celery
HTML
CSS
JavaScript

O projektu

anki-share vznikl z frustrace. Jako student gymnázia si často vytvářím malé balíčky v Anki, které se naučím za den nebo dva. Nemohl jsem je ale sdílet s kamarády, kteří Anki nepoužívají – museli by si ho nainstalovat a uživatelé iOS by si aplikaci museli nejdřív koupit. Většinou jsem tak nakonec kartičky ručně přepisoval třeba do Quizletu.

Cílem projektu je nabídnout velmi jednoduchý způsob, jak sdílet malé balíčky Anki. Stačí nahrát balíček kartiček a komukoli poslat odkaz. Ten si pak může balíček prohlédnout a učit se z něj na jakémkoli zařízení, aniž by musel cokoli instalovat nebo si zakládat účet.

Ukázkový nahraný balíček si můžete prohlédnout zde. Více o projektu se dozvíte na webu a v souboru readme na GitHubu.

Hlavní funkce

Plány do budoucna

Na anki-share plánuji dál pracovat. Chci přidat více sociálních funkcí pro veřejné sdílení balíčků (přihlašování, lajky, ...). Také se chci zaměřit na podporu dalších funkcí Anki (plánované opakování kartiček, kartičky s více než dvěma poli, ...).

Technické detaily

V této části chci poskytnout pár informací o tom, jak zpracovávat balíčky Anki ve formátu .apkg v Pythonu. Informací na toto téma jsem našel málo a často byly nepřesné nebo zastaralé.

Verze formátu .apkg

Pokud vím, existují soubory .apkg ve dvou různých verzích. Všechny jsou to zip archivy obsahující sqlite databázi a soubory médií.

Starší verze

Starší verze Anki používají jednoduchý přístup popsaný výše. Obsahují sqlite databázi (buď collection.anki2, nebo collection.anki21, podle verze) a soubor media. Ten je ve formátu json a mapuje původní názvy souborů mediálních příloh na jejich nové názvy. Nové názvy jsou jen čísla začínající od 0.

Novější verze

V novějších verzích Anki je všechno mnohem složitější. Soubory jsou komprimované a některé z nich jsou serializované pomocí protocol buffers.

Kartičky jsou nově uložené v souboru collection.anki21b. Je to sqlite databáze se stejnou strukturou jako collection.anki21 ve starších verzích, ale je komprimovaná pomocí zstd. Dekomprimovat ji lze například knihovnou pyzstd a pak číst stejně jako collection.anki21.

Soubor media v novějších verzích není json, ale je serializovaný pomocí protocol buffers. Deserializovat ho není úplně snadné. Nejdřív je potřeba získat soubory .proto z GitHubu Anki. Spousta článků tvrdí, že stačí jen soubor import_export.proto, ve skutečnosti ale potřebujete všechny. Z nich pak pomocí protoc vygenerujete soubory pro svůj programovací jazyk (v mém případě Python). Ty pak konečně můžete importovat do svého projektu a použít je ke čtení obsahu souboru media.

Samotné soubory médií (v souboru apkg pojmenované 0, 1, 2 atd.) jsou komprimované pomocí zstd a dají se dekomprimovat stejně jako collection.anki21b.