No description
Find a file
2026-06-01 17:17:33 +02:00
api Switch admin/API flows to article IDs with legacy job fallback 2026-05-31 18:04:21 +02:00
assets Updated og: metadata 2026-06-01 17:17:33 +02:00
bin Personalities selection improvement 2026-06-01 11:13:05 +02:00
js Refine map lightbox UX and map click behavior across pages 2026-05-31 15:19:39 +02:00
lib Update root deployment URLs and auth cookie path for non-/mvlog hosting 2026-06-01 09:15:01 +02:00
.gitignore Contact mail config update 2026-06-01 13:41:22 +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 Add contact page/includes and refine header action/logo styling 2026-06-01 13:19:08 +02:00
_header.php Add contact page/includes and refine header action/logo styling 2026-06-01 13:19:08 +02:00
auth.php Update root deployment URLs and auth cookie path for non-/mvlog hosting 2026-06-01 09:15:01 +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
index.php Updated og: metadata 2026-06-01 17:17:33 +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 Responsive mobile layout and header word sizing 2026-05-28 07:47:34 +02:00
logout.php Redirect logout to login page 2026-05-25 22:39:55 +02:00
new.php Tune header typography and logo position 2026-06-01 14:18:04 +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 Add web push notifications 2026-05-26 15:48:30 +02:00
README.md Updating with new features 2026-06-01 14:52:16 +02:00
send_push.js Add remaining relevant files (auto) 2026-05-29 13:29:12 +02:00
style.css Updated titles (again) and positioning.. 2026-06-01 15:05:41 +02:00
sw.js Adjust mobile index ordering and update push notification message defaults 2026-06-01 08:50:09 +02:00

movmaker-webui (MVL)

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

Production location

  • Web root: /var/www/html/mvlog
  • Public URLs:
    • https://bubulescu.org/
    • https://bubulescu.org/new.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)
  • new.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
  • thumbs/ — custom video poster images
  • 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
  • No generated timestamp is shown on cards
  • Optional map image per video (hidden when source article has .mvlog-hide-map)
  • Optional custom video poster from thumbs/

Admin (new.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 (immutable ID), with legacy dir-name fallback
  • 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)
  • Custom video poster selection from input images (set_video_thumb)
  • 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:

  • 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/mvlog/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.