fix(scan): quiet startup scans & thumbnail RAW/HEIC
Three recurring issues on every full scan: 1. Video playlist scans re-enqueued every file only to reject it as AlreadyExists. Pre-filter in ScanDirectoryMessage and QueueVideosMessage so we skip videos whose .m3u8 already exists, and demote the leaked AlreadyExists log to debug. 2. image crate was built with only jpeg/png features, so webp/tiff/avif files logged "format not supported" every scan. Enable those features. 3. RAW (ARW/NEF/CR2/...) and HEIC thumbnails weren't generated, so the scan kept retrying them. Try the file's embedded JPEG preview via kamadak-exif first (fast, pure-Rust, works on Sony ARW where ffmpeg's TIFF decoder fails). Fall back to ffmpeg for HEIC/HEIF and RAWs with no preview. Anything still undecodable gets a <thumb>.unsupported sentinel so future scans skip it. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
33
README.md
33
README.md
@@ -14,14 +14,43 @@ Upon first run it will generate thumbnails for all images and videos at `BASE_PA
|
||||
- **RAG-based Context Retrieval** - Semantic search over daily conversation summaries
|
||||
- **Automatic Daily Summaries** - LLM-generated summaries of daily conversations with embeddings
|
||||
|
||||
## External Dependencies
|
||||
|
||||
### ffmpeg (required)
|
||||
`ffmpeg` must be on `PATH`. It is used for:
|
||||
- **HLS video streaming** — transcoding/segmenting source videos into `.m3u8` + `.ts` playlists
|
||||
- **Video thumbnails** — extracting a frame at the 3-second mark
|
||||
- **Video preview clips** — short looping previews for the Video Wall
|
||||
- **HEIC / HEIF thumbnails** — decoding Apple's HEIC format (your ffmpeg build must include
|
||||
`libheif`; most modern builds do)
|
||||
|
||||
Builds used in development: the `gyan.dev` full build on Windows, and distro `ffmpeg`
|
||||
packages on Linux work fine. If HEIC thumbnails silently fail, check
|
||||
`ffmpeg -formats | grep heif` to confirm HEIF support.
|
||||
|
||||
### RAW photo thumbnails (no extra dependency)
|
||||
RAW formats (ARW, NEF, CR2, CR3, DNG, RAF, ORF, RW2, PEF, SRW, TIFF) are thumbnailed
|
||||
by reading the embedded JPEG preview from the TIFF IFD1 using `kamadak-exif`. No
|
||||
external RAW decoder (libraw / dcraw) is required. Files without an embedded preview
|
||||
fall back to ffmpeg (works for most NEF files), and anything that still can't be
|
||||
decoded is marked with a `<thumb>.unsupported` sentinel in the thumbnail directory
|
||||
so we don't retry it every scan. Delete those sentinels to force retries after a
|
||||
tooling upgrade.
|
||||
|
||||
## Environment
|
||||
There are a handful of required environment variables to have the API run.
|
||||
They should be defined where the binary is located or above it in an `.env` file.
|
||||
You must have `ffmpeg` installed for streaming video and generating video thumbnails.
|
||||
|
||||
- `DATABASE_URL` is a path or url to a database (currently only SQLite is tested)
|
||||
- `BASE_PATH` is the root from which you want to serve images and videos
|
||||
- `THUMBNAILS` is a path where generated thumbnails should be stored
|
||||
- `THUMBNAILS` is a path where generated thumbnails should be stored. Thumbnails
|
||||
mirror the source tree under `BASE_PATH` and keep the source's original
|
||||
extension (e.g. `foo.arw` or `bar.mp4`), though the file contents are always
|
||||
JPEG bytes — browsers content-sniff. Files that can't be thumbnailed by the
|
||||
`image` crate, ffmpeg, or an embedded RAW preview get a zero-byte
|
||||
`<thumb_path>.unsupported` sentinel in this directory so subsequent scans
|
||||
skip them. Delete the `*.unsupported` files to force retries (for example
|
||||
after upgrading ffmpeg or adding libheif)
|
||||
- `VIDEO_PATH` is a path where HLS playlists and video parts should be stored
|
||||
- `GIFS_DIRECTORY` is a path where generated video GIF thumbnails should be stored
|
||||
- `BIND_URL` is the url and port to bind to (typically your own IP address)
|
||||
|
||||
Reference in New Issue
Block a user