Modules
A photo and video library for PhoenixKit, in the spirit of Apple Photos and Google Photos.
The photo library for agents: find files by what a person would say ("the videos from last
July"), then act on them. The write tools are PhoenixKitPhotos.Bulk with an API around it,
the same two steps a person's selection takes, so every one of them answers a dry run with
what would happen and to which files, and nothing here deletes for good.
What can be done to many files at once. A person gets here through the timeline's selection
and an agent through the API tools (PhoenixKitPhotos.API); both take the same two steps,
so an agent cannot do what a person's screen would refuse.
The timeline LiveComponent: index and current window on the server, geometry
and recycling in the PhotoTimeline JS hook.
Adds photos and videos to one library: a floating + button, a panel with the queue, and the whole page as a place to drop files or folders.
Hosts PhoenixKit's canvas viewer and dialog hook for one authorized photo.
Pass only the file data returned by Timeline.viewer_file/3. Stage 1 is
read-only; editing and annotations remain in PhoenixKit's media screens.
A select for the viewer of one library (PhoenixKitPhotos.Viewer): "Default", "Swipe
viewer", "Classic viewer". It shows nothing to someone who may not choose
(Viewer.can_set?/2), and checks again when it saves.
Gettext backend for labels this package hands to the browser.
Forwards storage lifecycle messages from the host LiveView to its timelines.
The server side of the timeline: a monthly index and per-day windows over one storage library.
What the photo uploader asks of the server: who may add to a library, which files
it takes, and storing one finished upload. No LiveView in here; the
PhoenixKitPhotos.Components.PhotoUploader component calls it, and so can anything
else that has a file on disk (an importer, a script).
Which viewer a library's photos open in.
The timeline's Download: a form post of file ids, answered with a ZIP of the originals as they
are read. A host mounts it in a pipeline with the session, CSRF protection and the current
scope, and tells the timeline where (download_path)
The package's default timeline page.
A ZIP archive written front to back, for answering a download while the files are still being read: nothing is ever seeked back to, so it goes straight into a chunked response.