3fedf849d3027e22c4649c571908486f017b6bc7
view_lesson() called update_lesson_progress() with no arguments on every page load, which defaults completed=False and progress_seconds=0 and silently overwrote whatever was already saved - just opening an already-watched lesson reset its progress/completed state unless the client happened to report real values within the next 15 seconds. Replaced with touch_lesson_accessed(), which only bumps last_accessed. Also fixes the "Resume from Xs" feature this fed into: it read a value that was never populated on this route, and even when given a real one, checked activeMedia.duration synchronously before metadata had loaded, so it silently never applied. Now waits for loadedmetadata (or resolves immediately if already available) and defers to an explicit note-timestamp jump (?t=) when both are present. Notes Hub gets a live search box filtering by note text, lesson title, or course name (client-side, no reload), with a "no notes match" state - useful now that a single category folder can hold dozens of courses' worth of timestamped notes. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
OfflineU: Self-Hosted Local Course Loader & Progress Tracker
OfflineU is a sleek, self-hosted web app designed to load and view your offline video, audio, text, and quiz-based training courses. Whether it's Udemy downloads, "open sourced" training archives, or personal content, OfflineU turns your course folder into a fully navigable dashboard with automatic progress tracking.
✨ Features
- 📁 Dynamic folder parsing: Scans and maps your course structure into a browsable tree view.
- 🎥 Video & Audio player: Integrated media player with resume & completion tracking.
- 📄 Text & HTML viewer: Supports .txt, .md, .html, .pdf, and more.
- ✅ Lesson progress tracking: Auto-saves your time spent and marks lessons as completed.
- ♻️ Continue where you left off: Resume instantly from your last-accessed lesson.
- 💾 Local-first & private: 100% offline. No cloud, no tracking, no nonsense.
- 🧑💻 Works with any course format: No metadata required, just structured folders.
- 🧠 Ideal for hoarders, students, or offline learning setups
🗈️ Screenshots
🛠️ Installation
🔁 Quick Start (Local)
-
Clone the repo:
git clone https://github.com/WhiskeyCoder/OfflineU.git cd OfflineU -
Install Python dependencies:
pip install flask -
Run the app:
python offlineu_core.py --create-templates -
Open your browser:
http://127.0.0.1:5000
📂 Folder Structure Example
MyCourse/
├── Section 1/
│ ├── 01 - Intro.mp4
│ ├── 02 - Setup Guide.pdf
│ └── 03 - Quiz.html
├── Section 2/
│ ├── 04 - Advanced Tips.mp4
│ └── resources/
│ └── extras.md
└── .offlineu_progress.json ← created automatically
🌟 File types are detected automatically — videos, audio, quizzes, and docs.
📁 Supported File Types
| Type | Extensions |
|---|---|
| Videos | .mp4, .mkv, .webm, .mov, .avi, etc. |
| Audio | .mp3, .wav, .aac, etc. |
| Docs | .txt, .md, .html, .pdf, .docx |
| Subtitles | .srt, .vtt |
| Quizzes | Detected if file name contains quiz, exam, test, etc. |
⚙️ CLI Options
| Option | Description |
|---|---|
--host |
Set host (default: 127.0.0.1) |
--port |
Set port (default: 5000) |
--debug |
Enable Flask debug mode |
--create-templates |
Generate default HTML templates |
<course_path> |
Load course directly at startup |
🧠 Roadmap
- Base function and testing
- Multi-user profile support
- Dark/light theme switcher
- Built-in quiz interactivity
- Import/export course metadata
- Mobile app wrapper
- Self hosted Docker Deployment
💬 Community
Join the development, suggest features, or ask questions via:
- GitHub Issues: https://github.com/WhiskeyCoder/OfflineU/issues
🛡️ License
MIT License — Use freely, modify locally, share widely.
✨ Author
Built with ❤️ by @WhiskeyCoder Inspired by the dream of learning freely, offline, and without limits.
Languages
HTML
58.2%
Python
41.4%
JavaScript
0.2%
Dockerfile
0.2%
