๐Ÿ“š

OfflineU

Your self-hosted course library

{% if course %}
{{ course.name }}
{% endif %}
{% if course %}

{{ course.name }}

{{ stats.completed_lessons }}/{{ stats.total_lessons }} lessons completed
{{ "%.1f"|format(stats.completion_percentage) }}%
{% if stats.last_accessed_path %}
Last Accessed: {{ stats.last_accessed_path }} Continue
{% endif %}
{% macro render_tree_node(node, depth=0) %}
๐Ÿ“ {{ node.name }} {{ (node.children|length + node.lessons|length) }} items
{% if node.children or node.lessons %} {% endif %}
{% if node.children or node.lessons %}
{% for child_name, child_node in node.children.items() %} {{ render_tree_node(child_node, depth + 1) }} {% endfor %} {% for lesson in node.lessons %} {% set lesson_relative_path = lesson.path|replace('\\', '/')|replace(course.path|replace('\\', '/'), '')|replace('//', '/')|replace('/', '', 1) %} {% set percent_watched = 100 if lesson.completed else (((100 * lesson.progress_seconds / lesson.duration_seconds)|round|int) if (lesson.duration_seconds and lesson.progress_seconds) else 0) %}
{% if lesson.lesson_type == 'video' %}๐ŸŽฅ {% elif lesson.lesson_type == 'audio' %}๐ŸŽต {% elif lesson.lesson_type == 'quiz' %}๐Ÿ“ {% elif lesson.lesson_type == 'mixed' %}๐Ÿ“ฆ {% else %}๐Ÿ“„{% endif %} {{ lesson.title }}
{{ lesson.lesson_type|title }} {% if lesson.completed %} โœ“ {% elif percent_watched %} {{ percent_watched }}% watched {% else %} โ—‹ {% endif %}
{% if percent_watched %}
{% endif %}
{% endfor %}
{% endif %}
{% endmacro %} {{ render_tree_node(course.root_node) }}
{% else %} {% if recent_views %}

๐Ÿ• Recently Viewed

{% for view in recent_views %}
โ–ถ๏ธ {{ view.lesson_title }}
{% if view.completed %} โœ“ {% elif view.percent_watched %} {{ view.percent_watched }}% watched {% endif %} {{ view.course_name }}{% if view.viewed_display %} ยท {{ view.viewed_display }}{% endif %}
{% if view.percent_watched %}
{% endif %}
{% endfor %}
{% endif %}

Your Courses

{% endif %}