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 { Empty 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; 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; FieldNamesForNotesIn field_names_for_notes = 78; FindAndReplaceIn find_and_replace = 79; AfterNoteUpdatesIn after_note_updates = 80; AddNoteTagsIn add_note_tags = 81; UpdateNoteTagsIn update_note_tags = 82; int32 set_local_minutes_west = 83; } } message BackendOutput { oneof value { // infallible commands 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 SchedTimingTodayOut sched_timing_today = 17; 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; 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; CheckDatabaseOut 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; FieldNamesForNotesOut field_names_for_notes = 78; uint32 find_and_replace = 79; Empty after_note_updates = 80; uint32 add_note_tags = 81; uint32 update_note_tags = 82; Empty set_local_minutes_west = 83; 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 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 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 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 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; } message FieldNamesForNotesIn { repeated int64 nids = 1; } message FieldNamesForNotesOut { repeated string fields = 1; } message FindAndReplaceIn { repeated int64 nids = 1; string search = 2; string replacement = 3; bool regex = 4; bool match_case = 5; string field_name = 6; } message AfterNoteUpdatesIn { repeated int64 nids = 1; bool mark_notes_modified = 2; bool generate_cards = 3; } message AddNoteTagsIn { repeated int64 nids = 1; string tags = 2; } message UpdateNoteTagsIn { repeated int64 nids = 1; string tags = 2; string replacement = 3; bool regex = 4; } message CheckDatabaseOut { repeated string problems = 1; }