diff --git a/app/components/embed/media_component.html.erb b/app/components/embed/media_component.html.erb index 19d35d13..c3f3c8c7 100644 --- a/app/components/embed/media_component.html.erb +++ b/app/components/embed/media_component.html.erb @@ -30,7 +30,7 @@ -
+
diff --git a/app/components/embed/media_tag_component.rb b/app/components/embed/media_tag_component.rb index 23f1620d..b2812b99 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? ? file.mimetype : '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 2ca34247..dfb8e8a5 100644 --- a/app/javascript/controllers/media_player_controller.js +++ b/app/javascript/controllers/media_player_controller.js @@ -16,12 +16,24 @@ export default class extends Controller { const event = new CustomEvent('time-update', { detail: timestamp }) window.dispatchEvent(event) }) + + this.player.index = this.element.dataset.index; + + this.player.on('loadedmetadata', (evt) => { + // only load media for the first player + 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 9dbbb7dc..ff7fe39a 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 e4554493..b463a986 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) {