Changelog
Follow up on the latest improvements and updates.
RSS
new
improved
Interactive Video V1.2.2
NEW
📢
Activity completion condition "Watch till the end"
You can now set the interactive video as complete when the learner reaches the end of the video.

***

Note:
This does not guarentee that learners watch the entire video as they can still skip or seek to the end of the video. If you want to track percentage watched or set required segments, check out the paid interaction "Analytics". 😉📢
Bulk action: "Copy & Paste" across courses
In the previous release, we implemented the first bulk action -- delete. You can select multiple interactions and delete them at once.
In this release, we introduce a new action: copy and paste. What it does is it allows you to copy multiple interactions and paste them anywhere: in the same activity, in the same course or across courses.

How?
- First, enable the bulk action.
- Select the interactions you want to copy.
- Click the copy button. This should activate the paste button.
- Go to the destination activity. You should see that the paste button is activated.
- Click the paste button to proceed.
📢
Player method: isMuted()
Use isMuted() to check if the player is muted.
UPDATE
- Get rid of custom.css introduced in 1.1. Earlier we included the custom styles in custom.css because Moodle's RTL compiler had (still has) serious problems compiling modern CSS (clustering, @container, etc.) in the styles.css file. Importing custom.css into styles.css fixed these problems and we can still use the modern CSS, however, this caused a new issue with Moodle instances with sub-folder installation (e.g., moodle.com/lms). So our current solution is putting all the style codes in the styles.css file, use modern CSS for dir:ltr and fallback styles for dir:rtl.
new
improved
Interactive Video V1.1.6
📢
Resumable H5P Content State
- With this new update, H5P content state/progress can be saved and resumed. This feature is added at the interaction level, meaning it can be turned on or off per interaction as opposed to the course/site level. Look for this option in the advanced section. By default, this option is turned off.

- When this option is enabled, a log is created when each learner interacts with the H5P content. The log is updated with the state data (aka user content data) and saved to the database table when the interaction is dismissed or closed. When the interaction is relaunched, we'll attempt to get the relevant log. If the log exists, we'll show a confirmation dialogue in which the learner can choose to resume or start from the beginning.

- Also comes with the feature is the ability to view the learner's response on the report page. When the state saving is enabled, teachers can click on the report cell (see below) to launch the content with the submitted response. This response is final and does not change after the learner re-attempts the content.

- Technical Implementation:How is this feature implemented?
Most of the standard H5P content types can restore the state/progress, while some do not implement it intentionally. However, it's up to the LMS to implement the saving and resuming process. Unfortunately, Moodle does not implement this in its core H5P. After some research and testing, we learned that state saving can be turned on by modifying the H5PIntegration class. Here are the steps:
- First, we check if the specific H5P Content has state saving enabled by the teacher. If so, we're attempting to get the existing state (aka log) from the database.
- If the learner chooses to resume the content from the previous state, we're going to keep the log as is; otherwise, we use log=''.
- As soon as the interaction is launched, we use requestAnimationFrame()to detect theH5PIntegrationclass from the iframe. As soon as the class is found (before the.h5p-initializedCSS class is applied to the DOM), we have to enable state saving by changingH5PIntegration.saveFreqfromfalseto1, meaning we want the state to be saved every second. This does not necessarily mean the state will be saved in the database every second. The state data is updated inH5PIntegration.contents[id].contentUserData[0].state.
- Now we use the log value as the default state. H5PIntegration.contents[id].contentUserData[0].state = log.
- And just like that, the state saving is ready.
- When the interaction is closed, dismissed, or refreshed, we check the value from H5PIntegration.contents[id].contentUserData[0].stateand save it to the database.
📢
Lockable Chapter
- Chapters can now be locked until a condition is met. The available conditions are:
- Until all interactions in the previous chapter are complete
- Until all interactions in all previous chapters are complete
- Until the interactive video activity is complete (based on the activity completion condition)
- When a chapter is locked, all interactions within that chapter are temporarily removed.

