From 3a97f3e63ee5860bc1ea4f7e72be0c98f1cd9954 Mon Sep 17 00:00:00 2001 From: Nick Perez Date: Mon, 13 Jul 2026 05:50:38 +0200 Subject: [PATCH] feat: Send optional document metadata with KOSync progress uploads (#1820) --- lib/I18n/translations/belarusian.yaml | 1 + lib/I18n/translations/catalan.yaml | 1 + lib/I18n/translations/czech.yaml | 1 + lib/I18n/translations/danish.yaml | 1 + lib/I18n/translations/dutch.yaml | 1 + lib/I18n/translations/english.yaml | 1 + lib/I18n/translations/finnish.yaml | 1 + lib/I18n/translations/french.yaml | 1 + lib/I18n/translations/german.yaml | 1 + lib/I18n/translations/hebrew.yaml | 1 + lib/I18n/translations/hungarian.yaml | 1 + lib/I18n/translations/italian.yaml | 3 ++- lib/I18n/translations/kazakh.yaml | 1 + lib/I18n/translations/lithuanian.yaml | 1 + lib/I18n/translations/polish.yaml | 1 + lib/I18n/translations/portuguese.yaml | 1 + lib/I18n/translations/romanian.yaml | 1 + lib/I18n/translations/russian.yaml | 1 + lib/I18n/translations/slovak.yaml | 3 ++- lib/I18n/translations/slovenian.yaml | 1 + lib/I18n/translations/spanish.yaml | 1 + lib/I18n/translations/swedish.yaml | 1 + lib/I18n/translations/turkish.yaml | 1 + lib/I18n/translations/ukrainian.yaml | 1 + lib/I18n/translations/valencian.yaml | 1 + lib/I18n/translations/vietnamese.yaml | 1 + lib/KOReaderSync/KOReaderCredentialStore.cpp | 7 +++++ lib/KOReaderSync/KOReaderCredentialStore.h | 5 ++++ lib/KOReaderSync/KOReaderSyncClient.cpp | 6 +++++ lib/KOReaderSync/KOReaderSyncClient.h | 26 ++++++++++++++----- src/SettingsList.h | 8 ++++++ .../reader/KOReaderSyncActivity.cpp | 11 ++++++++ .../settings/KOReaderSettingsActivity.cpp | 13 +++++++--- 33 files changed, 95 insertions(+), 11 deletions(-) diff --git a/lib/I18n/translations/belarusian.yaml b/lib/I18n/translations/belarusian.yaml index 0b3c6823..26155ee4 100644 --- a/lib/I18n/translations/belarusian.yaml +++ b/lib/I18n/translations/belarusian.yaml @@ -87,6 +87,7 @@ STR_USERNAME: "Імя карыстальніка" STR_PASSWORD: "Пароль" STR_SYNC_SERVER_URL: "URL сервера сінхранізацыі" STR_DOCUMENT_MATCHING: "Супастаўленне дакументаў" +STR_SEND_METADATA: "Адпраўляць метаданыя дакумента" STR_AUTHENTICATE: "Аўтарызацыя" STR_KOREADER_USERNAME: "Імя карыстальніка KOReader" STR_KOREADER_PASSWORD: "Пароль KOReader" diff --git a/lib/I18n/translations/catalan.yaml b/lib/I18n/translations/catalan.yaml index 642228a6..8edf54e4 100644 --- a/lib/I18n/translations/catalan.yaml +++ b/lib/I18n/translations/catalan.yaml @@ -103,6 +103,7 @@ STR_USERNAME: "Nom d'usuari" STR_PASSWORD: "Contrasenya" STR_SYNC_SERVER_URL: "URL del servidor de sincronització" STR_DOCUMENT_MATCHING: "Coincidència de documents" +STR_SEND_METADATA: "Envia metadades del document" STR_AUTHENTICATE: "Autentica" STR_KOREADER_USERNAME: "Nom d'usuari del KOReader" STR_KOREADER_PASSWORD: "Contrasenya del KOReader" diff --git a/lib/I18n/translations/czech.yaml b/lib/I18n/translations/czech.yaml index 6a5b64b4..256713ed 100644 --- a/lib/I18n/translations/czech.yaml +++ b/lib/I18n/translations/czech.yaml @@ -92,6 +92,7 @@ STR_USERNAME: "Uživatelské jméno" STR_PASSWORD: "Heslo" STR_SYNC_SERVER_URL: "URL synch. serveru" STR_DOCUMENT_MATCHING: "Párování dokumentů" +STR_SEND_METADATA: "Odesílat metadata dokumentu" STR_AUTHENTICATE: "Ověření" STR_KOREADER_USERNAME: "Uživ. jméno KOReaderu" STR_KOREADER_PASSWORD: "Heslo KOReaderu" diff --git a/lib/I18n/translations/danish.yaml b/lib/I18n/translations/danish.yaml index e657aabc..c4be53b4 100644 --- a/lib/I18n/translations/danish.yaml +++ b/lib/I18n/translations/danish.yaml @@ -97,6 +97,7 @@ STR_USERNAME: "Brugernavn" STR_PASSWORD: "Adgangskode" STR_SYNC_SERVER_URL: "Synkroniseringsserver-URL" STR_DOCUMENT_MATCHING: "Dokumentsammenkobling" +STR_SEND_METADATA: "Send dokumentmetadata" STR_AUTHENTICATE: "Godkend" STR_KOREADER_USERNAME: "KOReader brugernavn" STR_KOREADER_PASSWORD: "KOReader adgangskode" diff --git a/lib/I18n/translations/dutch.yaml b/lib/I18n/translations/dutch.yaml index abe10661..c82366e3 100644 --- a/lib/I18n/translations/dutch.yaml +++ b/lib/I18n/translations/dutch.yaml @@ -97,6 +97,7 @@ STR_USERNAME: "Gebruikersnaam" STR_PASSWORD: "Wachtwoord" STR_SYNC_SERVER_URL: "Sync-server URL" STR_DOCUMENT_MATCHING: "Documentkoppeling" +STR_SEND_METADATA: "Documentmetadata versturen" STR_AUTHENTICATE: "Authenticatie" STR_KOREADER_USERNAME: "KOReader gebruikersnaam" STR_KOREADER_PASSWORD: "KOReader wachtwoord" diff --git a/lib/I18n/translations/english.yaml b/lib/I18n/translations/english.yaml index 43d61ff2..5a9bc8af 100644 --- a/lib/I18n/translations/english.yaml +++ b/lib/I18n/translations/english.yaml @@ -105,6 +105,7 @@ STR_USERNAME: "Username" STR_PASSWORD: "Password" STR_SYNC_SERVER_URL: "Sync Server URL" STR_DOCUMENT_MATCHING: "Document Matching" +STR_SEND_METADATA: "Send Document Metadata" STR_AUTHENTICATE: "Authenticate" STR_KOREADER_USERNAME: "KOReader Username" STR_KOREADER_PASSWORD: "KOReader Password" diff --git a/lib/I18n/translations/finnish.yaml b/lib/I18n/translations/finnish.yaml index 10cadbf3..e370a850 100644 --- a/lib/I18n/translations/finnish.yaml +++ b/lib/I18n/translations/finnish.yaml @@ -92,6 +92,7 @@ STR_USERNAME: "Käyttäjänimi" STR_PASSWORD: "Salasana" STR_SYNC_SERVER_URL: "Synkronointipalvelimen osoite" STR_DOCUMENT_MATCHING: "Dokumenttien tunnistus" +STR_SEND_METADATA: "Lähetä asiakirjan metatiedot" STR_AUTHENTICATE: "Tunnistaudu" STR_KOREADER_USERNAME: "KOReader-käyttäjänimi" STR_KOREADER_PASSWORD: "KOReader-salasana" diff --git a/lib/I18n/translations/french.yaml b/lib/I18n/translations/french.yaml index decf2e46..20ad160a 100644 --- a/lib/I18n/translations/french.yaml +++ b/lib/I18n/translations/french.yaml @@ -97,6 +97,7 @@ STR_USERNAME: "Nom d’utilisateur" STR_PASSWORD: "Mot de passe" STR_SYNC_SERVER_URL: "URL du serveur" STR_DOCUMENT_MATCHING: "Correspondance" +STR_SEND_METADATA: "Envoyer métadonnées" STR_AUTHENTICATE: "Connexion" STR_KOREADER_USERNAME: "Utilisateur" STR_KOREADER_PASSWORD: "Mot de passe" diff --git a/lib/I18n/translations/german.yaml b/lib/I18n/translations/german.yaml index 97ab7105..babbf4a2 100644 --- a/lib/I18n/translations/german.yaml +++ b/lib/I18n/translations/german.yaml @@ -91,6 +91,7 @@ STR_USERNAME: "Benutzername" STR_PASSWORD: "Passwort" STR_SYNC_SERVER_URL: "Sync-Server-URL" STR_DOCUMENT_MATCHING: "Dateizuordnung" +STR_SEND_METADATA: "Metadaten senden" STR_AUTHENTICATE: "Authentifizieren" STR_KOREADER_USERNAME: "KOReader-Benutzername" STR_KOREADER_PASSWORD: "KOReader-Passwort" diff --git a/lib/I18n/translations/hebrew.yaml b/lib/I18n/translations/hebrew.yaml index b48d0c06..12196c0b 100644 --- a/lib/I18n/translations/hebrew.yaml +++ b/lib/I18n/translations/hebrew.yaml @@ -95,6 +95,7 @@ STR_USERNAME: "שם משתמש" STR_PASSWORD: "סיסמה" STR_SYNC_SERVER_URL: "כתובת שרת סנכרון" STR_DOCUMENT_MATCHING: "התאמת מסמכים" +STR_SEND_METADATA: "שלח מטא-נתוני מסמך" STR_AUTHENTICATE: "התחבר" STR_KOREADER_USERNAME: "שם משתמש ב-KOReader" STR_KOREADER_PASSWORD: "סיסמת KOReader" diff --git a/lib/I18n/translations/hungarian.yaml b/lib/I18n/translations/hungarian.yaml index 7da48b4c..3098738a 100644 --- a/lib/I18n/translations/hungarian.yaml +++ b/lib/I18n/translations/hungarian.yaml @@ -94,6 +94,7 @@ STR_USERNAME: "Felhasználónév" STR_PASSWORD: "Jelszó" STR_SYNC_SERVER_URL: "Szinkronizálás szerver URL" STR_DOCUMENT_MATCHING: "Dokumentum egyeztetés" +STR_SEND_METADATA: "Dokumentum metaadatok küldése" STR_AUTHENTICATE: "Hitelesítés" STR_KOREADER_USERNAME: "KOReader felhasználónév" STR_KOREADER_PASSWORD: "KOReader jelszó" diff --git a/lib/I18n/translations/italian.yaml b/lib/I18n/translations/italian.yaml index 3ddbcb65..62b70030 100644 --- a/lib/I18n/translations/italian.yaml +++ b/lib/I18n/translations/italian.yaml @@ -98,6 +98,7 @@ STR_USERNAME: "Nome utente" STR_PASSWORD: "Password" STR_SYNC_SERVER_URL: "URL server di sincronizzazione" STR_DOCUMENT_MATCHING: "Corrispondenza documenti" +STR_SEND_METADATA: "Invia metadati documento" STR_AUTHENTICATE: "Autentica" STR_KOREADER_USERNAME: "Nome utente KOReader" STR_KOREADER_PASSWORD: "Password KOReader" @@ -385,4 +386,4 @@ STR_KOSYNC: "KOSync" STR_PWR_BTN_FOOTNOTE_BACK: "Rientro rapido dalle note" STR_EOB_CONTINUE_WITH: "Continua con" STR_EOB_HOME: "Home" -STR_INDEX_FAILED: "Indicizzazione fallita - libro non valido" \ No newline at end of file +STR_INDEX_FAILED: "Indicizzazione fallita - libro non valido" diff --git a/lib/I18n/translations/kazakh.yaml b/lib/I18n/translations/kazakh.yaml index 808ba518..97472a43 100644 --- a/lib/I18n/translations/kazakh.yaml +++ b/lib/I18n/translations/kazakh.yaml @@ -88,6 +88,7 @@ STR_USERNAME: "Пайдаланушы аты" STR_PASSWORD: "Құпия сөз" STR_SYNC_SERVER_URL: "Синхрондау сервері URL" STR_DOCUMENT_MATCHING: "Құжат сәйкестендіру" +STR_SEND_METADATA: "Құжат метадеректерін жіберу" STR_AUTHENTICATE: "Аутентификация" STR_KOREADER_USERNAME: "KOReader пайдаланушы аты" STR_KOREADER_PASSWORD: "KOReader құпия сөзі" diff --git a/lib/I18n/translations/lithuanian.yaml b/lib/I18n/translations/lithuanian.yaml index 0b17cf28..a5372f3f 100644 --- a/lib/I18n/translations/lithuanian.yaml +++ b/lib/I18n/translations/lithuanian.yaml @@ -94,6 +94,7 @@ STR_USERNAME: "Vartotojas" STR_PASSWORD: "Slaptažodis" STR_SYNC_SERVER_URL: "Serverio URL" STR_DOCUMENT_MATCHING: "Atpažinimas" +STR_SEND_METADATA: "Siųsti dokumento metaduomenis" STR_AUTHENTICATE: "Prisijungti" STR_KOREADER_USERNAME: "KOReader vartotojas" STR_KOREADER_PASSWORD: "KOReader slaptažodis" diff --git a/lib/I18n/translations/polish.yaml b/lib/I18n/translations/polish.yaml index ec623e78..f5bbc469 100644 --- a/lib/I18n/translations/polish.yaml +++ b/lib/I18n/translations/polish.yaml @@ -97,6 +97,7 @@ STR_USERNAME: "Użytkownik" STR_PASSWORD: "Hasło" STR_SYNC_SERVER_URL: "Serwer URL synchronizacji" STR_DOCUMENT_MATCHING: "Dopasowanie dokumentów" +STR_SEND_METADATA: "Wyślij metadane dokumentu" STR_AUTHENTICATE: "Uwierzytelnianie" STR_KOREADER_USERNAME: "Użytkownik KOReader" STR_KOREADER_PASSWORD: "Hasło KOReader" diff --git a/lib/I18n/translations/portuguese.yaml b/lib/I18n/translations/portuguese.yaml index f19a374c..a417a9ad 100644 --- a/lib/I18n/translations/portuguese.yaml +++ b/lib/I18n/translations/portuguese.yaml @@ -99,6 +99,7 @@ STR_USERNAME: "Nome de usuário" STR_PASSWORD: "Senha" STR_SYNC_SERVER_URL: "URL servidor sincronização" STR_DOCUMENT_MATCHING: "Documento correspondente" +STR_SEND_METADATA: "Enviar metadados do doc." STR_AUTHENTICATE: "Autenticar" STR_KOREADER_USERNAME: "Usuário do KOReader" STR_KOREADER_PASSWORD: "Senha do KOReader" diff --git a/lib/I18n/translations/romanian.yaml b/lib/I18n/translations/romanian.yaml index ed2c4eb5..60e54bd5 100644 --- a/lib/I18n/translations/romanian.yaml +++ b/lib/I18n/translations/romanian.yaml @@ -97,6 +97,7 @@ STR_USERNAME: "Utilizator" STR_PASSWORD: "Parolă" STR_SYNC_SERVER_URL: "URL server sincronizare" STR_DOCUMENT_MATCHING: "Corespondenţă document" +STR_SEND_METADATA: "Trimite metadate document" STR_AUTHENTICATE: "Autentificare" STR_KOREADER_USERNAME: "Nume utilizator KOReader" STR_KOREADER_PASSWORD: "Parolă KOReader" diff --git a/lib/I18n/translations/russian.yaml b/lib/I18n/translations/russian.yaml index 1863d8c7..76961dc8 100644 --- a/lib/I18n/translations/russian.yaml +++ b/lib/I18n/translations/russian.yaml @@ -99,6 +99,7 @@ STR_USERNAME: "Имя пользователя" STR_PASSWORD: "Пароль" STR_SYNC_SERVER_URL: "URL сервера синхронизации" STR_DOCUMENT_MATCHING: "Сопоставление документов" +STR_SEND_METADATA: "Отправлять метаданные" STR_AUTHENTICATE: "Авторизация" STR_KOREADER_USERNAME: "Имя пользователя KOReader" STR_KOREADER_PASSWORD: "Пароль KOReader" diff --git a/lib/I18n/translations/slovak.yaml b/lib/I18n/translations/slovak.yaml index 72cc444d..06a7ef96 100644 --- a/lib/I18n/translations/slovak.yaml +++ b/lib/I18n/translations/slovak.yaml @@ -97,7 +97,8 @@ STR_CLEAR_READING_CACHE: "Vymazať vyrovnávaciu pamäť čítania" STR_USERNAME: "Používateľské meno" STR_PASSWORD: "Heslo" STR_SYNC_SERVER_URL: "URL synchronizačného servera" -STR_DOCUMENT_MATCHING: "Párovanie dokumentov" +STR_DOCUMENT_MATCHING: "Párovanie dokumentov" +STR_SEND_METADATA: "Odosielať metadáta dokumentu" STR_AUTHENTICATE: "Overiť" STR_KOREADER_USERNAME: "Používateľské meno KOReader" STR_KOREADER_PASSWORD: "Heslo KOReader" diff --git a/lib/I18n/translations/slovenian.yaml b/lib/I18n/translations/slovenian.yaml index 41e64576..3b5d3c1b 100644 --- a/lib/I18n/translations/slovenian.yaml +++ b/lib/I18n/translations/slovenian.yaml @@ -94,6 +94,7 @@ STR_USERNAME: "Uporabniško ime" STR_PASSWORD: "Geslo" STR_SYNC_SERVER_URL: "URL strežnika za sinhronizacijo" STR_DOCUMENT_MATCHING: "Ujemanje dokumentov" +STR_SEND_METADATA: "Pošlji metapodatke dokumenta" STR_AUTHENTICATE: "Avtentikacija" STR_KOREADER_USERNAME: "KOReader uporabnik" STR_KOREADER_PASSWORD: "KOReader geslo" diff --git a/lib/I18n/translations/spanish.yaml b/lib/I18n/translations/spanish.yaml index 01050a2b..c13fbcb0 100644 --- a/lib/I18n/translations/spanish.yaml +++ b/lib/I18n/translations/spanish.yaml @@ -104,6 +104,7 @@ STR_USERNAME: "Usuario" STR_PASSWORD: "Contraseña" STR_SYNC_SERVER_URL: "URL del servidor de sinc." STR_DOCUMENT_MATCHING: "Coincidencia de doc." +STR_SEND_METADATA: "Enviar metadatos doc." STR_AUTHENTICATE: "Autenticar" STR_KOREADER_USERNAME: "Usuario de KOReader" STR_KOREADER_PASSWORD: "Contraseña de KOReader" diff --git a/lib/I18n/translations/swedish.yaml b/lib/I18n/translations/swedish.yaml index 3af303f7..97e410d2 100644 --- a/lib/I18n/translations/swedish.yaml +++ b/lib/I18n/translations/swedish.yaml @@ -102,6 +102,7 @@ STR_USERNAME: "Användarnamn" STR_PASSWORD: "Lösenord" STR_SYNC_SERVER_URL: "Synkronisera serveradress" STR_DOCUMENT_MATCHING: "Dokumentmatchning" +STR_SEND_METADATA: "Skicka dokumentmetadata" STR_AUTHENTICATE: "Autentisera " STR_KOREADER_USERNAME: "KOReader användarnamn" STR_KOREADER_PASSWORD: "KOReader lösenord" diff --git a/lib/I18n/translations/turkish.yaml b/lib/I18n/translations/turkish.yaml index 863ba643..7e4c58e9 100644 --- a/lib/I18n/translations/turkish.yaml +++ b/lib/I18n/translations/turkish.yaml @@ -92,6 +92,7 @@ STR_USERNAME: "Kullanıcı Adı" STR_PASSWORD: "Şifre" STR_SYNC_SERVER_URL: "Senkronizasyon Sunucu Adresi" STR_DOCUMENT_MATCHING: "Belge Eşleştirme" +STR_SEND_METADATA: "Belge üst verisi gönder" STR_AUTHENTICATE: "Kimlik Doğrula" STR_KOREADER_USERNAME: "KOReader Kullanıcı Adı" STR_KOREADER_PASSWORD: "KOReader Şifresi" diff --git a/lib/I18n/translations/ukrainian.yaml b/lib/I18n/translations/ukrainian.yaml index a6873b8b..a95e3e43 100644 --- a/lib/I18n/translations/ukrainian.yaml +++ b/lib/I18n/translations/ukrainian.yaml @@ -98,6 +98,7 @@ STR_USERNAME: "Ім'я користувача" STR_PASSWORD: "Пароль" STR_SYNC_SERVER_URL: "URL для синхронізації" STR_DOCUMENT_MATCHING: "Порівняння документів" +STR_SEND_METADATA: "Надсилати метадані" STR_AUTHENTICATE: "Автентифікувати" STR_KOREADER_USERNAME: "Ім'я користувача KOReader" STR_KOREADER_PASSWORD: "Пароль KOReader" diff --git a/lib/I18n/translations/valencian.yaml b/lib/I18n/translations/valencian.yaml index 58113b5d..371138f4 100644 --- a/lib/I18n/translations/valencian.yaml +++ b/lib/I18n/translations/valencian.yaml @@ -109,6 +109,7 @@ STR_USERNAME: "Nom d'usuari" STR_PASSWORD: "Contrasenya" STR_SYNC_SERVER_URL: "URL del servidor de sincronització" STR_DOCUMENT_MATCHING: "Coincidència de documents" +STR_SEND_METADATA: "Envia metadades del document" STR_AUTHENTICATE: "Autentica" STR_KOREADER_USERNAME: "Nom d'usuari del KOReader" STR_KOREADER_PASSWORD: "Contrasenya del KOReader" diff --git a/lib/I18n/translations/vietnamese.yaml b/lib/I18n/translations/vietnamese.yaml index 2701fa90..130f21a0 100644 --- a/lib/I18n/translations/vietnamese.yaml +++ b/lib/I18n/translations/vietnamese.yaml @@ -98,6 +98,7 @@ STR_USERNAME: "Tên đăng nhập" STR_PASSWORD: "Mật khẩu" STR_SYNC_SERVER_URL: "URL máy chủ đồng bộ" STR_DOCUMENT_MATCHING: "Khớp tài liệu" +STR_SEND_METADATA: "Gửi siêu dữ liệu tài liệu" STR_AUTHENTICATE: "Xác thực" STR_KOREADER_USERNAME: "Tên đăng nhập KOReader" STR_KOREADER_PASSWORD: "Mật khẩu KOReader" diff --git a/lib/KOReaderSync/KOReaderCredentialStore.cpp b/lib/KOReaderSync/KOReaderCredentialStore.cpp index f418f602..6b9c1695 100644 --- a/lib/KOReaderSync/KOReaderCredentialStore.cpp +++ b/lib/KOReaderSync/KOReaderCredentialStore.cpp @@ -14,6 +14,7 @@ void KOReaderCredentialStore::toJson(JsonDocument& doc) const { doc["password_obf"] = obfuscation::obfuscateToBase64(getPassword()); doc["serverUrl"] = getServerUrl(); doc["matchMethod"] = static_cast(getMatchMethod()); + doc["sendMetadata"] = getSendMetadata(); } bool KOReaderCredentialStore::fromJson(JsonVariantConst doc) { @@ -32,6 +33,7 @@ bool KOReaderCredentialStore::fromJson(JsonVariantConst doc) { LOG_DBG("KRS", "Invalid matchMethod %u in JSON, resetting to FILENAME", method); setMatchMethod(DocumentMatchMethod::FILENAME); } + setSendMetadata(doc["sendMetadata"] | false); if (needsResave) { LOG_DBG("KRS", "Resaved KOReader credentials to update format"); @@ -98,3 +100,8 @@ void KOReaderCredentialStore::setMatchMethod(DocumentMatchMethod method) { matchMethod = method; LOG_DBG("KRS", "Set match method: %s", method == DocumentMatchMethod::FILENAME ? "Filename" : "Binary"); } + +void KOReaderCredentialStore::setSendMetadata(bool enabled) { + sendMetadata = enabled; + LOG_DBG("KRS", "Set send metadata: %s", enabled ? "true" : "false"); +} diff --git a/lib/KOReaderSync/KOReaderCredentialStore.h b/lib/KOReaderSync/KOReaderCredentialStore.h index 1ac437a1..0aa4a576 100644 --- a/lib/KOReaderSync/KOReaderCredentialStore.h +++ b/lib/KOReaderSync/KOReaderCredentialStore.h @@ -24,6 +24,7 @@ class KOReaderCredentialStore : public PersistableStore std::string password; std::string serverUrl; // Custom sync server URL (empty = default) DocumentMatchMethod matchMethod = DocumentMatchMethod::FILENAME; // Default to filename for compatibility + bool sendMetadata = false; // Send document metadata with progress sync // Private constructor for singleton KOReaderCredentialStore() = default; @@ -60,6 +61,10 @@ class KOReaderCredentialStore : public PersistableStore // Document matching method void setMatchMethod(DocumentMatchMethod method); DocumentMatchMethod getMatchMethod() const { return matchMethod; } + + // Send metadata setting + void setSendMetadata(bool enabled); + bool getSendMetadata() const { return sendMetadata; } }; // Helper macro to access credential store diff --git a/lib/KOReaderSync/KOReaderSyncClient.cpp b/lib/KOReaderSync/KOReaderSyncClient.cpp index 155c43f2..d8395366 100644 --- a/lib/KOReaderSync/KOReaderSyncClient.cpp +++ b/lib/KOReaderSync/KOReaderSyncClient.cpp @@ -148,6 +148,12 @@ KOReaderSyncClient::Error KOReaderSyncClient::updateProgress(const KOReaderProgr // Build JSON body JsonDocument doc; doc["document"] = progress.document; + if (progress.metadata.has_value()) { + auto meta = doc["metadata"].to(); + meta["filename"] = progress.metadata->filename; + meta["title"] = progress.metadata->title; + meta["authors"] = progress.metadata->authors; + } doc["progress"] = progress.progress; doc["percentage"] = progress.percentage; doc["device"] = DEVICE_NAME; diff --git a/lib/KOReaderSync/KOReaderSyncClient.h b/lib/KOReaderSync/KOReaderSyncClient.h index 7c0208d9..8a67e991 100644 --- a/lib/KOReaderSync/KOReaderSyncClient.h +++ b/lib/KOReaderSync/KOReaderSyncClient.h @@ -1,16 +1,30 @@ #pragma once +#include +#include #include +/** + * Optional document metadata sent alongside progress sync requests. + * Mirrors the metadata object added in KOReader PR #15306. + * The official sync server ignores this field; custom servers may use it. + */ +struct KOReaderMetadata { + std::string filename; // e.g. "my_book.epub" + std::string title; // Document title from EPUB metadata + std::string authors; // Author(s) from EPUB metadata +}; + /** * Progress data from KOReader sync server. */ struct KOReaderProgress { - std::string document; // Document hash - std::string progress; // XPath-like progress string - float percentage; // Progress percentage (0.0 to 1.0) - std::string device; // Device name - std::string deviceId; // Device ID - int64_t timestamp; // Unix timestamp of last update + std::string document; // Document hash + std::string progress; // XPath-like progress string + float percentage; // Progress percentage (0.0 to 1.0) + std::string device; // Device name + std::string deviceId; // Device ID + int64_t timestamp; // Unix timestamp of last update + std::optional metadata; // Optional document metadata }; /** diff --git a/src/SettingsList.h b/src/SettingsList.h index 5f34a87e..c171cc5f 100644 --- a/src/SettingsList.h +++ b/src/SettingsList.h @@ -224,6 +224,14 @@ inline std::vector getSettingsList(const SdCardFontRegistry* regist KOREADER_STORE.saveToFile(); }, "koMatchMethod", StrId::STR_KOREADER_SYNC), + SettingInfo::DynamicEnum( + StrId::STR_SEND_METADATA, {StrId::STR_STATE_OFF, StrId::STR_STATE_ON}, + [] { return static_cast(KOREADER_STORE.getSendMetadata()); }, + [](uint8_t v) { + KOREADER_STORE.setSendMetadata(v != 0); + KOREADER_STORE.saveToFile(); + }, + "koSendMetadata", StrId::STR_KOREADER_SYNC), // --- Status Bar Settings (web-only, uses StatusBarSettingsActivity) --- SettingInfo::Toggle(StrId::STR_CHAPTER_PAGE_COUNT, &CrossPointSettings::statusBarChapterPageCount, "statusBarChapterPageCount", StrId::STR_CUSTOMISE_STATUS_BAR), diff --git a/src/activities/reader/KOReaderSyncActivity.cpp b/src/activities/reader/KOReaderSyncActivity.cpp index d4f7fef6..9fb39c93 100644 --- a/src/activities/reader/KOReaderSyncActivity.cpp +++ b/src/activities/reader/KOReaderSyncActivity.cpp @@ -206,6 +206,17 @@ void KOReaderSyncActivity::performUpload() { progress.progress = localProgress.xpath; progress.percentage = localProgress.percentage; + // Optionally include document metadata (KOReader PR #15306) + if (KOREADER_STORE.getSendMetadata()) { + KOReaderMetadata meta; + // Extract filename from path + const auto lastSlash = epubPath.rfind('/'); + meta.filename = (lastSlash != std::string::npos) ? epubPath.substr(lastSlash + 1) : epubPath; + meta.title = epub->getTitle(); + meta.authors = epub->getAuthor(); + progress.metadata = std::move(meta); + } + const auto result = KOReaderSyncClient::updateProgress(progress); // Drop the radio while user reads the result; full teardown happens at silent reboot. diff --git a/src/activities/settings/KOReaderSettingsActivity.cpp b/src/activities/settings/KOReaderSettingsActivity.cpp index 60edddcc..48b14956 100644 --- a/src/activities/settings/KOReaderSettingsActivity.cpp +++ b/src/activities/settings/KOReaderSettingsActivity.cpp @@ -13,9 +13,9 @@ #include "fontIds.h" namespace { -constexpr int MENU_ITEMS = 5; -const StrId menuNames[MENU_ITEMS] = {StrId::STR_USERNAME, StrId::STR_PASSWORD, StrId::STR_SYNC_SERVER_URL, - StrId::STR_DOCUMENT_MATCHING, StrId::STR_AUTHENTICATE}; +constexpr int MENU_ITEMS = 6; +const StrId menuNames[MENU_ITEMS] = {StrId::STR_USERNAME, StrId::STR_PASSWORD, StrId::STR_SYNC_SERVER_URL, + StrId::STR_DOCUMENT_MATCHING, StrId::STR_SEND_METADATA, StrId::STR_AUTHENTICATE}; } // namespace void KOReaderSettingsActivity::onEnter() { @@ -98,6 +98,11 @@ void KOReaderSettingsActivity::handleSelection() { KOREADER_STORE.saveToFile(); requestUpdate(); } else if (selectedIndex == 4) { + // Send Metadata - toggle on/off + KOREADER_STORE.setSendMetadata(!KOREADER_STORE.getSendMetadata()); + KOREADER_STORE.saveToFile(); + requestUpdate(); + } else if (selectedIndex == 5) { // Authenticate if (!KOREADER_STORE.hasCredentials()) { // Can't authenticate without credentials - just show message briefly @@ -136,6 +141,8 @@ void KOReaderSettingsActivity::render(RenderLock&&) { return KOREADER_STORE.getMatchMethod() == DocumentMatchMethod::FILENAME ? std::string(tr(STR_FILENAME)) : std::string(tr(STR_BINARY)); } else if (index == 4) { + return KOREADER_STORE.getSendMetadata() ? std::string(tr(STR_STATE_ON)) : std::string(tr(STR_STATE_OFF)); + } else if (index == 5) { return KOREADER_STORE.hasCredentials() ? "" : std::string("[") + tr(STR_SET_CREDENTIALS_FIRST) + "]"; } return std::string(tr(STR_NOT_SET));