diff --git a/app/components/embed/media_component.html.erb b/app/components/embed/media_component.html.erb
index f431650b3..557cff5e6 100644
--- a/app/components/embed/media_component.html.erb
+++ b/app/components/embed/media_component.html.erb
@@ -28,7 +28,7 @@
-
+
diff --git a/app/components/embed/media_tag_component.rb b/app/components/embed/media_tag_component.rb
index 40655d3d3..328d2d172 100644
--- a/app/components/embed/media_tag_component.rb
+++ b/app/components/embed/media_tag_component.rb
@@ -68,6 +68,7 @@ def media_tag # rubocop:disable Metrics/MethodLength
id: "sul-embed-media-#{@resource_iteration.index}",
data: {
auth_url: authentication_url,
+ index: @resource_iteration.index,
media_tag_target: 'authorizeableResource',
controller: 'media-player',
action: 'media-seek@window->media-player#seek ' \
@@ -82,8 +83,9 @@ def media_tag # rubocop:disable Metrics/MethodLength
end
def streaming_source
+ type = Rails.env.development? ? 'video/mp4' : 'application/x-mpegURL'
stacks_media_stream = Embed::StacksMediaStream.new(druid:, file:)
- tag.source(src: stacks_media_stream.to_playlist_url, type: 'application/x-mpegURL')
+ tag.source(src: stacks_media_stream.to_playlist_url, type:)
end
# Generate the video caption elements
diff --git a/app/javascript/controllers/media_player_controller.js b/app/javascript/controllers/media_player_controller.js
index b1c694e4f..27cd94bca 100644
--- a/app/javascript/controllers/media_player_controller.js
+++ b/app/javascript/controllers/media_player_controller.js
@@ -5,9 +5,9 @@ export default class extends Controller {
initializeVideoJSPlayer() {
this.element.classList.add('video-js', 'vjs-default-skin')
this.player = videojs(this.element.id, {"responsive": true})
- this.player.on('loadedmetadata', () => {
- const event = new CustomEvent('media-loaded', { detail: this.player })
- window.dispatchEvent(event)
+ this.player.index = this.element.dataset.index;
+
+ this.player.on('loadedmetadata', (evt) => {
// Stop the `loadedmetadata` event and don't bother listening for
// `timeupdate` events until after `loadedmetadata` fires completes.
@@ -20,13 +20,20 @@ export default class extends Controller {
const event = new CustomEvent('time-update', { detail: timestamp })
window.dispatchEvent(event)
})
+
+ if (evt.target.player.index == 0){
+ const event = new CustomEvent('media-loaded', { detail: this.player });
+ window.dispatchEvent(event);
+ }
})
// The loadeddata event occurs when the first frame of the video is available, and
// happens after loadedmetadata
- this.player.on('loadeddata', () => {
- const event = new CustomEvent('media-data-loaded')
- window.dispatchEvent(event)
+ this.player.on('loadeddata', (evt) => {
+ if (evt.target.player.index == 0){
+ const event = new CustomEvent('media-data-loaded');
+ window.dispatchEvent(event);
+ }
})
}
diff --git a/app/javascript/controllers/media_wrapper_controller.js b/app/javascript/controllers/media_wrapper_controller.js
index 4683ebf88..f5b4dad79 100644
--- a/app/javascript/controllers/media_wrapper_controller.js
+++ b/app/javascript/controllers/media_wrapper_controller.js
@@ -11,13 +11,18 @@ export default class extends Controller {
toggleVisibility(event) {
const index = event.detail.index
this.element.hidden = this.indexValue !== index
- this.pauseAllMedia();
+ this.pauseAllMedia(index);
}
- pauseAllMedia() {
+ // switch transcript if media object index is the same as the visible index.
+ pauseAllMedia(index) {
const mediaObject = this.element.querySelector('.video-js')
if (mediaObject) {
- videojs(mediaObject.id).pause()
+ const playerObject = videojs(mediaObject.id);
+ playerObject.pause()
+ if (mediaObject.dataset.index == index){
+ window.dispatchEvent(new CustomEvent('switch-transcript', { detail: playerObject }))
+ }
}
}
}
diff --git a/app/javascript/controllers/transcript_controller.js b/app/javascript/controllers/transcript_controller.js
index 8aa46de8c..dcd6d4666 100644
--- a/app/javascript/controllers/transcript_controller.js
+++ b/app/javascript/controllers/transcript_controller.js
@@ -28,6 +28,14 @@ export default class extends Controller {
this.loaded = true
}
+ // event called when switch-transcript event is fired.
+ // This really only happens when there are more than one media item with captions.
+ switchTranscript(evt) {
+ this.player = evt.detail;
+ this.setupTranscriptLanguageSwitching();
+ this.renderCues();
+ }
+
// Safari cues require special handling.
// We want the track cues to be available so we can properly generate the transcript sidebar language dropdown
// if there is more than one language track.
@@ -136,12 +144,7 @@ export default class extends Controller {
}
setupTranscriptLanguageSwitching() {
- this.captionTracks.forEach(track => {
- this.captionLanguageSelectTarget.insertAdjacentHTML(
- 'beforeend',
- `
`
- )
- })
+ this.captionLanguageSelectTarget.innerHTML = this.captionTracks.map(track => `
`).join("");
}
buildCue(cue) {