feat: Add kosync user registration and switch to crosspoint-sync server (#2587)
Implements createUser() endpoint to allow account creation via the KOSync protocol. Changes default sync server from sync.koreader.rocks to sync.crosspointreader.com with migration logic to preserve existing users' server settings. Extends sync protocol to include position data (spine index, page numbers, xpath) that crosspoint-sync supports while remaining compatible with standard kosync servers.
This commit is contained in:
@@ -232,8 +232,19 @@ void KOReaderSyncActivity::performSync() {
|
||||
return;
|
||||
}
|
||||
|
||||
SavedProgressPosition koPos = {remoteProgress.progress, remoteProgress.percentage};
|
||||
remotePosition = ProgressMapper::toCrossPoint(epub, koPos, renderer, currentSpineIndex, totalPagesInSpine);
|
||||
// Prefer the exact spine/page from a crosspoint-sync rich position (lossless
|
||||
// CrossPoint<->CrossPoint sync); fall back to the approximate XPath mapping
|
||||
// for plain kosync servers or when the rich position cannot be applied.
|
||||
std::optional<CrossPointPosition> richMapped;
|
||||
if (remoteProgress.position.has_value()) {
|
||||
richMapped = ProgressMapper::fromRichPosition(epub, *remoteProgress.position, renderer);
|
||||
}
|
||||
if (richMapped.has_value()) {
|
||||
remotePosition = *richMapped;
|
||||
} else {
|
||||
SavedProgressPosition koPos = {remoteProgress.progress, remoteProgress.percentage};
|
||||
remotePosition = ProgressMapper::toCrossPoint(epub, koPos, renderer, currentSpineIndex, totalPagesInSpine);
|
||||
}
|
||||
|
||||
if (smartSyncEnabled()) {
|
||||
static constexpr float SAME_PROGRESS_EPSILON = 0.001f; // 0.1 percentage points
|
||||
@@ -287,6 +298,22 @@ void KOReaderSyncActivity::performUpload() {
|
||||
progress.progress = localProgress.xpath;
|
||||
progress.percentage = localProgress.percentage;
|
||||
|
||||
// Rich CrossPoint position for crosspoint-sync servers (lossless
|
||||
// CrossPoint<->CrossPoint sync); plain kosync servers ignore the extra field.
|
||||
{
|
||||
KOReaderRichPosition pos;
|
||||
const float pct = localProgress.percentage < 0.0f ? 0.0f
|
||||
: localProgress.percentage > 1.0f ? 1.0f
|
||||
: localProgress.percentage;
|
||||
pos.pctQ = static_cast<uint32_t>(pct * 1000000.0f + 0.5f);
|
||||
pos.spineIndex = static_cast<uint16_t>(currentSpineIndex);
|
||||
pos.pageNumber = static_cast<uint16_t>(currentPage);
|
||||
pos.totalPages = static_cast<uint16_t>(totalPagesInSpine > 0 ? totalPagesInSpine : 1);
|
||||
pos.paragraphIndex = currentParagraphIndex;
|
||||
pos.xpath = localProgress.xpath;
|
||||
progress.position = std::move(pos);
|
||||
}
|
||||
|
||||
// Optionally include document metadata (KOReader PR #15306)
|
||||
if (KOREADER_STORE.getSendMetadata()) {
|
||||
// The Epub is released before the sync network calls and is only reloaded on the
|
||||
|
||||
Reference in New Issue
Block a user