Repository navigation
fix(worker): A file that records no date is undated, never dated by its last-modified time (#406) - #411
Merged
Conversation
…ts last-modified time (#406) A photo or video without EXIF DateTimeOriginal is stored undated: DateCaptured, Month, Day and Year are null (one migration). The last-modified fallback is gone; with it, CaptureDate.FromExifOrLastWrite became the identity, so it is deleted rather than kept until #404, and IFileSystem leaves the content writers, PairedMovResolver and KnownFileReconciler. - AssetContent carries a ContentDate: KeepRow, or Set(date or none). Undated() becomes KeepingRowDate(); keeping and "undated" are no longer the same null. - A Live Photo's video edited beside no dated photo row is undated. - Burst detection checks only dated photos (UncheckedPhotos, the invariant's one home) and no longer re-reads the EXIF date; an unreadable original is still a candidate, grouped by similarity alone, as agreed with the maintainer. - EfAssetViewReader filters undated assets before the selection, so AssetView and the API contract keep non-null dates (docs/openapi/v1.json unchanged). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ts (#406) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #406. Part of #383 (design: #383 (comment)).
Summary
A file with no EXIF
DateTimeOriginalis undated: ingested with its proxies, never in On This Day, never in a burst. The last-modified time is never a capture date.UndatedAssets:DateCaptured,Month,Day,Yearnullable, plus a column comment.CaptureDate.FromExifOrLastWriteis deleted: without the fallback it was the identity.IFileSystemleaves the content writers,PairedMovResolverandKnownFileReconciler.schema.sql,data-model.md,ingestion.md,media-reads.md. The Magick.NET HEIC ADR is renumbered to 0016; 0015 is the capture-date ADR (docs: A capture date is the recorded wall-clock time, or none (#383) #403 and feat(worker): iPhone HEIC photos ingest upright, behind one decode seam (#400, #401) #410 both took 0015).Evidence
WriteAsync_WithNullDateCaptured_FallsBackToFileLastWriteTimeAsync: year 2023).After:
WriteAsync_WithoutExifDate_StoresTheFileUndatedAsync,…LivePhotoPairWithoutExifDate_LeavesBothHalvesUndatedAsync,ReconcileAsync_VideoContentChangedWithoutAPhotoRow_MakesTheVideoUndatedAsyncall seed an mtime and assertDateCaptured == null.UncheckedPhotos_UndatedPhoto_IsNeitherLoadedNorCountedAsync,UncheckedPhotos_StatesTheDatedPhotosInItsOwnPredicate(SQL shape),OnThisDay_UndatedBurstMember_IsLeftOut.scripts/mutation-changed.sh: Core 100.00 %, Worker 100.00 %;scripts/derive-openapi.sh --check:docs/openapi/v1.json is current.Merge Danger
Door: two-way
Nothing is deployed, so the migration needs no backfill;
DownrestoresNOT NULL.Blast Radius: ingestion
Until #404, every video except a Live Photo's is undated (no video date source yet), as the design accepts.
🤖 Generated with Claude Code