From c75beda743dfd6af63f512e928d0889d9ead3973 Mon Sep 17 00:00:00 2001 From: Ken Date: Sat, 9 May 2026 04:41:03 +0000 Subject: =?UTF-8?q?Initial=20commit=20=E2=80=94=20Albumen=20photo=20album?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- views/admin/album.erb | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++ views/admin/login.erb | 14 +++++++ views/album.erb | 99 +++++++++++++++++++++++++++++++++++++++++++++++++ views/layout.erb | 25 +++++++++++++ views/slideshow.erb | 41 ++++++++++++++++++++ 5 files changed, 280 insertions(+) create mode 100644 views/admin/album.erb create mode 100644 views/admin/login.erb create mode 100644 views/album.erb create mode 100644 views/layout.erb create mode 100644 views/slideshow.erb (limited to 'views') diff --git a/views/admin/album.erb b/views/admin/album.erb new file mode 100644 index 0000000..f6b80d6 --- /dev/null +++ b/views/admin/album.erb @@ -0,0 +1,101 @@ +
+
+ <% if @rel.empty? %> + View Root + <% else %> + <% parent = @rel.include?('/') ? @rel.split('/')[0..-2].join('/') : '' %> + ← Parent + View Album + <% end %> +
+ +

Edit: <%= @title %>

+ +
+
+ Album +
+ +
+
+ +
+
+ + + + +
+
+ + <% unless @files.empty? %> +
+

Files

+ + + + + + + + + + + + <% @files.each do |name| %> + <% meta = (@data['files'] || {})[name] || {} %> + <% file_rel = @rel.empty? ? name : "#{@rel}/#{name}" %> + + + + + + + + <% end %> + +
ThumbFilenameTitleCaptionVisible
<%= name %> + + > +
+
+ <% end %> + +
+ +
+
+ + <% unless @sub_dirs.empty? %> +
+

Sub-albums

+
    + <% @sub_dirs.each do |name| %> + <% sub_rel = @rel.empty? ? name : "#{@rel}/#{name}" %> +
  • <%= name %>
  • + <% end %> +
+
+ <% end %> +
diff --git a/views/admin/login.erb b/views/admin/login.erb new file mode 100644 index 0000000..16f12d2 --- /dev/null +++ b/views/admin/login.erb @@ -0,0 +1,14 @@ + diff --git a/views/album.erb b/views/album.erb new file mode 100644 index 0000000..077e119 --- /dev/null +++ b/views/album.erb @@ -0,0 +1,99 @@ +
+ <% unless @crumbs.empty? %> + + <% end %> +

<%= @title %>

+ <% if @desc %>

<%= @desc %>

<% end %> +
+ <% if @entries.any? { |e| %i[image video].include?(e[:type]) } %> + Slideshow + <% end %> +
+
+ +<% unless @albums.empty? %> +
+ <% if @entries.any? %><% end %> +
+ <% @albums.each do |a| %> + <% href = @rel.empty? ? "/browse/#{a[:name]}" : "/browse/#{@rel}/#{a[:name]}" %> + +
+ <% cover_rel = @rel.empty? ? "#{a[:name]}/#{a[:cover]}" : "#{@rel}/#{a[:name]}/#{a[:cover]}" %> + <% if a[:cover] %> + <%= a[:title] %> + <% else %> +
📁
+ <% end %> +
+
<%= a[:title] %>
+
+ <% end %> +
+
+<% end %> + +<% unless @entries.empty? %> +
+ <% if @albums.any? %><% end %> +
+ <% @entries.each_with_index do |e, i| %> + <% file_rel = @rel.empty? ? e[:name] : "#{@rel}/#{e[:name]}" %> +
+
+ <%= ERB::Util.html_escape(e[:title]) %> + <% if e[:type] == :video %><% end %> + <% if e[:type] == :audio %><% end %> +
+ <% if e[:caption] %> +

<%= e[:caption] %>

+ <% end %> +
+ <% end %> +
+
+<% end %> + +<% if @albums.empty? && @entries.empty? %> +

This album is empty.

+<% end %> + + + + + diff --git a/views/layout.erb b/views/layout.erb new file mode 100644 index 0000000..3e798c4 --- /dev/null +++ b/views/layout.erb @@ -0,0 +1,25 @@ + + + + + + <%= @title %> — Albumen + + + + +
+ <%= yield %> +
+ + diff --git a/views/slideshow.erb b/views/slideshow.erb new file mode 100644 index 0000000..847da65 --- /dev/null +++ b/views/slideshow.erb @@ -0,0 +1,41 @@ + + + + + + <%= @title %> — Slideshow + + + +
+
+ + +
+ + +
+
+
+ ← Album + + + + +
+
+
+ + + + + -- cgit v1.2.3