anki/proto/backend.proto
Damien Elmes 238441f2d9 use the backend for the deck due tree
- approx 3x faster on a large test deck
- counts are no longer capped to 1000 in the tree
2020-05-12 21:13:33 +10:00

715 lines
16 KiB
Protocol Buffer

syntax = "proto3";
import "fluent.proto";
package backend_proto;
message Empty {}
message OptionalInt32 {
sint32 val = 1;
}
message OptionalUInt32 {
uint32 val = 1;
}
message BackendInit {
repeated string preferred_langs = 1;
string locale_folder_path = 2;
bool server = 3;
}
message I18nBackendInit {
repeated string preferred_langs = 4;
string locale_folder_path = 5;
}
// 1-15 reserved for future use
message BackendInput {
oneof value {
SchedTimingTodayIn sched_timing_today = 17;
DeckTreeIn deck_tree = 18;
SearchCardsIn search_cards = 19;
SearchNotesIn search_notes = 20;
RenderCardIn render_card = 21;
int64 local_minutes_west = 22;
string strip_av_tags = 23;
ExtractAVTagsIn extract_av_tags = 24;
ExtractLatexIn extract_latex = 25;
AddMediaFileIn add_media_file = 26;
SyncMediaIn sync_media = 27;
Empty check_media = 28;
TrashMediaFilesIn trash_media_files = 29;
TranslateStringIn translate_string = 30;
FormatTimeSpanIn format_time_span = 31;
StudiedTodayIn studied_today = 32;
CongratsLearnMsgIn congrats_learn_msg = 33;
Empty empty_trash = 34;
Empty restore_trash = 35;
OpenCollectionIn open_collection = 36;
CloseCollectionIn close_collection = 37;
int64 get_card = 38;
Card update_card = 39;
Card add_card = 40;
int64 get_deck_config = 41;
AddOrUpdateDeckConfigIn add_or_update_deck_config = 42;
Empty all_deck_config = 43;
Empty new_deck_config = 44;
int64 remove_deck_config = 45;
Empty abort_media_sync = 46;
Empty before_upload = 47;
RegisterTagsIn register_tags = 48;
string canonify_tags = 49;
Empty all_tags = 50;
int32 get_changed_tags = 51;
string get_config_json = 52;
SetConfigJson set_config_json = 53;
bytes set_all_config = 54;
Empty get_all_config = 55;
int32 get_changed_notetypes = 56;
AddOrUpdateNotetypeIn add_or_update_notetype = 57;
Empty get_all_decks = 58;
Empty check_database = 59;
Empty all_stock_notetypes = 60;
int64 get_notetype_legacy = 61;
Empty get_notetype_names = 62;
Empty get_notetype_names_and_counts = 63;
string get_notetype_id_by_name = 64;
int64 remove_notetype = 65;
int64 new_note = 66;
AddNoteIn add_note = 67;
Note update_note = 68;
int64 get_note = 69;
Empty get_empty_cards = 70;
int64 get_deck_legacy = 71;
string get_deck_id_by_name = 72;
Empty get_deck_names = 73;
AddOrUpdateDeckLegacyIn add_or_update_deck_legacy = 74;
bool new_deck_legacy = 75;
int64 remove_deck = 76;
Empty deck_tree_legacy = 77;
}
}
message BackendOutput {
oneof value {
// infallible commands
SchedTimingTodayOut sched_timing_today = 17;
sint32 local_minutes_west = 22;
string strip_av_tags = 23;
ExtractAVTagsOut extract_av_tags = 24;
ExtractLatexOut extract_latex = 25;
string translate_string = 30;
string format_time_span = 31;
string studied_today = 32;
string congrats_learn_msg = 33;
Empty abort_media_sync = 46;
AllStockNotetypesOut all_stock_notetypes = 60;
// fallible commands
DeckTreeNode deck_tree = 18;
SearchCardsOut search_cards = 19;
SearchNotesOut search_notes = 20;
RenderCardOut render_card = 21;
string add_media_file = 26;
Empty sync_media = 27;
MediaCheckOut check_media = 28;
Empty trash_media_files = 29;
Empty empty_trash = 34;
Empty restore_trash = 35;
Empty open_collection = 36;
Empty close_collection = 37;
GetCardOut get_card = 38;
Empty update_card = 39;
int64 add_card = 40;
bytes get_deck_config = 41;
int64 add_or_update_deck_config = 42;
bytes all_deck_config = 43;
bytes new_deck_config = 44;
Empty remove_deck_config = 45;
Empty before_upload = 47;
bool register_tags = 48;
CanonifyTagsOut canonify_tags = 49;
AllTagsOut all_tags = 50;
GetChangedTagsOut get_changed_tags = 51;
bytes get_config_json = 52;
Empty set_config_json = 53;
Empty set_all_config = 54;
bytes get_all_config = 55;
bytes get_changed_notetypes = 56;
int64 add_or_update_notetype = 57;
bytes get_all_decks = 58;
Empty check_database = 59;
bytes get_notetype_legacy = 61;
NoteTypeNames get_notetype_names = 62;
NoteTypeUseCounts get_notetype_names_and_counts = 63;
int64 get_notetype_id_by_name = 64;
Empty remove_notetype = 65;
Note new_note = 66;
int64 add_note = 67;
Empty update_note = 68;
Note get_note = 69;
EmptyCardsReport get_empty_cards = 70;
bytes get_deck_legacy = 71;
int64 get_deck_id_by_name = 72;
DeckNames get_deck_names = 73;
int64 add_or_update_deck_legacy = 74;
bytes new_deck_legacy = 75;
Empty remove_deck = 76;
bytes deck_tree_legacy = 77;
BackendError error = 2047;
}
}
message BackendError {
// localized error description suitable for displaying to the user
string localized = 1;
// error specifics
oneof value {
Empty invalid_input = 2;
Empty template_parse = 3;
Empty io_error = 4;
Empty db_error = 5;
NetworkError network_error = 6;
SyncError sync_error = 7;
// user interrupted operation
Empty interrupted = 8;
string json_error = 9;
string proto_error = 10;
Empty not_found_error = 11;
Empty exists = 12;
Empty deck_is_filtered = 13;
}
}
message Progress {
oneof value {
MediaSyncProgress media_sync = 1;
string media_check = 2;
}
}
message NetworkError {
enum NetworkErrorKind {
OTHER = 0;
OFFLINE = 1;
TIMEOUT = 2;
PROXY_AUTH = 3;
}
NetworkErrorKind kind = 1;
}
message SyncError {
enum SyncErrorKind {
OTHER = 0;
CONFLICT = 1;
SERVER_ERROR = 2;
CLIENT_TOO_OLD = 3;
AUTH_FAILED = 4;
SERVER_MESSAGE = 5;
MEDIA_CHECK_REQUIRED = 6;
RESYNC_REQUIRED = 7;
}
SyncErrorKind kind = 1;
}
message MediaSyncProgress {
string checked = 1;
string added = 2;
string removed = 3;
}
message MediaSyncUploadProgress {
uint32 files = 1;
uint32 deletions = 2;
}
message SchedTimingTodayIn {
int64 created_secs = 1;
int64 now_secs = 2;
OptionalInt32 created_mins_west = 3;
OptionalInt32 now_mins_west = 4;
OptionalInt32 rollover_hour = 5;
}
message SchedTimingTodayOut {
uint32 days_elapsed = 1;
int64 next_day_at = 2;
}
message DeckTreeIn {
bool include_counts = 1;
}
message DeckTreeNode {
int64 deck_id = 1;
string name = 2;
repeated DeckTreeNode children = 3;
uint32 level = 4;
bool collapsed = 5;
uint32 review_count = 6;
uint32 learn_count = 7;
uint32 new_count = 8;
}
message RenderCardIn {
string question_template = 1;
string answer_template = 2;
map<string,string> fields = 3;
int32 card_ordinal = 4;
}
message RenderCardOut {
repeated RenderedTemplateNode question_nodes = 1;
repeated RenderedTemplateNode answer_nodes = 2;
}
message RenderedTemplateNode {
oneof value {
string text = 1;
RenderedTemplateReplacement replacement = 2;
}
}
message RenderedTemplateReplacement {
string field_name = 1;
string current_text = 2;
repeated string filters = 3;
}
message ExtractAVTagsIn {
string text = 1;
bool question_side = 2;
}
message ExtractAVTagsOut {
string text = 1;
repeated AVTag av_tags = 2;
}
message AVTag {
oneof value {
string sound_or_video = 1;
TTSTag tts = 2;
}
}
message TTSTag {
string field_text = 1;
string lang = 2;
repeated string voices = 3;
float speed = 4;
repeated string other_args = 5;
}
message ExtractLatexIn {
string text = 1;
bool svg = 2;
bool expand_clozes = 3;
}
message ExtractLatexOut {
string text = 1;
repeated ExtractedLatex latex = 2;
}
message ExtractedLatex {
string filename = 1;
string latex_body = 2;
}
message AddMediaFileIn {
string desired_name = 1;
bytes data = 2;
}
message SyncMediaIn {
string hkey = 1;
string endpoint = 2;
}
message MediaCheckOut {
repeated string unused = 1;
repeated string missing = 2;
string report = 3;
bool have_trash = 4;
}
message TrashMediaFilesIn {
repeated string fnames = 1;
}
message TranslateStringIn {
FluentString key = 2;
map<string,TranslateArgValue> args = 3;
}
message TranslateArgValue {
oneof value {
string str = 1;
double number = 2;
}
}
message FormatTimeSpanIn {
enum Context {
PRECISE = 0;
ANSWER_BUTTONS = 1;
INTERVALS = 2;
}
float seconds = 1;
Context context = 2;
}
message StudiedTodayIn {
uint32 cards = 1;
double seconds = 2;
}
message CongratsLearnMsgIn {
float next_due = 1;
uint32 remaining = 2;
}
message OpenCollectionIn {
string collection_path = 1;
string media_folder_path = 2;
string media_db_path = 3;
string log_path = 4;
}
message SearchCardsIn {
string search = 1;
SortOrder order = 2;
}
message SearchCardsOut {
repeated int64 card_ids = 1;
}
message SortOrder {
oneof value {
Empty from_config = 1;
Empty none = 2;
string custom = 3;
BuiltinSearchOrder builtin = 4;
}
}
message SearchNotesIn {
string search = 1;
}
message SearchNotesOut {
repeated int64 note_ids = 2;
}
message BuiltinSearchOrder {
enum BuiltinSortKind {
NOTE_CREATION = 0;
NOTE_MOD = 1;
NOTE_FIELD = 2;
NOTE_TAGS = 3;
NOTE_TYPE = 4;
CARD_MOD = 5;
CARD_REPS = 6;
CARD_DUE = 7;
CARD_EASE = 8;
CARD_LAPSES = 9;
CARD_INTERVAL = 10;
CARD_DECK = 11;
CARD_TEMPLATE = 12;
}
BuiltinSortKind kind = 1;
bool reverse = 2;
}
message GetCardOut {
Card card = 1;
}
message Card {
int64 id = 1;
int64 nid = 2;
int64 did = 3;
uint32 ord = 4;
int64 mtime = 5;
sint32 usn = 6;
uint32 ctype = 7;
sint32 queue = 8;
sint32 due = 9;
uint32 ivl = 10;
uint32 factor = 11;
uint32 reps = 12;
uint32 lapses = 13;
uint32 left = 14;
sint32 odue = 15;
int64 odid = 16;
uint32 flags = 17;
string data = 18;
}
message CloseCollectionIn {
bool downgrade_to_schema11 = 1;
}
message AddOrUpdateDeckConfigIn {
bytes config = 1;
bool preserve_usn_and_mtime = 2;
}
message RegisterTagsIn {
string tags = 1;
bool preserve_usn = 2;
int32 usn = 3;
bool clear_first = 4;
}
message AllTagsOut {
repeated TagUsnTuple tags = 1;
}
message TagUsnTuple {
string tag = 1;
sint32 usn = 2;
}
message GetChangedTagsOut {
repeated string tags = 1;
}
message CanonifyTagsOut {
string tags = 1;
bool tag_list_changed = 2;
}
message SetConfigJson {
string key = 1;
oneof op {
bytes val = 2;
Empty remove = 3;
}
}
message NoteFieldConfig {
bool sticky = 1;
bool rtl = 2;
string font_name = 3;
uint32 font_size = 4;
bytes other = 5;
}
message NoteField {
OptionalUInt32 ord = 1;
string name = 2;
NoteFieldConfig config = 5;
}
message CardTemplateConfig {
string q_format = 1;
string a_format = 2;
string q_format_browser = 3;
string a_format_browser= 4;
int64 target_deck_id = 5;
string browser_font_name = 6;
uint32 browser_font_size = 7;
bytes other = 8;
}
message CardTemplate {
OptionalUInt32 ord = 1;
string name = 2;
uint32 mtime_secs = 3;
sint32 usn = 4;
CardTemplateConfig config = 5;
}
message NoteTypeConfig {
enum Kind {
NORMAL = 0;
CLOZE = 1;
}
Kind kind = 1;
uint32 sort_field_idx = 2;
string css = 3;
// fixme: anki currently sets this without flushing
int64 target_deck_id = 4;
string latex_pre = 5;
string latex_post = 6;
bool latex_svg = 7;
repeated CardRequirement reqs = 8;
bytes other = 9;
}
message CardRequirement {
enum Kind {
None = 0;
Any = 1;
All = 2;
}
uint32 card_ord = 1;
Kind kind = 2;
repeated uint32 field_ords = 3;
}
message NoteType {
int64 id = 1;
string name = 2;
uint32 mtime_secs = 3;
sint32 usn = 4;
NoteTypeConfig config = 7;
repeated NoteField fields = 8;
repeated CardTemplate templates = 9;
}
enum StockNoteType {
StockNoteTypeBasic = 0;
StockNoteTypeBasicAndReversed = 1;
StockNoteTypeBasicOptionalReversed = 2;
StockNoteTypeBasicTyping = 3;
StockNoteTypeCloze = 4;
}
message AllStockNotetypesOut {
repeated NoteType notetypes = 1;
}
message NoteTypeNames {
repeated NoteTypeNameID entries = 1;
}
message NoteTypeUseCounts {
repeated NoteTypeNameIDUseCount entries = 1;
}
message NoteTypeNameID {
int64 id = 1;
string name = 2;
}
message NoteTypeNameIDUseCount {
int64 id = 1;
string name = 2;
uint32 use_count = 3;
}
message AddOrUpdateNotetypeIn {
bytes json = 1;
bool preserve_usn_and_mtime = 2;
}
message Note {
int64 id = 1;
string guid = 2;
int64 ntid = 3;
uint32 mtime_secs = 4;
int32 usn = 5;
repeated string tags = 6;
repeated string fields = 7;
}
message AddNoteIn {
Note note = 1;
int64 deck_id = 2;
}
message EmptyCardsReport {
string report = 1;
repeated NoteWithEmptyCards notes = 2;
}
message NoteWithEmptyCards {
int64 note_id = 1;
repeated int64 card_ids = 2;
bool will_delete_note = 3;
}
message Deck {
int64 id = 1;
string name = 2;
uint32 mtime_secs = 3;
int32 usn = 4;
DeckCommon common = 5;
oneof kind {
NormalDeck normal = 6;
FilteredDeck filtered = 7;
}
}
message DeckCommon {
bool study_collapsed = 1;
bool browser_collapsed = 2;
uint32 last_day_studied = 3;
int32 new_studied = 4;
int32 review_studied = 5;
int32 learning_studied = 6;
int32 secs_studied = 7;
bytes other = 16;
}
message DeckKind {
oneof kind {
NormalDeck normal = 1;
FilteredDeck filtered = 2;
}
}
message NormalDeck {
int64 config_id = 1;
uint32 extend_new = 2;
uint32 extend_review = 3;
string description = 4;
}
message FilteredDeck {
bool reschedule = 1;
repeated FilteredSearchTerm search_terms = 2;
// v1 scheduler only
repeated float delays = 3;
// v2 scheduler only
uint32 preview_delay = 4;
}
message FilteredSearchTerm {
string search = 1;
uint32 limit = 2;
FilteredSearchOrder order = 3;
}
enum FilteredSearchOrder {
FILTERED_SEARCH_ORDER_OLDEST_FIRST = 0;
FILTERED_SEARCH_ORDER_RANDOM = 1;
FILTERED_SEARCH_ORDER_INTERVALS_ASCENDING = 2;
FILTERED_SEARCH_ORDER_INTERVALS_DESCENDING = 3;
FILTERED_SEARCH_ORDER_LAPSES = 4;
FILTERED_SEARCH_ORDER_ADDED = 5;
FILTERED_SEARCH_ORDER_DUE = 6;
FILTERED_SEARCH_ORDER_REVERSE_ADDED = 7;
FILTERED_SEARCH_ORDER_DUE_PRIORITY = 8;
}
message DeckNames {
repeated DeckNameID entries = 1;
}
message DeckNameID {
int64 id = 1;
string name = 2;
}
message AddOrUpdateDeckLegacyIn {
bytes deck = 1;
bool preserve_usn_and_mtime = 2;
}