wrolpi/alembic/versions
lrnselfreliance 9588af2601
Track how far the user is through a file, kept in recently_viewed.yaml (#787)
* Track how far the user is through a file, kept in recently_viewed.yaml

FileGroup gains `progress` (0.0 to 1.0, 1.0 is finished) and `position` (where
to resume: a time, a page, or an EPUB CFI).  Both are returned with the file,
including by POST /api/files/file.

POST /api/files/progress records progress and is also a view.  A file 95%
through is finished and keeps no position; one barely started (under 10 s,
the first page, under 1%) is not worth resuming.  The write happens before
the response, so the next request sees it.  POST /api/files/progress/clear
starts a file over.  Both refuse files outside the media directory.

recently_viewed.yaml keeps the 1000 most recently viewed files so viewing
history and positions survive a database rebuild.  On import the newer
`viewed` wins, so a file viewed while WROLPi was starting keeps its newer
position.  The config is saved when a file is opened, when progress is final
(paused or closed), when it is cleared, and after refresh cleanup (moves,
renames, deletes); heartbeats during playback only write the database.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Progress: write as a writer, confine and merge the import, keep FTS on downgrade

- The progress endpoints begin as writers (request.ctx.db.write()), so a
  heartbeat during a refresh waits instead of failing a lock upgrade.  The
  config switch fires after the commit.
- `..` is collapsed before the ignored-directory check.  Clear only resets
  an existing FileGroup; it never indexes a file.
- Import confines config paths to the media directory.  A newer plain view
  keeps its `viewed` but takes the config's position; only progress written
  after the config wins.  Files are globbed before the write transaction.
- The dump skips a row outside the media directory instead of failing.
- The downgrade drops the columns with ALTER TABLE, which keeps file_group's
  FTS triggers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 16:15:25 -06:00
..
2026_07_10_1350_sqlite_baseline.py Postgres -> SQLite hard cutover: the database moves into the media directory. 2026-07-12 14:09:37 -06:00
2026_07_14_0900_browse_covering_index.py SQLite: make the browse pages index-only. 2026-07-14 07:46:29 -06:00
2026_09_16_1200_file_group_stem.py files: SQL FileGroup compare, stem column, drop unused discovery path (#713) 2026-09-18 08:57:56 -06:00
2026_09_18_1200_unique_directory_stem.py files: unique (directory, stem) after collapsing duplicate FileGroups (#715) 2026-09-19 21:03:49 -06:00
2026_09_20_1200_drop_file_group_idempotency.py files: extract refresh compare into its own module; drop file_group.idempotency (#717) 2026-09-20 20:58:19 -06:00
2026_09_27_1200_domain_collection_summary.py collections: channel and domain listings read trigger-maintained summary columns (#739) 2026-09-27 11:36:08 -06:00
2026_09_28_1200_collection_listing_indexes.py collections: listing answers channel and download queries from covering indexes (#740) 2026-09-27 12:53:40 -06:00
2026_10_05_1200_markdown_mimetype.py Preview markdown files formatted, with a raw toggle (#780) 2026-10-05 13:26:42 -06:00
2026_10_06_1200_repository.py Add a Repos module that mirrors git repositories (#783) 2026-10-07 15:16:58 -06:00
2026_10_06_1300_repository_search.py Add a Repos module that mirrors git repositories (#783) 2026-10-07 15:16:58 -06:00
2026_10_06_1400_repository_submodules.py Add a Repos module that mirrors git repositories (#783) 2026-10-07 15:16:58 -06:00
2026_10_06_1500_repository_clone_token.py Add a Repos module that mirrors git repositories (#783) 2026-10-07 15:16:58 -06:00
2026_10_08_1200_file_group_progress.py Track how far the user is through a file, kept in recently_viewed.yaml (#787) 2026-10-08 16:15:25 -06:00