-
- @if (canShowMoreDetails && resourceItem.SensitiveContent && Model.HasCatalogueAccess)
+ string GetWeblinkNavigateLink(string url)
{
-
-
- Sensitive content
-
-
- This resource contains sensitive content which some people may find offensive or disturbing.
-
-
-
+ return $"/api/resource/NavigateToWeblinkAndRecordActivity?resourceVersionId={resourceItem.ResourceVersionId}&nodePathId={resourceItem.NodePathId}&url={Uri.EscapeDataString(url)}";
}
-
- @if (Model.HasCatalogueAccess && !resourceItem.SensitiveContent)
+ string GetFileExtension(string filename)
{
-
+ var extension = UtilityHelper.GetFileExtension(filename);
- @* Image *@
- @if (canShowMoreDetails && resourceItem.ResourceTypeEnum == ResourceTypeEnum.Image)
+ if (string.IsNullOrEmpty(extension))
{
-
-
-
-
)
-
-
-
-
+ return "-";
}
- @* Weblink *@
- @if (canShowMoreDetails && resourceItem.ResourceTypeEnum == ResourceTypeEnum.WebLink)
- {
-
-
-
Visit site:
- @{
- string displayText = resourceItem.WebLinkDetails.DisplayText;
+ return extension.ToUpper();
+ }
- if (string.IsNullOrEmpty(displayText))
- {
- displayText = resourceItem.WebLinkDetails.Url;
- }
- }
-
@displayText
-
-
+ string GetSensitiveContentUrl()
+ {
+ if (this.ViewContext.HttpContext.Request.QueryString.Value == "")
+ {
+ return "?acceptSensitiveContent=true";
}
+ else
+ {
+ return this.ViewContext.HttpContext.Request.QueryString.Value + "&acceptSensitiveContent=true";
+ }
+ }
+}
+
+
+
- @* Generic File *@
- @if (canShowMoreDetails && resourceItem.ResourceTypeEnum == ResourceTypeEnum.GenericFile)
+ @if (canShowMoreDetails && resourceItem.SensitiveContent && Model.HasCatalogueAccess)
{
-
-
-
-
Download:
-
- @GetFileExtension(resourceItem.GenericFileDetails.File.FileName)
- @resourceItem.GenericFileDetails.File.FileName (@resourceItem.GenericFileDetails.File.FileSizeKb KB)
+
+
+ Sensitive content
+
+
+ This resource contains sensitive content which some people may find offensive or disturbing.
-
+
-
-
}
- @* Article *@
- @if (canShowMoreDetails && resourceItem.ResourceTypeEnum == ResourceTypeEnum.Article)
+
+ @if (Model.HasCatalogueAccess && !resourceItem.SensitiveContent)
{
-
@Html.Raw(resourceItem.ArticleDetails.Description)
-
- @if (resourceItem.ArticleDetails.Files != null && resourceItem.ArticleDetails.Files.Count > 0)
- {
-
-
-
Documents
- @foreach (var file in resourceItem.ArticleDetails.Files)
+
+
+ @* Image *@
+ @if (canShowMoreDetails && resourceItem.ResourceTypeEnum == ResourceTypeEnum.Image)
{
-
- @GetFileExtension(file.FileName)
- @file.FileName (@file.FileSizeKb KB)
-
+
+
+
+
)
+
+
+
+
}
-
-
- }
- }
- @if (canShowMoreDetails && resourceItem.ResourceTypeEnum == ResourceTypeEnum.Video || resourceItem.ResourceTypeEnum == ResourceTypeEnum.Audio || resourceItem.ResourceTypeEnum == ResourceTypeEnum.Scorm ||
- resourceItem.ResourceTypeEnum == ResourceTypeEnum.Case || resourceItem.ResourceTypeEnum == ResourceTypeEnum.Assessment)
- {
- if (resourceItem.ResourceTypeEnum == ResourceTypeEnum.Case)
- {
-
- }
+ @* Weblink *@
+ @if (canShowMoreDetails && resourceItem.ResourceTypeEnum == ResourceTypeEnum.WebLink)
+ {
+
+
+
Visit site:
+ @{
+ string displayText = resourceItem.WebLinkDetails.DisplayText;
+
+ if (string.IsNullOrEmpty(displayText))
+ {
+ displayText = resourceItem.WebLinkDetails.Url;
+ }
+ }
+
@displayText
+
+
+ }
- @* Video/Audio/Scorm/Case/Assessment require JavaScript - use Vue.js resource app. *@
+ @* Generic File *@
+ @if (canShowMoreDetails && resourceItem.ResourceTypeEnum == ResourceTypeEnum.GenericFile)
+ {
+
+ }
-
-
-
+ @* Article *@
+ @if (canShowMoreDetails && resourceItem.ResourceTypeEnum == ResourceTypeEnum.Article)
+ {
+
@Html.Raw(resourceItem.ArticleDetails.Description)
+
+ @if (resourceItem.ArticleDetails.Files != null && resourceItem.ArticleDetails.Files.Count > 0)
+ {
+
+
+
Documents
+ @foreach (var file in resourceItem.ArticleDetails.Files)
+ {
+
+ @GetFileExtension(file.FileName)
+ @file.FileName (@file.FileSizeKb KB)
+
+ }
+
+
+ }
+ }
+ @* Html Resource *@
+ @if (canShowMoreDetails && resourceItem.ResourceTypeEnum == ResourceTypeEnum.Html)
+ {
+
+ }
-
- }
-
- }
- @* Description / Additional Information *@
- @if (resourceItem.ResourceTypeEnum != ResourceTypeEnum.Case && resourceItem.ResourceTypeEnum != ResourceTypeEnum.Assessment)
- {
-
- @if (resourceItem.ResourceTypeEnum != ResourceTypeEnum.Article || (resourceItem.Catalogue.RestrictedAccess && !Model.HasCatalogueAccess))
- {
-
@Html.Raw(resourceItem.Description)
+ @if (canShowMoreDetails && resourceItem.ResourceTypeEnum == ResourceTypeEnum.Video || resourceItem.ResourceTypeEnum == ResourceTypeEnum.Audio || resourceItem.ResourceTypeEnum == ResourceTypeEnum.Scorm ||
+ resourceItem.ResourceTypeEnum == ResourceTypeEnum.Case || resourceItem.ResourceTypeEnum == ResourceTypeEnum.Assessment)
+ {
+ if (resourceItem.ResourceTypeEnum == ResourceTypeEnum.Case)
+ {
+
+ }
+
+ @* Video/Audio/Scorm/Case/Assessment require JavaScript - use Vue.js resource app. *@
+
+
+
+
+
+
+ }
+
}
- @if (!string.IsNullOrEmpty(resourceItem.AdditionalInformation) && Model.HasCatalogueAccess)
+ @* Description / Additional Information *@
+ @if (resourceItem.ResourceTypeEnum != ResourceTypeEnum.Case && resourceItem.ResourceTypeEnum != ResourceTypeEnum.Assessment && resourceItem.ResourceTypeEnum != ResourceTypeEnum.Html)
{
-
-
Additional information
-
@resourceItem.AdditionalInformation
-
+
+ @if (resourceItem.ResourceTypeEnum != ResourceTypeEnum.Article || (resourceItem.Catalogue.RestrictedAccess && !Model.HasCatalogueAccess))
+ {
+
@Html.Raw(resourceItem.Description)
+ }
+
+ @if (!string.IsNullOrEmpty(resourceItem.AdditionalInformation) && Model.HasCatalogueAccess)
+ {
+
+
Additional information
+
@resourceItem.AdditionalInformation
+
+ }
+
}
-
- }
-
+
\ No newline at end of file
From 8f4dfa477601a49bd4d93821944fc46bb40912ad Mon Sep 17 00:00:00 2001
From: OluwatobiAwe <114475132+OluwatobiAwe@users.noreply.github.com>
Date: Wed, 13 Mar 2024 11:26:12 +0000
Subject: [PATCH 15/15] Merge pull request #195 from
TechnologyEnhancedLearning/Develop/Fixes/TD-3881
TD-3881 stream audio or video file content within html resource
---
.../Controllers/ResourceController.cs | 17 ++++++++++----
.../Interfaces/IFileService.cs | 8 +++++++
LearningHub.Nhs.WebUI/Services/FileService.cs | 23 +++++++++++++++++++
3 files changed, 44 insertions(+), 4 deletions(-)
diff --git a/LearningHub.Nhs.WebUI/Controllers/ResourceController.cs b/LearningHub.Nhs.WebUI/Controllers/ResourceController.cs
index 5e9b91134..8e48edf82 100644
--- a/LearningHub.Nhs.WebUI/Controllers/ResourceController.cs
+++ b/LearningHub.Nhs.WebUI/Controllers/ResourceController.cs
@@ -486,15 +486,24 @@ public async Task
HtmlResourceContent(int resourceReferenceId, st
contentType = "text/html";
}
- var file = await this.fileService.DownloadFileAsync(contentFilePath, path);
- if (file != null)
+ if (contentType.Contains("video") || contentType.Contains("audio"))
{
- return this.File(file.Content, contentType);
+ var stream = await this.fileService.StreamFileAsync(contentFilePath, path);
+ if (stream != null)
+ {
+ return this.File(stream, contentType, enableRangeProcessing: true);
+ }
}
else
{
- return this.Ok(this.Content("No file found"));
+ var file = await this.fileService.DownloadFileAsync(contentFilePath, path);
+ if (file != null)
+ {
+ return this.File(file.Content, contentType);
+ }
}
+
+ return this.Ok(this.Content("No file found"));
}
}
}
\ No newline at end of file
diff --git a/LearningHub.Nhs.WebUI/Interfaces/IFileService.cs b/LearningHub.Nhs.WebUI/Interfaces/IFileService.cs
index 684e391c1..7b1af9a68 100644
--- a/LearningHub.Nhs.WebUI/Interfaces/IFileService.cs
+++ b/LearningHub.Nhs.WebUI/Interfaces/IFileService.cs
@@ -29,6 +29,14 @@ public interface IFileService
/// A representing the result of the asynchronous operation.
Task DownloadFileAsync(string filePath, string fileName);
+ ///
+ /// The StreamFileAsync.
+ ///
+ /// The filePath.
+ /// The fileName.
+ /// The .
+ Task StreamFileAsync(string filePath, string fileName);
+
///
/// The ProcessFile.
///
diff --git a/LearningHub.Nhs.WebUI/Services/FileService.cs b/LearningHub.Nhs.WebUI/Services/FileService.cs
index c5661edf5..88d5b2579 100644
--- a/LearningHub.Nhs.WebUI/Services/FileService.cs
+++ b/LearningHub.Nhs.WebUI/Services/FileService.cs
@@ -98,6 +98,29 @@ public async Task DownloadFileAsync(string filePath, stri
return null;
}
+ ///
+ /// The StreamFileAsync.
+ ///
+ /// The filePath.
+ /// The fileName.
+ /// The .
+ public async Task StreamFileAsync(string filePath, string fileName)
+ {
+ var directory = this.ShareClient.GetDirectoryClient(filePath);
+
+ if (await directory.ExistsAsync())
+ {
+ var file = directory.GetFileClient(fileName);
+
+ if (await file.ExistsAsync())
+ {
+ return await file.OpenReadAsync();
+ }
+ }
+
+ return null;
+ }
+
///
/// The ProcessFile.
///