[DRAFT] Architecture Doc for Technical Discovery React Video Player
- 1 List of artifacts
- 2 Frontend for video player (React component to wrap Video.js)
- 2.1 Video.js FAQ
- 3 Video.js Options
- 4 Skins / theming:
- 5 Buffering issues analytics
- 6 CDN
- 7 Video Player Backend
- 8 Transcripts
- 9 Public sharing?
- 10 Features that might be considered for deprecation in old Video Block
- 11 Architecture Decisions
List of artifacts
Whiteboard: https://excalidraw.com/#room=bb5ec8f1a9402a2ef3b5,QXIMmn8cmiQV9WhcTkQc-w
ADR #1: Introduce React based video player into video block https://github.com/openedx/edx-platform/pull/33671
ADR#2: Gain Feature parity using Video.js functionality TBD
NFR: New video player architecture (React-based Video Player)
Frontend for video player (React component to wrap Video.js)
Video.js FAQ
https://videojs.com/guides/faqs/#q-does-videojs-work-with-react
Video.js Options
https://videojs.com/guides/options/
Existing Implementation for Video.js in OeX codebase
Video.js Documentation: https://docs.videojs.com/
Existing video.js implementation:
HLS support vs YouTube support https://github.com/openedx/frontend-app-learner-portal-enterprise/blob/master/src/components/video/VideoPlayer.jsx#L18C15-L18C15
YouTube: "videojs-youtube": "3.0.1"
HLS m3u8 - application/x-mpegURL
Adding video.js to studio PR:
Frontend concept: https://github.com/openedx/edx-platform/blob/14d2cc8f95f22e2a9f4ab59d3fe5d558af06fdfb/docs/concepts/frontend/javascript.rst#L43
Rendering of the player: https://github.com/openedx/edx-platform/blob/14d2cc8f95f22e2a9f4ab59d3fe5d558af06fdfb/xmodule/video_block/video_block.py#L246
Webpack config
(legacy pr)
Work with translations for video player
Skins / theming:
Use design tokens?
Extensions for video.js:
Buffering issues analytics
Is not possible out of the box, the custom approach for monitoring can be done
Courses for beta testing.
Under feature flag
Video Bumper ->
FEATURES.get('ENABLE_VIDEO_BUMPER')
CDN
https://github.com/openedx/edx-platform/blob/master/xmodule/video_block/video_utils.py#L39C5-L39C2
Video Player Backend
Transcripts
Current installation process for video block:
Included in setup.py https://github.com/openedx/edx-platform/blob/master/setup.py#L36
Public sharing?
Video block hooks:
save_user_state
Default video controls
Optional Features (waffles and Flags) in Old Video block
Flag | Description |
---|---|
SHOW_BUMPER_PERIODICITY | - Current time minus periodicity must be greater that last time viewed |
ENABLE_VIDEO_BUMPER | Check if bumper enabled. - Feature flag ENABLE_VIDEO_BUMPER should be set to True
- Do not show again button should not be clicked by user.
- Current time minus periodicity must be greater that last time viewed
- edxval_api should be presented |
AUTOPLAY_VIDEOS |
|
ENABLE_AUTOADVANCE_VIDEOS | # This is the setting that controls whether the autoadvance button will be visible, not whether the
# video will autoadvance or not.
# For autoadvance controls to be shown, both the feature flag and the course setting must be true.
# This allows to enable the feature for certain courses only. |
FALLBACK_TO_ENGLISH_TRANSCRIPTS |
|
DEPRECATE_YOUTUBE (Waffle) |
Features that might be considered for deprecation in old Video Block
Feature | Description | Decision |
---|---|---|
|
|
|
|
|
|
Architecture Decisions
Comparison of introducing a new xBlock vs Refactoring existing Video Block to include several UI options.
Whiteboard: https://excalidraw.com/#room=bb5ec8f1a9402a2ef3b5,QXIMmn8cmiQV9WhcTkQc-w
High-level architecture:
Option 1:
Option 2:
Option 3:
Solution / Problem |
|
|
|
---|---|---|---|
| JS Refactoring is required to move out it from the edx-platform | Completely new frontend development, it’s not required to work with the legacy Video Player implementation | No need for existing JS refactoring, only new functionality will be added |
| For python only new code will be introduced in Video xBlock required for the Video.js implementation. Slight deprecation activities are possible. | The further development on existing backend in edx-platform is required. | It’s required to refactor existing backend to adjust the required functionality for the Video.js based player. New code may be added on top or replace existing functions and utilities. |
| NPM installation into MFEs may be a little bit complicated Usual PIP installation of the xBlock into OeX system | NPM installation is simple, following the current approach with frontend-component-* repositories. | NPM installation into MFEs may be also complicated In addition a mechanism for switching between new xBlock and old video block should be implemented. |
| Frontend and Backend packages will use the same tag using SemVer scheme. | Only Frontend component will have a frontend versioning. | Only new Frontend and New Backend will have SemVer versioning. |
ARD Draft and sources:
Single xblock for Old and New Player with Frontend and backend stored in monorepo
Use React.js in xblock environment
Discussion:
Proof of concept:
Build mechanisms for the xBlock:
Standalone FE: Webpack → NPM (registry) → SPA installation
xBlock FE (LMS, CMS): Static collection → React Renderer
xBlock BE: Setup.py(or pyproject.toml) → PIP install → xBlock runtime
Course Waffle flags: