bc6725ee4c9ca27af94a642373cbf187dff4ecc8
Three comparison-driven upgrades against typical course/media platforms: - Lesson page gets a collapsible "Lessons in this section" list so you can jump between siblings without leaving the page, instead of only global Prev/Next buttons. find_lesson_in_tree() now also returns the DirectoryNode that owns the lesson (its .lessons list is the sibling set) since DirectoryNode has no parent pointer; a new get_section_lessons() resolves each sibling's progress the same way view_lesson() already does for the current lesson. - Course tree section headers show "X/Y watched" instead of a flat item count, via DynamicCourseParser._calculate_completion_stats (already computed recursive completion for any node, just never called per-section) exposed as a Jinja global. - Library browser gets a list/grid toggle for browsing large category folders by poster-style thumbnail instead of a 32px-icon list. Client-side only, persisted via localStorage, defaults to the existing list view; both folder browsing and search results already funnel through the same render function so grid mode covers both. 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%
