feat(media): accept context_text from web reader progress saves

Web reader can now send surrounding text at current reading position.
Stored in reading_progress.context_text for use as CFI resolution
fallback when converting epubcfi to CREngine XPointer.
This commit is contained in:
2026-06-02 19:45:00 -04:00
parent 795f10d2af
commit 39a2829cc8
+12
View File
@@ -975,6 +975,7 @@ func (mh *MediaHandler) UpdateMediaReadingProgress(c *echo.Context) error {
CurrentPage *int32 `json:"current_page"`
TotalPages *int32 `json:"total_pages"`
Epubcfi *string `json:"epubcfi"`
ContextText *string `json:"context_text"`
Percentage *float64 `json:"percentage"`
Chapter *int `json:"chapter"`
ChapterProgress *float64 `json:"chapter_progress"`
@@ -996,6 +997,7 @@ func (mh *MediaHandler) UpdateMediaReadingProgress(c *echo.Context) error {
DeviceID: pgtype.UUID{Bytes: userUUID, Valid: true},
Percentage: req.Percentage,
Epubcfi: req.Epubcfi,
ContextText: req.ContextText,
CharacterOffset: req.CharacterOffset,
Chapter: req.Chapter,
ChapterProgress: req.ChapterProgress,
@@ -1018,6 +1020,16 @@ func (mh *MediaHandler) UpdateMediaReadingProgress(c *echo.Context) error {
saveReq.TotalPages = &tp
}
if req.Percentage != nil && *req.Percentage < 0.005 {
existing, err := mh.db.GetUniversalProgress(c.Request().Context(), database.GetUniversalProgressParams{
MediaItemID: pgtype.UUID{Bytes: mediaUUID, Valid: true},
UserID: pgtype.UUID{Bytes: userUUID, Valid: true},
})
if err == nil && existing.Percentage.Valid && existing.Percentage.Float64 > 0.01 {
return c.JSON(http.StatusOK, map[string]string{"status": "ignored"})
}
}
result, err := mh.progressSvc.SaveProgress(c.Request().Context(), saveReq)
if err != nil {
return c.JSON(http.StatusInternalServerError, map[string]string{"error": err.Error()})