No description
Find a file
2026-06-05 09:49:20 +02:00
api Switch admin/API flows to article IDs with legacy job fallback 2026-05-31 18:04:21 +02:00
assets Large png logo 2026-06-04 22:13:48 +02:00
bin Describing improvements 2026-06-05 09:34:58 +02:00
js Refine map lightbox UX and map click behavior across pages 2026-05-31 15:19:39 +02:00
lib Additional inputs for Describe functionality 2026-06-05 01:38:40 +02:00
.gitignore Changed to permlainks only 2026-06-04 08:06:23 +02:00
404.php OG meta updated 2026-06-04 10:16:37 +02:00
_footer.php Add contact page/includes and refine header action/logo styling 2026-06-01 13:19:08 +02:00
_footer_admin.php Describing improvements 2026-06-05 09:34:58 +02:00
_header.php Changed to permlainks only 2026-06-04 08:06:23 +02:00
admin.php Fixed showing title/teaser/quote/description from data.txt, not like on index.php 2026-06-05 09:49:20 +02:00
auth.php Renamed new.php to admin.php, fixed redirects 2026-06-04 14:33:29 +02:00
config.php Fix: Restore Describe button functionality and correct JSON path 2026-05-30 01:24:00 +02:00
contact.php.example Contact mail config update 2026-06-01 13:41:22 +02:00
feed.php Show video creation time in admin edit list 2026-05-27 10:31:05 +02:00
header_titles.php Titles update 2026-06-04 12:56:02 +02:00
index.php Clickable bubbles to filter 2026-06-05 02:20:52 +02:00
job_status.php Switch admin/API flows to article IDs with legacy job fallback 2026-05-31 18:04:21 +02:00
login.php Renamed new.php to admin.php, fixed redirects 2026-06-04 14:33:29 +02:00
logout.php
new.php Renamed new.php to admin.php, fixed redirects 2026-06-04 14:33:29 +02:00
package-lock.json Add remaining relevant files (auto) 2026-05-29 13:29:12 +02:00
package.json Add remaining relevant files (auto) 2026-05-29 13:29:12 +02:00
push.json.example Ignore push.json and add push.json.example + README note 2026-05-29 13:36:58 +02:00
push_config.php Unify push config resolution for subscribe and send paths 2026-05-31 14:28:05 +02:00
push_subscribe.php
README.md HTML serving path changed to root 2026-06-04 22:38:49 +02:00
send_push.js Add remaining relevant files (auto) 2026-05-29 13:29:12 +02:00
style.css Styling, animation while generating description... 2026-06-05 00:43:58 +02:00
sw.js WebPush notification update 2026-06-04 12:50:42 +02:00

movmaker-webui (MVL)

PHP web UI for publishing and managing MVLog videos on bubulescu.org.

Production location

  • Web root: /var/www/html
  • Public URLs:
    • https://bubulescu.org/
    • https://bubulescu.org/admin.php
    • https://bubulescu.org/login.php
    • https://bubulescu.org/feed.php
    • https://bubulescu.org/contact.php

Main structure

  • index.php — public landing page (rendered videos and permalink pages)
  • admin.php — authenticated admin UI
  • feed.php — RSS feed
  • contact.php — contact form
  • auth.php — session auth helpers
  • config.php — app config
  • style.css — shared styles
  • _header.php, _footer.php, _footer_admin.php — shared layout includes

Important dirs:

  • in-dir/ — input/article dirs
  • out-dir/ — rendered videos and article OG images (<article_id>_og.jpg)
  • thumbs/ — legacy thumbnail cache / cleanup dir
  • cache/ — metadata/search/push caches

Public page (index.php)

  • Randomized header title text (<h1>), fixed HTML title MVL
  • Header actions: notifications, RSS, contact
  • Search supports:
    • general keyword (title/teaser/quote_da/description)
    • date=...
    • location=... / place=...
  • Case-insensitive + accent-insensitive matching
  • Shows title/date/location/teaser/description/quote_da
  • Article permalinks use ?id=<article_id>; filename fallback is no longer used
  • Permalink pages hide the bottom page numbers
  • Optional map image per video (hidden when source article has .mvlog-hide-map)
  • Video posters are resolved from the source image recorded in the thumbnail sidecar JSON; if the source image is missing, the <video> gets no poster
  • Permalink OG/Twitter images use out-dir/<article_id>_og.jpg when present; otherwise they fall back to https://bubulescu.org/assets/img/bubulescuorg.jpg

Admin (admin.php)

Requires login via PHP session.

Tabs:

  • New — create input dirs + upload media
  • Edit — edit metadata/media/order/toggles
  • Videos — manage orphan output videos

Implemented behavior:

  • Article identity uses .mvlog-id / article_id as the stable canonical ID; legacy dir-name fallback only applies to older entries that are missing the ID
  • Draft metadata is read/written from in-dir/<job>/data.txt
  • Supports metadata fields: title, teaser, quote_da, date, place, description
  • Manual media reordering via order.json (AJAX action reorder_file)
  • Per-article toggles:
    • Preview (set_preview)
    • Render (set_enabled)
    • Show (set_visible)
    • Hide map (set_map_hidden -> .mvlog-hide-map)
  • Save changes always regenerates the map PNG(s) for the article on every press, via bin/gpsmap.py
  • Map regeneration logs are written to /var/log/mvlog_map.log
  • Custom video poster selection uses the source image recorded in <output>_thumb.json; if the source image is missing, no poster file is used
  • set_video_thumb also writes an article-specific OG image to out-dir/<article_id>_og.jpg
  • Thumbnail provenance is stored in the thumb JSON sidecar (article_id, input_dir, source_file, source_path, created_at)
  • Describe button uses lib/generate_data_sync.php
  • Job status polling via job_status.php every 32s

Ordering rules

For visual media ordering in admin/render flow:

  1. order.json (authoritative when present)
  2. embedded metadata datetime
  3. filename datetime
  4. filesystem datetime

order.json is web/admin-owned (worker consumes it).

Contact form (contact.php)

  • Fields: name, email, message + honeypot anti-spam field
  • Uses PHP mail()
  • On success: redirects to https://bubulescu.org/
  • Recipient is configured in contact.php ($to_email)

Push notifications

Files:

  • push_config.php — exposes only public VAPID key
  • push_subscribe.php — stores subscriptions in cache/push_subscriptions.json
  • lib/send_push.php + send_push.js — server-side send logic
  • api/enable_show.php — triggers push on Show enable
  • sw.js — service worker fallback notification text

Current text behavior:

  • Show notifications open the article permalink (./?id=<article_id>)
  • payload body: New aticle @ MVL!
  • SW fallback title/body: MVL / New article @ MVL!

Push config is loaded from first available:

  • /etc/mvlog/push.php
  • /etc/mvlog/push.json
  • /var/www/html/push.json
  • ~/.config/mvlog/push.json

Auth

  • Session cookie name: MVLOGSESSID
  • Cookie path: /
  • Auth config: /etc/mvlog/auth.php

Runtime config (config.php)

return [
  "site_name" => "Admin MVLog",
  "videos_dir" => __DIR__ . "/out-dir",
  "thumbs_dir" => __DIR__ . "/thumbs",
  "uploads_dir" => __DIR__ . "/in-dir",
  "public_videos" => "out-dir",
  "public_thumbs" => "thumbs",
  "items_per_page" => 8,
];

Notes

  • contact.php is currently in .gitignore.
  • Keep secrets out of git (push.json, private keys, auth secrets).
  • Worker/rendering is handled by separate movmaker worker project.