Wires the persistence layer for CLIP semantic search. The watcher's per-tick drain encodes any image_exif row with a known content_hash but no clip_embedding via Apollo (cap CLIP_BACKLOG_MAX_PER_TICK, default 32). On a query, /photos/search encodes the text via Apollo and reranks every stored embedding in-memory. ExifDao additions: - list_clip_unencoded_candidates — partial-index scan for drain - backfill_clip_embedding — touches only the two new columns - list_clip_index — dedup'd (hash, embedding) pull for search clip_watch::run_clip_encoding_pass is the parallel fan-out — tokio runtime per pass with CLIP_ENCODE_CONCURRENCY (default 4). No marker rows for permanent failures yet; per-tick cap bounds the retry cost. /photos/search params: q, limit, threshold (default 0.20), library, model_version. Response is intentionally minimal (path + score) so the frontend joins against existing photo-metadata routes lazily. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
45 lines
816 B
Rust
45 lines
816 B
Rust
#![allow(clippy::too_many_arguments)]
|
|
|
|
#[macro_use]
|
|
extern crate diesel;
|
|
|
|
pub mod ai;
|
|
pub mod auth;
|
|
pub mod bin_progress;
|
|
pub mod cleanup;
|
|
pub mod clip_search;
|
|
pub mod clip_watch;
|
|
pub mod content_hash;
|
|
pub mod data;
|
|
pub mod database;
|
|
pub mod date_resolver;
|
|
pub mod duplicates;
|
|
pub mod error;
|
|
pub mod exif;
|
|
pub mod face_watch;
|
|
pub mod faces;
|
|
pub mod file_scan;
|
|
pub mod file_types;
|
|
pub mod files;
|
|
pub mod geo;
|
|
pub mod libraries;
|
|
pub mod library_maintenance;
|
|
pub mod memories;
|
|
pub mod otel;
|
|
pub mod parsers;
|
|
pub mod perceptual_hash;
|
|
pub mod personas;
|
|
pub mod service;
|
|
pub mod state;
|
|
pub mod tags;
|
|
#[cfg(test)]
|
|
pub mod testhelpers;
|
|
pub mod thumbnails;
|
|
pub mod utils;
|
|
pub mod video;
|
|
|
|
// Re-export commonly used types
|
|
pub use data::{Claims, ThumbnailRequest};
|
|
pub use database::{connect, schema};
|
|
pub use state::AppState;
|