diff options
Diffstat (limited to 'docs/photos.md')
| -rw-r--r-- | docs/photos.md | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/docs/photos.md b/docs/photos.md index ed4a826..c00a7e0 100644 --- a/docs/photos.md +++ b/docs/photos.md @@ -456,6 +456,29 @@ than Videos, not more. | P4 | Wrap-around vs. stop-at-ends for next/previous at album boundaries | UI choice, mirror whatever `video-player.js`'s own controls already do for consistency | | P5 | Album cover selection (always "first photo" vs. an operator/member choice) | Product call; "first photo, stable" is a reasonable, zero-config default and is what this document assumes | +## 10b. One photo, not two, in the cross-group Search view (2026-09-02) + +Reported against Videos and true here by construction: two groups sharing one +directory listed every photo twice inside one album. `source-merge.js` folds +entries on the content hash and resolves one source per album; the units come +from `groupPhotoAlbums` itself (exported for this), called on the un-merged +list purely to learn them. + +**One consequence is deliberate and is not a bug.** Albums are keyed by +directory (§2.5), so two groups whose roots have *different basenames* put the +same photo in two differently-named albums, and the merge — scoped to a unit — +leaves it in both. That is correct: they are two albums. Only same-named albums +collapse, which is the reported shape. Videos and Music do not have this case, +their units being title- and tag-based rather than path-based. + +The album card's source badge counts the union over **the album**, not the +cover photo: the cover is `photos.find((p) => p.thumb_hash) || photos[0]`, so +an album in two groups whose cover sits in only one would have claimed a single +source. + +Design: `docs/refactoring-search.md`. `test_search_media_merge.py` covers both +the collapsing and the non-collapsing case. + ## 11. Acceptance before shipping 1. Orientation correction verified against a real EXIF-rotated phone photo |