new
fixed
Interactive Video V1.1.5
Added
- Ability to check for the interaction type updates from the settings page. Links to the buy me coffee page for the plugin will be provided.
- Use options.isCompleted to check if the Interactive Video is completed. This will be used in the future to check if the video is completed or not.
- New paid interactions: Interactive Transcript and SCORM Content.
Fixed
- The divider line is not shown correctly.
- Remove duplicate code blocks.
Note
- We've been able to trick YouTube into not displaying the related videos when the video is paused. However, it appears that YouTube has changed its behavior, and the trick might not work under some circumstances.
new
improved
fixed
Core
Free
Interactive Video V1.1.2
Added
- Setting for selecting the profile fieldsfor the report
- Ability todelete multiple completion records
- Ability to delete completion dataper interaction per user
- Ability to filter the report data

- Support for HLS and DASHvideos (VOD and Live)
- Support for YouTube live video
Updated
- Use $DB->get_in_or_equal() to improve security.
Fixed
- mod_interactivevideo_core_calendar_provide_event_action
- Deleting an interaction does not clear and rebuild the cache
new
improved
fixed
Core
Sub-plugin
Free
Interactive Video V1.1
Version 1.1
brought several new exciting and super useful features and updates. The main focus is on improving performance and usability, especially when editing the interactive video instance and its interaction items. 📢 I recently relocated the additional interaction types to my buymeacoffee page. Each interaction type now has its dedicated page/post with a description and how-to video. You can still find and download these interaction types on my GitHub page, although it might be easier for you to get them from buymeacoffee if you're not familiar with GitHub, and it also allows me to keep track of the number of downloads for each interaction type. No payment is required for the free interaction types although you will be required to enter your (valid or fake) name and email address at checkout.
Be warned:
This is going to be a lengthy post!Added
🆕
New capabilities
- Two new capabilities: mod/interactivevideo:manageandmod/interactivevideo:editreport. (Now, only those withmod/interactivevideo:editreportcan remove the learner's completion data. Those withmod/interactivevideo:viewreportnow have read-only access.)
🆕
Management page
- Instructors (with mod/interactivevideo:managecapability) can nowset up the course-level settingsfor interactive video instances that override the site-level settings on the management page. (Admin must enable this setting in the site administration first). Any new interactive video instance in the course will use these settings. That also includes the instances that are added in bulk using the CSV file as well.
- Instructors (with mod/interactivevideo:managecapability) can nowmanage the interactive video instanceson the management page (e.g. bulk reset the appearance and behavior settings, quick edit the interactive video instance, etc.).
To go to the management page, click the "
More
" menu on the course page. Then choose "Manage interactive videos
".
🆕
Quick actions
- Ctrl/Cmd + Clickon the setting link (gear icon) on the navigation bar (in distraction-free mode) to launchthe quick settings form.

- Instructor can quickly edit the interactive videodirectly on the course page byctrl/cmd + clicking on the edit icon.
- Instructor can quickly view the reportfor the interaction video directly on the course page byctrl/cmd + clicking on the report icon.

🆕
Dismissible and skippable
- When adding an interaction to the video, the instructor can uncheck the "dismissible" box to prevent learners from dismissing or closing the interactionbefore completing it. A notification will be displayed to warn the learners when they click the close button.
- Similarly, unchecking the "skippable" box will prevent learners from watching the proceeding part of the videowithout completing the interaction first.

🆕
Required minimum time
- Previously, this option was available for the "Mark as complete manually" only. Now, it is also available for the "View" condition as well. This means the instructor can set a required time for learners to spend on the interaction before it's considered "viewed". Use cases: read a PDF document for at least 5 minutes, listen to a podcast for at least 3 minutes, etc.

🆕
Content Bank Item & H5P Content
- These two interaction types get new advanced settings. The instructor can set the behavior for when the learners receive a failing or passing grade. For instance, the instructor can set the video to go to a specific time when the grade is below 50% and/or display a message.

🆕
More
- When a reminder is set in the activity settings, the interactive video will be displayed on the timeline blockon the dashboard.


- New site settings: Enable course-level settingsandAllow custom theme


- Ability for interaction plugins to run theinitmethod on the report page. To do this, the interaction plugin must setinitonreportproperty totrue.
Updated
- Interaction items are now cachedusing Moodle's cache API (MUC). This reduces the number of database queries and tremendously improves the performance. Cached data is updated only when the instructor makes changes to the interaction items.
- posterimagecolumn will alwaysstore the original poster image URLfrom the video even when a custom poster image is used. This allows a quick reset when required.
- Poster images are now lazy-loaded.
- Drawer navigations are now color-coded.Green (success) for completed interactions, red (danger) for incomplete interactions, and gray (secondary) for interactions without completion tracking.

- Improve time-spent tracking accuracyespecially when multiple interactions are displayed on the drawer. Time spent is now calculated only when the interaction is active and the video is paused.
- Change how preview mode and editing mode are detected. Previously, body classes were used, which was not 100% reliable since body classes can be altered. Now, preview mode and editing mode are properties in each interaction item based on the URL parameter preview=1 & capability mod/interactivevideo:edit.
Fixed
- When clicking on the participant's name on the report table, the user profile is shown in the user context as opposed to the desired course context. The profile page is now open in a new tab instead of the current tab.
- When "Display description on course page" box was checked, and the activity was set to display inline on the course page, the unstyled card was also displayed on the Moodle mobile app. Now, only the description is shown.
- When the completion condition was set to "Add requirements" (automatic completion) and no requirement was selected, the form was submitted without any validation errors. Now, at least one requirement must be set.
new
improved
fixed
Core
Free
Interactive Video V1.0.3
Added
- Two URL parameters to control the player appearance: dmfor dark mode anddffor distraction-free mode. Example:https://yourmoodlesite.com/mod/interactivevideo/view.php?id=1&dm=1&df=1;
- Allow extension plugins to include js methods on the mod_form. To enable this, the plugin must add an element on the mod_form with the class '.requirejs' and the data attribute data-pluginvalue as the amd module name. Example:<div class="requirejs" data-plugin="local_ivanalytics/main"></div>. The plugin must implement the methodmformto add the required JS code.
- convertHMSToSecondsin the base class to convert HH:MM:SS/MM:SS/SS to seconds.
- Ability to lock the top navigation when watching the video on a modal on the course page.
- checkautoplayto pre-check if the browser allows autoplay video on mute. Useplayer.allowAutoplayto check.
- New events: interactionrefresh(after the refresh button is clicked),iv:autoplayBlocked(as soon as the player methodloadruns.)
- activeclass to#messageelement of the current/visible interaction.
Fixed
- Player didn't fire ivplayerReadyevent if the browser blocked autoplay.
- Share-moment link included embed=1if the link was created from the modal.
- onPausedmethod was not implemented onbeforeunloadevent, resulting in the watched time not being saved.
Updated
- Spotify player sometimes shows the preview version of the music tracks depending on the browser and user login. In this case, the interactions might be cut off. So, when the player is in preview mode, users will now get an error message before the player is destroyed.
- Kill all client-side background processes and event listeners if the video is invisible and paused for 30 minutes on the view page and 10 minutes on the interactions page. If the video already ends, the processes will be killed after 5 minutes of inactivity.
- Get processed data from the server only once for each interaction. Processed data will be saved to this.cache object with the annotation id. When the interaction is relaunched in the same session, the cached version will be used; therefore, releasing some burden from the server. This applies to the view page only. On the interaction page, new data is fetched every time the interaction is launched.
- Notify users if the browser blocks autoplay and encourage them to allow it on the current site.
- Kill the interactive video if autoplay is blocked on the Brave browser. (We'll re-enable it in the future when the Brave browser stops overly blocking the playmethod.)
- Improve the ability for other plugins to extend the mod_form and completion conditions/states, and more importantly, make sure removing or disabling the related plugins does not cause any completion issues.
- Improve accuracy in calculating the time spent on interaction. For instance, resume counting when the interaction is relaunched and pause counting when the interaction is no longer active (e.g. activity closed or video playing).
- Right-click on the timestamp on the interaction list to quick-edit the interaction's timestamp. Right-click on the input to set the value to the current time.
- Minor accessibility/UI/UX improvements
improved
fixed
Interactive Video V1.0.2
Fixed
- Custom start time for Spotify episode
- Timestamp column width is not respected on Safari.
- Totaltimeis undefined in some circumstances.
- When the video restarts, the annotation that has timestamp=starttimeis skipped.
- Individual completion record is not deleted from the report page on Moodle 4.1.
- Rumble's isPlayingmethod always returns true.
Updated
- Improve error handling: remove/hide elements above the video to show the error screen (e.g. YouTube video no longer available)
- Only get posterImageand title when on editing form (opts.editform)
- If the video is already paused, do not pause again if not necessary.
- Reset viewAnnowhen the video restarts.
- Increase frequency for Spotify and PeerTube since their time update interval is longer than others.
- PeerTube: use playbackStatusChangeto check/dispatch the pause state.
- PeerTube: ensure video resets to start time before dispatching iv:playerReady.
- Wistia: get annotation data from the database only after the password is validated.
improved
fixed
Core
Free
Interactive Video V1.0.1
Fixed
- Dailymotion video and SoundCloud audio played from the start after it ended.
- iv:playerReadyfired twice for Wistia video when password-protected.
- Destroy method didn't work correctly on SoundCloud/Spotify.
Updated
- Resize player iframe for SoundCloud/Spotify.
- Add player type to body class.
- Add a key icon to the poster image on the card if video is password-protected
- Only auto-update the video end time if it is 0 or undefined.
new
Core
Sub-plugin
Free
1st Stable Release
Added
- Tutorial video for each interaction type.
- Forward and rewind buttons on the editor timeline.
- Full Privacy API implementation.
- New placeholder columns in interactivevideo_itemstable:intg1,intg2andintg3.
- New column in interactivevideo_completion:lastviewedfor last watched timestamp
- Support for Panopto, SoundCloud, Spotify, PeerTube, Kinescope, SproutVideo, Rutube, and Rumble (Site admin must select them in the site settings to enable them.)
- New appearance setting: Square poster image. If your poster image is a square, check this option to display it nicely on the activity card.
Fixed
- Column names startandendare reserved keywords in MySQL, Oracle, and PostgreSQL. Changed tostarttimeandendtimerespectively.
- Fixed SQL in backup API for PostgreSQL support.
- Skipped segment at the end of the video prevents displaying the end screen and onEnded event.
- requiremintimecolumn is not backed up.
- When the "enabled video types" setting is set to html5videoandvideolink, the URL input on the mod_form is hidden.
- The end screen is not shown on some occasions.
- Interactions repeatedly open if they are put too close to one another (e.g. 0.1s).
- Minor fixes
Updated
- Add title attribute to buttons for accessibility improvement
- Use gradebookrolesfor the report. Previously, it was set toroleid=5.
- Update query for group report to include only users in gradebookroles.
- Prevent auto-playing if the start screen has content.
- The interaction drawer is removed when the video is replayed.
- Save the last viewed time in interactivevideo_completion rather than the browser's cache.
- On the activity editing form, right-click on start time or end time to set the value to the current video time.
- On the activity editing form, when changing the start time or end time, the video will seek the specified timestamp.
- Update player scripts to ensure the video state is updated (e.g. isEnded,isPaused,isPlaying) as quickly as possible.
- Ensure the video is paused before launching the interaction. The player must return isPaused = trueorisPlaying = false;
- Performance/memory improvement on playback.
- Set component=mod_interactivevideoon H5P player to enableH5PIntegration.reportingIsEnabled.
- Change Vimeo regex to allow more URL variations including custom URLs (e.g. vimeo.com/{username}/{customtext})
- Display tips on activity editing form.