Changelog

Follow up on the latest improvements and updates.

RSS

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.
image
***
image
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.
image
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.
📢
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.
image
  • 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.
image
  • 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.
image
  • 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:
  1. 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.
  2. 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=''
    .
  3. As soon as the interaction is launched, we use
    requestAnimationFrame()
    to detect the
    H5PIntegration
    class from the iframe. As soon as the class is found (before the
    .h5p-initialized
    CSS class is applied to the DOM), we have to enable state saving by changing
    H5PIntegration.saveFreq
    from
    false
    to
    1
    , 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 in
    H5PIntegration.contents[id].contentUserData[0].state
    .
  4. Now we use the log value as the default state.
    H5PIntegration.contents[id].contentUserData[0].state = log
    .
  5. And just like that, the state saving is ready.
  6. When the interaction is closed, dismissed, or refreshed, we check the value from
    H5PIntegration.contents[id].contentUserData[0].state
    and save it to the database.
📢
Lockable Chapter
  • Chapters can now be locked until a condition is met. The available conditions are:
  1. Until all interactions in the previous chapter are complete
  2. Until all interactions in all previous chapters are complete
  3. 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.
image
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 fields
    for the report
  • Ability to
    delete multiple completion records
  • Ability to
    delete completion data
    per interaction per user
  • Ability to
    filter the report data
image
  • Support for
    HLS and DASH
    videos (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:manage
    and
    mod/interactivevideo:editreport
    . (Now, only those with
    mod/interactivevideo:editreport
    can remove the learner's completion data. Those with
    mod/interactivevideo:viewreport
    now have read-only access.)
🆕
Management page
  • Instructors (with
    mod/interactivevideo:manage
    capability) can now
    set up the course-level settings
    for 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:manage
    capability) can now
    manage the interactive video instances
    on 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
".
image
🆕
Quick actions
  • Ctrl/Cmd + Click
    on the setting link (gear icon) on the navigation bar (in distraction-free mode) to launch
    the quick settings form
    .
image
  • Instructor can quickly
    edit the interactive video
    directly on the course page by
    ctrl/cmd + clicking on the edit icon
    .
  • Instructor can quickly
    view the report
    for the interaction video directly on the course page by
    ctrl/cmd + clicking on the report icon
    .
image
🆕
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 interaction
    before 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 video
    without completing the interaction first.
image
🆕
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.
image
🆕
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.
image
🆕
More
  • When a reminder is set in the activity settings, the interactive video
    will be displayed on the timeline block
    on the dashboard.
image
image
  • New site settings:
    Enable course-level settings
    and
    Allow custom theme
image
image
  • Ability for interaction plugins to
    run the
    init
    method on the report page
    . To do this, the interaction plugin must set
    initonreport
    property to
    true
    .
Updated
  • Interaction items are now cached
    using 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.
  • posterimage
    column will always
    store the original poster image URL
    from 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.
image
  • Improve
    time-spent tracking accuracy
    especially 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:
    dm
    for dark mode and
    df
    for 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-plugin
    value as the amd module name. Example:
    <div class="requirejs" data-plugin="local_ivanalytics/main"></div>
    . The plugin must implement the method
    mform
    to add the required JS code.
  • convertHMSToSeconds
    in 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.
  • checkautoplay
    to pre-check if the browser allows autoplay video on mute. Use
    player.allowAutoplay
    to check.
  • New events:
    interactionrefresh
    (after the refresh button is clicked),
    iv:autoplayBlocked
    (as soon as the player method
    load
    runs.)
  • active
    class to
    #message
    element of the current/visible interaction.
Fixed
  • Player didn't fire
    ivplayerReady
    event if the browser blocked autoplay.
  • Share-moment link included
    embed=1
    if the link was created from the modal.
  • onPaused
    method was not implemented on
    beforeunload
    event, 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
    play
    method.)
  • 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
Fixed
  • Custom start time for Spotify episode
  • Timestamp column width is not respected on Safari.
  • Totaltime
    is undefined in some circumstances.
  • When the video restarts, the annotation that has
    timestamp=starttime
    is skipped.
  • Individual completion record is not deleted from the report page on Moodle 4.1.
  • Rumble's
    isPlaying
    method 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
    posterImage
    and title when on editing form (
    opts.editform
    )
  • If the video is already paused, do not pause again if not necessary.
  • Reset
    viewAnno
    when the video restarts.
  • Increase frequency for Spotify and PeerTube since their time update interval is longer than others.
  • PeerTube: use
    playbackStatusChange
    to 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:playerReady
    fired 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_items
    table:
    intg1
    ,
    intg2
    and
    intg3
    .
  • New column in
    interactivevideo_completion
    :
    lastviewed
    for 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
    start
    and
    end
    are reserved keywords in MySQL, Oracle, and PostgreSQL. Changed to
    starttime
    and
    endtime
    respectively.
  • Fixed SQL in backup API for PostgreSQL support.
  • Skipped segment at the end of the video prevents displaying the end screen and onEnded event.
  • requiremintime
    column is not backed up.
  • When the "enabled video types" setting is set to
    html5video
    and
    videolink
    , 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
    gradebookroles
    for the report. Previously, it was set to
    roleid=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 = true
    or
    isPlaying = false
    ;
  • Performance/memory improvement on playback.
  • Set
    component=mod_interactivevideo
    on H5P player to enable
    H5PIntegration.reportingIsEnabled
    .
  • Change Vimeo regex to allow more URL variations including custom URLs (e.g. vimeo.com/{username}/{customtext})
  • Display tips on activity editing form.