Overview

Stream integration with Moodle enables:

  • Automatic sync of meeting recordings (Zoom, Teams, Unicko, etc.) to the Stream server.
  • Automatic embedding of recordings in the relevant Moodle course (via the local_stream plugin).
  • Stream activity in a course — playlist and video player inside Moodle (via the mod_stream plugin).

The two plugins work together: local_stream handles the flow of recordings from the cloud; mod_stream displays videos from Stream to students.

Required plugins

  • local_stream — central integration (Local plugin) Syncs meetings and recordings, uploads to the Stream server, and embeds them in the course.
    GitHub – moodle-local_stream · Moodle.org
  • mod_stream — Stream activity (Activity module) Adds a «STREAM» activity to a course: playlist, embedded player, and automatic recording collection per course.
    GitHub – moodle-mod_stream · Moodle.org
Optional: the filter_stream plugin for embedding Stream links inside Moodle content (pages, labels). See filter_stream on Moodle.org.

Prerequisites

  • An up-to-date Moodle site with Site administrator permissions.
  • An active Stream server (e.g. https://stream.example.ac.il) with an API key (Account ID).
  • SSH/FTP or deployment access to the Moodle directory, or installation via the «Install plugins» interface.
  • For Zoom sync: a Zoom account with Cloud Recording and API credentials (OAuth / Server-to-Server, depending on your organization’s setup).

Moodle versions and Git branches

In moodle-mod_stream, the following branches are defined:

Moodle versionRecommended Git branch
Moodle 3.4 – 4.1MOODLE_401
Moodle 4.2MOODLE_402

For local_stream, use the master branch or a branch that matches your Moodle version (check the repository README).

Installation

Install local_stream first, then mod_stream.

Step 1 — Download the files

  1. Download a ZIP from GitHub (Code → Download ZIP) or clone:
    git clone https://github.com/mattan-d/moodle-local_stream.git
          git clone https://github.com/mattan-d/moodle-mod_stream.git
  2. For mod_stream, switch to the branch that matches your Moodle version (e.g. MOODLE_402).

Step 2 — Copy to Moodle directories

PluginPath on the Moodle server
local_streammoodle/local/stream/
mod_streammoodle/mod/stream/

Make sure the folder name is stream (lowercase) and that all plugin files sit directly inside it (including version.php).

Step 3 — Complete installation in Moodle

  1. Log in as a site administrator.
  2. Go to Site administration → Notifications.
  3. Moodle will detect the new plugins — click Continue and complete the database upgrade.
  4. Repeat for each plugin if you installed them one at a time.
Important: after the upgrade, purge Moodle caches: Site administration → Development → Purge all caches.

Stream server settings (VideoTube)

Before configuring the Moodle plugins, make sure the Stream system has an API key the plugins will use:

  1. Log in to System settings (/admin/settings) on the Stream server.
  2. Find the Account ID / API Key field (the value in $CONFIG->apikey).
  3. Copy the key — it will be entered in both Moodle plugins as Account ID.
  4. Ensure the Stream server URL is reachable from Moodle (HTTPS, no firewall blocking).

Configuring local_stream

Path: Site administration → Plugins → Local plugins → Stream

Main settings

  • Platform — choose the recording source:
    • Zoom — sync cloud recordings from Zoom.
    • Microsoft Teams — Teams recordings.
    • Unicko — via LTI (depending on your organization’s setup).
  • Stream server / API — Stream server URL and Account ID (API key).
  • Zoom API (when the platform is Zoom):
    • Client ID / Client Secret or JWT / Server-to-Server credentials — depending on the app type in Zoom Marketplace.
    • Cloud Recording must be enabled on the Zoom account.
  • Embed order — whether to place the recording activity below the original meeting activity (e.g. below Zoom).
  • Based grouping / duplicate handling — prevent embedding the same recording twice (by Zoom UUID).
  • Notifications (optional) — notify course participants when a new recording is embedded.

Connection test

After saving settings, use the connection status check (if available on the screen) to verify that Moodle can communicate with Stream and Zoom.

Zoom flow (summary)

  1. A lecturer creates a Zoom activity in a Moodle course.
  2. The meeting takes place with cloud recording enabled.
  3. A scheduled task in local_stream pulls the list of recordings.
  4. The recording is uploaded to Stream (via webservice/api.php) and/or a course activity is created with a link to watch it.

Configuring mod_stream

Path: Site administration → Plugins → Activity modules → Stream

Site-level settings

  • Stream API endpoint — base URL of the Stream server (e.g. https://stream.smkb.ac.il).
  • Account ID — the same API key as in local_stream and Stream settings.
  • Connection status — verify that Moodle can reach api2.php and retrieve the video list.
  • Defaults (version-dependent):
    • Whether to include audio / an audio player for certain courses.
    • Automatic recording collection mode for the activity.

What mod_stream does in a course

  • Adds a STREAM activity to the course.
  • Displays a playlist of videos from the Stream server (manual selection or automatic collection).
  • Sends limited user details (name, email, ID) to Stream for security, statistics, and view restrictions — according to Stream settings.

Scheduled tasks (Cron)

local_stream requires Moodle Cron to run:

  1. Go to Site administration → Server → Scheduled tasks.
  2. Find the task Embedded recordings (local_stream) — class local_stream\task\embed.
  3. Ensure it is enabled and runs at a suitable frequency (e.g. every 5–15 minutes, or hourly).
  4. Ensure Moodle Cron runs on the server (crontab):
    * * * * * php /path/to/moodle/admin/cli/cron.php

You can run it manually for testing:

php /path/to/moodle/admin/cli/scheduled_task.php --execute='\local_stream\task\embed'

Check the Moodle log for API errors (Zoom / Stream).

How it works

Downloading videos from Zoom cloud

Once local_stream is configured, the system connects to Zoom cloud, identifies recordings of meetings linked to Moodle courses, and uploads them to the Stream server. Recordings are centralized in one system for management, editing, and transcription.

Automatic embedding in the course

Synced videos are embedded automatically in the relevant course — the one from which the Zoom meeting was created. The lecturer does not need to upload files manually.

Stream activity for students

With mod_stream you can add a Stream activity with all course videos (including those collected automatically), arrange a playlist, and control availability.

Benefit: saves lecturers time and ensures content is centralized, managed, and accessible to students inside Moodle.

For lecturers (summary)

After the administrator has configured the plugins:

  1. Zoom + automatic recording — create a Zoom activity in the course, record to the cloud; after Zoom processing the recording will appear in the course (via local_stream).
  2. STREAM activity — in the course: «Add an activity or resource» → STREAM:
    • Set a title and description.
    • Enable «Recording collection» or choose videos manually from the Stream server.
    • Reorder the playlist by drag and drop.
    • Set open/close dates if needed.

Detailed lecturer guide: Quick guide for lecturers – STREAM in Moodle.

Creating questions from a video: Creating questions from a Stream video in Moodle.

Troubleshooting

IssueWhat to check
Recording does not appear in the course Cloud Recording in Zoom; local_stream\task\embed task enabled; Cron running; Zoom and Stream credentials.
«Account ID is missing» / API error Account ID in Moodle matches apikey on the Stream server; HTTPS reachable.
Titles / Hebrew displayed as ???? UTF-8 in Moodle and MySQL; latest Stream server update (charset fix in API).
Recording in the wrong course courseid / course name mapping in settings; Zoom meeting topic.
Duplicate recordings Enable «based grouping» / dedup in local_stream.
Empty mod_stream activity Connection to api2.php; user/lecturer has videos in Stream; video privacy (public/authenticated).

For advanced diagnosis: enable debug in Moodle, run the scheduled task manually, and check the log.