Commit Graph

8 Commits

Author SHA1 Message Date
Harwinder Sekhon 91edba56d6 Remove course thumbnails and the ffmpeg dependency
Course cards go back to the colour-block art that previously sat under the
captured frame, so the UI is unchanged apart from losing the photo.

- Drop thumb.php, generateThumbnails(), captureThumbnail() and
  ensureThumbnailColumns(), plus the first-video tracking the scanner only
  kept to pick a frame source.
- Drop the ffprobe fallback in probeDuration(); the pure-PHP mvhd parse is
  now the only scan-time probe, with the player's report on first play as
  the remaining fallback.
- Drop THUMBNAILS_DIR/THUMBNAIL_SEEK_PERCENT from config, the
  thumbnail_* columns from schema.sql, the thumbnail counters from scan
  output, .thumb img from the stylesheet, and the matching README parts.

Existing databases keep two now-unused folders.thumbnail_* columns; they
are inert and can be dropped by hand if wanted.

Claude-Session: https://claude.ai/code/session_014oyi9DMdhALrGz989MNNZJ
2026-07-27 14:06:06 -04:00
Harwinder Sekhon c4c88e52da UI improved 2026-07-27 13:58:47 -04:00
Harwinder Sekhon 45e7465f7b Probe video durations at scan time
Parse the mp4 mvhd box in pure PHP (ffprobe fallback) for videos with no
stored duration, so folder listings show durations before first play.
2026-07-11 11:38:41 -04:00
Harwinder Sekhon c6a970880c Add quiz support: parse *_quiz_solved.txt files, take and grade quizzes
Scanner indexes quiz files found next to videos ([&] questions, "- "
options, "-- Correct" markers; _notsolved twins ignored). Quizzes appear
in the folder content list interleaved with videos by filename order.
New api/quiz.php serves questions without answers and grades attempts
server-side; per-user best/last score and attempts stored in
quiz_progress. Folder/course progress now aggregates videos + quizzes
with partial credit for partial scores.
2026-07-11 11:24:37 -04:00
Harwinder Sekhon 13856e35bc Fix HTTP 500 on PHP < 8.2: drop standalone true union type
registerUser() declared `: string|true`; the bare `true` type requires
PHP 8.2, so including auth.php was a fatal error on PHP 8.0/8.1 — every
login/API call returned 500 while install.php (which doesn't include
auth.php) worked. Use string|bool instead. Also install a JSON exception
handler so future server errors surface a message to the SPA instead of
a blank 500.
2026-07-11 11:11:30 -04:00
Harwinder Sekhon 4bd3d63a76 Installer: configurable videos folder
install.php now takes the videos path (form field / --videos= CLI flag),
persists it into config.php, and creates the directory if missing.
config.example.php default changed from a dev path to /srv/courses.
2026-07-11 11:06:45 -04:00
Harwinder Sekhon ceb7aa6780 Add install.php: browser/CLI installer for database and schema
Creates config.php from the example if missing, creates the database
(and app DB user when admin credentials are given), applies schema.sql
idempotently, optionally creates the first login account, and locks
itself with .install.lock after a successful run.
2026-07-11 11:02:22 -04:00
Harwinder Sekhon 3ae6c1ae2e CourseHub: AJAX video course player (PHP + MySQL + Bootstrap + Plyr)
Scans nested course folders for mp4s, tracks per-user resume position
and per-folder progress. SPA frontend with hash routing over a JSON API;
range-request streaming via stream.php.
2026-07-11 10:25:35 -04:00