| Age | Commit message (Collapse) | Author | Files | Lines |
|
When a media file is deleted from disk, also delete its cached
thumbnail from cache/thumbs/ so stale .th.jpg files don't accumulate.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
The next timer was starting as soon as ssShow() was called, so preload
time + 500ms crossfade ate into the visible interval. Now the timer
starts only after applyEntry() fires (photo is actually on screen),
guaranteeing each photo gets a full interval of visibility.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Acquire a screen wake lock when the slideshow is playing; release on
pause or page hide; re-acquire when the tab returns to the foreground.
Failures are silently ignored so older browsers degrade gracefully.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Use Page Visibility API to cancel the timer when the tab hides and
reschedule fresh on return, so no queued ticks fire in a burst.
Also fix stale #photo= → ?photo= in stage click-through.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
- Root slideshow: all_media_entries walks the full media tree so
/slideshow/ shows every photo across all albums; Slideshow button
always appears on the root album page
- Shuffle and Full screen checkboxes sit next to the Slideshow button
on the album page; options pass as ?shuffle=1&fullscreen=1 URL params
- Fullscreen uses a tap-to-activate overlay (browsers block auto-entry
on page load); webkit-prefixed for Safari; ⛶ button and F key for
mid-session toggle
- Fullscreen mode hides controls, counter, caption bar, and site header
- Exiting fullscreen auto-pauses so the current photo stays visible
- Click/tap anywhere in the stage navigates to the photo's album
lightbox; reads the live src attribute instead of ssIdx to avoid a
race where ssIdx advances during the cross-fade while the old photo
is still on screen
- layout.erb excluded from slideshow (layout: false) so the site header
never appears there
- CSS cache-busted with ?v=2
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
EXIF DateTimeOriginal has no timezone — it's the camera's wall clock.
Storing it via .iso8601 attached +00:00 (server TZ), causing browsers
to shift the time to their local zone when parsing. Switch to
strftime('%Y-%m-%dT%H:%M:%S') so no offset is written. JS strips any
existing +00:00 suffix from already-stored values so old data is also
displayed correctly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Tap "ℹ Info" in the caption bar to toggle a semi-transparent panel at
the bottom of the image showing filename (if different from title),
date taken, and pixel dimensions. Panel resets to hidden on each
photo change. Button is hidden automatically when no metadata is
available. Width/height are now included in the ENTRIES payload.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
SVG eye icon sits inside the right edge of the password field.
Tap/click to reveal; tap again to conceal. Helps mobile users
confirm what they're typing without a separate "show password" step.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Typing in the search box instantly hides non-matching album cards.
Shown only when an album has more than 4 sub-albums (no point otherwise).
Pure client-side — no server round-trips.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Covers system architecture, directory layout, dependencies, data model,
all HTTP routes, request flows (browse, thumbnail, lightbox, slideshow,
admin), the update.rb script, security model, and deployment.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Albums with no top-level photos (only sub-albums) now find a cover by
walking the full directory tree. Extracted cover_candidates() does a
recursive glob and returns paths relative to the album dir so the
existing thumb URL construction works unchanged.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Adds "— random image —" as a selectable cover option (stored as __random__
sentinel). album_cover() now picks a random eligible file when that value is
set, giving a fresh cover on each page load. Removes the cover_dynamic field
that was saved but never actually used in display logic.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
#lb-video and #lb-audio had explicit display:block via ID selectors, which
outweighed the .hidden class selector and kept the players visible for photos.
Added !important to .hidden so the utility class always wins.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Ruby/Sinatra self-hosted photo album with directory hierarchy,
per-photo captions and visibility, lightbox, slideshow, admin UI,
and Let's Encrypt HTTPS via Apache reverse proxy on prouter.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|