mirror of
https://github.com/mediacms-io/mediacms.git
synced 2026-02-04 06:22:59 -05:00
rem
This commit is contained in:
@@ -1,54 +0,0 @@
|
|||||||
# Changelog
|
|
||||||
|
|
||||||
All notable changes to the MediaCMS LTI Filter plugin will be documented in this file.
|
|
||||||
|
|
||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
||||||
|
|
||||||
## [1.0.0] - 2026-01-23
|
|
||||||
|
|
||||||
### Added
|
|
||||||
- Initial release of MediaCMS LTI Filter
|
|
||||||
- Automatic detection of MediaCMS video URLs in Moodle content
|
|
||||||
- Transparent LTI 1.3 authentication for embedded videos
|
|
||||||
- Support for `/view?m=TOKEN` and `/embed?m=TOKEN` URL patterns
|
|
||||||
- Configurable MediaCMS URL setting
|
|
||||||
- Configurable LTI tool selection from Moodle's LTI tools
|
|
||||||
- Configurable iframe dimensions (width/height)
|
|
||||||
- Auto-submit form mechanism for seamless LTI launch
|
|
||||||
- Support for Moodle 5.0+
|
|
||||||
- Privacy provider implementation for GDPR compliance
|
|
||||||
- Comprehensive documentation (README, INSTALLATION guide)
|
|
||||||
- Multi-language support framework (English strings included)
|
|
||||||
|
|
||||||
### Security
|
|
||||||
- Only processes content for logged-in users (no guest access)
|
|
||||||
- Uses Moodle's LTI 1.3 security framework
|
|
||||||
- Passes user context via secure `login_hint` parameter
|
|
||||||
- All URLs properly escaped and sanitized
|
|
||||||
|
|
||||||
## [Unreleased]
|
|
||||||
|
|
||||||
### Planned Features
|
|
||||||
- Support for additional MediaCMS URL patterns
|
|
||||||
- Customizable iframe styling options
|
|
||||||
- Cache optimization for LTI configuration
|
|
||||||
- Support for playlist URLs
|
|
||||||
- Admin interface to preview filter behavior
|
|
||||||
- Bulk URL conversion tool
|
|
||||||
- Statistics/usage tracking
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Version History
|
|
||||||
|
|
||||||
- **1.0.0** (2026-01-23) - Initial release
|
|
||||||
|
|
||||||
## Upgrade Notes
|
|
||||||
|
|
||||||
### Upgrading to 1.0.0
|
|
||||||
- First release, no upgrade path needed
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
For detailed information about each release, see the Git commit history.
|
|
||||||
@@ -1,223 +0,0 @@
|
|||||||
# Example Output - How the Filter Works
|
|
||||||
|
|
||||||
## Input (What users paste)
|
|
||||||
|
|
||||||
```
|
|
||||||
https://deic.mediacms.io/view?m=KmITliaUC
|
|
||||||
```
|
|
||||||
|
|
||||||
## Output (What gets rendered)
|
|
||||||
|
|
||||||
### HTML Generated by Filter
|
|
||||||
|
|
||||||
```html
|
|
||||||
<div class="mediacms-lti-embed">
|
|
||||||
<!-- The iframe where the video will load -->
|
|
||||||
<iframe
|
|
||||||
id="mediacms_lti_65b8f9a3e4c21"
|
|
||||||
width="960"
|
|
||||||
height="540"
|
|
||||||
frameborder="0"
|
|
||||||
allowfullscreen
|
|
||||||
style="max-width: 100%;">
|
|
||||||
</iframe>
|
|
||||||
|
|
||||||
<!-- Auto-submit form that initiates LTI authentication -->
|
|
||||||
<form
|
|
||||||
id="mediacms_lti_65b8f9a3e4c21_form"
|
|
||||||
action="https://deic.mediacms.io/lti/oidc/login/"
|
|
||||||
method="POST"
|
|
||||||
target="mediacms_lti_65b8f9a3e4c21"
|
|
||||||
style="display: none;">
|
|
||||||
|
|
||||||
<!-- LTI Platform Issuer (your Moodle URL) -->
|
|
||||||
<input type="hidden" name="iss" value="https://your-moodle-site.com" />
|
|
||||||
|
|
||||||
<!-- LTI Client ID from tool configuration -->
|
|
||||||
<input type="hidden" name="client_id" value="ABC123XYZ" />
|
|
||||||
|
|
||||||
<!-- Current user's Moodle ID -->
|
|
||||||
<input type="hidden" name="login_hint" value="42" />
|
|
||||||
|
|
||||||
<!-- Where to go after authentication, with video token -->
|
|
||||||
<input type="hidden" name="target_link_uri" value="https://deic.mediacms.io/lti/launch/?media_friendly_token=KmITliaUC" />
|
|
||||||
</form>
|
|
||||||
|
|
||||||
<!-- JavaScript to auto-submit the form immediately -->
|
|
||||||
<script>
|
|
||||||
document.getElementById('mediacms_lti_65b8f9a3e4c21_form').submit();
|
|
||||||
</script>
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
## What Happens Step-by-Step
|
|
||||||
|
|
||||||
### 1. User Views Page
|
|
||||||
```
|
|
||||||
User opens Moodle page containing the MediaCMS URL
|
|
||||||
↓
|
|
||||||
Filter detects: https://deic.mediacms.io/view?m=KmITliaUC
|
|
||||||
↓
|
|
||||||
Extracts video token: KmITliaUC
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. HTML Generation
|
|
||||||
```
|
|
||||||
Filter generates:
|
|
||||||
- Iframe with unique ID
|
|
||||||
- Hidden form with LTI parameters
|
|
||||||
- JavaScript to auto-submit
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. LTI Authentication Flow
|
|
||||||
```
|
|
||||||
Form submits to MediaCMS OIDC endpoint
|
|
||||||
↓
|
|
||||||
MediaCMS receives:
|
|
||||||
- iss: https://your-moodle-site.com
|
|
||||||
- client_id: ABC123XYZ
|
|
||||||
- login_hint: 42 (user's Moodle ID)
|
|
||||||
- target_link_uri: https://deic.mediacms.io/lti/launch/?media_friendly_token=KmITliaUC
|
|
||||||
↓
|
|
||||||
MediaCMS redirects to Moodle's auth endpoint
|
|
||||||
↓
|
|
||||||
Moodle validates and creates JWT token
|
|
||||||
↓
|
|
||||||
Moodle POSTs JWT back to MediaCMS
|
|
||||||
↓
|
|
||||||
MediaCMS validates JWT and creates session
|
|
||||||
↓
|
|
||||||
MediaCMS redirects to /lti/embed/KmITliaUC/
|
|
||||||
↓
|
|
||||||
MediaCMS checks permissions and redirects to /view?m=KmITliaUC
|
|
||||||
↓
|
|
||||||
Video loads in iframe!
|
|
||||||
```
|
|
||||||
|
|
||||||
### 4. User Experience
|
|
||||||
```
|
|
||||||
User sees:
|
|
||||||
1. Page loads
|
|
||||||
2. Empty iframe appears briefly (< 1 second)
|
|
||||||
3. Video player loads inside iframe
|
|
||||||
4. Video starts playing
|
|
||||||
```
|
|
||||||
|
|
||||||
## Real-World Examples
|
|
||||||
|
|
||||||
### Example 1: Course Page
|
|
||||||
|
|
||||||
**Input:**
|
|
||||||
```html
|
|
||||||
<p>Welcome to the course! Watch this introduction:</p>
|
|
||||||
<p>https://deic.mediacms.io/view?m=KmITliaUC</p>
|
|
||||||
```
|
|
||||||
|
|
||||||
**Output:**
|
|
||||||
```html
|
|
||||||
<p>Welcome to the course! Watch this introduction:</p>
|
|
||||||
<div class="mediacms-lti-embed">
|
|
||||||
<iframe id="mediacms_lti_..." width="960" height="540" ...></iframe>
|
|
||||||
<form id="mediacms_lti_..._form" ...>...</form>
|
|
||||||
<script>...</script>
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Example 2: Multiple Videos
|
|
||||||
|
|
||||||
**Input:**
|
|
||||||
```html
|
|
||||||
<h2>Week 1 Videos</h2>
|
|
||||||
<p>Lecture 1: https://deic.mediacms.io/view?m=ABC123</p>
|
|
||||||
<p>Lecture 2: https://deic.mediacms.io/view?m=XYZ789</p>
|
|
||||||
```
|
|
||||||
|
|
||||||
**Output:**
|
|
||||||
```html
|
|
||||||
<h2>Week 1 Videos</h2>
|
|
||||||
<p>Lecture 1:
|
|
||||||
<div class="mediacms-lti-embed">
|
|
||||||
<iframe id="mediacms_lti_abc_..." ...></iframe>
|
|
||||||
...
|
|
||||||
</div>
|
|
||||||
</p>
|
|
||||||
<p>Lecture 2:
|
|
||||||
<div class="mediacms-lti-embed">
|
|
||||||
<iframe id="mediacms_lti_xyz_..." ...></iframe>
|
|
||||||
...
|
|
||||||
</div>
|
|
||||||
</p>
|
|
||||||
```
|
|
||||||
|
|
||||||
Each video gets its own iframe with its own LTI authentication!
|
|
||||||
|
|
||||||
### Example 3: Mixed Content
|
|
||||||
|
|
||||||
**Input:**
|
|
||||||
```html
|
|
||||||
<p>Check out this resource:</p>
|
|
||||||
<p><a href="https://example.com">Regular link</a></p>
|
|
||||||
<p>https://deic.mediacms.io/view?m=KmITliaUC</p>
|
|
||||||
<p>Another link: https://google.com</p>
|
|
||||||
```
|
|
||||||
|
|
||||||
**Output:**
|
|
||||||
```html
|
|
||||||
<p>Check out this resource:</p>
|
|
||||||
<p><a href="https://example.com">Regular link</a></p>
|
|
||||||
<div class="mediacms-lti-embed">
|
|
||||||
<iframe id="mediacms_lti_..." ...></iframe>
|
|
||||||
...
|
|
||||||
</div>
|
|
||||||
<p>Another link: https://google.com</p>
|
|
||||||
```
|
|
||||||
|
|
||||||
Only MediaCMS URLs are converted! Other URLs remain unchanged.
|
|
||||||
|
|
||||||
## Performance Notes
|
|
||||||
|
|
||||||
- **Fast Detection**: Regex-based URL matching is extremely fast
|
|
||||||
- **No Database Queries**: Configuration is cached
|
|
||||||
- **Lazy Loading**: Videos only load when iframe initiates LTI flow
|
|
||||||
- **Minimal Overhead**: Each conversion adds ~500 bytes of HTML
|
|
||||||
|
|
||||||
## Security Notes
|
|
||||||
|
|
||||||
- **User Context**: Each iframe uses the current user's Moodle ID
|
|
||||||
- **CSRF Protected**: LTI flow includes state/nonce validation
|
|
||||||
- **Domain Restricted**: Only configured MediaCMS domain is processed
|
|
||||||
- **Guest Users**: Filter doesn't run for guest users (returns original text)
|
|
||||||
|
|
||||||
## Browser Compatibility
|
|
||||||
|
|
||||||
Works in all modern browsers:
|
|
||||||
- ✅ Chrome/Edge (Chromium)
|
|
||||||
- ✅ Firefox
|
|
||||||
- ✅ Safari
|
|
||||||
- ✅ Mobile browsers (iOS Safari, Chrome Mobile)
|
|
||||||
|
|
||||||
## Troubleshooting Examples
|
|
||||||
|
|
||||||
### If URL Doesn't Convert
|
|
||||||
|
|
||||||
**Check these patterns:**
|
|
||||||
```
|
|
||||||
✅ https://deic.mediacms.io/view?m=KmITliaUC
|
|
||||||
✅ https://deic.mediacms.io/embed?m=KmITliaUC
|
|
||||||
❌ https://deic.mediacms.io/view/KmITliaUC (no ?m= parameter)
|
|
||||||
❌ http://other-domain.com/view?m=KmITliaUC (wrong domain)
|
|
||||||
```
|
|
||||||
|
|
||||||
### If Video Doesn't Load
|
|
||||||
|
|
||||||
**Check browser console:**
|
|
||||||
```javascript
|
|
||||||
// Expected: No errors
|
|
||||||
// If you see CORS errors: Check MediaCMS iframe settings
|
|
||||||
// If you see 403 Forbidden: Check LTI configuration
|
|
||||||
// If you see 404: Check MediaCMS URL in settings
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**This is what makes the transparent LTI authentication possible!**
|
|
||||||
@@ -1,105 +0,0 @@
|
|||||||
# Quick Installation Guide - MediaCMS LTI Filter
|
|
||||||
|
|
||||||
## Prerequisites
|
|
||||||
|
|
||||||
- Moodle 5.0 or later
|
|
||||||
- MediaCMS instance with LTI 1.3 support
|
|
||||||
- LTI External Tool already configured in Moodle for MediaCMS
|
|
||||||
|
|
||||||
## Installation Steps
|
|
||||||
|
|
||||||
### 1. Install the Plugin
|
|
||||||
|
|
||||||
**Option A: Upload via Moodle UI**
|
|
||||||
```
|
|
||||||
1. Log in as Moodle admin
|
|
||||||
2. Site administration → Plugins → Install plugins
|
|
||||||
3. Upload the filter_mediacmslti.zip file
|
|
||||||
4. Click "Install plugin from the ZIP file"
|
|
||||||
5. Complete the installation wizard
|
|
||||||
```
|
|
||||||
|
|
||||||
**Option B: Manual Installation**
|
|
||||||
```bash
|
|
||||||
# Copy plugin to Moodle filter directory
|
|
||||||
cp -r filter_mediacmslti /path/to/moodle/filter/
|
|
||||||
|
|
||||||
# Set permissions
|
|
||||||
chown -R www-data:www-data /path/to/moodle/filter/filter_mediacmslti
|
|
||||||
|
|
||||||
# Visit Moodle notifications page to complete installation
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Configure the Filter
|
|
||||||
|
|
||||||
```
|
|
||||||
1. Site administration → Plugins → Filters → MediaCMS LTI Filter
|
|
||||||
2. Set "MediaCMS URL" to your MediaCMS instance (e.g., https://deic.mediacms.io)
|
|
||||||
3. Select your LTI tool from the "LTI External Tool" dropdown
|
|
||||||
4. Optionally adjust iframe width/height (defaults: 960x540)
|
|
||||||
5. Click "Save changes"
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. Enable the Filter
|
|
||||||
|
|
||||||
```
|
|
||||||
1. Site administration → Plugins → Filters → Manage filters
|
|
||||||
2. Find "MediaCMS LTI Embed" in the list
|
|
||||||
3. Change from "Disabled" to "On"
|
|
||||||
4. Click "Save changes"
|
|
||||||
```
|
|
||||||
|
|
||||||
### 4. Test It!
|
|
||||||
|
|
||||||
```
|
|
||||||
1. Create a Page resource in any course
|
|
||||||
2. Paste a MediaCMS URL: https://deic.mediacms.io/view?m=KmITliaUC
|
|
||||||
3. Save the page
|
|
||||||
4. View the page - video should embed automatically!
|
|
||||||
```
|
|
||||||
|
|
||||||
## Configuration Quick Reference
|
|
||||||
|
|
||||||
| Setting | Example Value | Description |
|
|
||||||
|---------|---------------|-------------|
|
|
||||||
| MediaCMS URL | `https://deic.mediacms.io` | Your MediaCMS instance (no trailing slash) |
|
|
||||||
| LTI External Tool | MediaCMS | Select from dropdown |
|
|
||||||
| Iframe Width | 960 | Width in pixels |
|
|
||||||
| Iframe Height | 540 | Height in pixels |
|
|
||||||
|
|
||||||
## Troubleshooting Quick Fixes
|
|
||||||
|
|
||||||
**URLs not converting?**
|
|
||||||
- Check filter is "On" in Filters → Manage filters
|
|
||||||
- Verify MediaCMS URL matches the URLs you're pasting
|
|
||||||
- Ensure user is logged in (not guest)
|
|
||||||
|
|
||||||
**Video not loading?**
|
|
||||||
- Check LTI tool is configured correctly
|
|
||||||
- Verify client_id and issuer match between Moodle and MediaCMS
|
|
||||||
- Check browser console for errors
|
|
||||||
|
|
||||||
**Need more help?**
|
|
||||||
See full README.md for detailed troubleshooting and technical documentation.
|
|
||||||
|
|
||||||
## What URLs Are Supported?
|
|
||||||
|
|
||||||
The filter automatically detects these patterns:
|
|
||||||
- `https://deic.mediacms.io/view?m=TOKEN`
|
|
||||||
- `https://deic.mediacms.io/embed?m=TOKEN`
|
|
||||||
|
|
||||||
Replace `deic.mediacms.io` with your configured MediaCMS URL.
|
|
||||||
|
|
||||||
## Quick Test Checklist
|
|
||||||
|
|
||||||
- [ ] Plugin installed successfully
|
|
||||||
- [ ] Filter settings configured
|
|
||||||
- [ ] Filter enabled in Manage filters
|
|
||||||
- [ ] LTI tool configured and working
|
|
||||||
- [ ] Test URL pasted in Page resource
|
|
||||||
- [ ] Video embeds and plays correctly
|
|
||||||
|
|
||||||
## Support
|
|
||||||
|
|
||||||
Full documentation: See README.md
|
|
||||||
MediaCMS docs: https://docs.mediacms.io
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 3, 29 June 2007
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
Copyright (C) 2026 MediaCMS
|
|
||||||
|
|
||||||
For the full text of the GNU GPL v3 license, visit:
|
|
||||||
https://www.gnu.org/licenses/gpl-3.0.html
|
|
||||||
@@ -1,264 +0,0 @@
|
|||||||
# MediaCMS LTI Filter for Moodle 5
|
|
||||||
|
|
||||||
A Moodle filter plugin that automatically converts MediaCMS video URLs into LTI-authenticated embedded video players. Users can simply paste MediaCMS URLs into any Moodle content area (course descriptions, page content, etc.) and the videos will be embedded with transparent LTI authentication.
|
|
||||||
|
|
||||||
## Features
|
|
||||||
|
|
||||||
- **Automatic URL Detection**: Detects MediaCMS video URLs and converts them to embedded iframes
|
|
||||||
- **Transparent LTI Authentication**: Automatically initiates LTI 1.3 authentication flow without user interaction
|
|
||||||
- **Seamless Integration**: Works in any Moodle text area (Pages, Activities, Descriptions, etc.)
|
|
||||||
- **Configurable**: Admin can set MediaCMS URL, LTI tool, and iframe dimensions
|
|
||||||
- **Moodle 5 Compatible**: Built specifically for Moodle 5.0+
|
|
||||||
|
|
||||||
## How It Works
|
|
||||||
|
|
||||||
1. User pastes a MediaCMS URL (e.g., `https://deic.mediacms.io/view?m=KmITliaUC`)
|
|
||||||
2. Filter detects the URL and extracts the video token
|
|
||||||
3. Generates an iframe with an auto-submitting form that initiates LTI authentication
|
|
||||||
4. Form includes:
|
|
||||||
- Current user's Moodle ID as `login_hint`
|
|
||||||
- LTI platform issuer (ISS)
|
|
||||||
- LTI client ID
|
|
||||||
- Target video via custom parameters
|
|
||||||
5. Video loads in iframe with proper LTI authentication
|
|
||||||
|
|
||||||
## Prerequisites
|
|
||||||
|
|
||||||
Before installing this filter, you must have:
|
|
||||||
|
|
||||||
1. **MediaCMS with LTI Support**: Your MediaCMS instance must have LTI 1.3 integration enabled
|
|
||||||
2. **LTI External Tool Configured**: An LTI External Tool must be configured in Moodle that connects to MediaCMS
|
|
||||||
3. **Moodle 5.0 or later**
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
### Method 1: Via Moodle Plugin Directory (Recommended)
|
|
||||||
|
|
||||||
1. Download the plugin ZIP file
|
|
||||||
2. Log in as Moodle admin
|
|
||||||
3. Go to **Site administration → Plugins → Install plugins**
|
|
||||||
4. Upload the ZIP file
|
|
||||||
5. Click "Install plugin from the ZIP file"
|
|
||||||
6. Follow the on-screen prompts
|
|
||||||
|
|
||||||
### Method 2: Manual Installation
|
|
||||||
|
|
||||||
1. Copy the `filter_mediacmslti` directory to your Moodle installation:
|
|
||||||
```bash
|
|
||||||
cp -r filter_mediacmslti /path/to/moodle/filter/
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Set proper permissions:
|
|
||||||
```bash
|
|
||||||
cd /path/to/moodle
|
|
||||||
chown -R www-data:www-data filter/filter_mediacmslti
|
|
||||||
```
|
|
||||||
|
|
||||||
3. Log in as Moodle admin and go to **Site administration → Notifications**
|
|
||||||
4. Moodle will detect the new plugin and prompt you to upgrade
|
|
||||||
5. Click "Upgrade Moodle database now"
|
|
||||||
|
|
||||||
## Configuration
|
|
||||||
|
|
||||||
### Step 1: Configure LTI External Tool (if not already done)
|
|
||||||
|
|
||||||
1. Go to **Site administration → Plugins → Activity modules → External tool → Manage tools**
|
|
||||||
2. Click "Configure a tool manually"
|
|
||||||
3. Enter the following details:
|
|
||||||
- **Tool name**: MediaCMS
|
|
||||||
- **Tool URL**: `https://deic.mediacms.io/lti/launch/`
|
|
||||||
- **LTI version**: LTI 1.3
|
|
||||||
- **Public key type**: Keyset URL
|
|
||||||
- **Public keyset**: `https://deic.mediacms.io/lti/jwks/`
|
|
||||||
- **Initiate login URL**: `https://deic.mediacms.io/lti/oidc/login/`
|
|
||||||
- **Redirection URI(s)**: `https://deic.mediacms.io/lti/launch/`
|
|
||||||
4. Enable:
|
|
||||||
- Deep Linking (Content-Item Message)
|
|
||||||
- Share launcher's name with tool
|
|
||||||
- Share launcher's email with tool
|
|
||||||
5. Click "Save changes"
|
|
||||||
6. **Note the Tool ID** (you'll need this for the filter configuration)
|
|
||||||
|
|
||||||
### Step 2: Configure Filter Settings
|
|
||||||
|
|
||||||
1. Go to **Site administration → Plugins → Filters → MediaCMS LTI Filter**
|
|
||||||
2. Configure the following settings:
|
|
||||||
|
|
||||||
- **MediaCMS URL**: Enter your MediaCMS instance URL
|
|
||||||
- Example: `https://deic.mediacms.io`
|
|
||||||
- Do NOT include trailing slash
|
|
||||||
|
|
||||||
- **LTI External Tool**: Select the MediaCMS tool you configured in Step 1
|
|
||||||
- Choose from the dropdown of available LTI tools
|
|
||||||
|
|
||||||
- **Iframe Width**: Default width in pixels (default: 960)
|
|
||||||
|
|
||||||
- **Iframe Height**: Default height in pixels (default: 540)
|
|
||||||
|
|
||||||
3. Click "Save changes"
|
|
||||||
|
|
||||||
### Step 3: Enable the Filter
|
|
||||||
|
|
||||||
1. Go to **Site administration → Plugins → Filters → Manage filters**
|
|
||||||
2. Find "MediaCMS LTI Embed" in the list
|
|
||||||
3. Change the setting from "Disabled" to **"On"**
|
|
||||||
- Alternatively, use "Off, but available" to allow course-level control
|
|
||||||
4. Adjust the filter order if needed (higher = runs earlier)
|
|
||||||
5. Click "Save changes"
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
### For Content Creators
|
|
||||||
|
|
||||||
Once the filter is enabled, simply paste MediaCMS URLs into any Moodle content area:
|
|
||||||
|
|
||||||
#### Example 1: In a Page Resource
|
|
||||||
|
|
||||||
1. Create or edit a Page resource
|
|
||||||
2. In the content editor, paste the MediaCMS URL:
|
|
||||||
```
|
|
||||||
https://deic.mediacms.io/view?m=KmITliaUC
|
|
||||||
```
|
|
||||||
3. Save the page
|
|
||||||
4. The URL will automatically be replaced with an embedded video player
|
|
||||||
|
|
||||||
#### Example 2: In Course Description
|
|
||||||
|
|
||||||
1. Edit course settings
|
|
||||||
2. In the "Course description" field, paste:
|
|
||||||
```
|
|
||||||
Watch this introduction video: https://deic.mediacms.io/view?m=KmITliaUC
|
|
||||||
```
|
|
||||||
3. Save
|
|
||||||
4. The video will be embedded directly in the course summary
|
|
||||||
|
|
||||||
#### Example 3: In Activity Description
|
|
||||||
|
|
||||||
1. Create any activity (Forum, Assignment, etc.)
|
|
||||||
2. In the description field, paste MediaCMS URLs
|
|
||||||
3. Students will see embedded videos when viewing the activity
|
|
||||||
|
|
||||||
### Supported URL Formats
|
|
||||||
|
|
||||||
The filter recognizes these URL patterns:
|
|
||||||
- `https://deic.mediacms.io/view?m=TOKEN`
|
|
||||||
- `https://deic.mediacms.io/embed?m=TOKEN`
|
|
||||||
- `http://` versions (if your MediaCMS uses HTTP)
|
|
||||||
|
|
||||||
### For End Users (Students/Teachers)
|
|
||||||
|
|
||||||
No action required! When viewing content with MediaCMS URLs:
|
|
||||||
1. Page loads normally
|
|
||||||
2. Video player appears in an iframe
|
|
||||||
3. LTI authentication happens transparently in the background
|
|
||||||
4. Video starts playing (if user has permission)
|
|
||||||
|
|
||||||
**Note**: Users must be logged into Moodle. Guest users will see the original URL without embedding.
|
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
### URLs are not being converted
|
|
||||||
|
|
||||||
**Check**:
|
|
||||||
1. Filter is enabled: **Site admin → Plugins → Filters → Manage filters**
|
|
||||||
2. MediaCMS URL in settings matches the URLs you're pasting
|
|
||||||
3. LTI tool is selected in filter settings
|
|
||||||
4. User is logged in (not guest)
|
|
||||||
|
|
||||||
### Video shows "Access Denied" error
|
|
||||||
|
|
||||||
**Possible causes**:
|
|
||||||
1. LTI tool not configured correctly
|
|
||||||
2. MediaCMS not receiving proper authentication
|
|
||||||
3. User doesn't have permission to view the video in MediaCMS
|
|
||||||
|
|
||||||
**Debug**:
|
|
||||||
- Check Moodle logs: **Site admin → Reports → Logs**
|
|
||||||
- Check MediaCMS LTI logs on the MediaCMS admin panel
|
|
||||||
- Verify LTI tool configuration (client_id, issuer, etc.)
|
|
||||||
|
|
||||||
### Iframe shows blank or loading forever
|
|
||||||
|
|
||||||
**Check**:
|
|
||||||
1. MediaCMS URL is accessible from your network
|
|
||||||
2. Browser console for JavaScript errors
|
|
||||||
3. LTI tool ID is correct
|
|
||||||
4. MediaCMS OIDC login endpoint is working: `https://deic.mediacms.io/lti/oidc/login/`
|
|
||||||
|
|
||||||
### Multiple iframes from same URL
|
|
||||||
|
|
||||||
The filter replaces ALL occurrences of MediaCMS URLs. If you paste the same URL twice, you'll get two embedded players.
|
|
||||||
|
|
||||||
**Solution**: Paste the URL only once per page, or use HTML mode to add the URL as plain text (wrap in `<code>` tags).
|
|
||||||
|
|
||||||
## Technical Details
|
|
||||||
|
|
||||||
### How the Filter Works
|
|
||||||
|
|
||||||
1. **Text Processing**: Filter scans all text content using regex patterns
|
|
||||||
2. **URL Extraction**: Identifies MediaCMS URLs and extracts video tokens
|
|
||||||
3. **LTI Configuration**: Retrieves LTI settings (issuer, client_id) from configured tool
|
|
||||||
4. **HTML Generation**: Creates:
|
|
||||||
- An `<iframe>` element with unique ID
|
|
||||||
- A hidden `<form>` that posts to MediaCMS OIDC login endpoint
|
|
||||||
- Form includes: `iss`, `client_id`, `login_hint`, `target_link_uri`
|
|
||||||
- JavaScript to auto-submit the form on page load
|
|
||||||
5. **LTI Flow**: Form submission triggers LTI 1.3 authentication:
|
|
||||||
- OIDC Login → Redirect to Moodle Auth → POST back with JWT → Session created
|
|
||||||
6. **Video Display**: MediaCMS redirects to video player inside iframe
|
|
||||||
|
|
||||||
### Security Considerations
|
|
||||||
|
|
||||||
- **Authentication Required**: Filter only works for logged-in users
|
|
||||||
- **LTI 1.3 Security**: Uses OAuth2/OIDC flow with JWT validation
|
|
||||||
- **User Context**: Each iframe uses the current user's Moodle ID as `login_hint`
|
|
||||||
- **No Credentials Stored**: Filter doesn't store user credentials or tokens
|
|
||||||
- **Content Security**: Iframes are scoped to MediaCMS domain
|
|
||||||
|
|
||||||
### Performance
|
|
||||||
|
|
||||||
- **Lightweight**: Regex-based URL detection is fast
|
|
||||||
- **No Database Queries**: Uses cached configuration from Moodle settings
|
|
||||||
- **Lazy Loading**: Videos load on-demand when iframe initiates LTI flow
|
|
||||||
|
|
||||||
## Uninstallation
|
|
||||||
|
|
||||||
1. Go to **Site administration → Plugins → Filters → Manage filters**
|
|
||||||
2. Disable the filter first
|
|
||||||
3. Go to **Site administration → Plugins → Plugins overview**
|
|
||||||
4. Find "MediaCMS LTI Filter"
|
|
||||||
5. Click "Uninstall"
|
|
||||||
6. Confirm uninstallation
|
|
||||||
|
|
||||||
**Note**: Existing MediaCMS URLs will revert to plain text URLs after uninstallation.
|
|
||||||
|
|
||||||
## Support
|
|
||||||
|
|
||||||
For issues or questions:
|
|
||||||
- Check MediaCMS documentation: https://docs.mediacms.io
|
|
||||||
- Report bugs on GitHub: https://github.com/mediacms-io/mediacms
|
|
||||||
- Moodle plugin directory: (link when published)
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
This plugin is licensed under the GNU GPL v3 or later.
|
|
||||||
|
|
||||||
Copyright (C) 2026 MediaCMS
|
|
||||||
|
|
||||||
## Changelog
|
|
||||||
|
|
||||||
### Version 1.0.0 (2026-01-23)
|
|
||||||
- Initial release
|
|
||||||
- Support for Moodle 5.0+
|
|
||||||
- Automatic URL detection and embedding
|
|
||||||
- LTI 1.3 authentication integration
|
|
||||||
- Configurable iframe dimensions
|
|
||||||
- Multi-language support (English)
|
|
||||||
|
|
||||||
## Credits
|
|
||||||
|
|
||||||
Developed by the MediaCMS team.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Enjoy seamless MediaCMS video embedding in Moodle!**
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
<?php
|
|
||||||
// This file is part of Moodle - http://moodle.org/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* LTI Auth Callback for Filter Launches
|
|
||||||
*
|
|
||||||
* This handles the OIDC redirect from MediaCMS for filter-initiated launches
|
|
||||||
*
|
|
||||||
* @package filter_mediacmslti
|
|
||||||
* @copyright 2026 MediaCMS
|
|
||||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
||||||
*/
|
|
||||||
|
|
||||||
require_once(__DIR__ . '/../../config.php');
|
|
||||||
require_once($CFG->dirroot . '/mod/lti/locallib.php');
|
|
||||||
|
|
||||||
// This endpoint receives the response from Moodle's /mod/lti/auth.php
|
|
||||||
// after it completes the OIDC flow
|
|
||||||
|
|
||||||
// Get launch parameters from query string
|
|
||||||
$state = optional_param('state', '', PARAM_RAW);
|
|
||||||
$id_token = optional_param('id_token', '', PARAM_RAW);
|
|
||||||
|
|
||||||
if (empty($id_token)) {
|
|
||||||
die('Missing id_token');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Verify and decode the id_token
|
|
||||||
// Then redirect to the MediaCMS embed
|
|
||||||
|
|
||||||
$PAGE->set_context(context_system::instance());
|
|
||||||
$PAGE->set_pagelayout('embedded');
|
|
||||||
|
|
||||||
echo $OUTPUT->header();
|
|
||||||
echo '<div style="padding: 20px;">';
|
|
||||||
echo '<p>Processing authentication...</p>';
|
|
||||||
echo '<p>ID Token received, redirecting to content...</p>';
|
|
||||||
echo '</div>';
|
|
||||||
echo $OUTPUT->footer();
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
<?php
|
|
||||||
// This file is part of Moodle - http://moodle.org/
|
|
||||||
//
|
|
||||||
// Moodle is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// Moodle is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Privacy provider for MediaCMS LTI Filter.
|
|
||||||
*
|
|
||||||
* @package filter_mediacmslti
|
|
||||||
* @copyright 2026 MediaCMS
|
|
||||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace filter_mediacmslti\privacy;
|
|
||||||
|
|
||||||
defined('MOODLE_INTERNAL') || die();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Privacy provider implementation for MediaCMS LTI Filter.
|
|
||||||
*
|
|
||||||
* This plugin does not store any personal data.
|
|
||||||
*/
|
|
||||||
class provider implements \core_privacy\local\metadata\null_provider {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the language string identifier with the component's language
|
|
||||||
* file to explain why this plugin stores no data.
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public static function get_reason(): string {
|
|
||||||
return 'privacy:metadata';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,136 +0,0 @@
|
|||||||
<?php
|
|
||||||
// This file is part of Moodle - http://moodle.org/
|
|
||||||
//
|
|
||||||
// Moodle is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// Moodle is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MediaCMS LTI Filter - Converts MediaCMS URLs to LTI-authenticated iframes.
|
|
||||||
*
|
|
||||||
* @package filter_mediacmslti
|
|
||||||
* @copyright 2026 MediaCMS
|
|
||||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace filter_mediacmslti;
|
|
||||||
|
|
||||||
defined('MOODLE_INTERNAL') || die();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Filter class for converting MediaCMS URLs to LTI iframes.
|
|
||||||
*/
|
|
||||||
class text_filter extends \core_filters\text_filter {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply the filter to the given text.
|
|
||||||
*
|
|
||||||
* @param string $text The text to filter
|
|
||||||
* @param array $options Filter options
|
|
||||||
* @return string The filtered text
|
|
||||||
*/
|
|
||||||
public function filter($text, array $options = array()) {
|
|
||||||
global $USER, $CFG, $PAGE;
|
|
||||||
|
|
||||||
// Don't process if user is not logged in.
|
|
||||||
if (!isloggedin() || isguestuser()) {
|
|
||||||
return $text;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get plugin configuration.
|
|
||||||
$mediacmsurl = get_config('filter_mediacmslti', 'mediacmsurl');
|
|
||||||
$ltitoolid = get_config('filter_mediacmslti', 'ltitoolid');
|
|
||||||
$iframewidth = get_config('filter_mediacmslti', 'iframewidth') ?: 960;
|
|
||||||
$iframeheight = get_config('filter_mediacmslti', 'iframeheight') ?: 540;
|
|
||||||
|
|
||||||
if (empty($mediacmsurl) || empty($ltitoolid)) {
|
|
||||||
return $text;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse the MediaCMS URL to get the base domain.
|
|
||||||
$parsedurl = parse_url($mediacmsurl);
|
|
||||||
if (!isset($parsedurl['host'])) {
|
|
||||||
return $text;
|
|
||||||
}
|
|
||||||
$domain = $parsedurl['host'];
|
|
||||||
|
|
||||||
// Escape special regex characters in domain.
|
|
||||||
$escapeddomain = preg_quote($domain, '/');
|
|
||||||
|
|
||||||
// Pattern to match MediaCMS video URLs:
|
|
||||||
// - https://lti.mediacms.io/view?m=TOKEN
|
|
||||||
// - https://lti.mediacms.io/embed?m=TOKEN
|
|
||||||
// - http versions
|
|
||||||
// Improved regex to handle parameters in any order
|
|
||||||
$pattern = '/https?:\/\/' . $escapeddomain . '\/(view|embed)\?(?:[^"\s]*&)?m=([a-zA-Z0-9_-]+)(?:&[^"\s]*)?/i';
|
|
||||||
|
|
||||||
// Find all matches.
|
|
||||||
if (!preg_match_all($pattern, $text, $matches, PREG_SET_ORDER)) {
|
|
||||||
return $text;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get course context
|
|
||||||
$context = isset($options['context']) ? $options['context'] : $PAGE->context;
|
|
||||||
$courseid = 0;
|
|
||||||
|
|
||||||
// Try to determine course ID from context
|
|
||||||
if ($context) {
|
|
||||||
if ($context->contextlevel == CONTEXT_COURSE) {
|
|
||||||
$courseid = $context->instanceid;
|
|
||||||
} else if ($context->contextlevel == CONTEXT_MODULE) {
|
|
||||||
$cm = get_coursemodule_from_id('', $context->instanceid);
|
|
||||||
if ($cm) {
|
|
||||||
$courseid = $cm->course;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Replace each match with an iframe pointing to launch.php
|
|
||||||
foreach ($matches as $match) {
|
|
||||||
$fullurl = $match[0];
|
|
||||||
$mediatoken = $match[2];
|
|
||||||
|
|
||||||
// Build launch URL with parameters (like Kaltura does)
|
|
||||||
$launchurl = new \moodle_url('/filter/mediacmslti/launch.php', [
|
|
||||||
'token' => $mediatoken,
|
|
||||||
'courseid' => $courseid,
|
|
||||||
'width' => $iframewidth,
|
|
||||||
'height' => $iframeheight
|
|
||||||
]);
|
|
||||||
|
|
||||||
// Calculate aspect ratio percentage for responsive container
|
|
||||||
$ratio = ($iframeheight / $iframewidth) * 100;
|
|
||||||
|
|
||||||
// Generate iframe (responsive)
|
|
||||||
$iframe = \html_writer::tag('iframe', '', array(
|
|
||||||
'width' => '100%',
|
|
||||||
'height' => '100%',
|
|
||||||
'class' => 'mediacms-player-iframe',
|
|
||||||
'allowfullscreen' => 'true',
|
|
||||||
'allow' => 'autoplay *; fullscreen *; encrypted-media *; camera *; microphone *; display-capture *;',
|
|
||||||
'src' => $launchurl->out(false),
|
|
||||||
'frameborder' => '0',
|
|
||||||
'style' => 'position: absolute; top: 0; left: 0; width: 100%; height: 100%;',
|
|
||||||
'title' => 'MediaCMS Video'
|
|
||||||
));
|
|
||||||
|
|
||||||
$iframeContainer = \html_writer::tag('div', $iframe, array(
|
|
||||||
'class' => 'mediacms-player-container',
|
|
||||||
'style' => 'position: relative; padding-bottom: ' . $ratio . '%; height: 0; overflow: hidden; max-width: 100%; background: #000; border-radius: 4px;'
|
|
||||||
));
|
|
||||||
|
|
||||||
$text = str_replace($fullurl, $iframeContainer, $text);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $text;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
<?php
|
|
||||||
// This file is part of Moodle - http://moodle.org/
|
|
||||||
//
|
|
||||||
// Moodle is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// Moodle is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Language strings for MediaCMS LTI Filter plugin.
|
|
||||||
*
|
|
||||||
* @package filter_mediacmslti
|
|
||||||
* @copyright 2026 MediaCMS
|
|
||||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
||||||
*/
|
|
||||||
|
|
||||||
$string['pluginname'] = 'MediaCMS LTI Filter';
|
|
||||||
$string['filtername'] = 'MediaCMS LTI Embed';
|
|
||||||
|
|
||||||
// Settings.
|
|
||||||
$string['mediacmsurl'] = 'MediaCMS URL';
|
|
||||||
$string['mediacmsurl_desc'] = 'The base URL of your MediaCMS instance (e.g., https://deic.mediacms.io). URLs from this domain will be converted to LTI-authenticated iframes.';
|
|
||||||
|
|
||||||
$string['ltitoolid'] = 'LTI External Tool';
|
|
||||||
$string['ltitoolid_desc'] = 'Select the LTI External Tool that is configured for MediaCMS integration. This tool must be pre-configured with the correct LTI settings.';
|
|
||||||
|
|
||||||
$string['noltitoolsfound'] = 'No LTI tools configured';
|
|
||||||
|
|
||||||
$string['iframewidth'] = 'Iframe Width';
|
|
||||||
$string['iframewidth_desc'] = 'Default width for embedded video iframes in pixels (default: 960).';
|
|
||||||
|
|
||||||
$string['iframeheight'] = 'Iframe Height';
|
|
||||||
$string['iframeheight_desc'] = 'Default height for embedded video iframes in pixels (default: 540).';
|
|
||||||
|
|
||||||
$string['enablefilterheading'] = 'Enable the Filter';
|
|
||||||
$string['enablefilterheading_desc'] = 'After configuring the settings above, you must enable this filter:<br><br>
|
|
||||||
<ol>
|
|
||||||
<li>Go to <strong>Site administration → Plugins → Filters → Manage filters</strong></li>
|
|
||||||
<li>Find "MediaCMS LTI Embed" in the list</li>
|
|
||||||
<li>Change the setting from "Disabled" to "On" or "Off, but available"</li>
|
|
||||||
<li>Click "Save changes"</li>
|
|
||||||
</ol>
|
|
||||||
<br>
|
|
||||||
Once enabled, any MediaCMS video URL pasted into course descriptions, page content, or other text areas will automatically be converted to an embedded video player with LTI authentication.';
|
|
||||||
|
|
||||||
// Privacy.
|
|
||||||
$string['privacy:metadata'] = 'The MediaCMS LTI Filter plugin does not store any personal data. It processes URLs in content and initiates LTI authentication using the user\'s Moodle ID as the login hint.';
|
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
<?php
|
|
||||||
// This file is part of Moodle - http://moodle.org/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* LTI Launch for MediaCMS Filter - Uses Moodle's LTI libraries like Kaltura
|
|
||||||
*
|
|
||||||
* @package filter_mediacmslti
|
|
||||||
* @copyright 2026 MediaCMS
|
|
||||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
||||||
*/
|
|
||||||
|
|
||||||
require_once(__DIR__ . '/../../config.php');
|
|
||||||
require_once($CFG->dirroot . '/mod/lti/lib.php');
|
|
||||||
require_once($CFG->dirroot . '/mod/lti/locallib.php');
|
|
||||||
|
|
||||||
global $SITE;
|
|
||||||
|
|
||||||
require_login();
|
|
||||||
|
|
||||||
$mediatoken = required_param('token', PARAM_ALPHANUMEXT);
|
|
||||||
$courseid = optional_param('courseid', 0, PARAM_INT);
|
|
||||||
$height = optional_param('height', 540, PARAM_INT);
|
|
||||||
$width = optional_param('width', 960, PARAM_INT);
|
|
||||||
|
|
||||||
// Get filter configuration
|
|
||||||
$mediacmsurl = get_config('filter_mediacmslti', 'mediacmsurl');
|
|
||||||
$ltitoolid = get_config('filter_mediacmslti', 'ltitoolid');
|
|
||||||
|
|
||||||
if (empty($mediacmsurl) || empty($ltitoolid)) {
|
|
||||||
die('Filter not configured');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the LTI tool type
|
|
||||||
$type = $DB->get_record('lti_types', ['id' => $ltitoolid]);
|
|
||||||
if (!$type) {
|
|
||||||
die('LTI tool not found');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set up context - if courseid is 0, use system context
|
|
||||||
if (0 != $courseid) {
|
|
||||||
$context = context_course::instance($courseid);
|
|
||||||
$course = get_course($courseid);
|
|
||||||
} else {
|
|
||||||
$context = context_system::instance();
|
|
||||||
$course = $SITE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set up page
|
|
||||||
$PAGE->set_url(new moodle_url('/filter/mediacmslti/launch.php', [
|
|
||||||
'token' => $mediatoken,
|
|
||||||
'courseid' => $courseid,
|
|
||||||
'width' => $width,
|
|
||||||
'height' => $height
|
|
||||||
]));
|
|
||||||
$PAGE->set_context($context);
|
|
||||||
$PAGE->set_pagelayout('embedded');
|
|
||||||
|
|
||||||
// Create a dummy LTI instance object (like Kaltura does)
|
|
||||||
$instance = new stdClass();
|
|
||||||
$instance->id = 0; // Dummy ID - not a real activity
|
|
||||||
$instance->course = $course->id;
|
|
||||||
$instance->typeid = $ltitoolid;
|
|
||||||
$instance->name = 'MediaCMS video resource';
|
|
||||||
$instance->instructorchoiceacceptgrades = 0;
|
|
||||||
$instance->grade = 0;
|
|
||||||
$instance->instructorchoicesendname = 1;
|
|
||||||
$instance->instructorchoicesendemailaddr = 1;
|
|
||||||
$instance->launchcontainer = LTI_LAUNCH_CONTAINER_EMBED_NO_BLOCKS;
|
|
||||||
|
|
||||||
// Set custom parameters to pass media token (like deep linking does)
|
|
||||||
// This will be included in the LTI custom claims JWT
|
|
||||||
$instance->instructorcustomparameters = "media_friendly_token=" . $mediatoken;
|
|
||||||
|
|
||||||
// Get type config (standard tool URL, no modifications needed)
|
|
||||||
$typeconfig = lti_get_type_type_config($ltitoolid);
|
|
||||||
|
|
||||||
// Use Moodle's LTI launch function to initiate OIDC properly
|
|
||||||
// Pass 0 as dummy cmid since we don't have a real course module
|
|
||||||
$content = lti_initiate_login($course->id, 0, $instance, $typeconfig, null, 'MediaCMS video resource');
|
|
||||||
|
|
||||||
// Inject media_token as a hidden field in the OIDC login form
|
|
||||||
// This allows MediaCMS to receive and store it in the state parameter
|
|
||||||
$hidden_field = '<input type="hidden" name="media_token" value="' . htmlspecialchars($mediatoken, ENT_QUOTES) . '" />';
|
|
||||||
|
|
||||||
// Insert the hidden field before the closing </form> tag
|
|
||||||
$content = str_replace('</form>', $hidden_field . '</form>', $content);
|
|
||||||
|
|
||||||
echo $OUTPUT->header();
|
|
||||||
echo $content;
|
|
||||||
echo $OUTPUT->footer();
|
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
<?php
|
|
||||||
// This file is part of Moodle - http://moodle.org/
|
|
||||||
//
|
|
||||||
// Moodle is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// Moodle is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Settings for MediaCMS LTI Filter plugin.
|
|
||||||
*
|
|
||||||
* @package filter_mediacmslti
|
|
||||||
* @copyright 2026 MediaCMS
|
|
||||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
||||||
*/
|
|
||||||
|
|
||||||
defined('MOODLE_INTERNAL') || die;
|
|
||||||
|
|
||||||
if ($ADMIN->fulltree) {
|
|
||||||
// MediaCMS URL setting.
|
|
||||||
$settings->add(new admin_setting_configtext(
|
|
||||||
'filter_mediacmslti/mediacmsurl',
|
|
||||||
get_string('mediacmsurl', 'filter_mediacmslti'),
|
|
||||||
get_string('mediacmsurl_desc', 'filter_mediacmslti'),
|
|
||||||
'https://deic.mediacms.io',
|
|
||||||
PARAM_URL
|
|
||||||
));
|
|
||||||
|
|
||||||
// Get list of LTI tools for dropdown.
|
|
||||||
$ltioptions = [];
|
|
||||||
try {
|
|
||||||
$tools = $DB->get_records('lti_types', null, 'name ASC', 'id, name');
|
|
||||||
foreach ($tools as $tool) {
|
|
||||||
$ltioptions[$tool->id] = $tool->name;
|
|
||||||
}
|
|
||||||
} catch (Exception $e) {
|
|
||||||
// Database not ready yet or no tools configured.
|
|
||||||
$ltioptions[0] = get_string('noltitoolsfound', 'filter_mediacmslti');
|
|
||||||
}
|
|
||||||
|
|
||||||
// LTI Tool ID setting.
|
|
||||||
$settings->add(new admin_setting_configselect(
|
|
||||||
'filter_mediacmslti/ltitoolid',
|
|
||||||
get_string('ltitoolid', 'filter_mediacmslti'),
|
|
||||||
get_string('ltitoolid_desc', 'filter_mediacmslti'),
|
|
||||||
0,
|
|
||||||
$ltioptions
|
|
||||||
));
|
|
||||||
|
|
||||||
// Iframe width setting.
|
|
||||||
$settings->add(new admin_setting_configtext(
|
|
||||||
'filter_mediacmslti/iframewidth',
|
|
||||||
get_string('iframewidth', 'filter_mediacmslti'),
|
|
||||||
get_string('iframewidth_desc', 'filter_mediacmslti'),
|
|
||||||
'960',
|
|
||||||
PARAM_INT
|
|
||||||
));
|
|
||||||
|
|
||||||
// Iframe height setting.
|
|
||||||
$settings->add(new admin_setting_configtext(
|
|
||||||
'filter_mediacmslti/iframeheight',
|
|
||||||
get_string('iframeheight', 'filter_mediacmslti'),
|
|
||||||
get_string('iframeheight_desc', 'filter_mediacmslti'),
|
|
||||||
'540',
|
|
||||||
PARAM_INT
|
|
||||||
));
|
|
||||||
|
|
||||||
// Information about enabling the filter.
|
|
||||||
$settings->add(new admin_setting_heading(
|
|
||||||
'filter_mediacmslti/enablefilterheading',
|
|
||||||
get_string('enablefilterheading', 'filter_mediacmslti'),
|
|
||||||
get_string('enablefilterheading_desc', 'filter_mediacmslti')
|
|
||||||
));
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
<?php
|
|
||||||
echo "Test 1: PHP works<br>";
|
|
||||||
|
|
||||||
echo "Testing path: " . __DIR__ . '<br>';
|
|
||||||
|
|
||||||
// Try the path with 4 parent dirs (current version)
|
|
||||||
if (file_exists(__DIR__ . '/../../../../config.php')) {
|
|
||||||
echo "Found with ../../../../<br>";
|
|
||||||
require_once(__DIR__ . '/../../../../config.php');
|
|
||||||
}
|
|
||||||
// Try with 2 parent dirs (correct for filter location)
|
|
||||||
else if (file_exists(__DIR__ . '/../../config.php')) {
|
|
||||||
echo "Found with ../../<br>";
|
|
||||||
require_once(__DIR__ . '/../../config.php');
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
die("Cannot find config.php. Tried: <br>" .
|
|
||||||
__DIR__ . '/../../../../config.php<br>' .
|
|
||||||
__DIR__ . '/../../config.php');
|
|
||||||
}
|
|
||||||
|
|
||||||
echo "Test 2: Moodle config loaded<br>";
|
|
||||||
|
|
||||||
echo "Test 3: Moodle loaded successfully<br>";
|
|
||||||
echo "wwwroot: " . $CFG->wwwroot . "<br>";
|
|
||||||
|
|
||||||
try {
|
|
||||||
require_login();
|
|
||||||
echo "Test 4: User logged in: " . $USER->id . "<br>";
|
|
||||||
} catch (Exception $e) {
|
|
||||||
die("Login error: " . $e->getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
echo "Test 5: All OK!";
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
<?php
|
|
||||||
// This file is part of Moodle - http://moodle.org/
|
|
||||||
//
|
|
||||||
// Moodle is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// Moodle is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Version information for MediaCMS LTI Filter plugin.
|
|
||||||
*
|
|
||||||
* @package filter_mediacmslti
|
|
||||||
* @copyright 2026 MediaCMS
|
|
||||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
||||||
*/
|
|
||||||
|
|
||||||
defined('MOODLE_INTERNAL') || die();
|
|
||||||
|
|
||||||
$plugin->version = 2026013000; // The current plugin version (Date: YYYYMMDDXX).
|
|
||||||
$plugin->requires = 2024100700; // Requires Moodle 5.0 or later.
|
|
||||||
$plugin->component = 'filter_mediacmslti'; // Full name of the plugin (used for diagnostics).
|
|
||||||
$plugin->maturity = MATURITY_STABLE;
|
|
||||||
$plugin->release = 'v1.1.5';
|
|
||||||
Reference in New Issue
Block a user