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>