Clip counts on listings, so clients find photos with only clips

Derived clips (#208) aren't counted as versions, so a photo whose only
derived file is a clip looked like a plain photo, and clients never fetched
/image/versions for it. Summaries now carry clip_count: /photos adds the
parallel array photo_clip_counts, records (memories, search, /photos/exif)
carry clip_count. All skipped when zero, so other responses are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Cameron CordesandClaude Opus 5.5 committed 2026-11-01 19:49:21 -05:00
1 parent 19cbc9d59c
commit 3d1db90e3c
7 files changed
+84 -25

No files matched your search

+5 -3
View File
@@ -364,7 +364,8 @@ to the original, as `<dir>/aiedits/<original name>.<kind>[.<n>].png`. A
**derived clip** (kind `animated`, `CLIP_KINDS`) is a video made from a photo
(Enhance "Animate", `<name>.animated[.<n>].mp4`): linked, hidden and lifecycled
exactly like a version, but never counted as one (`photo_version_counts`,
`version_count`), never a display choice (`PUT /image/versions/display` answers 400
`version_count`; they have their own `photo_clip_counts` / `clip_count`, so clients
know to fetch `/image/versions` for a photo with only clips), never a display choice (`PUT /image/versions/display` answers 400
`clip_not_displayable`), and listed apart, as `clips` in `GET /image/versions`. ImageApi
only detects it (library roots stay read-only) and shows original + versions as
**one photo**; a *global* choice (not per user) says which file is displayed.
@@ -751,8 +752,9 @@ GET /image/versions?path=...&library=... (path of the original or any version
POST /enhance ... (Enhance on demand; see "Enhance on demand")
PUT /image/versions/display (body { path, display_hash|null, library? }; global choice)
// /photos hides versions behind their original (include_versions=true lists them) and adds
// parallel arrays photo_display_paths / photo_version_counts; memories items, search hits and
// /photos/exif rows carry display_path / version_count. All skipped when there are none.
// parallel arrays photo_display_paths / photo_version_counts / photo_clip_counts; memories items,
// search hits and /photos/exif rows carry display_path / version_count / clip_count. All skipped
// when there are none.
// Memories (week-based grouping)
GET /memories?path=...&recursive=true