{"version":3,"sources":["webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/api/config.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/api/player.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/util/append-auth-ticket.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/api/presentation.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/util/sort-by-object-property.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/util/get-play-cover-info.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/api/quizzes.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/components/modal-dialog.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/components/modal-dialog.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/components/overlay.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/components/overlay.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/util/get-script-root.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/util/webpack-public-path.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/util/shared-control-bar.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/ask-a-question.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/ask-a-question.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/ask-a-question/question-form.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/audio-descriptions/audio-descriptions-player.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/audio-descriptions.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/audio-only.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/background.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/background.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/banner/banner-link.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/banner/get-dominant-color.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/banner.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/banner.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/banner/ended-modal-template.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/util/local-storage-available.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/captions.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/captions.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/captions-settings.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/captions-settings.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/chapters.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/util/get-fullscreen-toggle-index.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/controlbar-menu/overflow-menu-item.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/controlbar-menu/overflow-menu-item.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/controlbar-menu/overflow-menu-button.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/controlbar-menu/overflow-menu-button.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/controlbar-menu.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/downloads.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/downloads.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/help.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/conditional/360/hotspot-360.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/hotspots.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/hotspots.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/util/get-interaction-colors-from-color.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/layout.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/loader/apply-loader-callbacks.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/util/player-extensions.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/loader/ensure-presentation-available.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/loader.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/loader/load-presentation-data.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/loader/override-server-settings.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/loader/apply-player-source.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/logging/log-table.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/logging.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/logging.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/metadata/metadata-template.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/metadata.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/metadata.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/notifications/notification-item.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/notifications/notification-item.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/notifications.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/notifications.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/playcover/playcover-play-button.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/playcover.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/playcover/playcover-content-wrapper.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/playcover.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/polls.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/popout.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/register-external-plugin.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/register-plugin.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/reporting/reporting-play-detector.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/reporting/reporting-timeline-segments.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/reporting.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/search.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/search/search-result.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/search.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/search/search-form.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/seekbar-segments/seekbar-segment.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/seekbar-segments/seekbar-segment-progress-bar.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/seekbar-segments/seekbar-segment-progress-bar.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/seekbar-segments/seekbar-segment.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/seekbar-segments.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/seek-thumbnails.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/settings.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/share/share-form.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/share.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/share/share-form.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/show-message.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/smartzoom/layouts.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/smartzoom.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/smartzoom.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/util/calc-dimensions.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/timed-events.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/timeline-markers/timeline-marker.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/timeline-markers/timeline-marker-icon.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/timeline-markers/timeline-marker.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/timeline-markers.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/bookmarkStorage.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/util/simple-state-machine.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/inactivity.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/conditional/conviva.init.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/conditional/guided.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/conditional/guided.init.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/conditional/iframe.init.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/conditional/live.init.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/components/swap-streams-button.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/conditional/multistream.init.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/conditional/playlist.init.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/conditional/poll-notification.init.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/conditional/post-presentation-link.init.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/conditional/pre-roll.init.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/conditional/quizzes.init.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/conditional/video360.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/conditional/video360.init.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/util/hotkeys.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/util/cookie.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/components/seek-button.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/components/seek-button.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/player.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/player-branding.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/player.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/implementations/player-page.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/implementations/player-page.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/implementations/player-page/helpers.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/loader/apply-player-options.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/conditional/360/component360.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/conditional/360/enums.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/conditional/360/styles360.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/util/get-player-options.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/util/is-presentation-id.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/util/localization.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/components/modal-dialog.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/components/overlay.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/components/seek-button.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/implementations/player-page.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/player-branding.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/player.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/ask-a-question.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/background.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/banner.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/captions-settings.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/captions.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/controlbar-menu/overflow-menu-button.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/controlbar-menu/overflow-menu-item.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/downloads.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/hotspots.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/logging.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/metadata.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/notifications.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/notifications/notification-item.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/playcover.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/search.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/seekbar-segments/seekbar-segment-progress-bar.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/seekbar-segments/seekbar-segment.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/share/share-form.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/smartzoom.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/bundled/timeline-markers/timeline-marker.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/conditional/guided.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/conditional/video360.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/util/SFMP.MiniUtility.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/assets/images/DefaultPresenter.svg","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/assets/images/Stream_Swap_Icon.svg","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/assets/images/close-black-24dp.svg","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/assets/images/close-x-black.svg","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/assets/images/download-white-24dp.svg","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/assets/images/help-white-24dp.svg","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/assets/images/info-white-24dp.svg","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/assets/images/notifications_white_24dp.svg","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/assets/images/open_in_new-white-24dp.svg","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/assets/images/playcover-button.svg","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/assets/images/poll-white-24dp.svg","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/assets/images/question_answer-white-24dp.svg","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/assets/images/receipt_white_24dp.svg","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/assets/images/search-white-24dp.svg","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/assets/images/seek-back.svg","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/assets/images/seek-forward.svg","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/assets/images/share-white-24dp.svg","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/assets/images/three-dots-menu.svg","webpack://mediasite-player/../../../../../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/node_modules/video.js/dist/lang|sync|/.js$"],"names":["defaultMediasiteRoot","location","pathname","includes","AntiForgery","Object","seal","Header","Token","Path","ApplicationRoot","ApplicationScriptsRoot","PlayerService","FileServer","WebAppsApi","applyConfig","mediasiteRoot","config","undefined","assign","updatePaths","getOptions","presentationId","getPlayerOptions","then","presentationOptions","GlobalOptions","NextGenPlayerOptions","Presentation","d","IsLayoutPreview","HasSearchableText","ForumEnabled","SharingEnabled","PollingEnabled","IsDvrPlaybackEnabled","enableFullScreen","document","body","requestFullscreen","webkitRequestFullscreen","AllowFullscreen","userCanDownload","CanDownloadMediasiteContent","IsPresentationOwner","streamWithThumbs","Streams","find","s","HasPreviewThumbs","hasMultipleStreams","length","hasMultipleVisualStreams","filter","AudioOnly","conviva","enabled","EnableConviva","userNameHash","UserNameHash","convivaServiceUrl","ConvivaServiceUrl","convivaCustomerId","ConvivaCustomerId","playerType","PlayerType","playerId","PlayerId","playerName","PlayerName","layoutId","LayoutId","siteName","SiteName","siteVersion","SiteVersion","siteBuildNumber","SiteBuildNumber","multisiteId","MultisiteId","reporting","playbackTicket","PlaybackTicket","inactivity","sessionTimeout","SessionTimeout","metadata","showControlBarButton","EnablePresentationInfo","showPublishDateTime","ShowDateTime","chapters","AllowChapterNavigation","showChapterList","AllowScrubbing","search","EnableSearch","popout","AllowPopout","controls","ShowMainControls","settings","enablePlayPause","AllowPlayPauseStop","enableSpeedControl","AllowSpeedControl","enableSeeking","enableSwapStreams","HideSwapStreamsButton","playbackRates","getPlaybackRates","PlaybackSpeeds","live","enableDvr","enableLiveCaptions","LiveCaptioningEnabled","askAQuestion","AllowAskQuestion","downloads","AllowDownloads","share","AllowShare","polls","AllowPolls","url","PollingLocation","help","AllowHelp","PremierPlayerHelpUrl","banner","ShowHeaderArea","FullScreenBannerPath","renderIn360","Is360Video","src","href","FullScreenBannerUrl","width","FullScreenBannerWidth","height","FullScreenBannerHeight","behavior","endedEnabled","PresentationEndedBannerEnabled","endedSrc","PresentationEndedBannerPath","endedHref","PresentationEndedBannerUrl","endedWidth","PresentationEndedBannerWidth","endedHeight","PresentationEndedBannerHeight","seekThumbnails","thumbData","PreviewThumbs","background","isMultiStream","compositionMap","CompositionMap","getExtensions","playerOptions","PlayerExtensions","getLiveEvents","currentTimeInMs","sinceTimeInMs","fetch","method","headers","mode","JSON","stringify","result","json","jsonData","map","event","eventType","EventType","id","Id","payload","Payload","payloadType","PayloadType","sequence","Sequence","time","Time","reportMediaView","bookmarkPosition","segments","reportMediaOpen","embeddedPlayer","window","self","top","container","containerUrl","parent","mediaPlayerType","playbackSpeedsString","defaultList","parsedList","theString","matches","match","results","i","num","Number","isNaN","push","parsePlaybackSpeedsString","appendAuthTicket","collectionId","ticket","fixed","getCollectionIdFromQueryString","getEffectiveAuthTicket","getQueryParam","queryStringParam","indexOf","PresentationStatus","freeze","NotAvailable","ScheduledForLive","OpenForLive","Live","LivePaused","LiveEnded","LiveEndedDvr","OnDemand","PlayerPresentationStatus","None","Viewable","NotFound","Offline","Scheduled","NotYetAvailable","NotAuthorized","TimedEventType","Chapter","Poll","PresentationSubQuiz","Hotspot","Annotation","LiveTimelineEventType","Unknown","Slide","PresentationStart","PresentationEnd","PauseStart","PauseEnd","TimedEvent","ContentStreamType","Video1","Video2","Video3","SearchResultType","Caption","MediaErrorType","CustomError","AbortedError","NetworkError","DecodeError","SrcNotSupported","Encrypted","getMetadata","title","parse","Title","poster","ThumbnailUrl","playerPresentationStatusMessage","PlayerPresentationStatusMessage","playerPresentationStatus","duration","Duration","serverClockSkew","ServerClockSkew","playStatus","PlayStatus","unixTime","UnixTime","presenters","Presenters","presenter","name","Name","bioUrl","BioUrl","imageUrl","ImageUrl","PlayerLayoutOptions","Images","DefaultPresenterImage","ImageFilename","description","Description","supportingLinks","SupportingLinks","link","Url","compliancePolicyMarkdown","CompliancePolicyMarkdown","bookmark","PresentationBookmark","position","is360Video","isLiveCountdownEnabled","LiveCountdownEnabled","isLiveIndicationDelayed","LiveIndicationDelayed","isHlsMime","type","prioritizeHls","a","b","getStreams","stream","VideoUrls","HasSlideContent","slice","sort","prop","sortByObjectProperty","StreamType","videoUrls","videoUrl","locationUrl","URL","Location","protocol","MimeType","segmentLength","SegmentLength","streamType","audioOnly","items","playbackAudioSource","PlaybackAudioSource","priority","Priority","slides","Slides","slide","number","text","Text","slideBaseUrl","SlideBaseUrl","getAudioDescriptionUrl","AudioDescriptionsUrl","getDownloads","isPresentationId","TranscriptUrl","transcriptUrl","txtIndex","cleanTranscriptUrl","Transcripts","language","Language","languageCode","DetailedLanguageCode","transcriptLinkText","finalTranscriptUrl","zipTranscriptsUrl","PodcastUrl","VodcastUrl","Promise","resolve","getCaptions","getChapters","Chapters","chapter","chapterText","getHotspots","Hotspots","hotspot","hotspotProperties","getPresentationOptions","HasQuizzes","getLiveStatus","completedDurationInMs","CompletedDurationInMs","liveStartUnixTimeInMs","LiveStartUnixTimeInMs","getTimedEvents","TimedEvents","getCompositionMap","getCompositionList","CompositionList","getPosterInfo","coverVisible","playcoverNullObjectPromise","reject","defaultThumbnailUrl","hasQuizzes","allowedPlayerIFrameAPISites","enableLiveCountdown","delayLiveIndicationUntilPresentationDate","resourceId","playCoverOptions","DefaultThumbnailUrl","AirDateUnixTimeInMs","AllowedPlayerIFrameAPISites","IsLiveCountdownEnabled","IsLiveIndicationDelayed","sendQuestion","playbackTicketId","question","Message","Success","searchCaptionsAndSlides","searchTerm","SearchResults","searchResult","Type","getPresentationQuiz","PresentationId","AuthTicketId","SiteData","AuthTicket","MediasiteChannelId","CollectionId","RedirectUrl","getQuizResults","quizResultParams","Entity","setQuizAnswer","answerDetails","scoreQuiz","scoreQuizParams","scoreSubQuiz","presentationQuizId","subQuizId","PresentationQuizId","SubQuizId","resetQuizAnswers","data","_allModals","_displayAsPanel","WeakMap","_showPlayerControls","ModalDialog","videojs","constructor","player","options","super","this","addClass","displayAsPanel","solidBackground","on","showPlayerControls","open","args","one","el","querySelector","focus","existingModal","modal","opened","close","triggerLayoutUpdate","trigger","exitClass","removeClass","e","some","get","set","hasClass","shouldShow","conditionalFocus_","previouslyActiveEl_","conditionalBlur_","classList","contains","closest","dispose","indexInArray","splice","OverlayPosition","TopLeft","TopRight","BottomLeft","BottomRight","Center","Overlay","createEl","tag","props","attributes","overlayClassPosition","textContent","className","trim","target","call","__webpack_public_path__","currentScript","split","join","getMsFromString","durationDisplay","parseInt","timeInMS","enableFieldByCheckbox","field","checkbox","disabled","checked","addEventListener","required","padTimeBasedUponDuration","formattingMethod","needPadding","guide","formattedString","padStart","createValidationForTimeString","_modal","_content","_submitter","_email","localize","AskAQuestionPlugin","bind","temporary","uncloseable","pauseOnOpen","controlbarMenu","addMenuItem","icon","QuestionAnswerIcon","callback","openModal","ready","layout","addChild","loader","content","template","createElement","innerHTML","generateQuestionForm","setupModalContent","fillWith","closeModal","form","nameField","emailField","timeCheckbox","timeField","value","currentTime","setAttribute","preventDefault","handleSubmit","formEl","nameValue","emailValue","disableFormControls","Submitter","SubmitterEmail","Subject","QuestionText","TimeInPresentation","handleSubmitComplete","catch","error","handleSubmitError","submitResult","alert","handleSubmitErrorMessage","message","enableFormControls","Array","from","querySelectorAll","isMenuItemEnabled","enableMenuItem","disableMenuItem","usingPlugin","removeMenuItem","_enabled","AudioDescriptionsPlayer","muted","volume","handlePlayerSeeking","paused","pause","play","handlePlayerTimeupdate","handlePlayerPlaying","handlePlayerPause","handlePlayerRatechange","handlePlayerVolumeChange","removeAttribute","off","playerTime","playerRate","playbackRate","diff","Math","abs","currentPlaybackRate","correctedRate","audioDescriptions","log","_audioPlayer","AudioDescriptionsPlugin","collapsedButtons","pluginName","label","buttonName","class","audioPlayer","audioTrackList","audioTracks","existingTrack","getAudioDescriptionsTrack","track","kind","getMainTrack","addTrack","removeAudioComponent","removeAudioDescriptionsTrack","clear","removeTrack","removeChild","delete","AudioOnlyPlugin","hideAudioOnlyVideo","element","tech","style","left","_compositionMap","_isMultiStream","_backgroundContainer","BackgroundPlugin","backgroundComponent","shouldUpdateBackground","composition","VisualCompositions","doesVisualElementFillCanvas","VisualItems","item","ZIndex","backgroundComposition","image","color","SourceId","BaseColor","addBackground","backgroundImageUrl","backgroundContainer","setProperty","visualElement","targetRect","TargetRect","Height","Width","BannerBehavior","Disabled","AutoHide","Static","AUTO_HIDE_CLASS","BannerLink","controlText","alt","Error","processLoadedImage","imageData","img","canvas","naturalWidth","naturalHeight","context","getContext","drawImage","getImageData","getPixels","pixels","sum","pixel","r","g","simpleAverage","x","max","step","floor","getPixel","sampleTopBottomEdges","y","start","_bannerLink","_img","_bannerWidth","_bannerHeight","_isLooping","_endedEnabled","_renderIn360","_endedModal","_endedLink","_endedImg","_endedText","_replayButton","_returnButton","BannerPlugin","bannerLink","appendChild","overlayContents","firstElementChild","generateEndedOverlay","endedLink","endedImg","endedText","replayButton","handleClickedReplay","returnButton","handleClickedReturn","endedOverlay","childEl","children","endedModal","triggerResize","updateLayout","bannerEl","display","getDominantColor","loop","loadPreviousPresentation","video360","removeModal","restartPresentation","playlist","isAutoPlaying","modalBtns","action","displayModal","hideReplay","hideReturn","button","isHidden","add","remove","isCurrentPresentationOriginal","currentPresentationId","isInPlaylist","localStorageAvailable","localStorage","setItem","removeItem","SETTINGS_KEY","_initialTrack","_languageStrings","CaptionsPlugin","languageStrings","initialTrackLanguage","captionsUrl","detailedLanguage","tracks","textTracks","oldTrack","removeRemoteTextTrack","addRemoteTextTrack","captions","cues","getSelectedLanguage","detailed","activeTrack","val","startsWith","getCurrentCaptions","languageToCheck","activeCues","getCaptionTrack","captionTrack","getAllCaptionTracks","captionTracks","toggleCaptions","visible","found","lang","forEach","subsCapsButton","getDescendant","hasCaptionTracks","hasLiveCaptions","liveCaptions","currentCaptions","getChild","updateDisplay","currentTrack","CaptionsSettingsPlugin","captionOptionLabels","captionOptionsParent","captionHeader","innerText","prepend","captionOptions","caption","captionLabelSelector","captionLabelWording","entries","targetCaption","captionCloseBtn","parentNode","addFont","addHeaderToDropdown","headerText","captionsDropdown","captionsHeader","tabIndex","fontDisplay","fontClass","newFontOption","fontMenuDropdown","textTrackCue","_localStorage","currentCustomFont","getItem","getAttribute","selectedIndex","updatedFont","selectedOptions","fontName","fieldsetEl","fieldsetLegend","firstLabel","firstSelect","span","after","_chaptersTrack","_showChapterList","ChaptersPlugin","default","addCue","menuItem","cue","menu","addItem","seekBarSegments","startTime","endTime","progress","chaptersButton","removeCue","getAll","toggleChaptersButton","pressButton","currentChapter","update","visiblity","timeTooltip","cached_timeTooltipUpdate","seekBarRect","seekBarPoint","apply","arguments","timeNumber","chapterName","write","getFullscreenToggleIndex","MenuItem","_callback","OverflowMenuItem","iconClass","backgroundImage","iconSpan","dismissable","theButton","handleClick","tagName","toLowerCase","MenuButtonComponent","_currentMenu","_menuItems","OverflowMenuButton","ExpandLessIcon","createItems","reduce","allItems","currentItem","handleItemClick","itemId","uuid","updateMenuItem","menuItems","itemIndex","findIndex","updatedItem","newMenuItems","hasItem","setTimeout","unpressButton","isItemVisible","showMenuItem","hideMenuItem","_menuButton","ControlbarMenuPlugin","controlBar","contentEl","clientHeight","menuButton","_downloads","DownloadsPlugin","DownloadIcon","heading","listElement","download","_url","HelpPlugin","HelpIcon","_relativeHotspotsGroup","Hotspot360","createAreaHotspot","xr","material","areaProperties","Color","opacity","Opacity","linewidth","transparent","depthWrite","depthTest","hotspotMesh","HasNoFill","THREE","Shape","lookAt","camera","TimedId","triggerDelay","InteractionValues","triggerEffect","TriggerEffects","triggerParam","scene","createTextHotspot","yOffset","Y","xOffset","X","calcRadius","DefaultSizing","zPoint","z","xPoint","yPoint","hotspotTextSize","TextSize","textSize","DisplayText","SecondaryColor","createButtonHotspot","createButton","hoverEffect","HoverEffects","updatePositionOfRelativeHotspots","normalizedVector","getCameraDirectionNormalized","hotspotGroup","geometry","PI","mesh","circleGeometry","clone","itemSize","array","index","outline","leftX","rightX","topY","bottomY","topLeft","topRight","bottomLeft","bottomRight","offset","vertices","Float32Array","setIndex","padding","msgColor","textColor","outlineColor","lines","totalLines","lineMeshes","line","textMesh","createMessageTextMesh","font","renderWidth","renderHeight","parameters","backgroundMesh","createBackgroundMesh","backgroundColor","lineYOffset","linesCreated","lineMesh","maxWidth","contextFont","words","currentLine","word","measureText","meshes","longestWidth","xClampAngle","yClampAngle","translatedOffsetX","translatedOffsetY","theta","phi","sin","cos","_shouldRenderHotspots","_isCurrentVideo360","_hotspotsComponent","hotspot360","_renderedHotspots","_hotspotInfos","HotspotsPlugin","paramProvider","QueryStringParamProvider","getParamCaseSensitive","createHotspotHolder","aspect","videoWidth","videoHeight","setIs360","is360","hotspotsComponent","hotspotsContainer","hotspots","timedId","timedEvents","StartTime","EndTime","showHotspot","hideHotspot","hasPlayerLoadedXR","renderHotspot","targetHotspot","console","hotspotInfo","HasFocus","seeking","triggerHotspot","effect","InteractionEffect","parameter","InteractionParam","targetTime","loadNewPresentation","setDisableHotspot","handleURlChangeResumeButton","isDisabled","hotspotDOM","hotspotButtonDOM","key","deleteHotspot","removeObject","timedEventIds","keys","hotspotDescription","round","hotspotColor","hotspotDOMHolder","xAlignment","yAlignment","mainInteractionColors","backgroundHSL","hexToHsl","h","l","shouldHoverDarken","backgroundHoverLightness","backgroundActiveLightness","colorInHSL","hoverColorInHSL","activeColorInHSL","textHSL","textHoverLightness","textActiveLightness","MainColor","HoverColor","ActiveColor","TextColor","HoverTextColor","ActiveTextColor","hex","hexToParse","substring","exec","min","getInteractionColorsFromColor","fontSize","TextAlignment","_existingLayout","existingLayout","Component","applyLoaderCallbacks","playCoverData","presentationData","loaderHooks","hooks","hook","extensionHooks","extensions","SKIP_EXTENSION_TYPES","extension","ExtensionType","promise","async","extensionUrl","ExtensionBasePath","extensionFunc","import","Data","err","runPlayerExtension","getPlayerExtensionHooks","playerExtensions","all","pluginResults","deepmerge","isMergeableObject","isPlainObject","ensurePresentationAvailable","availableStatuses","status","_options","_currentOptions","_presentationId","_previousPresentationIds","_isLoadingNewPresentation","_playCoverData","_presentationData","_playCoverPromise","_presentationPromise","_playCoverCallbacks","_presentationCallbacks","LoaderPlugin","initOptions","init","playCoverPromise","overrides","playcover","autoPlayParam","getParamFromOptions","playCoverCallbacks","applyPlayerOptions","loadPresentation","showPlayButton","showMessage","applyLiveWait","streams","canPlayType","waitUntilSafe","presentationPromise","presentationCallbacks","audioDescriptionUrl","compositionList","loadPresentationData","overrideServerSettings","any","datetime","captionInfos","captionInfo","LanguageCode","CaptionsUrl","initialTextTrack","configureCaptions","chapterInfos","currentChapterStart","currentChapterEnd","nextChapterStart","VTTCue","configureChapters","timedEvent","enablePIP","applyPlayerSource","initBookmarkStorage","playFrom","getStoredBookmarkPosition","isDVR","seekDisabledInQuizSettings","quizzes","Infinity","seekToLiveEdge","seekToPlayFrom","initDurationPause","bookmarkStorage","lastStartTime","reportToDataProvider","trackPresentation","onLoadPlayCover","onLoadPresentation","skew","includeBookmark","storage","presentationDuration","clockSkew","retrieve","durationPause","savePreviousId","previousOptions","inXR","isPreviousVideo360","isInXR","isLooping","autoplay","enterXROnInit","isNextVideo360","xrDispose","previousPresentationId","pop","getPresentationId","previousPresentationIds","multistream","_tbody","LogTable","thead","sourceEl","descriptionEl","timeEl","tbody","addLog","source","tr","Date","toLocaleTimeString","_loggingWindow","_loggingInterval","_logs","_table","LoggingPlugin","loggingWindow","setInterval","header","closeButton","table","ctrlKey","altKey","shiftKey","URLSearchParams","LoggingIcon","clearInterval","logs","newLogs","history","loggingWindowEl","isAtBottom","scrollHeight","scrollTop","ceil","performance","timing","navigationStart","now","current","currentIndex","scrollTo","generateSpeakerBio","imgUrl","textHTML","convertTextToElement","html","_titleEl","_dateEl","_timeEl","_durationEl","_descriptionEl","_compliancePolicyEl","_presentersContainerEl","_supportingLinksContainerEl","MetadataPlugin","modalContentEl","generateMetadataContainer","InfoIcon","dateEl","date","dataset","toLocaleDateString","timeStyle","replaceAll","hidden","marked","presenterContainer","containerEl","currentLink","isLive","seconds","liveTracker","liveCurrentTime","NotificationItem","titleId","descriptionId","animationClass","clickableEl","notificationTitle","notificationDescription","timeout","animateUp","animate","animateDown","animateOut","direction","cleanup","_notificationContainer","NotificationsPlugin","NotificationsIcon","notificationContainer","overflowButtonIndex","notificationId","notificationItem","existingChildren","removeDisplayItem","child","hasDisplayItem","setupMuteNotification","PlaycoverPlayButton","playIconWrapper","PlaycoverContentWrapper","_poster","_playButton","_title","PlaycoverPlugin","playcoverContentWrapper","playButton","setPlaycoverCustomContent","vjsComponent","addComponent","removeComponent","removeAllComponents","bigPlayButton","clickable","showTitle","dimmed","_popup","PollsPlugin","PollIcon","popup","closed","_message","PopoutPlugin","OpenInNewIcon","iconUrl","inIFrame","onPlayerPage","channelId","playLink","windowName","windowOptions","popoutModalMessage","isOpen","module","moduleEntries","filteredEntries","warn","pluginWrapper","pluginFn","registerPlugin","entry","Plugin","fn","isBasic","_lastPositionChange","_firstPositionChangeOfSegment","_tolerance","_playbackRate","ReportingPlayDetector","lastPositionChange","firstPositionChangeOfSegment","tolerance","change","rate","segmentStartAction","startPosition","segmentEndAction","endPosition","isImportant","handlePlaybackRateChange","handlePositionChange","playing","positionChange","getCurrentTime","isProbablyPlaying","startSegment","endSegment","getTime","isImportantNotification","time1","position1","time2","position2","toleranceFactor","deltaTime","deltaPosition","expectedPositionChange","enforceNonNegativeNumber","_segments","ReportingTimelineSegments","addSegment","end","segmentsArray","getAllSegments","cloneSegment","segment","reset","_segmentsMemory","_playDetector","_includeBookmark","ReportingPlugin","serviceReportMediaViewCalledCount","segmentsMemory","playDetector","handleSegmentStart","handleSegmentEnd","scheduleHeartbeat","clearTimeout","heartbeatTimeout","onHeartbeat","reportSegmentsSinceLastReport","synchronous","reportPlayed","inactivityTimeout","onPlaybackRateChanged","newPlaybackRate","onPositionChanged","serviceSegments","calcBookmarkPosition","toServiceSegments","save","makeReportMediaViewDescription","inputArray","seg","resultArray","getLastItem","lastItem","NaN","getLastEnd","newEnd","newDuration","extendLastItem","addNewItem","parts","secondsToMinutesAndSeconds","totalSeconds","m","ss","isNegative","serviceSegment","isInNoBookmarkZone","generateSearchResult","TIME_ARIA_LABEL","SEARCH_RESULTS_ARIA_LABEL","timeAriaLabel","replacePlaceholders","toISOString","substr","ariaLabel","firstChild","replaceRegex","templateString","rest","previous","replace","_formEl","_resultsEl","SearchPlugin","SearchIcon","generateSearchForm","resultsEl","captionLanguage","RESULT_TYPE_MAPPING","resultContainer","resultEl","keyCode","parseFloat","currentTarget","_startTime","_endTime","SeekBarSegmentProgressBar","segmentWidth","parentElement","getBoundingClientRect","ResizeObserver","updateWidth","observe","playProgressBarPosition","seekBarWidth","_label","_spacerWidth","_progress","SeekBarSegment","spacerWidth","createSegment","onResize","updateSeekBarStyles","addProgressBar","removeProgressBar","seekBar","playProgressBar","overflowX","seekBarSegmentProgressBar","spacerHalfWidth","roundedStartPosition","roundedEndPosition","seekBarSegmentWidth","segmentLeftPosition","_seekBarSegments","SeekBarSegmentsPlugin","segmentConfig","seekBarSegment","segmentId","removeProperty","currentSegments","values","_width","_height","_columns","_rows","_interval","_aspectRatio","SeekThumbnailsPlugin","aspectRatio","spriteThumbnails","interval","Interval","idxTag","columns","Columns","rows","Rows","downlink","responsive","ratio","_enablePlayPause","_enableFullScreen","_enableSpeedControl","_enableSeeking","_enableSwapStreams","_playbackRates","_enablePIP","SettingsPlugin","fullscreenToggle","isFullscreen","exitFullscreen","speedControl","progressControl","forwardSeek","backwardSeek","enable","show","disable","handleMouseMove","hide","enableSwap","getComputedStyle","getPropertyValue","rates","SharePlugin","ShareIcon","generateShareForm","presentationLinkField","copyURL","host","searchParams","has","elementToHide","liveStatus","timeValue","convertedValue","append","textarea","toString","clickElement","select","navigator","clipboard","writeText","classes","overlay","_wrapper","_controlsOverlay","_clickToExit","_canvas","_target","_aspect","SmartzoomPlugin","presetName","testRegions","LAYOUTS","regionCount","activeRegion","lastFocused","windowResizeListener","component","getParam","smartzoomContainer","clickToExit","clickToExitButton","addRegion","oldTarget","region","rect","removeRegion","moveRegion","zoom","targetEl","canvasEl","targetBounds","targetAspect","targetWidth","targetHeight","regionAspect","videoStartTransform","canvasEndTransition","canvasEndOpacity","transition","transform","visibility","drawFrame","offsetHeight","transitionCleanup","removeEventListener","toggleClass","unzoom","immediateRezoom","regionOriginalX","regionOriginalY","regionOriginalWidth","newBounds","regionNewX","regionNewY","regionNewWidth","regionNewHeight","canvasStartVisibility","canvasStartTransition","canvasStartOpacity","canvasStartMargin","canvasStartPosition","canvasStartTransform","videoStartTransition","videoStartOpacity","canvasEndTransform","canvasEndVisibility","videoEndOpacity","videoEndTransition","margin","wrapper","controlsOverlay","wrapperEl","size","bounds","containerAspect","changedScale","scale","calcDimensions","clipWidth","clipHeight","stopPropagation","activeElement","indexBeforeTech","_activeCues","_startCallbacks","_endCallbacks","TimedEventsPlugin","metadataTrack","startCallback","endCallback","marker","timelineMarkers","info","previousCues","isActive","wasActive","TimelineMarkerIcon","shape","timelineMarkerIcon","generateMarkerIcon","innerHTMl","_time","_color","_shape","TimelineMarker","labelDiv","setMarkerIcon","handleMouseDown","handleDurationChange","labelEl","markerColor","customIcon","horizontalPadding","paddingLeft","labelBounding","playerBounding","leftOffset","right","rightOffset","_timelineMarkers","TimelineMarkersPlugin","markerConfig","timelineMarker","markerId","_maximumPositionValue","_bookmarksKeyName","_lastStartTime","_presentationDuration","_isLive","_clockSkew","BookmarkStorePlugin","bookmarks","bookmarksOriginalString","_date","_timestamp","UTC","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getMilliseconds","savedAt","compareSavedAt","shift","watchViewTracking","viewTracking","addHandler","important","SimpleStateMachine","states","initialStateName","onEnter","changeState","toStateName","toState","onExit","beginInactiveChecking","stopInactiveChecking","doReload","isLivePlayback","active","handlePlay","handleSeeking","handlePause","handleEnded","handleInactivityExceeded","inactive","dead","currentState","reload","milliseconds","ConvivaPluginStub","shouldLoad","queryStringEnableTouchstone","convivaSettings","urlSearchParams","ConvivaPlugin","firstPlayableItem","getFirstPlayableItem","comp","convivaConfiguration","serviceUrl","DEFAULT_TOUCHSTONE_ULR_TEST","customerId","hasQuizzing","recordedDateString","numberOfSlides","getSlideCount","numberOfVideos","getVideoCount","streamUrl","videoAmount","findVisualItemBySourceId","sourceId","slideStream","GuidedPluginStub","GuidedPlugin","guided","IFramePluginStub","IFramePlugin","iframe","LivePluginStub","isLivePresentation","isLivePlayable","initializeLivePlugin","liveOptions","LivePlugin","enableCountdown","lastLiveEventTime","getComponent","SwapStreamsButton","multiStream","clickHandler","incrementCompositionIndex","applyNewCompositionMap","StreamSwapIcon","handler","options_","AUDIO_ONLY_STREAM_DIMENSIONS","MultistreamPluginStub","sortByPlaybackAudioSource","organizeStreams","organizedStreams","visualItem","streamLayoutInfo","setupBackground","setBackgroundImage","setBackgroundColor","MultistreamPlugin","multistreams","multistreamPlugin","setMainStreamSize","primarySourceId","swapButton","PlaylistPluginStub","PlaylistPlugin","playlistId","isHomeLooping","defaultImgSrc","PollNotificationPluginStub","ext","PollNotificationPlugin","PostPresentationLinkPluginStub","PostPresentationLinkPlugin","surveyExtensionConfig","surveyUrl","surveyMessage","postPresentationLink","PreRollPluginStub","PreRollPlugin","extensionData","Seconds","preRoll","QuizzesPluginStub","previewQuizzes","noQuizzes","QuizResultContextId","quizOptions","API","quizData","Quizzes","initializeQuizPlugin","QuizzesPlugin","quizTimes","quizzingBuffer","quizResults","addQuizzes","DisableSeeking","Video360PluginStub","disableOverlays","Video360Plugin","hotkeysConfig","seekStep","enableModifiersForNumbers","enableHoverScroll","playPauseKey","which","rewindKey","forwardKey","fullscreenKey","customKeys","questionKey","setupCustomKey","toggleCaptionsKey","toggleChapterssKey","searchKey","infoKey","shareKey","helpKey","downloadKey","pollsKey","nextPresentationKey","prevPresentationKey","homePresentationKey","arrowKeyShift","audioKey","audioBtn","playbackKey","playbackBtn","captionSettingsKey","captionsModal","swapStreamsKey","swapBtn","targetKey","plugin","functionToCall","playerPlugin","Cookie","readCookieData","newPath","setValue","writeCookieData","getValue","defaultValue","getValueAsNumber","getValueAsBool","cookie","begin","decodeURIComponent","newCookie","cookieData","hasOwnProperty","encodeURIComponent","toGMTString","SeekButton","isForward","seekDuration","SeekForward","SeekBackward","pluginNames","allPluginEntries","bundledPlugins","conditionalPlugins","bundledPluginOptions","_player","backSeekButton","forwardSeekButton","muteToggle","playToggle","isAutoPlay","videoEl","events","apiConfig","plugins","customPlugins","fill","fluid","getCurrentLanguage","lockControls","pluginOptions","userActions","hotkeys","click","doubleClick","liveui","crossOrigin","html5","nativeTextTracks","nativeAudioTracks","preloadTextTracks","persistTextTrackSettings","tooltipRect","el_","playerRect","player_","seekBarPointPx","spaceLeftOfPoint","spaceRightOfPoint","pullTooltipBy","fixTimeTooltipUpdate","setupVolumeCooking","autoMute","notifications","playRate","populateMenuButtons","setShowMoreButtonVisibility","overflowButton","playbackMenuItem","textElement","mainTrack","volumeCookie","volumeString","muteString","volumeValue","controlBarMenu","buttonData","pluginButton","clientX","clientWidth","clientY","overflowItems","flexItems","newValue","registerExternalPlugin","AntiForgeryHeaderName","AntiForgeryToken","getPlayFrom","getDuration","getLockControls","elapsed","MediasitePlayer","queryString","playFromParam","durationParam","dataPresentationId","splitPath","dashlessId","part","paramName","paramArray","returnParam","param","paramOption","pluginKey","optionKey","optionValue","createMessage","messageColor","textMeshMetrics","buttonColor","btnTextColor","leftSideBtn","createHalfCircle","rightSideBtn","btnGroupMesh","rotateOnAxis","fontFamily","metrics","textAlign","textBaseline","strokeStyle","lineWidth","strokeText","fillStyle","fillText","renderMessage","texture","needsUpdate","side","createTextMesh","createLoadingIndicator","updateLoadingIndicator","renderOrder","viewTime","percentLoaded","createCircleTexture","strokeWidth","percentFilled","matCanvas","matContext","circleSize","beginPath","arc","textureMaxSize","closePath","stroke","deleteObject","object","Pager","Play","Pause","Restart","Next","Previous","Home","Custom","Scale","BorderScale","PauseCountdown","UIPieces","Border","Close","TextOffset","Distance","VideoSphereRadius","TriggerDelay","_playerColor","_backgroundColor","_textColor","_font","setPlayerColors","playerSelector","playerColor","modalSelector","modalStyle","playerOptionsRequests","urlReferrer","ok","LoginUrl","test","require","LocalizedDictionary","LocalizedStrings","Culture","ApplicationData","fromEntries","translation","___CSS_LOADER_EXPORT___","___CSS_LOADER_URL_REPLACEMENT_0___","___CSS_LOADER_URL_REPLACEMENT_1___","___CSS_LOADER_URL_REPLACEMENT_2___","___CSS_LOADER_URL_REPLACEMENT_3___","SFMP","Utility","COVER_ENABLE_OLD","COVER_ENABLE","COVER_TITLE","COVER_PLAYBUTTON","COVER_COUNTDOWN","AUTHTICKET","COLLECTION","CATALOG","basicHtmlSanitationSpec","allowedTags","tagAttributes","encodeURI","sanitizeOpeningTag","tagInfo","allowedAttributesSpec","filtered","tagHtml","attributeName","re","quotedValue","nullFilter","wholeTag","RegExp","quote","getAuthTicketFromCookie","regex","ids","params","isEmbedded","varArgs","targetObj","propName","TypeError","sourceObj","prototype","sanitizeHtmlString","htmlString","sanitationSpec","allowedAttributes","cleaned","spec","tagPattern","tagExpression","output","searchStart","getNonTagText","startIndex","endIndex","leftEnd","rightEnd","isClosingTag","bareTag","lastIndex","exports","webpackContext","req","webpackContextResolve","__webpack_require__","o","code"],"mappings":"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","file":"main.91eec312c879e8dfb2cf.js","sourcesContent":["const defaultMediasiteRoot = location.pathname.includes('/Mediasite/streams/') ? '/Mediasite/streams' : '/Mediasite';\r\n\r\nfunction updatePaths(mediasiteRoot) {\r\n Object.assign(Path, {\r\n ApplicationRoot: `${mediasiteRoot}/Play`,\r\n ApplicationScriptsRoot: `${mediasiteRoot}/Play/Dist`,\r\n PlayerService: `${mediasiteRoot}/PlayerService/PlayerService.svc/json`,\r\n FileServer: `${mediasiteRoot}/FileServer`,\r\n WebAppsApi: `${mediasiteRoot}/MyMediasite/webapps-api`\r\n });\r\n}\r\n\r\nexport const AntiForgery = Object.seal({\r\n Header: 'X-SOFO-AntiForgeryHeader',\r\n Token: ''\r\n});\r\n\r\nexport const Path = Object.seal({\r\n ApplicationRoot: '',\r\n ApplicationScriptsRoot: '',\r\n PlayerService: '',\r\n FileServer: '',\r\n WebAppsApi: ''\r\n});\r\n\r\nexport function applyConfig({ mediasiteRoot, ...config }) {\r\n if (mediasiteRoot !== undefined) {\r\n updatePaths(mediasiteRoot ?? defaultMediasiteRoot);\r\n }\r\n\r\n if (config) {\r\n Object.assign(AntiForgery, config.AntiForgery);\r\n Object.assign(Path, config.Path);\r\n }\r\n}\r\n\r\napplyConfig({ mediasiteRoot: defaultMediasiteRoot });\r\n","import { getPlayerOptions } from '../util';\r\nimport { Path } from './config.js';\r\n\r\n/**\r\n * @typedef {Object} PlayerOptions\r\n * @property {string} userNameHash\r\n * @property {boolean} enableConviva\r\n * @property {string} playbackTicket\r\n * @property {boolean} allowPopout\r\n * @property {boolean} showMainControls\r\n * @property {boolean} allowScrubbing\r\n * @property {boolean} allowPlayPauseStop\r\n * @property {boolean} enablePresentationInfo\r\n * @property {boolean} showDateTime\r\n * @property {boolean} allowClosedCaptions\r\n * @property {boolean} allowFullscreen\r\n */\r\n\r\n/**\r\n * \r\n * @param {string} presentationId \r\n * @returns {PlayerOptions}\r\n */\r\nexport function getOptions(presentationId) {\r\n return getPlayerOptions(presentationId).then(presentationOptions => {\r\n let { GlobalOptions, NextGenPlayerOptions, Presentation } = presentationOptions.d;\r\n\r\n if (GlobalOptions?.IsLayoutPreview) {\r\n //Set these values\r\n Presentation = {\r\n HasSearchableText: true,\r\n ForumEnabled: true,\r\n SharingEnabled: true,\r\n PollingEnabled: true,\r\n IsDvrPlaybackEnabled: false\r\n }\r\n }\r\n\r\n let browserSupportsFullscreenElement = typeof (document.body.requestFullscreen ?? document.body.webkitRequestFullscreen) === 'function';\r\n let enableFullScreen = browserSupportsFullscreenElement && (NextGenPlayerOptions?.AllowFullscreen ?? true);\r\n let userCanDownload = GlobalOptions?.CanDownloadMediasiteContent || GlobalOptions?.IsPresentationOwner;\r\n let streamWithThumbs = Presentation?.Streams?.find((s) => s.HasPreviewThumbs);\r\n let hasMultipleStreams = (Presentation?.Streams?.length ?? 0) > 1;\r\n let hasMultipleVisualStreams = (Presentation?.Streams?.filter(s => !s.AudioOnly).length ?? 0) > 1;\r\n\r\n let result = {\r\n conviva: {\r\n enabled: GlobalOptions?.EnableConviva,\r\n userNameHash: GlobalOptions?.UserNameHash,\r\n convivaServiceUrl: GlobalOptions?.ConvivaServiceUrl,\r\n convivaCustomerId: GlobalOptions?.ConvivaCustomerId,\r\n playerType: NextGenPlayerOptions?.PlayerType,\r\n playerId: GlobalOptions?.PlayerId,\r\n playerName: GlobalOptions?.PlayerName,\r\n layoutId: GlobalOptions?.LayoutId,\r\n siteName: GlobalOptions?.SiteName,\r\n siteVersion: GlobalOptions?.SiteVersion,\r\n siteBuildNumber: GlobalOptions?.SiteBuildNumber,\r\n multisiteId: GlobalOptions.MultisiteId\r\n },\r\n\r\n reporting: {\r\n playbackTicket: GlobalOptions?.PlaybackTicket\r\n },\r\n\r\n inactivity: {\r\n sessionTimeout: GlobalOptions?.SessionTimeout\r\n },\r\n\r\n metadata: {\r\n showControlBarButton: NextGenPlayerOptions?.EnablePresentationInfo ?? true,\r\n showPublishDateTime: NextGenPlayerOptions?.ShowDateTime ?? true\r\n },\r\n\r\n chapters: {\r\n enabled: NextGenPlayerOptions?.AllowChapterNavigation ?? true,\r\n showChapterList: NextGenPlayerOptions?.AllowScrubbing ?? true //if seeking is disabled, remove the chapter list from the UI\r\n },\r\n\r\n //if seeking is disabled, so should search so that the user can't jump around the video through searching\r\n search: {\r\n enabled: NextGenPlayerOptions?.EnableSearch === true && NextGenPlayerOptions?.AllowScrubbing === true && Presentation?.HasSearchableText === true\r\n },\r\n\r\n popout: {\r\n enabled: NextGenPlayerOptions?.AllowPopout === true\r\n },\r\n \r\n controls: NextGenPlayerOptions?.ShowMainControls ?? true,\r\n\r\n settings: {\r\n enablePlayPause: NextGenPlayerOptions?.AllowPlayPauseStop ?? true,\r\n enableFullScreen: enableFullScreen,\r\n enableSpeedControl: NextGenPlayerOptions?.AllowSpeedControl ?? true,\r\n enableSeeking: NextGenPlayerOptions?.AllowScrubbing ?? true,\r\n enableSwapStreams: hasMultipleVisualStreams && !(NextGenPlayerOptions?.HideSwapStreamsButton),\r\n playbackRates: NextGenPlayerOptions?.AllowSpeedControl ? getPlaybackRates(GlobalOptions?.PlaybackSpeeds) : []\r\n },\r\n\r\n live: {\r\n enableDvr: (Presentation?.IsDvrPlaybackEnabled ?? false) && NextGenPlayerOptions?.AllowScrubbing,\r\n enableLiveCaptions: GlobalOptions?.LiveCaptioningEnabled ?? false\r\n },\r\n\r\n askAQuestion: {\r\n enabled: (NextGenPlayerOptions?.AllowAskQuestion && Presentation?.ForumEnabled) ?? false\r\n },\r\n\r\n downloads: {\r\n enabled: (NextGenPlayerOptions?.AllowDownloads && userCanDownload) ?? false\r\n },\r\n\r\n share: {\r\n enabled: NextGenPlayerOptions?.AllowShare === true && Presentation?.SharingEnabled !== false\r\n },\r\n\r\n polls: {\r\n enabled: NextGenPlayerOptions?.AllowPolls && Presentation?.PollingEnabled,\r\n url: Presentation?.PollingLocation\r\n },\r\n\r\n help: {\r\n url: NextGenPlayerOptions?.AllowHelp ? (GlobalOptions?.PremierPlayerHelpUrl ?? null) : null\r\n },\r\n\r\n banner: {\r\n enabled: NextGenPlayerOptions?.ShowHeaderArea == 'Disabled' ? false : NextGenPlayerOptions?.FullScreenBannerPath ? true : false,\r\n renderIn360: Presentation?.Is360Video,\r\n src: NextGenPlayerOptions?.FullScreenBannerPath,\r\n href: NextGenPlayerOptions?.FullScreenBannerUrl,\r\n width: NextGenPlayerOptions?.FullScreenBannerWidth,\r\n height: NextGenPlayerOptions?.FullScreenBannerHeight,\r\n behavior: NextGenPlayerOptions?.ShowHeaderArea != 'Disabled' ? NextGenPlayerOptions?.ShowHeaderArea : 'Disabled',\r\n endedEnabled: NextGenPlayerOptions?.PresentationEndedBannerEnabled,\r\n endedSrc: NextGenPlayerOptions?.PresentationEndedBannerPath,\r\n endedHref: NextGenPlayerOptions?.PresentationEndedBannerUrl,\r\n endedWidth: NextGenPlayerOptions?.PresentationEndedBannerWidth,\r\n endedHeight: NextGenPlayerOptions?.PresentationEndedBannerHeight\r\n },\r\n\r\n seekThumbnails: {\r\n enabled: (streamWithThumbs?.HasPreviewThumbs && NextGenPlayerOptions?.AllowScrubbing) ?? false,\r\n thumbData: streamWithThumbs?.PreviewThumbs\r\n },\r\n\r\n background: {\r\n isMultiStream: hasMultipleStreams,\r\n compositionMap: Presentation?.CompositionMap,\r\n }\r\n }\r\n\r\n return result;\r\n });\r\n}\r\n\r\n/**\r\n * @param {string} presentationId\r\n * @returns {Promise>}\r\n */\r\nexport function getExtensions(presentationId) {\r\n return getPlayerOptions(presentationId).then(playerOptions => {\r\n const { Presentation } = playerOptions.d;\r\n const extensions = [...Presentation?.PlayerExtensions ?? []];\r\n return extensions;\r\n });\r\n}\r\n\r\n/**\r\n * @typedef {Object} LiveEvent\r\n * @property {number} eventType\r\n * @property {number} time\r\n */\r\n\r\n/**\r\n * \r\n * @param {string} playbackTicket\r\n * @param {number} [currentTimeInMs]\r\n * @param {number} [sinceTimeInMs]\r\n * @returns {Promise>}\r\n */\r\nexport function getLiveEvents(playbackTicket, currentTimeInMs = 0, sinceTimeInMs = -1) {\r\n return fetch(`${Path.PlayerService}/GetLiveEvents`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n mode: 'cors',\r\n body: JSON.stringify({\r\n playbackTicket,\r\n currentTimeInMs,\r\n sinceTimeInMs\r\n })\r\n }).then(result => result.json()).then(jsonData => jsonData.d.map(event => ({\r\n eventType: event.EventType,\r\n id: event.Id,\r\n payload: event.Payload,\r\n payloadType: event.PayloadType,\r\n sequence: event.Sequence,\r\n time: event.Time\r\n })));\r\n}\r\n\r\n/**\r\n * \r\n * @param {string} playbackTicket \r\n * @param {number} bookmarkPosition \r\n * @param {Array<{Duration:number, StartTime: number}>} segments \r\n */\r\nexport function reportMediaView(playbackTicket, bookmarkPosition, segments) {\r\n return fetch(`${Path.PlayerService}/ReportMediaView`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n mode: 'cors',\r\n body: JSON.stringify({\r\n playbackTicket,\r\n bookmarkPosition,\r\n segments\r\n })\r\n });\r\n}\r\n\r\nexport function reportMediaOpen(playbackTicket) {\r\n const embeddedPlayer = window.self != window.top;\r\n let container = null;\r\n if (embeddedPlayer) {\r\n try {\r\n let containerUrl = window.parent.document.location.href;\r\n if (containerUrl) container = containerUrl;\r\n } catch { }\r\n }\r\n return fetch(`${Path.PlayerService}/ReportMediaOpen`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n mode: 'cors',\r\n body: JSON.stringify({\r\n playbackTicket,\r\n playerType: 'Javascript',\r\n mediaPlayerType: 'Html5',\r\n embeddedPlayer,\r\n url: document.location.href,\r\n container\r\n })\r\n });\r\n}\r\n\r\nfunction getPlaybackRates(playbackSpeedsString) {\r\n const defaultList = [0.5, .75, 1.0, 1.25, 1.5, 1.75, 2.0];\r\n\r\n if (typeof playbackSpeedsString !== 'string') {\r\n return defaultList;\r\n }\r\n\r\n let parsedList = parsePlaybackSpeedsString(playbackSpeedsString);\r\n\r\n if (parsedList.length < 1) {\r\n return defaultList;\r\n }\r\n\r\n return parsedList;\r\n}\r\n\r\nfunction parsePlaybackSpeedsString(theString) {\r\n const pattern = /[\\d\\.]+/g;\r\n\r\n if (typeof theString !== 'string') {\r\n return [];\r\n }\r\n\r\n let matches = theString.match(pattern);\r\n\r\n if (!matches) {\r\n return [];\r\n }\r\n\r\n\r\n const results = [];\r\n\r\n for (let i = 0; i < matches.length; i += 1) {\r\n let num = Number(matches[i]);\r\n if (!isNaN(num)) {\r\n results.push(num);\r\n }\r\n }\r\n\r\n return results;\r\n}","import {\r\n queryStringParam,\r\n getCollectionIdFromQueryString,\r\n getEffectiveAuthTicket,\r\n getQueryParam\r\n} from './SFMP.MiniUtility.js';\r\n\r\n/**\r\n * @param {string} presentationId\r\n * @param {string} url\r\n */\r\nexport function appendAuthTicket(presentationId, url) {\r\n if (!url) {\r\n // Garbage in -- garbage out.\r\n return url;\r\n }\r\n\r\n var connector, collectionId, ticket;\r\n var fixed = url;\r\n\r\n function getConnector() { return (fixed.indexOf(\"?\") > -1) ? \"&\" : \"?\" }\r\n\r\n collectionId = getCollectionIdFromQueryString();\r\n ticket = getEffectiveAuthTicket(presentationId, collectionId);\r\n\r\n if (!ticket) {\r\n ticket = getQueryParam(queryStringParam.AUTHTICKET);\r\n }\r\n\r\n if (ticket) {\r\n fixed += getConnector() + queryStringParam.AUTHTICKET + \"=\" + ticket;\r\n }\r\n\r\n return fixed;\r\n}\r\n","import { getPlayerOptions, getPlayCoverInfo, sortByObjectProperty, isPresentationId } from '../util';\r\nimport { Path } from './config.js';\r\nimport { appendAuthTicket } from '../util';\r\n\r\n// Values for d.Presentation.PlayStatus\r\n/**\r\n* @enum {string}\r\n*/\r\nexport const PresentationStatus = Object.freeze({\r\n NotAvailable: \"NotAvailable\",\r\n ScheduledForLive: \"ScheduledForLive\",\r\n OpenForLive: \"OpenForLive\",\r\n Live: \"Live\",\r\n LivePaused: \"LivePaused\",\r\n LiveEnded: \"LiveEnded\",\r\n LiveEndedDvr: \"LiveEndedDvr\",\r\n OnDemand: \"OnDemand\",\r\n});\r\n\r\n// Values for d.PlayerPresentationStatus\r\n/**\r\n* @enum {number}\r\n*/\r\nexport const PlayerPresentationStatus = Object.freeze({\r\n None: 0,\r\n Viewable: 1,\r\n NotFound: 2,\r\n Offline: 3,\r\n Scheduled: 4,\r\n NotYetAvailable: 5,\r\n NotAuthorized: 6\r\n});\r\n\r\n// Values for d.Presentation.TimedEvents\r\n/**\r\n* @enum {string}\r\n*/\r\nexport const TimedEventType = Object.freeze({\r\n Chapter: 'application/vnd.sonicfoundry.chapter.xml',\r\n Poll: 'mediasite/poll',\r\n PresentationSubQuiz: 'mediasite/presentationSubQuiz',\r\n Hotspot: \"SfPresentationHotspot\",\r\n Annotation: 'SfPresentationAnnotation'\r\n});\r\n\r\n/**\r\n * Values for SonicFoundry.Mediasite.Player.DataAccess.TimelineEventType\r\n * @enum {number}\r\n **/\r\nexport const LiveTimelineEventType = Object.freeze({\r\n Unknown: 0,\r\n Slide: 1,\r\n PresentationStart: 2,\r\n PresentationEnd: 3,\r\n PauseStart: 4,\r\n PauseEnd: 5,\r\n TimedEvent: 6\r\n});\r\n\r\n/**\r\n * @enum {number}\r\n */\r\nexport const ContentStreamType = Object.freeze({\r\n Video1: 0,\r\n Slide: 2,\r\n Presentation: 3,\r\n Video2: 4,\r\n Video3: 5\r\n});\r\n\r\n/**\r\n * @enum {number}\r\n */\r\nexport const SearchResultType = Object.freeze({\r\n Caption: 1,\r\n Slide: 2\r\n});\r\n\r\nexport const MediaErrorType = Object.freeze({\r\n CustomError: 0,\r\n AbortedError: 1,\r\n NetworkError: 2,\r\n DecodeError: 3,\r\n SrcNotSupported: 4,\r\n Encrypted: 5\r\n});\r\n\r\n/**\r\n * @typedef {Object} PresentationMetadata\r\n * @property {string} title\r\n * @property {string} poster\r\n * @property {string} playerPresentationStatusMessage\r\n * @property {number} playerPresentationStatus\r\n * @property {number} duration\r\n * @property {string} playStatus\r\n * @property {number} unixTime\r\n * @property {Array} presenters\r\n * @property {Array} supportingLinks\r\n * @property {string} description\r\n * @property {string} compliancePolicyMarkdown\r\n * @property {number} bookmark\r\n * @property {boolean} is360Video\r\n * @property {boolean} isLiveCountdownEnabled\r\n * @property {boolean} isLiveIndicationDelayed\r\n */\r\n\r\n/**\r\n * \r\n * @param {string} presentationId\r\n * @returns {Promise}\r\n */\r\nexport function getMetadata(presentationId) {\r\n return getPlayerOptions(presentationId).then(presentationOptions => {\r\n return {\r\n title: JSON.parse(`\"${presentationOptions.d.Presentation?.Title}\"`),\r\n poster: appendAuthTicket(presentationId, presentationOptions.d.Presentation?.ThumbnailUrl),\r\n playerPresentationStatusMessage: presentationOptions.d.PlayerPresentationStatusMessage,\r\n playerPresentationStatus: presentationOptions.d.PlayerPresentationStatus,\r\n duration: presentationOptions.d.Presentation?.Duration,\r\n serverClockSkew: presentationOptions.d.Presentation?.ServerClockSkew ?? 0,\r\n playStatus: presentationOptions.d.Presentation?.PlayStatus,\r\n unixTime: presentationOptions.d.Presentation?.UnixTime,\r\n presenters: presentationOptions.d.Presentation?.Presenters?.map(presenter => {\r\n return {\r\n name: JSON.parse(`\"${presenter.Name}\"`),\r\n bioUrl: JSON.parse(`\"${presenter.BioUrl}\"`),\r\n imageUrl: presenter.ImageUrl || presentationOptions.d.PlayerLayoutOptions?.Images?.DefaultPresenterImage?.ImageFilename\r\n };\r\n }) ?? [],\r\n description: presentationOptions.d.Presentation?.Description,\r\n supportingLinks: presentationOptions.d.Presentation?.SupportingLinks?.map?.(link => {\r\n return {\r\n title: JSON.parse(`\"${link.Description}\"`),\r\n url: JSON.parse(`\"${link.Url}\"`)\r\n }\r\n }) ?? [],\r\n compliancePolicyMarkdown: presentationOptions.d.GlobalOptions?.CompliancePolicyMarkdown,\r\n bookmark: presentationOptions.d.PresentationBookmark?.position,\r\n is360Video: presentationOptions.d.Presentation?.Is360Video,\r\n isLiveCountdownEnabled: presentationOptions.d.Presentation?.LiveCountdownEnabled,\r\n isLiveIndicationDelayed: presentationOptions.d.Presentation?.LiveIndicationDelayed,\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * @typedef {Object} VideoSource\r\n * @property {string} src\r\n * @property {string} type\r\n * @property {number} segmentLength\r\n * @property {number} streamType\r\n */\r\n\r\nfunction isHlsMime(type) {\r\n return type === 'audio/x-mpegurl';\r\n}\r\n\r\nfunction prioritizeHls(a, b) {\r\n if (isHlsMime(a.type) && !isHlsMime(b.type)) {\r\n return -1;\r\n }\r\n else if (isHlsMime(b.type) && !isHlsMime(a.type)) {\r\n return 1;\r\n }\r\n else {\r\n return 0;\r\n }\r\n}\r\n\r\n/**\r\n * @typedef {Object} MediaStream\r\n * @property {string} streamType\r\n * @property {VideoSource[]} items\r\n * @property {boolean} playbackAudioSource\r\n * @property {number} priority\r\n * @property {string} [slideBaseUrl]\r\n */\r\n\r\n/**\r\n * \r\n * @param {any} presentationId\r\n * @returns {Promise}\r\n */\r\nexport function getStreams(presentationId) {\r\n return getPlayerOptions(presentationId).then(presentationOptions => {\r\n const streams = presentationOptions.d.Presentation?.Streams\r\n ?.filter(stream => (stream.VideoUrls.length > 0 || stream.HasSlideContent))\r\n .slice()\r\n .sort((a, b) => sortByObjectProperty(a, b, 'Priority')) ?? [];\r\n\r\n return streams.map(stream => {\r\n switch (stream.StreamType) {\r\n case ContentStreamType.Video1:\r\n case ContentStreamType.Video2:\r\n case ContentStreamType.Video3: {\r\n const videoUrls = stream.VideoUrls.map(videoUrl => {\r\n const locationUrl = new URL(videoUrl.Location);\r\n locationUrl.protocol = window.location.protocol;\r\n return {\r\n src: locationUrl.href,\r\n type: videoUrl.MimeType,\r\n segmentLength: videoUrl.SegmentLength,\r\n streamType: stream.StreamType\r\n }\r\n }) ?? [];\r\n videoUrls.sort(prioritizeHls);\r\n return {\r\n id: stream.Id,\r\n audioOnly: stream.AudioOnly,\r\n streamType: stream.StreamType,\r\n items: videoUrls,\r\n playbackAudioSource: stream.PlaybackAudioSource,\r\n priority: stream.Priority\r\n };\r\n }\r\n case ContentStreamType.Slide:\r\n const slides = stream.Slides.map(slide => {\r\n return {\r\n number: slide.Number,\r\n text: slide.Text,\r\n time: slide.Time,\r\n streamType: ContentStreamType.Slide\r\n }\r\n });\r\n return {\r\n id: stream.Id,\r\n audioOnly: stream.AudioOnly,\r\n streamType: stream.StreamType,\r\n items: slides,\r\n slideBaseUrl: stream.SlideBaseUrl,\r\n playbackAudioSource: stream.PlaybackAudioSource,\r\n priority: stream.Priority\r\n }\r\n default:\r\n break;\r\n }\r\n });\r\n });\r\n}\r\n/**\r\n * \r\n * @param {string} presentationId\r\n * @returns {Promise}\r\n */\r\nexport function getAudioDescriptionUrl(presentationId) {\r\n return getPlayerOptions(presentationId).then(presentationOptions => (\r\n appendAuthTicket(presentationId, presentationOptions.d.Presentation?.AudioDescriptionsUrl)\r\n ));\r\n}\r\n\r\n/**\r\n * @typedef {Object} DownloadInfo\r\n * @property {string} text\r\n * @property {string} url\r\n */\r\n\r\n/**\r\n * \r\n * @param {string} presentationId\r\n * @returns {Promise>}\r\n */\r\nexport function getDownloads(presentationId) {\r\n return isPresentationId(presentationId) ? getPlayerOptions(presentationId).then(presentationOptions => {\r\n const result = [];\r\n if (presentationOptions.d.Presentation?.TranscriptUrl) {\r\n const transcriptUrl = presentationOptions.d.Presentation?.TranscriptUrl\r\n const txtIndex = transcriptUrl.indexOf('.txt');\r\n const cleanTranscriptUrl = transcriptUrl.slice(0, txtIndex);\r\n\r\n for (let i = 0; i < presentationOptions.d.Presentation?.Transcripts.length; i++) {\r\n const language = presentationOptions.d.Presentation.Transcripts[i].Language;\r\n const languageCode = presentationOptions.d.Presentation.Transcripts[i].DetailedLanguageCode;\r\n const languageTranscriptUrl = cleanTranscriptUrl + '_' + languageCode + '.txt';\r\n let transcriptLinkText = `${language} Transcript (.txt)`\r\n let finalTranscriptUrl = appendAuthTicket(presentationId, languageTranscriptUrl);\r\n\r\n //Don't show language if only one transcript exists\r\n if (presentationOptions.d.Presentation?.Transcripts.length === 1) {\r\n transcriptLinkText = 'Transcript (.txt)';\r\n finalTranscriptUrl = appendAuthTicket(presentationId, transcriptUrl);\r\n }\r\n \r\n result.push({\r\n text: transcriptLinkText,\r\n url: finalTranscriptUrl\r\n });\r\n }\r\n\r\n if (presentationOptions.d.Presentation?.Transcripts.length > 1) {\r\n const zipTranscriptsUrl = cleanTranscriptUrl + 's.zip';\r\n result.push({\r\n text: `Transcripts (.zip)`,\r\n url: appendAuthTicket(presentationId, zipTranscriptsUrl)\r\n });\r\n }\r\n }\r\n if (presentationOptions.d.Presentation?.PodcastUrl) {\r\n result.push({\r\n text: 'Audio (.mp3 Podcast)',\r\n url: appendAuthTicket(presentationId, presentationOptions.d.Presentation?.PodcastUrl)\r\n });\r\n }\r\n if (presentationOptions.d.Presentation?.VodcastUrl) {\r\n result.push({\r\n text: 'Video (.mp4 Vodcast)',\r\n url: appendAuthTicket(presentationId, presentationOptions.d.Presentation?.VodcastUrl)\r\n });\r\n }\r\n return result;\r\n }) : Promise.resolve([{ text: 'Example', url: location.href }]);\r\n}\r\n\r\n/**\r\n * \r\n * @param {string} presentationId\r\n * @returns {Promise}\r\n */\r\nexport function getCaptions(presentationId) {\r\n return getPlayerOptions(presentationId).then(presentationOptions => {\r\n const captions = presentationOptions.d.Presentation?.Transcripts ?? [];\r\n return captions;\r\n });\r\n}\r\n\r\n/**\r\n * \r\n * @param {string} presentationId\r\n * @returns {Promise}\r\n */\r\nexport function getChapters(presentationId) {\r\n return getPlayerOptions(presentationId).then(presentationOptions => {\r\n return (presentationOptions.d.Presentation?.Chapters ?? []).map(chapter => {\r\n //Parsing to JSON handles decoding any encoding done by server-side\r\n const chapterText = JSON.parse(`\"${chapter.Text}\"`);\r\n return Object.assign({}, chapter, { Text: chapterText });\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * \r\n * @param {string} presentationId\r\n * @returns {Promise}\r\n */\r\nexport function getHotspots(presentationId) {\r\n return getPlayerOptions(presentationId).then(presentationOptions => {\r\n return (presentationOptions.d.Presentation?.Hotspots ?? []).map(hotspot => {\r\n //Parse out the properties in hotspot text and then merge it with the info found elsewhere in the hotspot object\r\n const hotspotProperties = JSON.parse(hotspot.Text);\r\n return { ...hotspot, ...hotspotProperties };\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * @typedef {Object} PresentationOptions\r\n * @property {boolean} HasSearchableText\r\n * @property {boolean} ForumEnabled\r\n * @property {boolean} SharingEnabled\r\n * @property {boolean} PollingEnabled\r\n * @property {boolean} HasQuizzes\r\n */\r\n\r\n/**\r\n * \r\n * @param {string} presentationId\r\n * @returns {Promise}\r\n */\r\n\r\nexport function getPresentationOptions(presentationId) {\r\n return getPlayerOptions(presentationId).then(presentationOptions => {\r\n return {\r\n HasSearchableText: presentationOptions.d.Presentation?.HasSearchableText,\r\n ForumEnabled: presentationOptions.d.Presentation?.ForumEnabled,\r\n SharingEnabled: presentationOptions.d.Presentation?.SharingEnabled,\r\n PollingEnabled: presentationOptions.d.Presentation?.PollingEnabled,\r\n HasQuizzes: presentationOptions.d.Presentation?.HasQuizzes,\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * @param {string} presentationId\r\n * @returns {Promise<{completedDurationInMs:number,liveStartUnixTimeInMs:number,playStatus:string}>}\r\n */\r\nexport function getLiveStatus(presentationId) {\r\n return fetch(`${Path.PlayerService}/GetLiveStatus`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n mode: 'cors',\r\n body: JSON.stringify({ presentationId })\r\n }).then(result => result.json()).then(jsonData => ({\r\n completedDurationInMs: jsonData.d.CompletedDurationInMs,\r\n liveStartUnixTimeInMs: jsonData.d.LiveStartUnixTimeInMs,\r\n playStatus: jsonData.d.PlayStatus\r\n }));\r\n}\r\n\r\n/**\r\n * @typedef {Object} TimedEvent\r\n * @property {string} Id\r\n * @property {string} Text\r\n * @property {number} Time\r\n * @property {string} Type\r\n * @property {string} _type\r\n */\r\n\r\n/**\r\n * \r\n * @param {string} presentationId\r\n * @returns {Promise}\r\n */\r\nexport function getTimedEvents(presentationId) {\r\n return getPlayerOptions(presentationId).then(presentationOptions => {\r\n return presentationOptions.d.Presentation?.TimedEvents ?? [];\r\n });\r\n}\r\n\r\n/**\r\n * @typedef {Object} CompositionMap\r\n * @property {number} Width\r\n * @property {number} Height\r\n * @property {number} Duration\r\n * @property {Array} VisualCompositions\r\n */\r\n\r\n/**\r\n * @typedef {Object} VisualComposition\r\n * @property {number} Time\r\n * @property {Array} VisualItems\r\n */\r\n\r\n/**\r\n * @typedef {Object} VisualCompositionItem\r\n * @property {string} SourceId\r\n * @property {Rect} TargetRect\r\n */\r\n\r\n/**\r\n * @typedef {Object} Rect\r\n * @property {number} X\r\n * @property {number} Y\r\n * @property {number} Width\r\n * @property {number} Height\r\n */\r\n\r\n/**\r\n *\r\n * @param {string} presentationId\r\n * @returns {Promise}\r\n */\r\nexport function getCompositionMap(presentationId) {\r\n return getPlayerOptions(presentationId).then(presentationOptions => {\r\n return presentationOptions.d.Presentation?.CompositionMap;\r\n });\r\n}\r\n\r\n/**\r\n *\r\n * @param {string} presentationId\r\n * @returns {Promise}\r\n */\r\nexport function getCompositionList(presentationId) {\r\n return getPlayerOptions(presentationId).then(presentationOptions => {\r\n return presentationOptions.d.Presentation?.CompositionList;\r\n });\r\n}\r\n\r\n/**\r\n * @typedef {Object} PosterInfo\r\n * @property {string} title\r\n * @property {string} poster\r\n * @property {string} playStatus\r\n * @property {number} unixTime\r\n * @property {boolean} hasQuizzes\r\n * @property {string[]} allowedPlayerIFrameAPISites\r\n */\r\n\r\n/**\r\n * \r\n * @param {string} presentationId\r\n * @returns {Promise}\r\n */\r\nexport function getPosterInfo(presentationId, coverVisible) {\r\n const playcoverNullObjectPromise = new Promise((resolve, reject) => {\r\n const playcoverNullObject = {\r\n title: null,\r\n poster: null,\r\n defaultThumbnailUrl: null,\r\n playStatus: null,\r\n unixTime: null,\r\n hasQuizzes: null,\r\n allowedPlayerIFrameAPISites: null,\r\n enableLiveCountdown: null,\r\n delayLiveIndicationUntilPresentationDate: null\r\n }\r\n resolve(playcoverNullObject)\r\n })\r\n\r\n if (!isPresentationId(presentationId) || coverVisible === false) {\r\n return playcoverNullObjectPromise\r\n }\r\n else {\r\n return getPlayCoverInfo(presentationId).then(playCoverOptions => {\r\n return {\r\n title: playCoverOptions.d.Title,\r\n poster: appendAuthTicket(presentationId, playCoverOptions.d?.ThumbnailUrl) ?? playCoverOptions.d.DefaultThumbnailUrl,\r\n defaultThumbnailUrl: playCoverOptions.d.DefaultThumbnailUrl,\r\n playStatus: playCoverOptions.d.PlayStatus,\r\n unixTime: playCoverOptions.d.AirDateUnixTimeInMs,\r\n hasQuizzes: playCoverOptions.d.HasQuizzes,\r\n allowedPlayerIFrameAPISites: playCoverOptions.d.AllowedPlayerIFrameAPISites,\r\n enableLiveCountdown: playCoverOptions.d.IsLiveCountdownEnabled,\r\n delayLiveIndicationUntilPresentationDate: playCoverOptions.d.IsLiveIndicationDelayed\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport function sendQuestion(playbackTicketId, question) {\r\n return fetch(`${Path.PlayerService}/SendQuestion`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n mode: 'cors',\r\n body: JSON.stringify({ playbackTicketId, question })\r\n }).then(result => result.json()).then(jsonData => {\r\n const { Message, Success } = jsonData.d;\r\n // Success variable indicates whether question was successfully submited (after server side validation, etc.)\r\n return { Success, Message };\r\n });\r\n}\r\n\r\nexport function getShareEmail(playbackTicketId) {\r\n return fetch(`${Path.PlayerService}/GetInvite`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n mode: 'cors',\r\n body: JSON.stringify({ playbackTicketId })\r\n }).then(result => result.json()).then(jsonData => {\r\n return {\r\n text: jsonData.d.MessageBody,\r\n title: jsonData.d.Subject,\r\n url: jsonData.d.MailTo\r\n }\r\n });\r\n}\r\n\r\n\r\n/**\r\n * @typedef {Object} PresentationTextSearchResult\r\n * @property {string} text The text excerpt where the result was found.\r\n * @property {number} time The time in milliseconds.\r\n * @property {SearchResultType} type The type of result.\r\n */\r\n\r\n/**\r\n * \r\n * @param {string} playbackTicketId\r\n * @param {string} searchTerm\r\n * @returns {Promise}\r\n */\r\nexport function searchCaptionsAndSlides(playbackTicketId, searchTerm, language) {\r\n return fetch(`${Path.PlayerService}/SearchPresentationText`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n mode: 'cors',\r\n body: JSON.stringify({ playbackTicketId, searchTerm, language })\r\n }).then(result => result.json()).then(jsonData => {\r\n return jsonData.d.SearchResults?.map(searchResult => ({\r\n text: searchResult.Text,\r\n time: searchResult.Time,\r\n type: searchResult.Type\r\n })) ?? [];\r\n });\r\n}\r\n","export function sortByObjectProperty(a, b, prop) {\r\n if (a[prop] > b[prop]) {\r\n return 1;\r\n }\r\n else if (a[prop] < b[prop]) {\r\n return -1;\r\n }\r\n else {\r\n return 0;\r\n }\r\n}\r\n","import { Path } from '../api/config.js';\r\n\r\n/**\r\n* Returns a Promise that resolves to a collection of data from GetPlayerOptions.\r\n* @param {string} resourceId\r\n* @returns {Promise}\r\n*/\r\nexport function getPlayCoverInfo(resourceId) {\r\n return fetch(`${Path.PlayerService}/GetPlayCoverInfo`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n mode: 'cors',\r\n body: JSON.stringify({\r\n \"presentationId\": resourceId\r\n })\r\n }).then(result => result.json());\r\n}\r\n","import { AntiForgery, Path } from './config.js';\r\n\r\nexport function getPresentationQuiz(presentationId) {\r\n return fetch(`${Path.WebAppsApi}/PresentationQuiz/GetQuizPlayerDisplay`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n [AntiForgery.Header]: AntiForgery.Token,\r\n 'X-Requested-With': 'XMLHttpRequest'\r\n },\r\n mode: 'cors',\r\n body: JSON.stringify({\r\n Id: presentationId,\r\n PresentationId: presentationId,\r\n AuthTicketId: window.SiteData.AuthTicket,\r\n MediasiteChannelId: window.SiteData.CollectionId\r\n })\r\n }).then(result => result.json()).then(jsonData => {\r\n if (jsonData.RedirectUrl) {\r\n location.href = jsonData.RedirectUrl;\r\n return new Promise();\r\n }\r\n else {\r\n return jsonData;\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * \r\n * @param {Object} quizResultParams\r\n * @param {string} quizResultParams.PresentationId\r\n * @param {string} quizResultParams.PresentationQuizId\r\n * @param {string} quizResultParams.AuthTicketId\r\n * @param {string} quizResultParams.MediasiteChannelId\r\n * @param {string} quizResultParams.QuizResultContextId\r\n * \r\n */\r\nexport function getQuizResults(quizResultParams) {\r\n return fetch(`${Path.WebAppsApi}/QuizResult/FindOrCreateResult`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n [AntiForgery.Header]: AntiForgery.Token\r\n },\r\n mode: 'cors',\r\n body: JSON.stringify(quizResultParams)\r\n }).then(result => result.json()).then(result => result.Entity);\r\n}\r\n\r\n/**\r\n * \r\n * @param {Object} answerDetails\r\n * @param {string} answerDetails.PresentationQuizId\r\n * @param {string} answerDetails.PresentationId\r\n * @param {string} answerDetails.CatalogId\r\n * @param {string} answerDetails.QuizResultId\r\n * @param {string} answerDetails.SubQuizId\r\n * @param {string} answerDetails.QuestionId\r\n * @param {string} answerDetails.SubmittedAnswer\r\n * @param {string} answerDetails.QuizResultContextId\r\n */\r\nexport function setQuizAnswer(answerDetails) {\r\n\r\n return fetch(`${Path.WebAppsApi}/QuizResult/SetAnswer`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n [AntiForgery.Header]: AntiForgery.Token\r\n },\r\n mode: 'cors',\r\n body: JSON.stringify(answerDetails)\r\n }).then(result => result.json());\r\n}\r\n\r\n/**\r\n * \r\n * @param {Object} scoreQuizParams\r\n * @param {string} scoreQuizParams.PresentationId\r\n * @param {string} scoreQuizParams.PresentationQuizId\r\n * @param {string} scoreQuizParams.AuthTicketId\r\n * @param {string} scoreQuizParams.MediasiteChannelId\r\n * @param {string} scoreQuizParams.QuizResultContextId\r\n * \r\n */\r\nexport function scoreQuiz(scoreQuizParams) {\r\n return fetch(`${Path.WebAppsApi}/QuizResult/ScoreQuiz`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n [AntiForgery.Header]: AntiForgery.Token\r\n },\r\n mode: 'cors',\r\n body: JSON.stringify(scoreQuizParams)\r\n }).then(result => result.json()).then(result => result.Entity);\r\n}\r\n\r\n\r\nexport function scoreSubQuiz(presentationId, presentationQuizId, subQuizId) {\r\n return fetch(`${Path.WebAppsApi}/QuizResult/ScoreSubQuiz`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n [AntiForgery.Header]: AntiForgery.Token\r\n },\r\n mode: 'cors',\r\n body: JSON.stringify({\r\n PresentationQuizId: presentationQuizId,\r\n PresentationId: presentationId,\r\n SubQuizId: subQuizId,\r\n AuthTicketId: window.SiteData.AuthTicket,\r\n MediasiteChannelId: window.SiteData.CollectionId\r\n })\r\n }).then(result => result.json()).then(result => result.Entity);\r\n}\r\n\r\n/**\r\n * \r\n * @param {string} presentationId\r\n * @param {string} presentationQuizId\r\n * @param {string} channelId\r\n */\r\nexport function resetQuizAnswers(presentationId, presentationQuizId) {\r\n\r\n const data = {\r\n PresentationQuizId: presentationQuizId,\r\n PresentationId: presentationId,\r\n AuthTicketId: window.SiteData.AuthTicket,\r\n MediasiteChannelId: window.SiteData.CollectionId\r\n }\r\n\r\n return fetch(`${Path.WebAppsApi}/QuizResult/ResetAnswers`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n [AntiForgery.Header]: AntiForgery.Token\r\n },\r\n mode: 'cors',\r\n body: JSON.stringify(data)\r\n }).then(result => result.json());\r\n}\r\n","import api from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/postcss-loader/dist/cjs.js!./modal-dialog.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import videojs from 'video.js';\r\n\r\nimport './modal-dialog.css';\r\n\r\nconst _allModals = [];\r\nconst _displayAsPanel = new WeakMap();\r\nconst _showPlayerControls = new WeakMap();\r\n\r\nexport default class ModalDialog extends videojs.getComponent('ModalDialog') {\r\n /**\r\n * \r\n * @param {videojs.Player} player\r\n * @param {Object} options\r\n * @param {string} options.text\r\n * @param {OVERLAY_POSITION} [options.position]\r\n * @param {string} [options.className]\r\n * @param {boolean} [options.displayAsPanel]\r\n * @param {boolean} [options.solidBackground]\r\n * @param {boolean} [options.showPlayerControls]\r\n */\r\n constructor(player, options) {\r\n super(player, options);\r\n this.addClass('mediasite-player__modal-dialog');\r\n this.displayAsPanel = options.displayAsPanel || false;\r\n this.solidBackground = options.solidBackground ?? true;\r\n _allModals.push(this);\r\n\r\n //the option to show the player controls needs to know about the player setting to show the player controls\r\n //therefore, we wait until the loader has finished before finding out if the modal dialog option of showing the player controls\r\n //should be applied or not\r\n player.on('presentationloaded', () => { \r\n const playerHasControls = this.player().controls();\r\n if (playerHasControls && options.showPlayerControls) {\r\n this.showPlayerControls = true;\r\n } else {\r\n this.showPlayerControls = false;\r\n }\r\n });\r\n }\r\n\r\n open(...args) {\r\n super.open(...args);\r\n\r\n this.one('animationend', () => {\r\n this.el().querySelector('input')?.focus();\r\n });\r\n\r\n if (this.displayAsPanel) {\r\n const existingModal = _allModals.find(modal => modal.displayAsPanel && modal.opened() && modal !== this);\r\n existingModal?.close();\r\n }\r\n\r\n if (this.showPlayerControls) {\r\n this.player().controls(true);\r\n }\r\n\r\n this.triggerLayoutUpdate();\r\n\r\n this.trigger('modalopened');\r\n }\r\n\r\n close(...args) {\r\n if (super.opened()) {\r\n super.close(...args);\r\n const exitClass = 'mediasite-player__modal-dialog--exiting';\r\n try {\r\n this.addClass(exitClass);\r\n this.one('animationend', () => {\r\n this.removeClass(exitClass);\r\n this.triggerLayoutUpdate();\r\n });\r\n }\r\n catch (e) { }\r\n }\r\n }\r\n\r\n triggerLayoutUpdate() {\r\n if (_allModals.some(modal => modal.displayAsPanel && modal.opened())) {\r\n this.player().addClass('mediasite-player--sidebar-open');\r\n this.player().controls(true);\r\n }\r\n else {\r\n this.player().removeClass('mediasite-player--sidebar-open');\r\n }\r\n this.player().trigger('playerresize');\r\n }\r\n\r\n get displayAsPanel() {\r\n return _displayAsPanel.get(this);\r\n }\r\n\r\n set displayAsPanel(displayAsPanel) {\r\n _displayAsPanel.set(this, displayAsPanel);\r\n\r\n if (displayAsPanel) {\r\n this.addClass('mediasite-player__modal-dialog--panel');\r\n }\r\n else {\r\n this.removeClass('mediasite-player__modal-dialog--panel');\r\n }\r\n\r\n this.triggerLayoutUpdate();\r\n }\r\n\r\n get solidBackground() {\r\n return this.hasClass('mediasite-player__modal-dialog--solid-background');\r\n }\r\n\r\n set solidBackground(solidBackground) {\r\n if (solidBackground) {\r\n this.addClass('mediasite-player__modal-dialog--solid-background');\r\n }\r\n else {\r\n this.removeClass('mediasite-player__modal-dialog--solid-background');\r\n }\r\n }\r\n\r\n get showPlayerControls() {\r\n return _showPlayerControls.get(this);\r\n }\r\n\r\n set showPlayerControls(shouldShow) {\r\n _showPlayerControls.set(this, shouldShow); \r\n\r\n if (shouldShow) {\r\n this.addClass('mediasite-player__modal-dialog---show-controls');\r\n }\r\n else {\r\n this.removeClass('mediasite-player__modal-dialog---show-controls');\r\n }\r\n\r\n this.triggerLayoutUpdate();\r\n }\r\n\r\n /**\r\n * See the 'condtionalBlur' comment for more details, but this function moves the focus off the modal when it opens back to where the focus was before\r\n * if the controls are enabled to be shown.\r\n */\r\n conditionalFocus_() {\r\n super.conditionalFocus_();\r\n\r\n if (this.showPlayerControls) {\r\n this.previouslyActiveEl_.focus();\r\n }\r\n }\r\n\r\n /**\r\n * This is how the official Video.js \"TextTrackSettings\" component resets focus to the captions button on close.\r\n * I don't like how it's labeled in the Video.js source code as a private function, but it appears to be the\r\n * only way to do this accessibly without reimplementing more of the modal component.\r\n * @see {@link https://github.com/videojs/video.js/blob/main/src/js/tracks/text-track-settings.js#L589}\r\n * @private\r\n */\r\n conditionalBlur_() {\r\n if (this.previouslyActiveEl_ && this.previouslyActiveEl_.classList.contains('vjs-menu-item')) {\r\n // ModalDialog component automatically focuses this.previouslyActiveEl_ on close; setting it here lets us override which button gets focused\r\n this.previouslyActiveEl_ = this.previouslyActiveEl_.closest('.vjs-menu-button').querySelector('.vjs-menu-button');\r\n }\r\n super.conditionalBlur_();\r\n }\r\n\r\n dispose() {\r\n super.dispose();\r\n const indexInArray = _allModals.indexOf(this);\r\n if (indexInArray > -1) {\r\n _allModals.splice(indexInArray, 1);\r\n }\r\n }\r\n}\r\n","import api from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/postcss-loader/dist/cjs.js!./overlay.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import videojs from 'video.js';\r\n\r\nimport './overlay.css';\r\n\r\n/**\r\n * @enum {string}\r\n **/\r\nexport const OverlayPosition = Object.freeze({\r\n TopLeft: 'top-left',\r\n TopRight: 'top-right',\r\n BottomLeft: 'bottom-left',\r\n BottomRight: 'bottom-right',\r\n Center: 'center'\r\n});\r\n\r\nexport default class Overlay extends videojs.getComponent('Component') {\r\n /**\r\n * \r\n * @param {videojs.Player} player\r\n * @param {Object} options\r\n * @param {string} options.text\r\n * @param {OverlayPosition} [options.position]\r\n * @param {string} [options.className]\r\n */\r\n constructor(player, options) {\r\n super(player, options);\r\n }\r\n\r\n createEl(tag, props = {}, attributes = {}) {\r\n const options = this.options();\r\n const overlayClassPosition = options.position ?? OverlayPosition.Center;\r\n\r\n tag = options.url ? 'a' : 'div';\r\n props = Object.assign({\r\n textContent: options.text,\r\n className: `mediasite-player__overlay mediasite-player__overlay--${overlayClassPosition} ${options.className ?? ''}`.trim()\r\n });\r\n\r\n if (options.url) {\r\n props.href = options.url;\r\n props.target = '_blank';\r\n }\r\n\r\n return super.createEl.call(this, tag, props, attributes);\r\n }\r\n}\r\n","export function getScriptRoot() {\r\n const url = new URL(document.currentScript?.src ?? '');\r\n return url.href.split('/').slice(0, -1).join('/');\r\n}\r\n","import { getScriptRoot } from '.';\r\n__webpack_public_path__ = `${getScriptRoot()}/`;\r\n","//there is some functionality that different modals that get displayed in the control bar all use\r\n/**\r\n * Converts the provided time string (like HH:MM:SS or MM:SS) into the number of milliseconds\r\n * @param {string} durationDisplay\r\n */\r\nexport function getMsFromString(durationDisplay) {\r\n var i, segments = durationDisplay.split(\":\");\r\n\r\n //if the first segement only has one digit for hours, add a padding 0 to the front of it\r\n if (segments[0].length === 1) {\r\n segments[0] = `0${segments[0]}`;\r\n }\r\n\r\n for (i = 0; i < segments.length; i++) {\r\n if (isNaN(parseInt(segments[i], 10)) || segments[i].length != 2 || segments[i] < 0) {\r\n return -1;\r\n }\r\n }\r\n\r\n var timeInMS = 0;\r\n\r\n switch (segments.length) {\r\n case 3:\r\n timeInMS = segments[0] * 3600000 + segments[1] * 60000 + segments[2] * 1000;\r\n break;\r\n case 2:\r\n timeInMS = segments[0] * 60000 + segments[1] * 1000;\r\n break;\r\n case 1:\r\n timeInMS = segments[0] * 1000;\r\n break;\r\n }\r\n\r\n return timeInMS;\r\n}\r\n\r\n/**\r\n * Mirrors the checkbox 'checked' attribute to the field 'interactable' attribute.\r\n */ \r\nexport function enableFieldByCheckbox(field, checkbox) {\r\n field.disabled = !checkbox.checked;\r\n\r\n // When timeCheckbox changes, toggle timeField disabled\r\n checkbox.addEventListener('change', event => {\r\n field.disabled = !checkbox.checked;\r\n field.required = checkbox.checked;\r\n });\r\n}\r\n/**\r\n * Adds padding of 0s before the time given.\r\n * If our video is longer than an hour, add enough padding for hours.\r\n * Else, keep it to just minutes and seconds.\r\n * @param {function} formattingMethod (videojs.formatTime)\r\n */ \r\nexport function padTimeBasedUponDuration(formattingMethod, time, duration) {\r\n let needPadding = false;\r\n let guide = 600;\r\n\r\n //the normal time formatting only include one digit for hours\r\n //if the video is longer than 10 hours, add a tens digit for hours\r\n if (duration >= 36000) {\r\n needPadding = true;\r\n guide = 3600;\r\n } else if (duration >= 3600) {\r\n guide = 3600;\r\n }\r\n\r\n let formattedString = formattingMethod(time, guide);\r\n\r\n if (needPadding) {\r\n formattedString.padStart(8, '0');\r\n }\r\n return formattedString;\r\n}\r\n\r\n/**\r\n * Returns a regex that matches the format of the string to make sure its value is in the same format before submitting.\r\n */ \r\nexport function createValidationForTimeString(formattedString) {\r\n let segments = formattedString.split(\":\");\r\n\r\n if (segments.length == 2) {\r\n return \"^[0-5]\\\\d:[0-5]\\\\d$\";\r\n } else if (segments.length == 3) {\r\n if (segments[0].length == 2) {\r\n return \"^\\\\d\\\\d:[0-5]\\\\d:[0-5]\\\\d$\";\r\n } else if (segments[0].length == 1) {\r\n return \"^\\\\d:[0-5]\\\\d:[0-5]\\\\d$\";\r\n }\r\n }\r\n\r\n return \"\";\r\n}","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js!./ask-a-question.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import videojs from 'video.js';\r\n\r\nimport ModalDialog from '../../components/modal-dialog.js';\r\n\r\nimport generateQuestionForm from './ask-a-question/question-form.js';\r\nimport { getMsFromString, enableFieldByCheckbox, padTimeBasedUponDuration, createValidationForTimeString } from '../../util/shared-control-bar.js';\r\n\r\nimport './ask-a-question.css';\r\nimport { sendQuestion } from '../../api/presentation.js';\r\n\r\nimport QuestionAnswerIcon from '../../assets/images/question_answer-white-24dp.svg';\r\nimport { isPresentationId } from '../../util';\r\n\r\nconst _modal = new WeakMap();\r\nconst _content = new WeakMap();\r\nconst _submitter = new WeakMap();\r\nconst _email = new WeakMap();\r\nlet localize;\r\n\r\n/**\r\n * The AskAQuestion module.\r\n * @member {AskAQuestionPlugin} askAQuestion\r\n * @memberof MediasitePlayer#\r\n */\r\n\r\n/**\r\n * Provides a modal dialog for the user to submit a question to the presenter, if enabled.\r\n * @hideconstructor\r\n * @extends {external:\"videojs.Plugin\"}\r\n **/\r\nclass AskAQuestionPlugin extends videojs.getPlugin('plugin') {\r\n constructor(player, options) {\r\n localize = player.localize?.bind(player);\r\n super(player, options);\r\n\r\n const modal = new ModalDialog(player, {\r\n temporary: false,\r\n uncloseable: false,\r\n pauseOnOpen: false,\r\n description: localize('Ask a Question'),\r\n displayAsPanel: true\r\n });\r\n modal.addClass('mediasite-player__ask-a-question-modal');\r\n modal.addClass('mediasite-player__control-bar-modal');\r\n _modal.set(this, modal);\r\n player.controlbarMenu().addMenuItem(localize('Ask a Question'), { id: this.name, icon: QuestionAnswerIcon, callback: () => this.openModal() });\r\n\r\n player.ready(() => {\r\n player.layout().addChild(modal);\r\n });\r\n }\r\n\r\n /**\r\n * Opens the Ask a Question modal dialog.\r\n * @example\r\n * player.askAQuestion.openModal();\r\n */\r\n openModal() {\r\n if (isPresentationId(this.player.loader().presentationId) && this.enabled) {\r\n const modal = _modal.get(this);\r\n const content = generateQuestionForm(this.player);\r\n _content.set(this, content);\r\n\r\n this.setupModalContent(content);\r\n modal.fillWith(content);\r\n modal.open();\r\n }\r\n }\r\n\r\n /**\r\n * Closes the Ask a Question modal dialog.\r\n * @example\r\n * player.askAQuestion.closeModal();\r\n */\r\n closeModal() {\r\n _modal.get(this).close();\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {HTMLDivElement} content\r\n */\r\n setupModalContent(content) {\r\n const form = content.querySelector('form');\r\n const nameField = content.querySelector('input[name=name]');\r\n const emailField = content.querySelector('input[name=email]');\r\n const timeCheckbox = content.querySelector('input[type=checkbox]');\r\n const timeField = content.querySelector('input[name=time]');\r\n\r\n //populate the name and email field with what was previously submitted, if applicatable\r\n nameField.value = _submitter.get(this) ?? '';\r\n emailField.value = _email.get(this) ?? '';\r\n\r\n enableFieldByCheckbox(timeField, timeCheckbox);\r\n timeField.value = padTimeBasedUponDuration(videojs.formatTime, this.player.currentTime(), this.player.duration());\r\n timeField.setAttribute(\"pattern\", createValidationForTimeString(timeField.value));\r\n\r\n // When submitButton is clicked, validate and submit\r\n form.addEventListener('submit', event => {\r\n event.preventDefault();\r\n this.handleSubmit();\r\n });\r\n }\r\n\r\n handleSubmit() {\r\n /** @type {HTMLFormElement} */\r\n const formEl = _content.get(this).querySelector('form');\r\n const nameValue = formEl.querySelector('input[name=name]').value;\r\n const emailValue = formEl.querySelector('input[name=email]').value;\r\n\r\n //save the name and email for when the form loads again\r\n _submitter.set(this, nameValue);\r\n _email.set(this, emailValue);\r\n\r\n this.disableFormControls();\r\n const question = {\r\n Submitter: nameValue,\r\n SubmitterEmail: emailValue,\r\n Subject: formEl.querySelector('input[name=subject]').value,\r\n QuestionText: formEl.querySelector('textarea').value,\r\n TimeInPresentation: formEl.querySelector('input[type=checkbox]').checked ? getMsFromString(formEl.querySelector('input[name=time]').value) : 0\r\n };\r\n sendQuestion(this.player.reporting().playbackTicket, question)\r\n .then(result => this.handleSubmitComplete(result))\r\n .catch(error => this.handleSubmitError(error));\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {object} submitResult\r\n * @param {boolean} submitResult.Success\r\n * @param {string} submitResult.Message\r\n */\r\n handleSubmitComplete(submitResult) {\r\n if (submitResult?.Success) {\r\n alert('Your question has been sent.');\r\n _modal.get(this).close();\r\n }\r\n else if (submitResult?.Message != null) {\r\n this.handleSubmitErrorMessage(submitResult.Message)\r\n }\r\n else {\r\n this.handleSubmitError()\r\n }\r\n }\r\n\r\n handleSubmitErrorMessage(message) {\r\n alert(`${message}`)\r\n this.enableFormControls();\r\n }\r\n\r\n handleSubmitError() {\r\n alert('Error!');\r\n this.enableFormControls();\r\n }\r\n\r\n enableFormControls() {\r\n const formEl = _content.get(this).querySelector('form');\r\n for (const el of Array.from(formEl.querySelectorAll('input:not([name=time]), textarea'))) {\r\n el.disabled = false;\r\n }\r\n\r\n const timeCheckbox = formEl.querySelector('input[type=checkbox]');\r\n const timeField = formEl.querySelector('input[name=time]');\r\n if (timeCheckbox.checked) {\r\n timeField.disabled = false;\r\n }\r\n }\r\n\r\n disableFormControls() {\r\n const formEl = _content.get(this).querySelector('form');\r\n for (const el of Array.from(formEl.querySelectorAll('input, textarea'))) {\r\n el.disabled = true;\r\n }\r\n }\r\n\r\n /**\r\n * A boolean indicating whether or not the Ask a Question feature is enabled.\r\n * @type {boolean}\r\n * @example\r\n * player.askAQuestion.enabled = true;\r\n */\r\n get enabled() {\r\n return this.player.controlbarMenu().isMenuItemEnabled(this.name);\r\n }\r\n\r\n set enabled(enabled) {\r\n if (enabled) {\r\n this.player.controlbarMenu().enableMenuItem(this.name);\r\n }\r\n else {\r\n this.player.controlbarMenu().disableMenuItem(this.name);\r\n }\r\n }\r\n\r\n dispose() {\r\n if (this.player?.usingPlugin('controlbarMenu')) {\r\n this.player.controlbarMenu().removeMenuItem(this.name);\r\n }\r\n \r\n super.dispose();\r\n }\r\n}\r\n\r\nexport default AskAQuestionPlugin;\r\n","export default function generateQuestionForm(player) {\r\n const localize = player.localize?.bind(player);\r\n const template = `

${localize('Ask a Question')}

\r\n
\r\n

\r\n

\r\n

\r\n

\r\n

${localize('Time')}${localize('Time at')}

\r\n

* ${localize('Required Field')}

\r\n

\r\n
`;\r\n\r\n const container = document.createElement('div');\r\n container.innerHTML = template;\r\n return container;\r\n}","import videojs from 'video.js';\r\n\r\n/** @type {WeakMap} */\r\nconst _enabled = new WeakMap();\r\n\r\nconst POOR_SYNC = 0.5; // seconds\r\nconst VERY_BAD_SYNC = 1.0; // seconds\r\nconst SYNC_CORRECTION = 0.1;\r\n\r\nexport default class AudioDescriptionsPlayer extends videojs.getComponent('Component') {\r\n /**\r\n * \r\n * @param {videojs.Player} player\r\n * @param {any} options\r\n */\r\n constructor(player, options) {\r\n super(player, options);\r\n }\r\n\r\n createEl(tag, props = {}, attributes = {}) {\r\n tag = 'audio';\r\n props = Object.assign({});\r\n attributes = Object.assign({});\r\n\r\n return super.createEl.call(this, tag, props, attributes);\r\n }\r\n\r\n /**\r\n * @type {boolean}\r\n */\r\n set enabled(enabled) {\r\n _enabled.set(this, enabled);\r\n this.el().muted = !enabled;\r\n if (enabled) {\r\n this.el().volume = this.player().volume();\r\n this.el().muted = this.player().muted();\r\n }\r\n }\r\n \r\n get enabled() {\r\n return _enabled.get(this);\r\n }\r\n\r\n set src(src) {\r\n const player = this.player();\r\n\r\n if (src) {\r\n this.el().src = src;\r\n\r\n this.handlePlayerSeeking();\r\n if (player.paused()) {\r\n this.el().pause();\r\n }\r\n else {\r\n this.el().play();\r\n }\r\n\r\n // Set up event listeners\r\n this.on(player, 'seeking', this.handlePlayerSeeking);\r\n this.on(player, 'timeupdate', this.handlePlayerTimeupdate);\r\n this.on(player, 'playing', this.handlePlayerPlaying);\r\n this.on(player, 'pause', this.handlePlayerPause);\r\n this.on(player, 'ratechange', this.handlePlayerRatechange);\r\n this.on(player, 'volumechange', this.handlePlayerVolumeChange);\r\n }\r\n else {\r\n this.el().pause();\r\n this.el().removeAttribute('src');\r\n\r\n this.off(player, 'seeking', this.handlePlayerSeeking);\r\n this.off(player, 'timeupdate', this.handlePlayerTimeupdate);\r\n this.off(player, 'playing', this.handlePlayerPlaying);\r\n this.off(player, 'pause', this.handlePlayerPause);\r\n this.off(player, 'ratechange', this.handlePlayerRatechange);\r\n this.off(player, 'volumechange', this.handlePlayerVolumeChange);\r\n }\r\n }\r\n\r\n get src() {\r\n return this.el().src;\r\n }\r\n\r\n /**\r\n * @param {Event} event\r\n */\r\n handlePlayerSeeking(event) {\r\n this.el().currentTime = this.player().currentTime();\r\n }\r\n\r\n /**\r\n * @param {Event} event\r\n */\r\n handlePlayerTimeupdate(event) {\r\n const playerTime = this.player().currentTime();\r\n const playerRate = this.player().playbackRate();\r\n const audioTime = this.el().currentTime;\r\n const diff = audioTime - playerTime;\r\n\r\n if (Math.abs(diff) > VERY_BAD_SYNC) {\r\n this.handlePlayerSeeking();\r\n }\r\n else {\r\n const currentPlaybackRate = this.el().playbackRate;\r\n let correctedRate = playerRate;\r\n if (diff > POOR_SYNC) {\r\n correctedRate = playerRate - SYNC_CORRECTION;\r\n }\r\n else if (diff < -POOR_SYNC) {\r\n correctedRate = playerRate + SYNC_CORRECTION;\r\n }\r\n\r\n if (correctedRate !== currentPlaybackRate) {\r\n this.el().playbackRate = correctedRate;\r\n this.player().audioDescriptions().log(`Adjusting audio descriptions playback rate: ${correctedRate}`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @param {Event} event\r\n */\r\n handlePlayerPlaying(event) {\r\n this.el().play();\r\n }\r\n\r\n /**\r\n * @param {Event} event\r\n */\r\n handlePlayerPause(event) {\r\n this.el().pause();\r\n this.handlePlayerSeeking();\r\n }\r\n\r\n /**\r\n * @param {Event} event\r\n */\r\n handlePlayerRatechange(event) {\r\n this.el().playbackRate = this.player().playbackRate();\r\n }\r\n\r\n /**\r\n * @param {Event} event\r\n */\r\n handlePlayerVolumeChange(event) {\r\n if (_enabled.get(this)) {\r\n this.el().volume = this.player().volume();\r\n this.el().muted = this.player().muted();\r\n }\r\n }\r\n}\r\n","import videojs from 'video.js';\r\n\r\nimport AudioDescriptionsPlayer from './audio-descriptions/audio-descriptions-player.js';\r\n\r\nconst _audioPlayer = new WeakMap();\r\nlet localize;\r\n\r\n/**\r\n * The AudioDescriptions module.\r\n * @member {AudioDescriptionsPlugin} audioDescriptions\r\n * @memberof MediasitePlayer#\r\n */\r\n\r\n/**\r\n * Configures an audio descriptions track to play along with the main source video. Playback and audio volume are kept in sync with the main source video automatically.\r\n * @hideconstructor\r\n * @extends {external:\"videojs.Plugin\"}\r\n **/\r\nclass AudioDescriptionsPlugin extends videojs.getPlugin('plugin') {\r\n constructor(player, options) {\r\n localize = player.localize?.bind(player);\r\n super(player, options);\r\n\r\n player.ready(() => {\r\n player.collapsedButtons?.push({\r\n pluginName: this.name,\r\n label: localize('Audio Descriptions'),\r\n buttonName: 'AudioTrackButton',\r\n class: 'vjs-audio-button'\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * The source URL of an audio descriptions file to play along with the main media. If null, the existing audio descriptions track will be removed (if there is one).\r\n * @type {string}\r\n * @example\r\n * player.audioDescriptions.src = '/path/to/audio/file.mp3';\r\n */\r\n set src(src) {\r\n const player = this.player;\r\n localize = player.localize?.bind(player);\r\n let audioPlayer = _audioPlayer.get(this);\r\n\r\n const audioTrackList = player.audioTracks();\r\n const existingTrack = getAudioDescriptionsTrack(player);\r\n const mainTrack = getMainTrack(player);\r\n mainTrack.label = localize('Main');\r\n\r\n if (src) {\r\n // Make sure there's an audio player component for the audio descriptions\r\n if (!audioPlayer) {\r\n audioPlayer = new AudioDescriptionsPlayer(player);\r\n audioPlayer.enabled = false;\r\n\r\n audioTrackList.addEventListener('change', () => {\r\n for (let i = 0; i < audioTrackList.length; i++) {\r\n if (audioTrackList[i].kind === 'main-desc' && audioTrackList[i].enabled) {\r\n audioPlayer.enabled = true;\r\n }\r\n else {\r\n audioPlayer.enabled = false;\r\n }\r\n }\r\n });\r\n\r\n _audioPlayer.set(this, audioPlayer);\r\n player.addChild(audioPlayer);\r\n }\r\n\r\n // Add the track to the player, if it does not already exist\r\n if (!existingTrack) {\r\n audioTrackList.addTrack(new videojs.AudioTrack({\r\n kind: 'main-desc',\r\n label: localize('Audio Descriptions'),\r\n language: 'en'\r\n }));\r\n }\r\n\r\n audioPlayer.src = src;\r\n }\r\n else {\r\n removeAudioComponent(player);\r\n removeAudioDescriptionsTrack(player);\r\n }\r\n }\r\n\r\n get src() {\r\n return _audioPlayer.get(this)?.src;\r\n }\r\n\r\n clear() {\r\n removeAudioComponent(this.player);\r\n removeAudioDescriptionsTrack(this.player);\r\n }\r\n\r\n dispose() {\r\n removeAudioComponent(this.player);\r\n removeAudioDescriptionsTrack(this.player);\r\n\r\n super.dispose();\r\n }\r\n}\r\n\r\n/**\r\n * @private\r\n * @param {videojs.Player} player\r\n */\r\nfunction getMainTrack(player) {\r\n return Array.from(player.audioTracks())\r\n .find(track => track.kind === 'main');\r\n}\r\n\r\n/**\r\n * @private\r\n * @param {videojs.Player} player\r\n */\r\nfunction getAudioDescriptionsTrack(player) {\r\n return Array.from(player?.audioTracks() ?? [])\r\n .find(track => track.kind === 'main-desc');\r\n}\r\n\r\n/**\r\n * @private\r\n * @param {videojs.Player} player\r\n */\r\nfunction removeAudioDescriptionsTrack(player) {\r\n const audioTrackList = player?.audioTracks();\r\n const existingTrack = getAudioDescriptionsTrack(player);\r\n\r\n if (existingTrack) {\r\n audioTrackList.removeTrack(existingTrack);\r\n\r\n // Enable the main track so Video.js UI in the ControlBar properly resets\r\n Array.from(audioTrackList).find(track => track.kind === 'main').enabled = true;\r\n }\r\n}\r\n\r\n/**\r\n * @private\r\n * @param {videojs.Player} player\r\n */\r\nfunction removeAudioComponent(player) {\r\n const audioPlayer = _audioPlayer.get(this);\r\n if (audioPlayer) {\r\n audioPlayer.src = null;\r\n player.removeChild(audioPlayer);\r\n _audioPlayer.delete(this);\r\n }\r\n}\r\n\r\nexport default AudioDescriptionsPlugin;\r\n","import videojs from 'video.js';\r\n\r\n//TODO: Create message that shows when presentation is audio only, with no video or slide stream shown\r\nexport default class AudioOnlyPlugin extends videojs.getPlugin('plugin') {\r\n constructor(player, options) {\r\n super(player, options); \r\n }\r\n\r\n hideAudioOnlyVideo() {\r\n const element = this.player.tech(true).el();\r\n element.style.left = '0px';\r\n element.style.top = `0px`;\r\n element.style.width = `0px`;\r\n element.style.height = `0.01px`;\r\n }\r\n}\r\n","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js!./background.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import videojs from 'video.js';\r\nimport './background.css';\r\n\r\nconst _compositionMap = new WeakMap();\r\nconst _isMultiStream = new WeakMap();\r\nconst _backgroundContainer = new WeakMap();\r\n\r\nconst DEFAULT_COLOR = \"#000000\";\r\n\r\n/**\r\n * The Background module.\r\n * @memberof MediasitePlayer#\r\n */\r\n\r\n/**\r\n * Configures the background for single stream presentations\r\n * @hideconstructor\r\n * @extends {external:\"videojs.Plugin\"}\r\n */\r\nclass BackgroundPlugin extends videojs.getPlugin('plugin') {\r\n constructor(player, options) {\r\n super(player, options);\r\n\r\n const Component = videojs.getComponent('Component');\r\n const backgroundComponent = new Component(this.player, { name: 'Background' }); \r\n backgroundComponent.addClass('mediasite-player__background');\r\n backgroundComponent.addClass('vjs-hidden');\r\n\r\n _backgroundContainer.set(this, backgroundComponent);\r\n\r\n this.player.ready(() => {\r\n this.player.layout().addChild(backgroundComponent);\r\n });\r\n }\r\n\r\n /**\r\n * Set the composition map on the background plugin\r\n * @type {object}\r\n * @example\r\n * player.background().compositionMap = {}\r\n */\r\n get compositionMap() {\r\n return _compositionMap.get(this);\r\n }\r\n\r\n set compositionMap(map) {\r\n _compositionMap.set(this, map);\r\n this.shouldUpdateBackground(map);\r\n }\r\n\r\n /**\r\n * Set whether or not there are more than one stream with this presentation. If so, this plugin will let the multistream plugin handle the background logic instead\r\n */ \r\n get isMultiStream() {\r\n return _isMultiStream.get(this);\r\n }\r\n\r\n set isMultiStream(hasMultipleStreams) {\r\n _isMultiStream.set(this, hasMultipleStreams);\r\n }\r\n\r\n shouldUpdateBackground(compositionMap) {\r\n //don't bother creating a background here if we have multiple stream, let the multistream plugin handle that\r\n if (this.isMultiStream) {\r\n return;\r\n }\r\n\r\n const composition = compositionMap?.VisualCompositions[0];\r\n //if the video we're looking already fills the canvas, don't bother adding a background since it wouldn't be seen\r\n const doesFill = this.doesVisualElementFillCanvas(composition.VisualItems.find(item => item.ZIndex === 1)); \r\n if (doesFill) {\r\n return;\r\n }\r\n\r\n //grab the background image and color to determine what we should do about them\r\n const backgroundComposition = composition.VisualItems.find(item => item.ZIndex === 0);\r\n\r\n let image, color;\r\n if (backgroundComposition) {\r\n image = backgroundComposition.SourceId;\r\n }\r\n\r\n if (composition.BaseColor) {\r\n color = composition.BaseColor;\r\n } \r\n\r\n //update the background if we have an image, or a color that isn't the default\r\n if (image || (color && color != DEFAULT_COLOR)) {\r\n this.addBackground(image, color);\r\n }\r\n }\r\n\r\n addBackground(backgroundImageUrl, color) {\r\n const backgroundContainer = _backgroundContainer.get(this);\r\n backgroundContainer.addChild(this.player.tech(true));\r\n\r\n backgroundContainer.el().style.setProperty('--background-color', color);\r\n backgroundContainer.el().style.setProperty('--background-url', `url('${backgroundImageUrl}')`);\r\n\r\n backgroundContainer.removeClass(\"vjs-hidden\");\r\n }\r\n\r\n doesVisualElementFillCanvas(visualElement) {\r\n if (!visualElement) {\r\n return false;\r\n }\r\n const targetRect = visualElement?.TargetRect;\r\n\r\n return (targetRect.Height === 1 && targetRect.Width === 1);\r\n }\r\n\r\n clear() {\r\n const backgroundContainer = _backgroundContainer.get(this);\r\n if (backgroundContainer.hasClass('vjs-hidden')) {\r\n return;\r\n }\r\n\r\n const tech = this.player.tech(true);\r\n this.player.layout().addChild(tech, {}, 0);\r\n\r\n backgroundContainer.addClass('vjs-hidden');\r\n }\r\n\r\n dispose() {\r\n this.clear();\r\n super.dispose();\r\n }\r\n}\r\n\r\nexport default BackgroundPlugin;\r\n","import videojs from 'video.js';\r\n\r\nexport const BannerBehavior = Object.freeze({\r\n Disabled: 'Disabled',\r\n AutoHide: 'AutoHide',\r\n Static: 'Static'\r\n});\r\n\r\nconst AUTO_HIDE_CLASS = 'mediasite-player__banner-img--auto-hide';\r\n\r\nlet localize;\r\n\r\nexport default class BannerLink extends videojs.getComponent('ClickableComponent') {\r\n constructor(player, options) {\r\n localize = player.localize?.bind(player);\r\n\r\n super(player, options);\r\n\r\n player.ready(() => {\r\n this.controlText(localize(\"Video banner\"));\r\n });\r\n }\r\n\r\n createEl(tag, props = {}, attributes = {}) {\r\n tag = 'a';\r\n props = Object.assign({\r\n className: `mediasite-player__banner-img ${AUTO_HIDE_CLASS}`\r\n });\r\n attributes = Object.assign({\r\n target: '_blank',\r\n alt: localize(\"Video banner\")\r\n });\r\n\r\n return super.createEl.call(this, tag, props, attributes);\r\n }\r\n\r\n get behavior() {\r\n return this.hasClass(AUTO_HIDE_CLASS) ? BannerBehavior.AutoHide : BannerBehavior.Static;\r\n }\r\n\r\n set behavior(behavior) {\r\n if (behavior === BannerBehavior.AutoHide) {\r\n this.addClass(AUTO_HIDE_CLASS);\r\n }\r\n else if (behavior === BannerBehavior.Static) {\r\n this.removeClass(AUTO_HIDE_CLASS);\r\n }\r\n else if (behavior === BannerBehavior.Disabled) {\r\n }\r\n else {\r\n throw new Error(`Invalid banner image behavior \"${behavior}\".`);\r\n }\r\n }\r\n\r\n}\r\n","export function getDominantColor(imageUrl) {\r\n const image = document.createElement('img'); \r\n image.setAttribute('src', imageUrl);\r\n\r\n if (image.width) {\r\n return Promise.resolve(processLoadedImage(image));\r\n }\r\n else {\r\n return new Promise(resolve => {\r\n image.addEventListener('load', () => {\r\n resolve(processLoadedImage(image));\r\n });\r\n })\r\n }\r\n}\r\n\r\nfunction processLoadedImage(image) {\r\n const imageData = getPixels(image);\r\n\r\n if (imageData) {\r\n const sampledPixels = sampleTopBottomEdges(imageData);\r\n return simpleAverage(sampledPixels);\r\n } else {\r\n return false;\r\n }\r\n}\r\n\r\nfunction getPixels(img) {\r\n try {\r\n const canvas = document.createElement('canvas');\r\n canvas.width = img.naturalWidth;\r\n canvas.height = img.naturalHeight;\r\n\r\n var context = canvas.getContext('2d');\r\n context.drawImage(img, 0, 0);\r\n\r\n return context.getImageData(0, 0, canvas.width, canvas.height);\r\n } catch (e) {\r\n // probably local file security error\r\n }\r\n}\r\n\r\nfunction sampleTopBottomEdges (imageData) {\r\n const pixelsPerEdge = 6;\r\n const pixels = [];\r\n\r\n for (let x = 0, max = imageData.width, step = Math.floor(max / pixelsPerEdge); x < max; x += step) {\r\n pixels.push(getPixel(imageData, x, 0));\r\n pixels.push(getPixel(imageData, x, imageData.height - 1));\r\n }\r\n \r\n return pixels;\r\n}\r\n\r\nfunction getPixel(imageData, x, y) {\r\n const start = (y * imageData.width + x) * 4;\r\n return imageData.data.slice(start, start + 4);\r\n} \r\n\r\nfunction simpleAverage(pixels) {\r\n let num = 0;\r\n const sum = [0, 0, 0, 0];\r\n\r\n for (let i = 0, length = pixels.length; i < length; i++) {\r\n var pixel = pixels[i];\r\n if (!pixel[3]) {\r\n continue;\r\n };\r\n\r\n sum[0] += pixel[0];\r\n sum[1] += pixel[1];\r\n sum[2] += pixel[2];\r\n sum[3] += pixel[3];\r\n num++;\r\n }\r\n\r\n if (num) {\r\n sum[0] /= num;\r\n sum[1] /= num;\r\n sum[2] /= num;\r\n sum[3] /= num;\r\n }\r\n sum[3] = sum[3] || 255;\r\n\r\n return { \r\n r: sum[0],\r\n g: sum[1],\r\n b: sum[2],\r\n a: sum[3] / 256\r\n };\r\n};\r\n","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js!./banner.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import videojs from 'video.js';\r\n\r\nimport BannerLink from './banner/banner-link.js';\r\nimport { getDominantColor } from './banner/get-dominant-color.js';\r\nimport { generateEndedOverlay } from './banner/ended-modal-template.js';\r\n\r\nimport './banner.css';\r\nimport ModalDialog from '../../components/modal-dialog.js';\r\nimport Overlay, { OverlayPosition } from '../../components/overlay.js';\r\n\r\nconst _bannerLink = new WeakMap();\r\nconst _img = new WeakMap();\r\nconst _bannerWidth = new WeakMap();\r\nconst _bannerHeight = new WeakMap();\r\nconst _enabled = new WeakMap();\r\nconst _isLooping = new WeakMap();\r\n\r\nconst _endedEnabled = new WeakMap();\r\nconst _renderIn360 = new WeakMap();\r\nconst _endedModal = new WeakMap();\r\nconst _endedLink = new WeakMap();\r\nconst _endedImg = new WeakMap();\r\nconst _endedText = new WeakMap();\r\nconst _replayButton = new WeakMap();\r\nconst _returnButton = new WeakMap();\r\nlet localize;\r\n\r\n/**\r\n * The Banner module.\r\n * @member {BannerPlugin} banner\r\n * @memberof MediasitePlayer#\r\n */\r\n\r\n/**\r\n * Configures a banner image and link that may be displayed at the top of the player area.

\r\n * Note: the banner image will only be displayed if {@link BannerPlugin#enabled} is set to true, and {@link BannerPlugin#src} and {@link BannerPlugin#href} have each been set to a non-empty string.\r\n * @hideconstructor\r\n * @extends {external:\"videojs.Plugin\"}\r\n **/\r\nclass BannerPlugin extends videojs.getPlugin('plugin') {\r\n constructor(player, options) {\r\n localize = player.localize?.bind(player);\r\n super(player, options);\r\n _enabled.set(this, false);\r\n _endedEnabled.set(this, false);\r\n\r\n player.ready(() => {\r\n const bannerLink = new BannerLink(player);\r\n\r\n const img = document.createElement('img');\r\n\r\n img.setAttribute(\"alt\", localize(\"Video banner\"));\r\n bannerLink.el().appendChild(img);\r\n player.layout().addChild(bannerLink);\r\n\r\n _bannerLink.set(this, bannerLink);\r\n _img.set(this, img);\r\n\r\n this.enabled = false;\r\n\r\n const overlayContents = generateEndedOverlay(player);\r\n const endedLink = overlayContents.querySelector('a');\r\n _endedLink.set(this, endedLink);\r\n\r\n const endedImg = overlayContents.querySelector('img');\r\n _endedImg.set(this, endedImg);\r\n\r\n const endedText = overlayContents.querySelector('.vjs-presentation-ended-text');\r\n _endedText.set(this, endedText);\r\n\r\n const replayButton = overlayContents.querySelector('.mediasite-player__presentation-ended-replay-button');\r\n this.on(replayButton, 'click', this.handleClickedReplay);\r\n _replayButton.set(this, replayButton);\r\n\r\n const returnButton = overlayContents.querySelector('.mediasite-player__presentation-ended-return-button');\r\n this.on(returnButton, 'click', this.handleClickedReturn);\r\n _returnButton.set(this, returnButton);\r\n\r\n const endedOverlay = new Overlay(player, {\r\n text: '',\r\n position: OverlayPosition.Center\r\n });\r\n\r\n for (const childEl of Array.from(overlayContents.children)) {\r\n endedOverlay.el().appendChild(childEl);\r\n }\r\n\r\n const endedModal = new ModalDialog(player, {\r\n content: [endedOverlay.el()],\r\n solidBackground: false,\r\n uncloseable: true,\r\n temporary: false,\r\n label: localize('Presentation Ended'),\r\n showPlayerControls: !this.#shouldHideReplay()\r\n });\r\n endedModal.addClass('mediasite-player__presentation-ended-modal');\r\n player.layout().addChild(endedModal);\r\n _endedModal.set(this, endedModal);\r\n\r\n this.on(player, 'ended', this.#handlePresentationEnded);\r\n \r\n });\r\n }\r\n\r\n triggerResize() {\r\n this.player.trigger('playerresize');\r\n }\r\n\r\n updateLayout() {\r\n const bannerLink = _bannerLink.get(this);\r\n if (this.src && this.enabled) {\r\n bannerLink.removeClass('vjs-hidden');\r\n }\r\n else {\r\n bannerLink.addClass('vjs-hidden');\r\n }\r\n this.triggerResize();\r\n }\r\n\r\n /**\r\n * The path to an image to display.\r\n * @type {string}\r\n * @example\r\n * player.banner.src = '/path/to/image.jpg';\r\n */\r\n get src() {\r\n return _img.get(this)?.src;\r\n }\r\n\r\n set src(src) {\r\n this.player.ready(() => {\r\n _img.get(this).src = src;\r\n this.updateLayout();\r\n });\r\n }\r\n\r\n /**\r\n * A link to which the banner should point.\r\n * @type {string}\r\n * @example\r\n * player.banner.href = '/path/to/web/page/';\r\n */\r\n get href() {\r\n return _bannerLink.get(this).el().href;\r\n }\r\n\r\n set href(href) {\r\n this.player.ready(() => {\r\n const bannerEl = _bannerLink.get(this).el();\r\n if (!href?.length) {\r\n bannerEl.removeAttribute('href');\r\n bannerEl.setAttribute('tabindex', -1);\r\n bannerEl.setAttribute('aria-disabled', true);\r\n } else {\r\n bannerEl.href = href;\r\n }\r\n this.updateLayout();\r\n });\r\n }\r\n\r\n /**\r\n * A boolean indicating whether or not the Banner feature is enabled.\r\n * @type {boolean}\r\n * @example\r\n * player.banner.enabled = true;\r\n */\r\n get enabled() {\r\n return _enabled.get(this);\r\n }\r\n\r\n set enabled(enabled) {\r\n this.player.ready(() => {\r\n _enabled.set(this, enabled);\r\n this.updateLayout();\r\n });\r\n }\r\n\r\n /**\r\n * Configures how the banner is positioned in the layout.\r\n * @type {'Static'|'AutoHide'}\r\n * @example\r\n * player.banner.behavior = 'AutoHide';\r\n */\r\n get behavior() {\r\n return _bannerLink.get(this)?.behavior;\r\n }\r\n\r\n set behavior(behavior) {\r\n this.player.ready(() => {\r\n _bannerLink.get(this).behavior = behavior;\r\n this.updateLayout();\r\n });\r\n \r\n }\r\n\r\n /**\r\n * The desired display width of the banner.\r\n * @type {number}\r\n * @example\r\n * player.banner.width = 500;\r\n */\r\n get width() {\r\n return parseInt(_bannerWidth.get(this), 10);\r\n }\r\n\r\n set width(width) {\r\n this.player.ready(() => {\r\n _bannerLink.get(this).el().style.setProperty('--banner-width', width + \"px\");\r\n _bannerWidth.set(this, width);\r\n this.triggerResize();\r\n });\r\n }\r\n\r\n /**\r\n * The desired display height of the banner.\r\n * @type {number}\r\n * @example\r\n * player.banner.height = 100;\r\n */\r\n get height() {\r\n return parseInt(_bannerHeight.get(this), 10);\r\n }\r\n\r\n set height(height) {\r\n this.player.ready(() => {\r\n _bannerLink.get(this).el().style.setProperty('--banner-height', height + \"px\");\r\n _bannerHeight.set(this, height);\r\n this.triggerResize();\r\n });\r\n }\r\n\r\n /** \r\n * The path to a banner image to display when the presentation has ended.\r\n * @type {string}\r\n * @example\r\n * player.banner.endedSrc = '/path/to/image.jpg';\r\n */\r\n get endedSrc() {\r\n return _endedImg.get(this)?.src;\r\n }\r\n\r\n set endedSrc(endedSrc) {\r\n this.player.ready(() => {\r\n const endedImg = _endedImg.get(this);\r\n const endedText = _endedText.get(this);\r\n if (endedSrc) {\r\n endedImg.src = endedSrc;\r\n endedImg.style.display = \"block\";\r\n endedText.style.display = \"none\";\r\n\r\n getDominantColor(endedSrc).then(color => {\r\n const endedModal = _endedModal.get(this);\r\n endedModal.el().style.setProperty('--ended-banner-bg-color', `rgba(${color.r}, ${color.g}, ${color.b}, ${color.a})`);\r\n });\r\n }\r\n else {\r\n endedImg.removeAttribute('src');\r\n endedImg.style.display = \"none\";\r\n endedText.style.display = \"block\";\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * A URL to use as a link for the Presentation Ended banner image, if present.\r\n * @type {string}\r\n * @example\r\n * player.banner.endedHref = '/path/to/web/page';\r\n */\r\n get endedHref() {\r\n return _endedLink.get(this)?.href;\r\n }\r\n\r\n set endedHref(endedHref) {\r\n this.player.ready(() => {\r\n const endedLink = _endedLink.get(this);\r\n if (endedHref) {\r\n endedLink.href = endedHref;\r\n }\r\n else {\r\n endedLink.removeAttribute('href');\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * The desired display width of the Presentation Ended banner.\r\n * @type {number}\r\n * @example\r\n * player.banner.endedWidth = 500;\r\n */\r\n get endedWidth() {\r\n const endedImg = _endedImg.get(this);\r\n return endedImg ? parseInt(endedImg.width, 10) : 0;\r\n }\r\n\r\n set endedWidth(endedWidth) {\r\n this.player.ready(() => {\r\n const endedImg = _endedImg.get(this);\r\n endedImg.width = endedWidth;\r\n _endedModal.get(this).el().style.setProperty('--ended-banner-width', `${endedWidth}px`);\r\n });\r\n }\r\n\r\n /**\r\n * The desired display height of the Presentation Ended banner.\r\n * @type {number}\r\n * @example\r\n * player.banner.endedHeight = 100;\r\n */\r\n get endedHeight() {\r\n const endedImg = _endedImg.get(this);\r\n return endedImg ? parseInt(endedImg.height, 10) : 0;\r\n }\r\n\r\n set endedHeight(endedHeight) {\r\n this.player.ready(() => {\r\n const endedImg = _endedImg.get(this);\r\n endedImg.height = endedHeight;\r\n });\r\n }\r\n\r\n /**\r\n * Whether or not to show the \"Presentation Ended\" banner at the end of the presentation.\r\n * @type {boolean}\r\n * @example\r\n * player.banner.endedEnabled = true;\r\n */\r\n get endedEnabled() {\r\n return _endedEnabled.get(this);\r\n }\r\n\r\n set endedEnabled(endedEnabled) {\r\n _endedEnabled.set(this, endedEnabled);\r\n\r\n if (endedEnabled && this.player.currentTime() === this.player.duration()) {\r\n this.#handlePresentationEnded();\r\n }\r\n else {\r\n const endedModal = _endedModal.get(this);\r\n if (endedModal?.opened()) {\r\n endedModal.close();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * A boolean indicating whether or not we should render in XR or not\r\n * @type {boolean}\r\n * @example\r\n * player.banner.renderIn360 = true;\r\n */\r\n get renderIn360() {\r\n return _renderIn360.get(this);\r\n }\r\n\r\n set renderIn360(renderIn360) {\r\n _renderIn360.set(this, renderIn360);\r\n }\r\n\r\n /**\r\n * Whether or not we immediately restart the presentation when we hit the end of the presentation.\r\n * Done this way, rather than setting the element itself, to better work with our other plugins\r\n */ \r\n get isLooping() {\r\n return _isLooping.get(this);\r\n }\r\n\r\n set isLooping(loop) {\r\n _isLooping.set(this, loop);\r\n }\r\n\r\n #handlePresentationEnded() {\r\n if (this.player.error()) {\r\n //if it is a live presentation and there is an error, the live plugin will determine whether it is actually\r\n //the end of the presentation or an error, so we shouldn't display a false presentation ended message\r\n return\r\n }\r\n //if we're looping, don't show the modal, but rather return back to the start of the presentation\r\n if (_isLooping.get(this)) {\r\n this.restartPresentation();\r\n return;\r\n }\r\n\r\n //if the playlist has another presentation, let it render its own modal, rather than the presentation ended modal\r\n const isUsingPlaylist = this.player.usingPlugin('playlist');\r\n if (isUsingPlaylist && this.player.playlist().isAutoPlaying()) {\r\n return;\r\n }\r\n\r\n const endedModal = _endedModal.get(this);\r\n //if (this.endedEnabled && this.endedSrc && !endedModal.opened?.()) {\r\n if (this.endedEnabled && !endedModal.opened?.()) {\r\n if (_renderIn360.get(this)) {\r\n let modalBtns = [];\r\n if (!this.#shouldHideReplay()) {\r\n modalBtns.push({\r\n text: localize(\"Replay\"),\r\n icon: \"0xf116\",\r\n action: this.handleClickedReplay.bind(this)\r\n });\r\n }\r\n\r\n if (!this.#shouldHideReturnToPrevious()) {\r\n modalBtns.push({\r\n text: localize(\"Back to Previous\"),\r\n icon: \"0xf120\",\r\n action: this.handleClickedReturn.bind(this)\r\n });\r\n }\r\n\r\n this.player.video360?.().displayModal(\"Presentation Ended\", modalBtns);\r\n\r\n this.one(this.player, 'timeupdate', function () {\r\n this.player.video360?.().removeModal();\r\n });\r\n } else {\r\n const replayButton = _replayButton.get(this);\r\n const hideReplay = this.#shouldHideReplay();\r\n this.#toggleDisplayBtn(replayButton, hideReplay);\r\n\r\n const returnButton = _returnButton.get(this);\r\n const hideReturn = this.#shouldHideReturnToPrevious();\r\n this.#toggleDisplayBtn(returnButton, hideReturn);\r\n\r\n endedModal.open();\r\n\r\n this.one(this.player, 'timeupdate', function () {\r\n endedModal.close();\r\n });\r\n }\r\n }\r\n }\r\n\r\n #toggleDisplayBtn(button, isHidden) {\r\n if (isHidden) {\r\n button.classList.add('vjs-hidden');\r\n } else {\r\n button.classList.remove('vjs-hidden');\r\n }\r\n }\r\n\r\n #shouldHideReplay() {\r\n return this.player.usingPlugin('live') || this.player.usingPlugin('guided');\r\n }\r\n\r\n #shouldHideReturnToPrevious() {\r\n //if we're still in the orginial presentation, no need to have an option to return to it \r\n const isOrginal = this.player.loader().isCurrentPresentationOriginal();\r\n\r\n if (isOrginal) {\r\n return true;\r\n }\r\n\r\n //if we're using the playlist plugin, ask it if the current presentation is in the playlist\r\n if (videojs.getPlugin(\"playlist\")) {\r\n const currentPresentationId = this.player.loader().presentationId;\r\n const inPlaylist = this.player.playlist().isInPlaylist(currentPresentationId);\r\n\r\n return inPlaylist;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n handleClickedReturn() {\r\n this.player.loader().loadPreviousPresentation();\r\n }\r\n\r\n handleClickedReplay() {\r\n if (_renderIn360.get(this)) {\r\n this.player.video360?.().removeModal();\r\n } else {\r\n _endedModal.get(this)?.close();\r\n }\r\n \r\n this.restartPresentation();\r\n }\r\n\r\n restartPresentation() {\r\n this.player.currentTime(0);\r\n this.player.one('timeupdate', () => {\r\n this.player.play();\r\n });\r\n }\r\n\r\n dispose() {\r\n const bannerLink = _bannerLink.get(this);\r\n const endedModal = _endedModal.get(this);\r\n this.player.layout().removeChild(bannerLink);\r\n this.player.layout().removeChild(endedModal);\r\n }\r\n}\r\n\r\nexport default BannerPlugin;\r\n","export function generateEndedOverlay(player) {\r\n const localize = player.localize?.bind(player);\r\n const template = `
\r\n \r\n \"${localize('Presentation\r\n
${localize('Presentation Ended')}
\r\n
\r\n
\r\n \r\n \r\n
\r\n
`;\r\n\r\n const element = document.createElement('div');\r\n element.innerHTML = template;\r\n return element.firstElementChild;\r\n}","/**\r\n* Checks to make sure window.localStorage is available. localStorage throws an exception (it does not show up as null or undefined)\r\n* when (third party) cookies are disabled. Perform this check whenever localStorage needs to be accessed.\r\n*/\r\nexport function localStorageAvailable() {\r\n try {\r\n window.localStorage.setItem('test', 0);\r\n window.localStorage.removeItem('test');\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js!./captions.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import videojs from 'video.js';\r\nimport { makeVTT } from './captions/make-vtt.js';\r\nimport './captions.css';\r\nimport { localStorageAvailable } from '../../util';\r\n\r\nconst SETTINGS_KEY = 'mediasite-player-captions-track';\r\nconst _initialTrack = new WeakMap();\r\nconst _enabled = new WeakMap();\r\nconst _languageStrings = new WeakMap();\r\nlet localize;\r\n\r\n/**\r\n * The Captions module.\r\n * @member {CaptionsPlugin} captions\r\n * @memberof MediasitePlayer#\r\n */\r\n\r\n/**\r\n * Configures closed captions that may be displayed during playback.\r\n * @hideconstructor\r\n * @extends {external:\"videojs.Plugin\"}\r\n **/\r\nclass CaptionsPlugin extends videojs.getPlugin('plugin') {\r\n constructor(player, options) {\r\n localize = player.localize?.bind(player);\r\n super(player, options);\r\n\r\n this.languageStrings = [];\r\n _enabled.set(this, true);\r\n if (localStorageAvailable()) {\r\n this.initialTrackLanguage = localStorage[SETTINGS_KEY];\r\n }\r\n\r\n player.ready(() => {\r\n this.#updateControlBarButtonVisibility();\r\n this.on(player, ['useractive', 'userinactive'], this.#handleUserActiveChange);\r\n this.on(player, 'texttrackchange', this.#handleTextTrackChange);\r\n\r\n player.collapsedButtons?.push({\r\n pluginName: this.name,\r\n label: localize('Captions'),\r\n buttonName: 'SubsCapsButton',\r\n class: 'vjs-subs-caps-button'\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Sets a list of captions that should be available to the user in the player UI.\r\n * @param {string} language The language code for the provided captions.\r\n * @param {string} label A label to use in the UI for this set of captions.\r\n * @param {string} captionsUrl A url to a vtt file stream\r\n * @example\r\n * player.captions.set('en', 'English', 'https:/dev-machine.sonicfoundry.net/Mediasite/streams/FileServer/Presentation/PresentationId/captions_languageCode.vtt?playbackTicket=ticketId');\r\n */\r\n set(language, label, captionsUrl, detailedLanguage) {\r\n const tracks = this.player.textTracks();\r\n const initialTrackLanguage = this.initialTrackLanguage;\r\n\r\n for (let i = 0; i < tracks.length; i++) {\r\n if (tracks[i].language === language && tracks[i].kind === 'captions') {\r\n const oldTrack = tracks[i];\r\n this.off(oldTrack, ['cuechange', 'modechange'], this.#handleCaptionChange);\r\n this.player.removeRemoteTextTrack(oldTrack);\r\n break;\r\n }\r\n }\r\n\r\n if (captionsUrl) {\r\n const track = this.player.addRemoteTextTrack({\r\n src: captionsUrl,\r\n kind: 'captions',\r\n label: label ?? language,\r\n language: language,\r\n mode: 'disabled'\r\n });\r\n\r\n this.languageStrings.push(detailedLanguage);\r\n\r\n this.on(track, ['cuechange', 'modechange'], this.#handleCaptionChange);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the list of captions that are available for the given language.\r\n * If no language is passed, returns the list of active captions\r\n * @param {string} language The language code of the captions to be retrieved.\r\n * @returns {VTTCue[]}\r\n * @example\r\n * const englishCaptions = player.captions.get('en');\r\n */\r\n get(language) {\r\n const tracks = this.player.textTracks();\r\n const captions = [];\r\n\r\n // Check for active caption language if no language passed to get\r\n if (language == null) {\r\n language = Array.from(tracks).find(track => track.mode === 'showing')?.language;\r\n }\r\n\r\n for (let i = 0; i < tracks.length; i++) {\r\n if (tracks[i].language === language && tracks[i].kind === 'captions') {\r\n captions.push(...Array.from(tracks[i].cues ?? []));\r\n break;\r\n }\r\n }\r\n return captions;\r\n }\r\n\r\n /**\r\n * Gets the currently selected caption language\r\n * @param {bool} detailed Whether to return the detailedLanguage string\r\n * @returns {string}\r\n * @example\r\n * const captionsLang = player.captions.getSelectedLanguage();\r\n */\r\n getSelectedLanguage(detailed) {\r\n const tracks = this.player.textTracks();\r\n const activeTrack = Array.from(tracks).find(track => track.mode === 'showing');\r\n\r\n if (detailed) {\r\n return this.languageStrings.find(function (val) {\r\n return activeTrack?.language && val.startsWith(activeTrack?.language);\r\n });\r\n }\r\n\r\n return activeTrack?.language;\r\n }\r\n\r\n /**\r\n * Returns an array containing VTTCue objects for the captions that apply to the current playback time, if any.\r\n * @param {string} language\r\n * @returns {VTTCue[]}\r\n * @example\r\n * const currentlyDisplayedCaptions = player.captions.getCurrentCaptions('en');\r\n */\r\n getCurrentCaptions(language) {\r\n const captions = [];\r\n\r\n if (language !== null) {\r\n const tracks = Array.from(this.player.textTracks()).filter(track => track.kind === 'captions');\r\n const languageToCheck = language || tracks[0]?.language; // Fall back to the first language if nothing is passed\r\n\r\n for (const track of Array.from(tracks)) {\r\n if (track.language === languageToCheck) {\r\n if (track.activeCues) {\r\n captions.push(...Array.from(track.activeCues));\r\n } \r\n }\r\n }\r\n }\r\n \r\n return captions;\r\n }\r\n\r\n /**\r\n * Returns the TextTrack that corresponds to a given language\r\n */\r\n getCaptionTrack(language) {\r\n if (language == null) {\r\n return;\r\n }\r\n const tracks = this.player.textTracks();\r\n let captionTrack;\r\n for (let i = 0; i < tracks.length; i++) {\r\n if (tracks[i].kind === 'captions' && tracks[i].language === language) {\r\n captionTrack = tracks[i];\r\n }\r\n }\r\n\r\n return captionTrack;\r\n }\r\n\r\n /**\r\n * Returns the TextTracks that correspond to the captions\r\n */\r\n getAllCaptionTracks() {\r\n const tracks = this.player.textTracks();\r\n const captionTracks = [];\r\n for (let i = 0; i < tracks.length; i++) {\r\n if (tracks[i].kind === 'captions') {\r\n captionTracks.push(tracks[i]);\r\n }\r\n }\r\n\r\n return captionTracks;\r\n }\r\n\r\n /**\r\n * Used to toggle the captions either on or off. Currently used in the hot keys \r\n */\r\n toggleCaptions() {\r\n this.visible = !this.visible;\r\n }\r\n\r\n /**\r\n * The language of the captions track that should be showing. When this value is a string (for example, 'en'), the track with the matching language will be shown. If this value is true, the first available track (if any) will be shown.\r\n * @type {?(string|boolean)}\r\n * @example Showing English captions (if available).\r\n * player.captions.visible = 'en';\r\n */\r\n set visible(language) {\r\n const tracks = Array.from(this.player.textTracks()).filter(track => track.kind === 'captions');\r\n\r\n let found = false;\r\n for (const track of tracks) {\r\n if (track.language === language || (language === true && !found)) {\r\n track.mode = 'showing';\r\n found = true;\r\n }\r\n else {\r\n track.mode = 'hidden';\r\n }\r\n }\r\n }\r\n\r\n get visible() {\r\n const tracks = Array.from(this.player.textTracks());\r\n return tracks.find(track => {\r\n return track.mode === 'showing';\r\n })?.language ?? null;\r\n }\r\n\r\n /**\r\n * Whether or not to enable the captions UI.\r\n * @type {boolean}\r\n * @example\r\n * player.captions.enabled = true;\r\n */\r\n get enabled() {\r\n return _enabled.get(this);\r\n }\r\n\r\n set enabled(enabled) {\r\n _enabled.set(this, enabled);\r\n this.#updateControlBarButtonVisibility();\r\n }\r\n\r\n\r\n /**\r\n * What caption text track language should load if any.\r\n * @type {string}\r\n * @example\r\n * player.captions.initialTrackLanguage = \"en-US\";\r\n */\r\n get initialTrackLanguage() {\r\n return _initialTrack.get(this);\r\n }\r\n\r\n set initialTrackLanguage(track) {\r\n _initialTrack.set(this, track);\r\n }\r\n /**\r\n * Array of full language descriptors with locale.\r\n * @type {string[]}\r\n * @example\r\n * player.captions.languageStrings = [ \"en-US\" ];\r\n */\r\n get languageStrings() {\r\n return _languageStrings.get(this);\r\n }\r\n\r\n set languageStrings(lang) {\r\n _languageStrings.set(this, lang);\r\n }\r\n\r\n #updateControlBarButtonVisibility() {\r\n const subsCapsButton = this.player.getDescendant('ControlBar', 'SubsCapsButton');\r\n const hasCaptionTracks = Array.from(this.player.textTracks()).filter(track => track.kind === 'captions').length > 0;\r\n const hasLiveCaptions = this.player.usingPlugin('live') && this.player.live().liveCaptions;\r\n\r\n if (_enabled.get(this) && (hasCaptionTracks || hasLiveCaptions)) {\r\n subsCapsButton.removeClass('vjs-hidden');\r\n }\r\n else {\r\n subsCapsButton.addClass('vjs-hidden');\r\n }\r\n }\r\n\r\n #handleCaptionChange() {\r\n const currentCaptions = this.getCurrentCaptions(this.visible);\r\n this.player.trigger('captionchanged', currentCaptions);\r\n }\r\n\r\n #handleUserActiveChange() {\r\n this.player.getChild('TextTrackDisplay').updateDisplay();\r\n }\r\n\r\n #handleTextTrackChange() {\r\n const captionTracks = Array.from(this.player.textTracks()).filter(track => track.kind === 'captions');\r\n if (captionTracks.length > 0) {\r\n const currentTrack = captionTracks.find(track => track.mode === 'showing');\r\n //if the caption track exists and has changed, the captions have changed\r\n this.#handleCaptionChange();\r\n if (localStorageAvailable()) {\r\n localStorage[SETTINGS_KEY] = currentTrack?.language;\r\n }\r\n }\r\n }\r\n\r\n clear() {\r\n const captionTracks = this.getAllCaptionTracks();\r\n\r\n captionTracks.forEach((track) => {\r\n this.player.removeRemoteTextTrack(track);\r\n })\r\n \r\n this.enabled = false;\r\n }\r\n\r\n dispose() {\r\n this.off(this.player, ['useractive', 'userinactive'], this.#handleUserActiveChange);\r\n this.off(this.player, 'texttrackchange', this.#handleTextTrackChange);\r\n super.dispose();\r\n }\r\n}\r\n\r\nexport default CaptionsPlugin;\r\n","import videojs from 'video.js';\r\nimport './captions-settings.css';\r\nimport { localStorageAvailable } from '../../util';\r\n\r\nlet localize;\r\n\r\nclass CaptionsSettingsPlugin extends videojs.getPlugin('plugin') {\r\n constructor(player, options) {\r\n localize = player.localize?.bind(player);\r\n super(player, options);\r\n\r\n //when the player is ready, modify the DOM to match the new design for the caption settings\r\n player.ready(() => {\r\n //an object of partial id selectors paired with the value of what we want it to say\r\n //example: label id='captions-foreground-opacity-vjs_video_3_component_959' will then say localize(\"Text Opacity\")\r\n const captionOptionLabels = {\r\n 'captions-foreground-color': localize(\"Text Color\"),\r\n 'captions-foreground-opacity': localize(\"Text Opacity\"),\r\n 'captions-background-color': localize(\"Background Color\"),\r\n 'captions-background-opacity': localize(\"Background Opacity\"),\r\n 'captions-window-color': localize(\"Window Color\"),\r\n 'captions-window-opacity': localize(\"Window Opacity\")\r\n };\r\n \r\n const captionOptionsParent = document.querySelector(\".vjs-modal-dialog.vjs-text-track-settings > .vjs-modal-dialog-content\"); \r\n\r\n if (captionOptionsParent) {\r\n let captionHeader = document.createElement(\"h2\");\r\n captionHeader.innerText = localize(\"Caption Settings\");\r\n captionOptionsParent.prepend(captionHeader);\r\n const captionOptions = captionOptionsParent.querySelectorAll(\"fieldset.vjs-track-setting\");\r\n\r\n for (let caption of captionOptions) {\r\n this.#setupOptionDropdowns(caption);\r\n }\r\n\r\n //grab the label that corresponds with the option and set its text to be whatever the value is in captionOptionLabels\r\n for (const [captionLabelSelector, captionLabelWording] of Object.entries(captionOptionLabels)) {\r\n let targetCaption = captionOptionsParent.querySelector(`label[id*=${captionLabelSelector}]`);\r\n if (targetCaption) {\r\n targetCaption.innerText = captionLabelWording;\r\n }\r\n }\r\n\r\n const captionCloseBtn = document.querySelector(\".vjs-modal-dialog.vjs-text-track-settings .vjs-done-button\");\r\n captionCloseBtn.classList.add(\"player-primary-button\");\r\n captionCloseBtn.innerText = localize(\"Update\");\r\n\r\n //move the reset button to the bottom of its parent so that it is now the bottom button for screen readers\r\n captionCloseBtn.parentNode.prepend(captionCloseBtn);\r\n }\r\n\r\n //add custom fonts to the font dropdown\r\n this.addFont(\"OpenDyslexic\", \"opendyslexic\");\r\n });\r\n\r\n player.on(\"presentationloaded\", () => {\r\n this.addHeaderToDropdown(localize(\"Captions\"));\r\n });\r\n }\r\n\r\n //Adds a header to the captions selection dropdown, since one does not come by default\r\n addHeaderToDropdown(headerText) {\r\n const captionsDropdown = document.querySelector(\".vjs-subs-caps-button > .vjs-menu .vjs-menu-content\");\r\n const captionsHeader = document.createElement(\"li\");\r\n captionsHeader.textContent = headerText;\r\n captionsHeader.classList.add(\"vjs-menu-title\");\r\n captionsHeader.tabIndex = -1;\r\n\r\n captionsDropdown.prepend(captionsHeader);\r\n }\r\n\r\n /**\r\n * Displays a new font option based upon first parameter and adds a class based upon the second parameter (font-{fontClass}).\r\n * @param {string} fontDisplay\r\n * @param {string} fontClass\r\n */\r\n addFont(fontDisplay, fontClass) {\r\n const newFontOption = this.#createFontOption(fontDisplay, fontClass);\r\n\r\n //adds the new option to the caption font dropdown\r\n const fontMenuDropdown = document.querySelector(\".vjs-font-family.vjs-track-setting select\");\r\n fontMenuDropdown.add(newFontOption); \r\n\r\n //adds a class to the 'vjs-text-track-display' element if the user previously selected that font\r\n const textTrackCue = document.querySelector('.vjs-text-track-display');\r\n let _localStorage = localStorageAvailable() ? localStorage : null;\r\n\r\n let currentCustomFont = _localStorage?.getItem('custom-text-track-settings');\r\n\r\n //sets the added font option as the active font option if selected previously\r\n if (currentCustomFont != null) {\r\n textTrackCue.classList.add(this.#generateFontClass(currentCustomFont));\r\n \r\n //set the active option to whatever was selected in our local storage \r\n for (let i = 0; i < fontMenuDropdown.options.length; i++) {\r\n if (fontMenuDropdown.options[i].getAttribute('data-font') === currentCustomFont) {\r\n fontMenuDropdown.selectedIndex = i;\r\n break;\r\n }\r\n }\r\n }\r\n \r\n //whenever the font dropdown changes, we need to update the class added to the 'vjs-text-track-display' element\r\n fontMenuDropdown.addEventListener('change', (event) => {\r\n //remove the previously added font class, if applicable\r\n if (currentCustomFont != null) {\r\n textTrackCue.classList.remove(this.#generateFontClass(currentCustomFont));\r\n }\r\n\r\n //if the new option is a custom option, add a class and update local storage. If not, clear out the old value\r\n const updatedFont = event.target.selectedOptions[0].getAttribute('data-font');\r\n if (updatedFont != null) {\r\n textTrackCue.classList.add(this.#generateFontClass(updatedFont));\r\n _localStorage?.setItem('custom-text-track-settings', updatedFont);\r\n } else {\r\n _localStorage?.removeItem('custom-text-track-settings');\r\n }\r\n\r\n currentCustomFont = updatedFont;\r\n });\r\n }\r\n\r\n /**\r\n * Creates a new option element that's formatted with the arguments provided.\r\n * @param {any} fontDisplay\r\n * @param {any} fontClass\r\n */\r\n #createFontOption(fontDisplay, fontClass) {\r\n const newFontOption = document.createElement(\"option\");\r\n newFontOption.textContent = localize(fontDisplay);\r\n newFontOption.setAttribute('value', 'default');\r\n newFontOption.setAttribute('data-font', fontClass);\r\n return newFontOption;\r\n }\r\n\r\n #generateFontClass(fontName) {\r\n return `font-${fontName}`;\r\n }\r\n\r\n /* \r\n * The structure of some of the caption options are the following\r\n *
\r\n * Visible Title\r\n * \r\n * \r\n * \r\n * \r\n * \r\n * \r\n *
\r\n * \r\n * The goal is to hide the legend and instead make the labels be visual. To best make this work, we need to move the first select and label\r\n * to make them not direct children of the fieldset\r\n * \r\n *
\r\n * Hidden Title\r\n * \r\n * \r\n * \r\n * \r\n * \r\n * \r\n * \r\n * \r\n *
\r\n */\r\n #setupOptionDropdowns(fieldsetEl) {\r\n //if there's more than one select, move element around. See method description\r\n if (fieldsetEl.querySelectorAll(\"select\").length > 1) {\r\n\r\n //find and create the elements needed for the restructuring \r\n let fieldsetLegend = fieldsetEl.querySelector(\"legend\");\r\n let firstLabel = fieldsetEl.querySelector(\"legend + label\");\r\n let firstSelect = fieldsetEl.querySelector(\"legend + label + select\");\r\n let span = document.createElement(\"span\");\r\n\r\n //move and hide the legend from being seen\r\n fieldsetLegend.classList.add(\"vjs-hidden\");\r\n fieldsetLegend.after(span);\r\n\r\n //due to the query the reset function uses to find the select for each caption option\r\n //the select will need to have the same class list for its parent after moving\r\n span.classList = fieldsetEl.classList;\r\n\r\n //move the select and label to be children of the span we made \r\n span.appendChild(firstLabel);\r\n span.appendChild(firstSelect);\r\n }\r\n\r\n }\r\n}\r\n\r\nexport default CaptionsSettingsPlugin;","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js!./captions-settings.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import videojs from 'video.js';\r\n\r\nconst _chaptersTrack = new WeakMap();\r\nconst _enabled = new WeakMap();\r\nconst _showChapterList = new WeakMap();\r\n\r\nlet localize;\r\n\r\n/**\r\n * The Chapters module.\r\n * @member {ChaptersPlugin} chapters\r\n * @memberof MediasitePlayer#\r\n */\r\n\r\n/**\r\n * Configures a list of chapters that will be available to the user in the UI.\r\n * @hideconstructor\r\n * @extends {external:\"videojs.Plugin\"}\r\n **/\r\nclass ChaptersPlugin extends videojs.getPlugin('plugin') {\r\n constructor(player, options) {\r\n localize = player.localize?.bind(player);\r\n super(player, options);\r\n\r\n const track = new videojs.TextTrack({\r\n tech: player,\r\n kind: 'chapters',\r\n label: localize('Chapters'),\r\n language: 'en',\r\n default: true\r\n });\r\n this.on(track, 'cuechange', this.#handleChapterChange);\r\n _chaptersTrack.set(this, track);\r\n\r\n const tracks = this.player.textTracks();\r\n tracks.addTrack(track);\r\n\r\n player.ready(() => {\r\n player.collapsedButtons?.push({\r\n pluginName: this.name,\r\n label: localize('Chapters'),\r\n buttonName: 'ChaptersButton',\r\n class: 'vjs-chapters-button'\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Adds the given chapter to the player and returns its ID.\r\n * @param {VTTCue} chapter\r\n * @returns {string}\r\n * @example\r\n * player.chapters.add(new VTTCue(10, 20, 'A chapter that starts at 10 seconds and ends at 20 seconds.'));\r\n */\r\n add(chapter) {\r\n const track = _chaptersTrack.get(this);\r\n track.addCue(chapter);\r\n\r\n const ChaptersTrackMenuItem = videojs.getComponent('ChaptersTrackMenuItem');\r\n const menuItem = new ChaptersTrackMenuItem(this.player, { track, cue: chapter });\r\n const chaptersButton = this.player.getDescendant('ControlBar', 'ChaptersButton');\r\n chaptersButton.menu.addItem(menuItem);\r\n\r\n this.player.seekBarSegments().add({\r\n id: chapter.id,\r\n startTime: chapter.startTime,\r\n endTime: chapter.endTime,\r\n label: chapter.text,\r\n progress: true\r\n });\r\n\r\n this.#updateVisibility();\r\n\r\n return chapter.id;\r\n }\r\n\r\n /**\r\n * Removes the chapter with the given ID from the player.\r\n * @param {string} id\r\n * @example\r\n * player.chapters.remove('chapterId');\r\n */\r\n remove(id) {\r\n const track = _chaptersTrack.get(this);\r\n const chaptersButton = this.player.getDescendant('ControlBar', 'ChaptersButton');\r\n\r\n for (const cue of Array.from(track.cues)) {\r\n if (cue.id === id) {\r\n const menuItem = chaptersButton.menu.children().find(item => item.cue?.id === id);\r\n chaptersButton.menu.removeChild(menuItem);\r\n track.removeCue(cue);\r\n break;\r\n }\r\n }\r\n\r\n this.player.seekBarSegments().remove(id);\r\n\r\n this.#updateVisibility();\r\n }\r\n\r\n /**\r\n * Gets the chapter with the given ID.\r\n * @param {string} id\r\n * @returns {VTTCue}\r\n * @example\r\n * const chapterCue = player.chapters.get('chapterId');\r\n */\r\n get(id) {\r\n const track = _chaptersTrack.get(this);\r\n return Array.from(track.cues).find(cue => cue.id === id) ?? null;\r\n }\r\n\r\n /**\r\n * Gets an array containing all available chapters.\r\n * @returns {VTTCue[]}\r\n * @example\r\n * const allChapters = player.chapters.getAll();\r\n **/\r\n getAll() {\r\n const track = _chaptersTrack.get(this);\r\n return Array.from(track.cues);\r\n }\r\n\r\n /**\r\n * Called by the hotkey, this presses the chapters button so that the list of chapters is displayed and the focus is within it\r\n */\r\n toggleChaptersButton() {\r\n const chaptersButton = this.player.getDescendant('ControlBar', 'ChaptersButton');\r\n chaptersButton.pressButton();\r\n }\r\n\r\n #handleChapterChange() {\r\n const track = _chaptersTrack.get(this);\r\n const currentChapter = track.activeCues[0] ?? null;\r\n this.player.trigger('chapterchanged', currentChapter);\r\n }\r\n\r\n #updateVisibility() {\r\n const enabled = _enabled.get(this);\r\n const track = _chaptersTrack.get(this);\r\n const cues = Array.from(track.cues);\r\n\r\n // Logic for hidiing or showing chapters button and timeline markers\r\n if (enabled && cues.length > 0) {\r\n //if seeking is disabled, hide the option to select a chapter, but still display the chapter segments\r\n const showChapterList = _showChapterList.get(this);\r\n \r\n this.#setVisiblityofChapterButton(showChapterList);\r\n for (const { id } of cues) {\r\n this.player.seekBarSegments().update(id, {});\r\n }\r\n this.#updateTimeTooltip();\r\n }\r\n else {\r\n // Hide chapters button and timeline markers\r\n this.#setVisiblityofChapterButton(false);\r\n for (const { id } of cues) {\r\n this.player.seekBarSegments().update(id, null);\r\n }\r\n }\r\n }\r\n\r\n #setVisiblityofChapterButton(visiblity) {\r\n const chaptersButton = this.player.getDescendant('ControlBar', 'ChaptersButton');\r\n if (visiblity) {\r\n chaptersButton.removeClass('vjs-hidden');\r\n } else {\r\n chaptersButton.addClass('vjs-hidden');\r\n }\r\n }\r\n\r\n #updateTimeTooltip() {\r\n const player = this.player\r\n const timeTooltip = player.getChild('ControlBar')?.getChild('ProgressControl')?.getChild('SeekBar')?.getChild('MouseTimeDisplay')?.getChild('TimeTooltip');\r\n const track = _chaptersTrack.get(this);\r\n const cues = Array.from(track.cues)\r\n\r\n if (timeTooltip != null) {\r\n // Videojs has internal logic to determine when the tooltip should be updated, and how to handle the edges of screen\r\n // want to add logic to add chapter names, without losing any logic from future videojs updates by overwriting\r\n // So overwrite update function with function containing update function, plus added chapterName logic\r\n timeTooltip.update = (function () {\r\n const cached_timeTooltipUpdate = timeTooltip.update;\r\n return function (seekBarRect, seekBarPoint, time) {\r\n cached_timeTooltipUpdate.apply(this, arguments);\r\n const timeNumber = seekBarPoint * player.duration();\r\n let chapterName = '';\r\n\r\n for (const cue of cues) {\r\n if (timeNumber >= cue.startTime && timeNumber < cue.endTime) {\r\n chapterName = cue.text;\r\n break;\r\n }\r\n else if (timeNumber === cue.endTime && timeNumber === player.duration()) {\r\n chapterName = cue.text;\r\n break;\r\n }\r\n }\r\n\r\n if (chapterName === '') {\r\n this.write(`${time}`)\r\n }\r\n else {\r\n this.write(`${time} - ${chapterName}`)\r\n }\r\n }\r\n }());\r\n }\r\n }\r\n\r\n /**\r\n * Whether or not to enable the chapters UI.\r\n * @type {boolean}\r\n * @example\r\n * player.chapters.enabled = true;\r\n */\r\n get enabled() {\r\n return _enabled.get(this) ?? false;\r\n }\r\n\r\n set enabled(enabled) {\r\n _enabled.set(this, enabled);\r\n this.#updateVisibility();\r\n }\r\n\r\n /**\r\n * Whether or not to display just the chapters button.\r\n * @type {boolean}\r\n * @example\r\n * player.chapters.showChapterList = true;\r\n */\r\n get showChapterList() {\r\n return _showChapterList.get(this) ?? false;\r\n }\r\n\r\n set showChapterList(showChapterList) {\r\n _showChapterList.set(this, showChapterList);\r\n this.#updateVisibility();\r\n }\r\n\r\n clear() {\r\n const chapterInfos = this.getAll();\r\n\r\n chapterInfos.forEach((chapter) => {\r\n this.remove(chapter.id);\r\n });\r\n\r\n this.enabled = false;\r\n }\r\n}\r\n\r\nexport default ChaptersPlugin;\r\n","export function getFullscreenToggleIndex(player) {\r\n return player.getChild('ControlBar').children().indexOf(\r\n player.getDescendant('ControlBar', 'FullscreenToggle')\r\n );\r\n}\r\n","import api from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/postcss-loader/dist/cjs.js!./overflow-menu-item.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import videojs from 'video.js';\r\nimport './overflow-menu-item.css';\r\n\r\nconst MenuItem = videojs.getComponent('MenuItem');\r\nlet localize;\r\n\r\nconst _callback = new WeakMap();\r\nexport class OverflowMenuItem extends MenuItem {\r\n constructor(player, options) {\r\n localize = player.localize?.bind(player);\r\n super(player, options);\r\n _callback.set(this, options.callback);\r\n\r\n const { icon, iconClass } = options;\r\n if (icon) {\r\n this.el().style.backgroundImage = `url(\"${icon}\")`;\r\n }\r\n\r\n if (iconClass) {\r\n let iconSpan = document.createElement(\"span\");\r\n this.el().classList.add(iconClass);\r\n this.el().classList.add(\"flex-menu-item\");\r\n iconSpan.classList.add(\"vjs-icon-placeholder\");\r\n iconSpan.classList.add(\"icon-mobile\");\r\n this.el().prepend(iconSpan);\r\n }\r\n\r\n if (options.dismissable) {\r\n this.addClass('mediasite-player__controlbar-dismissable-item');\r\n const theButton = this.el().appendChild(document.createElement('button'));\r\n theButton.type = 'button';\r\n theButton.setAttribute('aria-label', localize('Dismiss notification'));\r\n }\r\n }\r\n\r\n handleClick(event) {\r\n let type = 'invoke';\r\n if (this.options().dismissable && event.target.tagName.toLowerCase() === 'button') {\r\n type = 'dismiss';\r\n }\r\n _callback.get(this)({ type });\r\n }\r\n}\r\n","import api from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/postcss-loader/dist/cjs.js!./overflow-menu-button.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import videojs from 'video.js';\r\nimport { v4 as uuid } from 'uuid';\r\nimport { OverflowMenuItem } from './overflow-menu-item.js';\r\nimport './overflow-menu-button.css';\r\nimport ExpandLessIcon from '../../../assets/images/three-dots-menu.svg';\r\n\r\nconst MenuButtonComponent = videojs.getComponent('MenuButton');\r\nlet localize;\r\n\r\n/**\r\n * @typedef {Object} OverflowMenuButtonData\r\n * @property {string} id\r\n * @property {string} label\r\n * @property {string} icon\r\n * @property {boolean} visible\r\n * @property {function} callback\r\n * @property {string} [icon]\r\n * @property {boolean} dismissable\r\n * @property {Array} subItems\r\n */\r\n\r\nconst _currentMenu = new WeakMap();\r\n\r\n/** @type {WeakMap} */\r\n const menuItems = _menuItems.get(this) ?? [];\r\n \r\n return menuItems.reduce((allItems, currentItem) => {\r\n if (currentItem.visible) {\r\n const menuItem = new OverflowMenuItem(this.player(), {\r\n\t\t\t\t\tlabel: currentItem.label,\r\n icon: currentItem.icon,\r\n iconClass: currentItem.iconClass,\r\n\t\t\t\t\tcallback: (event) => this.handleItemClick(currentItem.id, event),\r\n\t\t\t\t\tdismissable: currentItem.dismissable\r\n\t\t\t\t});\r\n allItems.push(menuItem);\r\n }\r\n return allItems;\r\n }, []);\r\n }\r\n\r\n handleItemClick(itemId, event = {}) {\r\n _menuItems.get(this).find(item => item.id === itemId).callback(event); \r\n }\r\n\r\n addMenuItem(label, { id = uuid(), icon, visible = true, callback = () => { }, dismissable = false, iconClass = null }) {\r\n _menuItems.get(this).push({ label, id, icon, iconClass, visible, callback, dismissable});\r\n this.update();\r\n return id;\r\n }\r\n\r\n updateMenuItem(id, { label, icon, visible, callback, dismissable, iconClass }) {\r\n const menuItems = _menuItems.get(this);\r\n const itemIndex = menuItems.findIndex(item => item.id === id);\r\n if (itemIndex > -1) {\r\n const updatedItem = Object.assign({}, menuItems[itemIndex]);\r\n updatedItem.label = label ?? updatedItem.label;\r\n updatedItem.icon = icon ?? updatedItem.icon;\r\n updatedItem.iconClass = iconClass ?? updatedItem.iconClass;\r\n updatedItem.visible = visible ?? updatedItem.visible;\r\n updatedItem.callback = callback ?? updatedItem.callback;\r\n updatedItem.dismissable = (dismissable !== undefined && dismissable) ?? updatedItem.dismissable;\r\n\r\n const newMenuItems = menuItems.slice();\r\n newMenuItems.splice(itemIndex, 1, updatedItem);\r\n _menuItems.set(this, newMenuItems);\r\n this.update();\r\n }\r\n }\r\n\r\n removeMenuItem(itemId) {\r\n if (this.hasItem(itemId)) {\r\n const menuItems = _menuItems.get(this);\r\n menuItems.splice(menuItems.findIndex(item => item.id === itemId), 1);\r\n this.update();\r\n\r\n if (menuItems.length === 0) {\r\n this.setTimeout(() => this.unpressButton(), 0);\r\n }\r\n }\r\n }\r\n\r\n hasItem(itemId) {\r\n return _menuItems.get(this).some(item => item.id === itemId);\r\n }\r\n\r\n isItemVisible(itemId) {\r\n return _menuItems.get(this).find(item => item.id === itemId)?.visible;\r\n }\r\n\r\n showMenuItem(itemId) {\r\n if (this.hasItem(itemId)) {\r\n const item = _menuItems.get(this).find(item => item.id === itemId);\r\n item.visible = true;\r\n this.update();\r\n }\r\n }\r\n\r\n hideMenuItem(itemId) {\r\n if (this.hasItem(itemId)) {\r\n const item = _menuItems.get(this).find(item => item.id === itemId);\r\n item.visible = false;\r\n this.update();\r\n }\r\n }\r\n}\r\n","import videojs from 'video.js';\r\nimport { getFullscreenToggleIndex } from '../../util';\r\nimport { OverflowMenuButton } from './controlbar-menu/overflow-menu-button.js';\r\n\r\n/**\r\n * @typedef {Object} OverflowMenuItemData\r\n * @property {string} [id]\r\n * @property {string} [label]\r\n * @property {string} [icon]\r\n * @property {boolean} [visible]\r\n * @property {function} callback\r\n * @property {Array} subItems\r\n */\r\n\r\n/** \r\n * @type {WeakMap}\r\n * @private\r\n */\r\nconst _menuButton = new WeakMap();\r\n\r\n/**\r\n * The ControlbarMenu module.\r\n * @member {ControlbarMenuPlugin} controlbarMenu\r\n * @memberof MediasitePlayer#\r\n */\r\n\r\n/**\r\n * Provides developers with the ability to add menu items to the control bar.\r\n * @hideconstructor\r\n * @extends {external:\"videojs.Plugin\"}\r\n **/\r\nclass ControlbarMenuPlugin extends videojs.getPlugin('plugin') {\r\n constructor(player, options) {\r\n super(player, options);\r\n\r\n const button = new OverflowMenuButton(player);\r\n _menuButton.set(this, button);\r\n\r\n player.ready(() => {\r\n player.getChild('ControlBar').addChild(button, null, getFullscreenToggleIndex(player) + 1);\r\n });\r\n\r\n player.one('play', () => {\r\n const controlBar = player.getChild('ControlBar');\r\n const playerEl = player.contentEl();\r\n playerEl.style.setProperty('--control-bar-height', `${controlBar.contentEl().clientHeight}px`);\r\n });\r\n }\r\n\r\n /**\r\n * Adds a menu item to the control bar menu.\r\n * @param {string} label A label to display for the menu item.\r\n * @param {OverflowMenuItemData} [options]\r\n * @returns {string} The ID of the menu item.\r\n * @example\r\n * const itemId = player.controlbarMenu.addMenuItem('Click here', {\r\n * callback: () => console.log('I was clicked!')\r\n * });\r\n */\r\n addMenuItem(label, options) {\r\n const menuButton = _menuButton.get(this);\r\n return menuButton.addMenuItem(label, options);\r\n }\r\n\r\n /**\r\n * Updates an existing menu item.\r\n * @param {string} id\r\n * @param {OverflowMenuItemData} options\r\n * @example\r\n * player.controlbarMenu.update('itemId', {\r\n * label: 'Changed the label',\r\n * callback: () => console.log('Changed the callback')\r\n * });\r\n */\r\n updateMenuItem(id, options) {\r\n _menuButton.get(this).updateMenuItem(id, options);\r\n }\r\n\r\n /**\r\n * Determines if the given menu item is enabled and visible in the control bar menu.\r\n * @param {string} itemId The ID of a menu item that was previously added via [addMenuItem]{@link ControlbarMenuPlugin#addMenuItem}.\r\n * @returns {boolean}\r\n * @example\r\n * const isItemEnabled = player.controlbarMenu.isMenuItemEnabled('itemId');\r\n */\r\n isMenuItemEnabled(itemId) {\r\n return _menuButton.get(this).isItemVisible(itemId);\r\n }\r\n\r\n /**\r\n * Shows the given menu item in the control bar menu.\r\n * @param {string} itemId The ID of a menu item that was previously added via [addMenuItem]{@link ControlbarMenuPlugin#addMenuItem}.\r\n * @example\r\n * player.controlbarMenu.enableMenuItem('itemId');\r\n */\r\n enableMenuItem(itemId) {\r\n _menuButton.get(this).showMenuItem(itemId);\r\n }\r\n\r\n /**\r\n * Hides the given menu item in the control bar menu.\r\n * @param {string} itemId The ID of a menu item that was previously added via [addMenuItem]{@link ControlbarMenuPlugin#addMenuItem}.\r\n * @example\r\n * player.controlbarMenu.disableMenuItem('itemId');\r\n */\r\n disableMenuItem(itemId) {\r\n _menuButton.get(this).hideMenuItem(itemId);\r\n }\r\n\r\n /**\r\n * Removes the given menu item from the control bar menu.\r\n * @param {string} itemId The ID of a menu item that was previously added via [addMenuItem]{@link ControlbarMenuPlugin#addMenuItem}.\r\n * @example\r\n * player.controlbarMenu.removeMenuItem('itemId');\r\n */\r\n removeMenuItem(itemId) {\r\n _menuButton.get(this).removeMenuItem(itemId);\r\n }\r\n\r\n dispose() {\r\n const menuButton = _menuButton.get(this);\r\n menuButton.dispose();\r\n\r\n const controlbar = this.player.getChild('ControlBar');\r\n controlbar.removeChild(menuButton);\r\n\r\n super.dispose();\r\n }\r\n}\r\n\r\nexport default ControlbarMenuPlugin;\r\n","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js!./downloads.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import videojs from 'video.js';\r\n\r\nimport ModalDialog from '../../components/modal-dialog.js';\r\nimport DownloadIcon from '../../assets/images/download-white-24dp.svg';\r\nimport { isPresentationId } from '../../util';\r\n\r\nimport './downloads.css';\r\n\r\nconst _enabled = new WeakMap();\r\nconst _downloads = new WeakMap();\r\nconst _modal = new WeakMap();\r\nlet localize;\r\n\r\n/**\r\n * The Downloads module.\r\n * @member {DownloadsPlugin} downloads\r\n * @memberof MediasitePlayer#\r\n */\r\n\r\n/**\r\n * Configures a list of downloadable content that is made available to the user via the control bar menu.

\r\n * Note: the Downloads button will only be displayed in the control bar menu if {@link DownloadsPlugin#enabled} is set to true, and at least one item has been added to the list of downloads via {@link DownloadsPlugin#add}.\r\n * @hideconstructor\r\n * @extends {external:\"videojs.Plugin\"}\r\n **/\r\nclass DownloadsPlugin extends videojs.getPlugin('plugin') {\r\n constructor(player, options) {\r\n localize = player.localize?.bind(player);\r\n super(player, options);\r\n\r\n const modal = new ModalDialog(player, {\r\n temporary: false,\r\n uncloseable: false,\r\n pauseOnOpen: false,\r\n description: localize('Downloads'),\r\n displayAsPanel: true\r\n });\r\n _modal.set(this, modal);\r\n modal.addClass('mediasite-player__downloads-modal');\r\n modal.addClass('mediasite-player__control-bar-modal');\r\n _enabled.set(this, false);\r\n _downloads.set(this, []);\r\n\r\n player.controlbarMenu().addMenuItem(localize('Downloads'), { id: this.name, icon: DownloadIcon, callback: () => this.openModal() });\r\n\r\n player.ready(() => {\r\n player.layout().addChild(modal);\r\n this.#updateVisibility();\r\n });\r\n }\r\n\r\n /**\r\n * Opens the Downloads modal dialog.\r\n * @example\r\n * player.downloads.openModal();\r\n */\r\n openModal() {\r\n if (isPresentationId(this.player.loader().presentationId) && this.enabled) {\r\n const modal = _modal.get(this);\r\n modal.open();\r\n }\r\n }\r\n\r\n /**\r\n * Closes the Downloads modal dialog.\r\n * @example\r\n * player.downloads.closeModal();\r\n */\r\n closeModal() {\r\n const modal = _modal.get(this);\r\n if (modal?.opened()) {\r\n modal.close();\r\n }\r\n }\r\n\r\n #updateModalContent() {\r\n const modal = _modal.get(this);\r\n if (modal) {\r\n const downloads = _downloads.get(this);\r\n const heading = document.createElement('h2');\r\n heading.textContent = localize('Downloads');\r\n\r\n const listElement = document.createElement('ul');\r\n listElement.classList.add('mediasite-player__downloads');\r\n for (const { text, url } of downloads) {\r\n const listItem = listElement.appendChild(document.createElement('li'));\r\n const link = listItem.appendChild(document.createElement('a'));\r\n link.download = '';\r\n link.href = url;\r\n link.textContent = text;\r\n }\r\n\r\n\r\n modal.fillWith([heading, listElement]);\r\n }\r\n }\r\n\r\n /**\r\n * Adds an item to the list of downloads.\r\n * @param {string} url A path to the item to download.\r\n * @param {string} text A label for the item's entry in the Downloads control bar menu.\r\n * @example\r\n * player.downloads.add('https://mediasite.com', 'Mediasite');\r\n */\r\n add(url, text) {\r\n const downloads = _downloads.get(this);\r\n _downloads.set(this, [...downloads, { text, url }]);\r\n\r\n this.#updateVisibility();\r\n }\r\n\r\n /**\r\n * Removes an item from the list of downloads that was previously added via [add]{@link MediasitePlayer.downloads#add}.\r\n * @param {string} url The path to the item.\r\n * @example\r\n * player.downloads.remove('https://mediasite.com');\r\n */\r\n remove(url) {\r\n const downloads = _downloads.get(this);\r\n _downloads.set(this, downloads.filter(item => item.url !== url));\r\n\r\n this.#updateVisibility();\r\n }\r\n\r\n #updateVisibility() {\r\n // If enabled + downloads available, show toolbar button\r\n const downloads = _downloads.get(this);\r\n\r\n if (_enabled.get(this) && downloads.length > 0) {\r\n this.player.controlbarMenu().enableMenuItem(this.name);\r\n }\r\n else {\r\n this.player.controlbarMenu().disableMenuItem(this.name);\r\n this.closeModal();\r\n }\r\n this.#updateModalContent();\r\n }\r\n\r\n /**\r\n * A boolean indicating whether or not the Downloads feature is enabled.\r\n * @type {boolean}\r\n * @example\r\n * player.downloads.enabled = true;\r\n */\r\n get enabled() {\r\n return _enabled.get(this);\r\n }\r\n\r\n set enabled(enabled) {\r\n _enabled.set(this, enabled);\r\n this.#updateVisibility();\r\n }\r\n\r\n dispose() {\r\n if (this.player?.usingPlugin('controlbarMenu')) {\r\n this.player.controlbarMenu().removeMenuItem(this.name);\r\n }\r\n\r\n super.dispose();\r\n }\r\n}\r\n\r\nexport default DownloadsPlugin;\r\n","import videojs from 'video.js';\r\n\r\nimport HelpIcon from '../../assets/images/help-white-24dp.svg';\r\nimport { isPresentationId } from '../../util';\r\n\r\nconst _url = new WeakMap();\r\nconst _enabled = new WeakMap();\r\nlet localize;\r\n\r\n/**\r\n * The Help module.\r\n * @member {HelpPlugin} help\r\n * @memberof MediasitePlayer#\r\n */\r\n\r\n/**\r\n * Configures the Help button that is displayed in the controlbar menu.\r\n * @hideconstructor\r\n * @extends {external:\"videojs.Plugin\"}\r\n */\r\nclass HelpPlugin extends videojs.getPlugin('plugin') {\r\n constructor(player, options) {\r\n localize = player.localize?.bind(player);\r\n super(player, options);\r\n _enabled.set(this, true);\r\n\r\n player.ready(() => {\r\n player.controlbarMenu().addMenuItem(localize('Help'), { id: this.name, icon: HelpIcon, callback: () => this.handleClick() });\r\n player.controlbarMenu().disableMenuItem(this.name);\r\n });\r\n }\r\n\r\n handleClick() {\r\n if (isPresentationId(this.player.loader().presentationId) && this.enabled) {\r\n window.open(_url.get(this));\r\n }\r\n }\r\n\r\n /**\r\n * The URL that will be opened in a new window when the user clicks on the Help button.\r\n * @type {string}\r\n * @example\r\n * player.help.url = 'https://mediasite.com';\r\n */\r\n get url() {\r\n return _url.get(this);\r\n }\r\n\r\n set url(url) {\r\n _url.set(this, url);\r\n this.#updateVisibility();\r\n }\r\n\r\n /**\r\n * A boolean indicating whether or not the Help UI is enabled.\r\n * @type {boolean}\r\n * @example\r\n * player.help.enabled = true;\r\n */\r\n get enabled() {\r\n return _enabled.get(this);\r\n }\r\n\r\n set enabled(enabled) {\r\n _enabled.set(this, enabled);\r\n this.#updateVisibility();\r\n }\r\n\r\n #updateVisibility() {\r\n if (this.enabled && this.url) {\r\n this.player.controlbarMenu().enableMenuItem(this.name);\r\n }\r\n else {\r\n this.player.controlbarMenu().disableMenuItem(this.name);\r\n }\r\n }\r\n\r\n dispose() {\r\n if (this.player?.usingPlugin('controlbarMenu')) {\r\n this.player.controlbarMenu().removeMenuItem(this.name);\r\n }\r\n\r\n super.dispose();\r\n }\r\n}\r\n\r\nexport default HelpPlugin;\r\n","import * as THREE from 'three';\r\n\r\nimport { TriggerEffects, HoverEffects, DefaultSizing, InteractionValues } from './enums.js';\r\n\r\nimport { createMessageTextMesh, createBackgroundMesh, createButton } from './component360.js'\r\nimport { backgroundColor, textColor, font } from './styles360.js';\r\n\r\n/** @type {WeakMap} */\r\nconst _relativeHotspotsGroup = new WeakMap();\r\n\r\nconst DEFAULT_COLOR = 0x02528A; //fallback value for color just in case someone doesn't configure a hotspot correctly\r\nconst DEFAULT_OPACITY = .75; //fallback value for opacity just in case someone doesn't configure a hotspot correctly\r\n\r\n/**\r\n * \r\n * A class for any interaction that hotspots/interactions solely does with 360 \r\n */\r\nexport default class Hotspot360 {\r\n\tconstructor(player) {\r\n\t\tthis.player = player;\r\n\r\n\t\t//remove all the relative hotspots when we switch presentations\r\n\t\tthis.player.on(\"loadnewpresentation\", () => {\r\n\t\t\t_relativeHotspotsGroup.delete(this);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a circular hotspot in the world space based upon the properties of a hotspot\r\n\t * @param {any} hotspot\r\n\t */\r\n\tcreateAreaHotspot(hotspot) {\r\n\t\tconst xr = this.player.xr();\r\n\t\tlet material;\r\n\r\n\t\tconst areaProperties = {\r\n\t\t\tcolor: hotspot.Color != null ? hotspot.Color : DEFAULT_COLOR,\r\n\t\t\topacity: hotspot.Opacity > 0 ? hotspot.Opacity : DEFAULT_OPACITY,\r\n\t\t\tlinewidth: 4,\r\n\t\t\ttransparent: true,\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\t\t};\r\n\r\n\t\tif (hotspot.HasNoFill) {\r\n\t\t\tmaterial = new THREE.LineBasicMaterial(areaProperties);\r\n\t\t} else {\r\n\t\t\tmaterial = new THREE.MeshBasicMaterial(areaProperties);\r\n\t\t}\r\n\r\n\t\tlet hotspotMesh;\r\n\r\n\t\tif (hotspot.Shape === \"Rectangle\") {\r\n\t\t\thotspotMesh = this.#createRectangleHotspotMesh(hotspot, material);\r\n\t\t} else {\r\n\t\t\thotspotMesh = this.#createCircleHotspotMesh(hotspot, material);\r\n\t\t\thotspotMesh.lookAt(xr.camera.position);\r\n\t\t}\r\n\r\n\t\t//The raycast uses the name to reference back to the id that the hotspots have in hotspots.js\r\n\t\thotspotMesh.name = hotspot.TimedId;\r\n\t\thotspotMesh.triggerDelay = InteractionValues.TriggerDelay;\r\n\t\thotspotMesh.triggerEffect = TriggerEffects.Hotspot;\r\n\t\thotspotMesh.triggerParam = hotspot.TimedId;\r\n\r\n\t\thotspotMesh.visible = false;\r\n\t\txr.scene.add(hotspotMesh);\r\n\r\n\t\treturn hotspotMesh;\r\n\t}\r\n\r\n\t#createCircleHotspotMesh(hotspot, material) {\r\n\t\t//math to get the coordinates of the middle of the hotspot\r\n\t\tconst yOffset = hotspot.Y + (hotspot.Height / 2);\r\n\t\tconst xOffset = hotspot.X + (hotspot.Width / 2);\r\n\r\n\t\tconst position = this.#getPointIn3DSpace(xOffset, yOffset);\r\n\r\n\t\t//we have two different approaching to how to render our hotspots, either circles or spheres\r\n\t\t//if spheres, due to them being 3D shapes, we can render their origin directly on the sphere and they will render partically within the sphere\r\n\t\t//if circles, we then need to render them fully within the outer sphere, so we need to have the point we're rendering be closer to the center\r\n\t\t//depending on how big the hotspot is\r\n\t\tconst calcRadius = (InteractionValues.VideoSphereRadius - (InteractionValues.VideoSphereRadius * hotspot.Width));\r\n\t\tconst zPoint = position.z * calcRadius;\r\n\t\tconst xPoint = position.x * calcRadius;\r\n\t\tconst yPoint = position.y * calcRadius;\r\n\r\n\t\tconst geometry = new THREE.CircleGeometry(InteractionValues.VideoSphereRadius * hotspot.Height * (Math.PI / 2), 128);\r\n\r\n\t\tlet mesh;\r\n\t\tif (hotspot.HasNoFill) {\r\n\t\t\t//render the other one like normal, but have it have a opacity of 0\r\n\t\t\tmesh = new THREE.Mesh(geometry, new THREE.MeshBasicMaterial({\r\n\t\t\t\topacity: 0,\r\n\t\t\t\ttransparent: true,\r\n\t\t\t\tdepthWrite: false,\r\n\t\t\t\tdepthTest: false\r\n\t\t\t}));\r\n\r\n\t\t\t//then create a line out of the same geometry and set it as a child of normal one\r\n\t\t\t//first, we need to remove the first vertex, which is the center point of the circle\r\n\t\t\t//we will then have just the outer line of the circle to create a line out of\r\n\t\t\tconst circleGeometry = geometry.clone();\r\n\t\t\tconst itemSize = 3;\r\n\t\t\tcircleGeometry.setAttribute('position',\r\n\t\t\t\tnew THREE.BufferAttribute(\r\n\t\t\t\t\tcircleGeometry.attributes.position.array.slice(itemSize,\r\n\t\t\t\t\t\tcircleGeometry.attributes.position.array.length - itemSize\r\n\t\t\t\t\t), itemSize\r\n\t\t\t\t)\r\n\t\t\t);\r\n\t\t\tcircleGeometry.index = null;\r\n\t\t\tconst outline = new THREE.LineLoop(circleGeometry, material);\r\n\t\t\tmesh.add(outline);\r\n\t\t} else {\r\n\t\t\tmesh = new THREE.Mesh(geometry, material);\r\n\t\t}\r\n\r\n\t\t//why is x negative? How the video is wrapped on the sphere is that the ends of the video meet on the x-axis.\r\n\t\t//This means that the center of the presentation that we start looking at is directly opposite that\r\n\t\tmesh.position.set(-xPoint, yPoint, zPoint);\r\n\t\treturn mesh;\r\n\t}\r\n\r\n\t#createRectangleHotspotMesh(hotspot, material) {\r\n\t\t//math to get the corners of the rectangle\r\n\t\tconst leftX = hotspot.X;\r\n\t\tconst rightX = hotspot.X + hotspot.Width;\r\n\t\tconst topY = hotspot.Y;\r\n\t\tconst bottomY = hotspot.Y + hotspot.Height;\r\n\r\n\t\tconst topLeft = this.#getPointIn3DSpace(leftX, topY);\r\n\t\tconst topRight = this.#getPointIn3DSpace(rightX, topY);\r\n\t\tconst bottomLeft = this.#getPointIn3DSpace(leftX, bottomY);\r\n\t\tconst bottomRight = this.#getPointIn3DSpace(rightX, bottomY);\r\n\r\n\t\t//construct a geometry using the points found for the corners\r\n\t\tconst geometry = new THREE.BufferGeometry();\r\n\t\tconst offset = InteractionValues.VideoSphereRadius;\r\n\t\t//why is x negative? How the video is wrapped on the sphere is that the ends of the video meet on the x-axis.\r\n\t\t//This means that the center of the presentation that we start looking at is directly opposite that\r\n\t\tconst vertices = new Float32Array([\r\n\t\t\t-bottomLeft.x * offset, bottomLeft.y * offset, bottomLeft.z * offset,\r\n\t\t\t-bottomRight.x * offset, bottomRight.y * offset, bottomRight.z * offset,\r\n\t\t\t-topRight.x * offset, topRight.y * offset, topRight.z * offset,\r\n\t\t\t-topLeft.x * offset, topLeft.y * offset, topLeft.z * offset\r\n\t\t]);\r\n\r\n\t\tconst indices = [\r\n\t\t\t0, 1, 2,\r\n\t\t\t2, 3, 0,\r\n\t\t];\r\n\r\n\t\tgeometry.setIndex(indices);\r\n\t\t// itemSize = 3 because there are 3 values (components) per vertex\r\n\t\tgeometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3));\r\n\r\n\t\tlet mesh;\r\n\t\tif (hotspot.HasNoFill) {\r\n\t\t\t//render the other one like normal, but have it have a opacity of 0\r\n\t\t\tmesh = new THREE.Mesh(geometry, new THREE.MeshBasicMaterial({\r\n\t\t\t\topacity: 0,\r\n\t\t\t\ttransparent: true,\r\n\t\t\t\tdepthWrite: false,\r\n\t\t\t\tdepthTest: false\r\n\t\t\t}));\r\n\t\t\t//then create a line out of the same geometryand set it as a child of normal one\r\n\t\t\tconst outline = new THREE.Line(geometry, material);\r\n\t\t\tmesh.add(outline);\r\n\t\t} else {\r\n\t\t\tmesh = new THREE.Mesh(geometry, material);\r\n\t\t}\r\n\r\n\t\treturn mesh;\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a text element based upon the hotspot information passed into it and adds it to the scene.\r\n\t * @param {any} hotspot\r\n\t */\r\n\tcreateTextHotspot(hotspot) {\r\n\t\tconst xr = this.player.xr();\r\n\r\n\t\t//math to get the coordinates of the middle of the hotspot\r\n\t\tconst yOffset = hotspot.Y + (hotspot.Height / 2);\r\n\t\tconst xOffset = hotspot.X + (hotspot.Width / 2);\r\n\r\n\t\tconst position = this.#getClampedPosition(xOffset, yOffset);\r\n\r\n\t\tconst calcRadius = DefaultSizing.Distance * 2;\r\n\t\tconst zPoint = position.z * calcRadius;\r\n\t\tconst xPoint = position.x * calcRadius;\r\n\t\tconst yPoint = position.y * calcRadius;\r\n\r\n\t\tconst hotspotTextSize = hotspot.TextSize;\r\n\t\tlet textSize;\r\n\r\n\t\tif (hotspotTextSize === \"Small\") {\r\n\t\t\ttextSize = .75;\r\n\t\t} else if (hotspotTextSize === \"Medium\") {\r\n\t\t\ttextSize = 1.25;\r\n\t\t} else {\r\n\t\t\ttextSize = 2;\r\n\t\t}\r\n\r\n\t\tconst hotspotMesh = this.#createMessageWithLineBreaks(hotspot.DisplayText, .05, textSize, hotspot.Width * DefaultSizing.Scale / textSize, 0, hotspot.Color, hotspot.SecondaryColor);\r\n\r\n\t\thotspotMesh.position.set(-xPoint, yPoint, zPoint);\r\n\t\thotspotMesh.name = hotspot.TimedId;\r\n\r\n\t\thotspotMesh.visible = false;\r\n\t\thotspotMesh.lookAt(xr.camera.position);\r\n\t\tthis.#addToViewpointRelativeHotspots(hotspotMesh);\r\n\r\n\t\treturn hotspotMesh;\r\n\t}\r\n\r\n\t/**\r\n\t * Converts the given piece of text into a mesh that line breaks when it reaches its max width\r\n\t * @param {any} message\r\n\t * @param {any} padding\r\n\t * @param {any} height\r\n\t * @param {any} width\r\n\t * @param {any} opacity\r\n\t * @param {any} msgColor\r\n\t * @param {any} outlineColor\r\n\t */\r\n\t#createMessageWithLineBreaks(message, padding = .25, height = DefaultSizing.Height, width = DefaultSizing.Height, opacity = 1, msgColor = textColor(), outlineColor = null) {\r\n\t\tconst lines = this.#getLinesFromMessage(message, width);\r\n\t\tconst totalLines = lines.length;\r\n\t\tconst lineMeshes = [];\r\n\r\n\t\tlines.forEach(line => {\r\n\t\t\tconst textMesh = createMessageTextMesh(line, height, msgColor, font(), outlineColor);\r\n\t\t\tlineMeshes.push(textMesh);\r\n\t\t});\r\n\r\n\t\tconst longestTextWidth = this.#getLengthofWidestMesh(lineMeshes);\r\n\t\tconst renderWidth = longestTextWidth + padding;\r\n\t\tconst renderHeight = lineMeshes[0].geometry.parameters.height + padding;\r\n\t\tconst backgroundMesh = createBackgroundMesh(renderWidth, renderHeight * totalLines, backgroundColor(), opacity);\r\n\r\n\t\tconst lineYOffset = (totalLines - 1) / 2;\r\n\r\n\t\tlet linesCreated = 0;\r\n\t\tlineMeshes.forEach(lineMesh => {\r\n\t\t\tbackgroundMesh.add(lineMesh);\r\n\t\t\tlineMesh.position.set(0, (lineYOffset - linesCreated) * renderHeight, DefaultSizing.TextOffset);\r\n\t\t\tlinesCreated++;\r\n\t\t});\r\n\r\n\t\treturn backgroundMesh;\r\n\t}\r\n\r\n\t/**\r\n\t * Breaks a message down into an array of string where each of them have a length less than the width passed in.\r\n\t * @param {string} text\r\n\t * @param {width} maxWidth\r\n\t * @return {Array} lines\r\n\t */\r\n\t#getLinesFromMessage(text, maxWidth) {\r\n\t\tconst canvas = document.createElement('canvas');\r\n\t\tconst context = canvas.getContext('2d');\r\n\t\tconst contextFont = `normal ${DefaultSizing.Scale}px ${font()}`;\r\n\t\tcontext.font = contextFont;\r\n\r\n\t\tconst words = text.split(\" \");\r\n\t\tconst lines = [];\r\n\t\tlet currentLine = words[0];\r\n\r\n\t\tfor (let index = 1; index < words.length; index++) {\r\n\t\t\tconst word = words[index];\r\n\t\t\tconst width = context.measureText(currentLine + \" \" + word).width;\r\n\t\t\tif (width / DefaultSizing.Scale < maxWidth) {\r\n\t\t\t\tcurrentLine += \" \" + word;\r\n\t\t\t} else {\r\n\t\t\t\tlines.push(currentLine);\r\n\t\t\t\tcurrentLine = word;\r\n\t\t\t}\r\n\t\t}\r\n\t\tlines.push(currentLine);\r\n\t\treturn lines;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the longest width in a collection of meshes\r\n\t * @param {Array} meshes\r\n\t * @returns {number} width\r\n\t */\r\n\t#getLengthofWidestMesh(meshes) {\r\n\t\tlet longestWidth = 0;\r\n\t\tmeshes.forEach(mesh => {\r\n\t\t\tconst width = mesh.geometry.parameters.width;\r\n\r\n\t\t\tif (longestWidth < width) {\r\n\t\t\t\tlongestWidth = width;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn longestWidth;\r\n\t}\r\n\r\n\t/**\r\n\t * Create a button that is added to the scene based upon the hotspot information passed into it.\r\n\t * @param {any} hotspot\r\n\t */\r\n\tcreateButtonHotspot(hotspot) {\r\n\t\tconst xr = this.player.xr();\r\n\r\n\t\t//math to get the coordinates of the middle of the hotspot\r\n\t\tconst yOffset = hotspot.Y + (hotspot.Height / 2);\r\n\t\tconst xOffset = hotspot.X + (hotspot.Width / 2);\r\n\r\n\t\tconst position = this.#getClampedPosition(xOffset, yOffset);\r\n\r\n\t\tconst calcRadius = DefaultSizing.Distance * 2;\r\n\t\tconst zPoint = position.z * calcRadius;\r\n\t\tconst xPoint = position.x * calcRadius;\r\n\t\tconst yPoint = position.y * calcRadius;\r\n\r\n\t\tconst hotspotTextSize = hotspot.TextSize;\r\n\t\tlet textSize;\r\n\r\n\t\tif (hotspotTextSize === \"Small\") {\r\n\t\t\ttextSize = .75;\r\n\t\t} else if (hotspotTextSize === \"Medium\") {\r\n\t\t\ttextSize = 1.25;\r\n\t\t} else {\r\n\t\t\ttextSize = 2;\r\n\t\t}\r\n\r\n\t\tconst hotspotMesh = createButton(hotspot.DisplayText, textSize, textSize, hotspot.Color, hotspot.SecondaryColor);\r\n\r\n\t\thotspotMesh.position.set(-xPoint, yPoint, zPoint);\r\n\t\thotspotMesh.name = hotspot.TimedId;\r\n\t\thotspotMesh.triggerDelay = InteractionValues.TriggerDelay;\r\n\t\thotspotMesh.triggerEffect = TriggerEffects.Hotspot;\r\n\t\thotspotMesh.triggerParam = hotspot.TimedId;\r\n\t\thotspotMesh.hoverEffect = HoverEffects.Scale;\r\n\r\n\t\thotspotMesh.visible = false;\r\n\t\thotspotMesh.lookAt(xr.camera.position);\r\n\r\n\t\tthis.#addToViewpointRelativeHotspots(hotspotMesh);\r\n\r\n\t\treturn hotspotMesh;\r\n\t}\r\n\r\n\t/**\r\n\t * When provided offsets that range from 0 - 1, where 1 returns maxAngle / 2 and 0 return -maxAngle / 2\r\n\t * and provided clamp angles, so that if offsets was 1 it would return clampAngle / 2 and 0 return -clampAngle / 2\r\n\t * return a Vector3 in 3D space that matches those two new clamped angles\r\n\t * @param {number} xOffset\r\n\t * @param {number} yOffset\r\n\t * @param {number} xClampAngle\r\n\t * @param {number} yClampAngle\r\n\t */\r\n\t#getClampedPosition(xOffset, yOffset, xClampAngle = 80, yClampAngle = 50) {\r\n\t\tconst xMaxAngle = 180;\r\n\t\tconst yMaxAngle = 90;\r\n\r\n\t\tconst movedOffsetX = xOffset * (xClampAngle * 2) - xClampAngle;\r\n\t\tconst translatedOffsetX = (movedOffsetX + xMaxAngle) / (xMaxAngle * 2);\r\n\r\n\t\tconst movedOffsetY = yOffset * (yClampAngle * 2) - yClampAngle;\r\n\t\tconst translatedOffsetY = (movedOffsetY + yMaxAngle) / (yMaxAngle * 2);\r\n\r\n\t\treturn this.#getPointIn3DSpace(translatedOffsetX, translatedOffsetY);\r\n\t}\r\n\r\n\t#getPointIn3DSpace(x, y) {\r\n\t\t//Who's ready for some trig!!! Goal: to figure out where on the outer sphere (where the video is being rendered onto) we're rendering the hotspot\r\n\r\n\t\t/* okay, so we have the x offset, which is basically how far left/right into the presentation the hotspot is\r\n\t\t well, the horizontal distance has now been wrapped into a circle and we know how far into the circle we are (the xOffset)\r\n\t\t we need to convert this straight distance into a curved distance, i.e. radians\r\n\t\t we also need to multiply by 2 since before we were working on a scale to 0 - 1 and 2π radians = 360 degree */\r\n\t\tconst theta = x * 2 * Math.PI;\r\n\r\n\t\t//simarly, we need to get our vertical angle. We do the same math, but don't multiply by 2 since the vertical\r\n\t\t//range we're dealing with is only 0 to π radians, in other words, 0 - 180 degrees\r\n\t\tconst phi = y * Math.PI;\r\n\r\n\t\t//we got our angles in radians! Now, we can do some caluculations to figure out the point in the space\r\n\t\t//the following math has been pulled from here: https://stackoverflow.com/a/969880/11466368\r\n\t\t//x = r * cos(phi) * sin(theta)\r\n\t\t//y = r * sin(phi) * sin(theta)\r\n\t\t//z = r * cos(theta)\r\n\t\t//if you wish to know the why behind the math, read this wikipedia section: https://en.wikipedia.org/wiki/Spherical_coordinate_system#Coordinate_system_conversions\r\n\t\tlet zPoint = Math.sin(phi) * Math.cos(theta);\r\n\t\tlet xPoint = Math.sin(phi) * Math.sin(theta);\r\n\t\tlet yPoint = Math.cos(phi);\r\n\r\n\t\treturn {\r\n\t\t\tx: xPoint,\r\n\t\t\ty: yPoint,\r\n\t\t\tz: zPoint\r\n\t\t}\r\n\t}\r\n\r\n\t//To get the buttons and text to follow the camera, we add them to a group that moves to where the camera is looking\r\n\t//rather than trying to move each hotspot when they appear on screen\r\n\t#addToViewpointRelativeHotspots(hotspot) {\r\n\t\tlet hotspotGroup = _relativeHotspotsGroup.get(this);\r\n\r\n\t\tif (!hotspotGroup) {\r\n\t\t\tconst xr = this.player.xr();\r\n\t\t\thotspotGroup = new THREE.Group();\r\n\t\t\thotspotGroup.position.set(0, 0, -1);\r\n\t\t\txr.scene.add(hotspotGroup);\r\n\t\t}\r\n\r\n\t\thotspotGroup.add(hotspot);\r\n\t\t_relativeHotspotsGroup.set(this, hotspotGroup);\r\n\t}\r\n\r\n\t/**\r\n\t * Moves the holder of the hotspots that move with the camera to update its position and move to where the camera is looking \r\n\t * \r\n\t*/\r\n\tupdatePositionOfRelativeHotspots() {\r\n\t\tconst normalizedVector = this.player.video360?.().getCameraDirectionNormalized();\r\n\t\tconst hotspotGroup = _relativeHotspotsGroup.get(this);\r\n\r\n\t\tif (hotspotGroup) {\r\n\t\t\thotspotGroup.position.set(normalizedVector.x, normalizedVector.y, normalizedVector.z);\r\n\t\t\thotspotGroup.lookAt(0, 0, 0);\r\n\t\t}\r\n\t}\r\n}","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js!./hotspots.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import videojs from 'video.js';\r\n\r\nimport { QueryStringParamProvider } from '../../implementations/player-page/helpers.js';\r\nimport { getInteractionColorsFromColor } from '../../util';\r\nimport Hotspot360 from '../conditional/360/hotspot-360.js';\r\nimport './hotspots.css';\r\n\r\nlet _shouldRenderHotspots;\r\nlet _isCurrentVideo360;\r\nlet _renderedHotspots = [];\r\nlet _hotspotInfos = [];\r\nlet _hotspotsComponent;\r\n\r\n/** @type {Hotspot360} */\r\nlet hotspot360;\r\n\r\nconst HOTSPOT_DEFAULT_COLOR = \"#02528A\";\r\nconst HOTSPOT_DEFAULT_OPACITY = 0.75;\r\n/**\r\n * The Hotspots plugin, which handles adding and rendering the hotspots\r\n * @extends {external:\"videojs.Plugin\"}\r\n **/\r\nclass HotspotsPlugin extends videojs.getPlugin('plugin') {\r\n\tconstructor(player, options) {\r\n\t\tsuper(player, options);\r\n\r\n\t\thotspot360 = new Hotspot360(player);\r\n\r\n\t\tconst paramProvider = new QueryStringParamProvider(location.search);\r\n\t\t_shouldRenderHotspots = (paramProvider.getParamCaseSensitive(\"hotspots\") !== \"false\");\r\n\r\n\t\tthis.createHotspotHolder();\r\n\r\n\t\tthis.player.one('loadedmetadata', () => {\r\n\t\t\tif (isNaN(this.aspect) || !this.aspect) {\r\n\t\t\t\tthis.aspect = this.player.videoWidth() / this.player.videoHeight();\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tsetIs360(is360) {\r\n\t\t_isCurrentVideo360 = is360;\r\n\t}\r\n\r\n\t/**\r\n\t * Creates the DOM element to hold the hotspots in that matches the size of the primary stream\r\n\t*/\r\n\tcreateHotspotHolder() {\r\n\t\tconst Component = videojs.getComponent('Component');\r\n\t\tconst hotspotsComponent = new Component(this.player, { name: 'Hotspots' });\r\n\t\thotspotsComponent.addClass('mediasite-player__hotspots_wrapper');\r\n\t\thotspotsComponent.addClass('vjs-hidden');\r\n\r\n\t\tconst hotspotsContainer = document.createElement('div');\r\n\t\thotspotsContainer.classList.add('mediasite-player__hotspots_container');\r\n\r\n\t\thotspotsComponent.el().appendChild(hotspotsContainer);\r\n\r\n\t\tthis.player.ready(() => {\r\n\t\t\tthis.player.layout().addChild(hotspotsComponent);\r\n\t\t});\r\n\r\n\t\t_hotspotsComponent = hotspotsComponent;\r\n\t}\r\n\r\n\t/**\r\n\t * Creates the timed events for showing/hiding the hotspots on the presentation and then renders them\r\n\t * @param {any} hotspots\r\n\t */\r\n\tadd(hotspots) {\r\n\t\tif (!_shouldRenderHotspots) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (hotspots.length === 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor (let index = 0; index < hotspots.length; index++) {\r\n\t\t\tconst hotspot = hotspots[index];\r\n\t\t\tconst timedId = this.player.timedEvents().add(\r\n\t\t\t\t{\r\n\t\t\t\t\ttime: hotspot.StartTime / 1000,\r\n\t\t\t\t\tduration: (hotspot.EndTime / 1000) - (hotspot.StartTime / 1000),\r\n\t\t\t\t\ttype: 'hotspot'\r\n\t\t\t\t},\r\n\t\t\t\tthis.showHotspot.bind(this),\r\n\t\t\t\tthis.hideHotspot.bind(this)\r\n\t\t\t);\r\n\r\n\t\t\thotspot.TimedId = timedId;\t\t\t\r\n\r\n\t\t\t//convert opacity from percentage into decimal\r\n\t\t\tif (hotspot.Opacity > 1) {\r\n\t\t\t\thotspot.Opacity = hotspot.Opacity / 100;\r\n\t\t\t}\r\n\r\n\t\t\t_hotspotInfos[timedId] = hotspot;\r\n\t\t}\r\n\r\n\t\t//depending if we have XR loaded, either render through XR or load it to the DOM\r\n\t\t//since we've render hotspots, let's activate the raycaster to check if the user looks at them\r\n\t\tif (_isCurrentVideo360) {\r\n\t\t\tconst xr = this.player.xr();\r\n\r\n\t\t\t//'hasPlayerLoadedXR' gets set to true when 'initialized' is triggered in the xr plugin\r\n\t\t\t//And so, if 'initialized' has already been trigged, add hotspots now. If it hasn't, wait until it has been triggered then do it\r\n\t\t\tif (xr.hasPlayerLoadedXR) {\r\n\t\t\t\tthis.#createHotspotsin360(hotspots);\r\n\t\t\t} else {\r\n\t\t\t\txr.one(\"initialized\", () => {\r\n\t\t\t\t\tthis.#createHotspotsin360(hotspots);\r\n\t\t\t\t});\t\t\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\thotspots.forEach((hotspot) => {\r\n\t\t\t\t_renderedHotspots[hotspot.TimedId] = this.renderHotspot(hotspot);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t_hotspotsComponent.removeClass('vjs-hidden');\r\n\t}\r\n\r\n\t#createHotspotsin360(hotspots) {\r\n\t\thotspots.forEach((hotspot) => {\r\n\t\t\tswitch (hotspot.Type) {\r\n\t\t\t\tcase \"Text\":\r\n\t\t\t\t\t_renderedHotspots[hotspot.TimedId] = hotspot360.createTextHotspot(hotspot);\r\n\t\t\t\t\tbreak;\t\t\t\t\r\n\t\t\t\tcase \"Button\":\r\n\t\t\t\t\t_renderedHotspots[hotspot.TimedId] = hotspot360.createButtonHotspot(hotspot);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"Hotspot\":\r\n\t\t\t\tdefault:\r\n\t\t\t\t\t_renderedHotspots[hotspot.TimedId] = hotspot360.createAreaHotspot(hotspot);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t});\r\n\t}\r\n\r\n\t// Displays the hotspot with the id given by the timed event\r\n\tshowHotspot(id) {\r\n\t\tconst targetHotspot = _renderedHotspots[id];\r\n\t\tif (!targetHotspot) {\r\n\t\t\tconsole.log(`Attempted to render a hotspot with id ${id} and failed.`);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst hotspotInfo = _hotspotInfos[id];\r\n\r\n\t\tif (hotspotInfo.HasFocus) {\r\n\t\t\t//if we're seeking when we trigger the interaction, wait until seeking is done before pausing the player\r\n\t\t\tif (this.player.seeking()) {\r\n\t\t\t\tthis.player.one(\"seeked\", () => {\r\n\t\t\t\t\tthis.player.pause();\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tthis.player.pause();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (_isCurrentVideo360) {\r\n\t\t\tswitch (hotspotInfo.Type) {\r\n\t\t\t\tcase \"Text\":\r\n\t\t\t\tcase \"Button\":\r\n\t\t\t\t\thotspot360.updatePositionOfRelativeHotspots();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"Hotspot\":\r\n\t\t\t\tdefault:\t\t\t\t\t\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\ttargetHotspot.visible = true;\t\t\t\r\n\t\t} else {\r\n\t\t\ttargetHotspot.classList.remove('vjs-hidden');\r\n\t\t}\r\n\t}\r\n\r\n\t// Hides the hotspot with the id given by the timed event\r\n\thideHotspot(id) {\r\n\t\tconst targetHotspot = _renderedHotspots[id];\r\n\t\tif (_isCurrentVideo360) {\r\n\t\t\ttargetHotspot.visible = false;\r\n\t\t} else {\r\n\t\t\ttargetHotspot.classList.add('vjs-hidden');\r\n\t\t}\r\n\t}\r\n\r\n\t// Triggers the event associated with the hotspot with said id\r\n\ttriggerHotspot(id) {\r\n\t\tconst hotspotInfo = _hotspotInfos[id];\r\n\t\tconst effect = hotspotInfo.InteractionEffect;\r\n\t\tconst parameter = hotspotInfo.InteractionParam;\r\n\r\n\t\tif (!parameter) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t//Deduce what the effect of the hotspot should be then call some sort of function with the parameter that was passed in\r\n\t\tswitch (effect) {\r\n\t\t\tcase \"timeChange\":\t\t\t\t\r\n\t\t\t\tconst targetTime = parameter / 1000;\r\n\t\t\t\tthis.player.currentTime(targetTime);\r\n\t\t\t\tthis.player.play();\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"presentationChange\":\r\n\t\t\t\tthis.player.loader().loadNewPresentation(parameter);\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"urlChange\":\r\n\t\t\t\tthis.player.pause();\r\n\t\t\t\twindow.open(parameter, '_blank');\r\n\t\t\t\tif (_isCurrentVideo360) {\r\n\t\t\t\t\t//after we trigger it, let's disable it in 360 so that we don't keep on triggering it when we move to a new tab\r\n\t\t\t\t\tthis.setDisableHotspot(id, true);\r\n\r\n\t\t\t\t\tlet modalBtns = [];\r\n\t\t\t\t\tmodalBtns.push({\r\n\t\t\t\t\t\ttext: \"Resume Presentation\",\r\n\t\t\t\t\t\ticon: \"0xf101\",\r\n\t\t\t\t\t\taction: this.handleURlChangeResumeButton.bind(this)\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\tthis.player.video360?.().displayModal(\"Opended a URL in a new tab.\", modalBtns);\r\n\r\n\t\t\t\t\tthis.player.one('play', () => {\r\n\t\t\t\t\t\tthis.player.video360?.().removeModal();\r\n\t\t\t\t\t\tthis.setDisableHotspot(id, false);\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tthis.player.log(`A hotspot with an unknown interaction effect of ${effect} has been triggered.`);\r\n\t\t}\r\n\t}\r\n\r\n\t// allows a hotspot to be seen, but not interactable. Useful if a hotspot should only be triggered once\r\n\tsetDisableHotspot(id, isDisabled) {\r\n\t\tconst targetHotspot = _renderedHotspots[id];\r\n\t\t//Right now, there is no non-360 need to disable a hotspot\r\n\t\tif (_isCurrentVideo360) {\r\n\t\t\ttargetHotspot.disabled = isDisabled;\r\n\t\t}\r\n\t}\r\n\r\n\thandleURlChangeResumeButton() {\r\n\t\tthis.player.play();\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a DOM element for the hotspot. Update when non-circle sizing exists, along with any additional properities to a hotspot\r\n\t * @param {any} hotspot\r\n\t */\r\n\trenderHotspot(hotspot) {\r\n\t\tlet hotspotDOM = document.createElement('div');\r\n\t\thotspotDOM.classList.add('mediasite-player__hotspot', 'vjs-hidden');\r\n\t\thotspotDOM.style.setProperty('left', `${hotspot.X * 100}%`);\r\n\t\thotspotDOM.style.setProperty('top', `${hotspot.Y * 100}%`);\r\n\t\thotspotDOM.setAttribute(\"aria-live\", \"polite\");\r\n\r\n\t\tswitch (hotspot.Type) {\r\n\t\t\tcase \"Button\":\r\n\t\t\t\thotspotDOM = this.#renderButtonHotspot(hotspot, hotspotDOM);\r\n\t\t\t\tconst hotspotButtonDOM = hotspotDOM.querySelector(\".mediasite-player__hotspot-button\");\r\n\t\t\t\thotspotButtonDOM.addEventListener(\"click\", () => {\r\n\t\t\t\t\tthis.triggerHotspot(hotspot.TimedId);\r\n\t\t\t\t});\r\n\t\t\t\thotspotButtonDOM.addEventListener(\"keydown\", (event) => {\r\n\t\t\t\t\tif (event.key.toLowerCase() === 'enter' || event.key.toLowerCase() === 'space') {\r\n\t\t\t\t\t\tthis.triggerHotspot(hotspot.TimedId);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"Text\":\r\n\t\t\t\thotspotDOM = this.#renderTextHotspot(hotspot, hotspotDOM);\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"Hotspot\":\r\n\t\t\tdefault:\r\n\t\t\t\thotspotDOM = this.#renderAreaHotspot(hotspot, hotspotDOM);\t\r\n\t\t\t\thotspotDOM.addEventListener(\"click\", () => {\r\n\t\t\t\t\tthis.triggerHotspot(hotspot.TimedId);\r\n\t\t\t\t});\r\n\t\t\t\thotspotDOM.addEventListener(\"keydown\", (event) => {\r\n\t\t\t\t\tif (event.key.toLowerCase() === 'enter' || event.key.toLowerCase() === 'space') {\r\n\t\t\t\t\t\tthis.triggerHotspot(hotspot.TimedId);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\t_hotspotsComponent.el().querySelector(\".mediasite-player__hotspots_container\").appendChild(hotspotDOM);\r\n\t\treturn hotspotDOM;\r\n\t}\r\n\r\n\t#renderAreaHotspot(hotspot, hotspotDOM) {\r\n\t\thotspotDOM.style.setProperty('height', `${hotspot.Height * 100}%`);\r\n\t\thotspotDOM.style.setProperty('width', `${hotspot.Width * 100}%`);\r\n\t\thotspotDOM.setAttribute(\"role\", \"button\");\r\n\t\thotspotDOM.setAttribute(\"tabindex\", \"0\");\r\n\t\tconst hotspotDescription = `Hotspot with Left: ${Math.round(hotspot.X * 100)}% \r\n\t\t\t\tTop: ${Math.round(hotspot.Y * 100)}% \r\n\t\t\t\tHeight: ${Math.round(hotspot.Height * 100)}% \r\n\t\t\t\tWidth: ${Math.round(hotspot.Width * 100)}%`;\r\n\t\thotspotDOM.setAttribute(\"aria-label\", hotspotDescription);\r\n\r\n\t\t//if the hotspot color or opacity aren't valid, use defaults\r\n\t\tconst hotspotColor = hotspot.Color != null ? hotspot.Color : HOTSPOT_DEFAULT_COLOR;\r\n\t\tif (hotspot.HasNoFill) {\r\n\t\t\thotspotDOM.style.setProperty('background-color', `transparent`);\r\n\t\t\thotspotDOM.style.setProperty('border', `4px solid ${hotspotColor}`);\r\n\t\t} else {\r\n\t\t\thotspotDOM.style.setProperty('background-color', `${hotspotColor}`);\t\t\t\r\n\t\t}\r\n\r\n\t\thotspot.Opacity > 0 ? hotspotDOM.style.setProperty('opacity', `${hotspot.Opacity}`) : hotspotDOM.style.setProperty('opacity', `${HOTSPOT_DEFAULT_OPACITY}`);\t\t\r\n\r\n\t\tswitch (hotspot.Shape) {\r\n\t\t\tcase \"Rectangle\":\r\n\t\t\t\thotspotDOM.classList.add('mediasite-player__hotspot-rectangle');\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"Circle\":\r\n\t\t\tdefault:\r\n\t\t\t\thotspotDOM.classList.add('mediasite-player__hotspot-circle');\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\treturn hotspotDOM;\r\n\t}\r\n\r\n\t//For the button, since it can't be resized, we render a div to hold the button that is the size in the editor and then\r\n\t//have that parent hold the button div and justify it depending on it position on the page\r\n\t#renderButtonHotspot(hotspot, hotspotDOMHolder) {\r\n\t\thotspotDOMHolder.classList.add('mediasite-player__hotspot-holder');\r\n\r\n\t\thotspotDOMHolder.style.setProperty('height', `${hotspot.Height * 100}%`);\r\n\t\thotspotDOMHolder.style.setProperty('width', `${hotspot.Width * 100}%`);\r\n\r\n\t\tconst xAlignment = this.#getAlignmentValue(hotspot.X);\r\n\t\tconst yAlignment = this.#getAlignmentValue(hotspot.Y);\r\n\r\n\t\thotspotDOMHolder.style.setProperty('justify-content', xAlignment);\r\n\t\thotspotDOMHolder.style.setProperty('align-items', yAlignment);\r\n\r\n\t\tconst hotspotDOM = document.createElement('div');\r\n\t\thotspotDOM.classList.add('mediasite-player__hotspot-button');\r\n\t\thotspotDOM.setAttribute(\"role\", \"button\");\r\n\t\thotspotDOM.setAttribute(\"tabindex\", \"0\");\r\n\r\n\t\thotspotDOM.textContent = hotspot.DisplayText;\r\n\r\n\t\tconst mainInteractionColors = getInteractionColorsFromColor(hotspot.Color, hotspot.SecondaryColor);\r\n\t\thotspotDOM.style.setProperty(\"--main-background-color\", `${mainInteractionColors.MainColor}`);\r\n\t\thotspotDOM.style.setProperty(\"--main-background-hover-color\", `${mainInteractionColors.HoverColor}`);\r\n\t\thotspotDOM.style.setProperty('--main-background-active-color', `${mainInteractionColors.ActiveColor}`);\r\n\t\thotspotDOM.style.setProperty('--main-secondary-color', `${mainInteractionColors.TextColor}`);\r\n\t\thotspotDOM.style.setProperty('--main-secondary-hover-color', `${mainInteractionColors.HoverTextColor}`);\r\n\t\thotspotDOM.style.setProperty('--main-secondary-active-color', `${mainInteractionColors.ActiveTextColor}`);\r\n\r\n\t\thotspotDOM.style.fontSize = this.#convertTextSizeIntoPx(hotspot.TextSize);\r\n\t\thotspotDOMHolder.appendChild(hotspotDOM);\r\n\r\n\t\treturn hotspotDOMHolder;\r\n\t}\r\n\r\n\t#getAlignmentValue(offset) {\r\n\t\tconst firstBreakPoint = .33;\r\n\t\tconst secondBreakPoint = .67;\r\n\r\n\t\tif (offset <= firstBreakPoint) {\r\n\t\t\treturn 'flex-start';\r\n\t\t} else if (offset <= secondBreakPoint) {\r\n\t\t\treturn 'center';\t\t\t\r\n\t\t} else {\r\n\t\t\treturn 'flex-end';\r\n\t\t}\t\t\r\n\t}\r\n\r\n\t#renderTextHotspot(hotspot, hotspotDOM) {\r\n\t\thotspotDOM.style.setProperty('height', `${hotspot.Height * 100}%`);\r\n\t\thotspotDOM.style.setProperty('width', `${hotspot.Width * 100}%`);\r\n\r\n\t\thotspotDOM.classList.add('mediasite-player__hotspot-text');\r\n\t\thotspotDOM.textContent = hotspot.DisplayText;\r\n\t\thotspotDOM.style.setProperty('color', `${hotspot.Color}`);\r\n\t\thotspotDOM.style.setProperty('--secondary-color', `${hotspot.SecondaryColor}`);\r\n\t\thotspotDOM.style.setProperty('--text-alignment', `${hotspot.TextAlignment}`);\r\n\r\n\t\thotspotDOM.style.fontSize = this.#convertTextSizeIntoPx(hotspot.TextSize);\t\t\r\n\r\n\t\treturn hotspotDOM;\r\n\t}\r\n\r\n\t#convertTextSizeIntoPx(fontSize) {\r\n\t\tswitch (fontSize) {\r\n\t\t\tcase \"Small\":\r\n\t\t\t\treturn \"12px\";\r\n\t\t\tcase \"Medium\":\r\n\t\t\t\treturn \"18px\";\r\n\t\t\tcase \"Large\":\r\n\t\t\t\treturn \"24px\";\r\n\t\t\tdefault:\r\n\t\t\t\treturn \"12px\";\r\n\t\t}\r\n\t}\r\n\r\n\tdeleteHotspot(id) {\r\n\t\tconst targetHotspot = _renderedHotspots[id];\r\n\t\tif (_isCurrentVideo360) {\r\n\t\t\tthis.player.video360?.().removeObject(targetHotspot);\r\n\t\t} else {\r\n\t\t\ttargetHotspot.remove();\r\n\t\t}\r\n\t}\r\n\r\n\tclear() {\r\n\t\tconst timedEventIds = Object.keys(_renderedHotspots);\r\n\r\n\t\tfor (const id of timedEventIds) {\r\n\t\t\tthis.deleteHotspot(id);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport default HotspotsPlugin;","/*\r\n * Copied over from Sf.GetNavBarColors and modified to work with a background and text color.\r\n * Orginal function based all four color purely upon the background color.\r\n */\r\nexport function getInteractionColorsFromColor(background, text) {\r\n const backgroundHSL = hexToHsl(background);\r\n\r\n const h = backgroundHSL.h;\r\n const s = backgroundHSL.s;\r\n const l = backgroundHSL.l;\r\n\r\n const shouldHoverDarken = (l > 50);\r\n\r\n let backgroundHoverLightness = l + 10;\r\n let backgroundActiveLightness = l - 10;\r\n if (shouldHoverDarken) {\r\n backgroundHoverLightness = l - 10;\r\n backgroundActiveLightness = l + 10;\r\n }\r\n\r\n var colorInHSL = 'hsl(' + h + ', ' + s + '%, ' + l + '%)';\r\n var hoverColorInHSL = 'hsl(' + h + ', ' + s + '%, ' + backgroundHoverLightness + '%)';\r\n var activeColorInHSL = 'hsl(' + h + ', ' + s + '%, ' + backgroundActiveLightness + '%)';\r\n\r\n const textHSL = hexToHsl(text);\r\n\r\n let textHoverLightness = textHSL.l + 10;\r\n let textActiveLightness = textHSL.l - 10;\r\n if (shouldHoverDarken) {\r\n textHoverLightness = textHSL.l - 10;\r\n textActiveLightness = textHSL.l + 10;\r\n }\r\n\r\n var textColorInHSL = 'hsl(' + textHSL.h + ', ' + textHSL.s + '%, ' + textHSL.l + '%)';\r\n var hoverTextColorInHSL = 'hsl(' + textHSL.h + ', ' + textHSL.s + '%, ' + textHoverLightness + '%)';\r\n var activeTextColorInHSL = 'hsl(' + textHSL.h + ', ' + textHSL.s + '%, ' + textActiveLightness + '%)';\r\n\r\n return {\r\n MainColor: colorInHSL,\r\n HoverColor: hoverColorInHSL,\r\n ActiveColor: activeColorInHSL,\r\n TextColor: textColorInHSL,\r\n HoverTextColor: hoverTextColorInHSL,\r\n ActiveTextColor: activeTextColorInHSL\r\n };\r\n\r\n function hexToHsl(hex) {\r\n let hexToParse;\r\n if (hex.length === 4) {\r\n hexToParse = `#${hex.substring(1)}${hex.substring(1)}`;\r\n } else {\r\n hexToParse = hex;\r\n }\r\n var result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hexToParse);\r\n\r\n //Getthe hsl values (convert to rgb first)\r\n var r = parseInt(result[1], 16);\r\n var g = parseInt(result[2], 16);\r\n var b = parseInt(result[3], 16);\r\n\r\n r /= 255, g /= 255, b /= 255;\r\n var max = Math.max(r, g, b), min = Math.min(r, g, b);\r\n var h, s, l = (max + min) / 2;\r\n\r\n if (max == min) {\r\n h = s = 0; // achromatic\r\n } else {\r\n var d = max - min;\r\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\r\n switch (max) {\r\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\r\n case g: h = (b - r) / d + 2; break;\r\n case b: h = (r - g) / d + 4; break;\r\n }\r\n h /= 6;\r\n }\r\n\r\n s = s * 100;\r\n s = Math.round(s);\r\n l = l * 100;\r\n l = Math.round(l);\r\n h = Math.round(360 * h);\r\n\r\n return {\r\n s: s,\r\n l: l,\r\n h: h\r\n }\r\n }\r\n\r\n function hslToHex(hsl) {\r\n hsl = hsl.match(/^hsla?\\(\\s?(\\d+)(?:deg)?,?\\s(\\d+)%,?\\s(\\d+)%,?\\s?(?:\\/\\s?\\d+%|\\s+[\\d+]?\\.?\\d+)?\\)$/i);\r\n if (!hsl) {\r\n return null;\r\n }\r\n let h = hsl[1];\r\n let s = hsl[2];\r\n let l = hsl[3];\r\n h /= 360;\r\n s /= 100;\r\n l /= 100;\r\n let r, g, b;\r\n if (s === 0) {\r\n r = g = b = l;\r\n } else {\r\n const hue2rgb = function (p, q, t) {\r\n if (t < 0) t += 1;\r\n if (t > 1) t -= 1;\r\n if (t < 1 / 6) return p + (q - p) * 6 * t;\r\n if (t < 1 / 2) return q;\r\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\r\n return p;\r\n };\r\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\r\n const p = 2 * l - q;\r\n r = hue2rgb(p, q, h + 1 / 3);\r\n g = hue2rgb(p, q, h);\r\n b = hue2rgb(p, q, h - 1 / 3);\r\n }\r\n const toHex = function (x) {\r\n const hex = Math.round(x * 255).toString(16);\r\n return hex.length === 1 ? '0' + hex : hex;\r\n };\r\n return '#' + toHex(r) + toHex(g) + toHex(b);\r\n }\r\n}","import videojs from 'video.js';\r\n\r\nconst _existingLayout = new WeakMap();\r\n\r\n/**\r\n * Gets a reference to the main layout container within the player. Most child components added by plugins should be inserted here.\r\n * @memberof MediasitePlayer#\r\n * @returns {videojs.Component}\r\n * @example\r\n * player.layout().addChild(someCustomVideoJsComponent);\r\n */\r\nfunction layout() {\r\n let existingLayout = _existingLayout.get(this);\r\n if (!existingLayout) {\r\n const Component = videojs.getComponent('Component');\r\n existingLayout = new Component(this);\r\n existingLayout.addClass('mediasite-player__layout');\r\n _existingLayout.set(this, existingLayout);\r\n\r\n // Video element gets special treatment in iOS from Video.js and lives at index 0. Attempting to use 0 causes errors in Safari.\r\n this.ready(() => this.addChild(existingLayout, {}, 1));\r\n }\r\n return existingLayout;\r\n}\r\n\r\nexport default layout;\r\n","import deepmerge from 'deepmerge';\r\nimport { isPlainObject } from 'is-plain-object';\r\nimport { runPlayerExtension } from '../../../util/player-extensions.js';\r\n\r\n/**\r\n * \r\n * @param {any} player\r\n * @param {string} presentationId\r\n * @param {PlayCoverData} playCoverData\r\n * @param {PresentationData} presentationData\r\n * @param {Array} loaderHooks\r\n * @returns {Promise}\r\n */\r\nexport function applyLoaderCallbacks(player, presentationId, playCoverData, presentationData, loaderHooks) {\r\n const hooks = loaderHooks.map(hook => hook?.(presentationId, playCoverData, presentationData));\r\n const extensions = presentationData.playerExtensions ?? [];\r\n const extensionHooks = getPlayerExtensionHooks(player, extensions);\r\n hooks.push(...extensionHooks);\r\n\r\n return Promise.all(hooks).then(pluginResults => {\r\n const result = deepmerge.all(\r\n [presentationData, ...pluginResults.filter(val => val !== undefined)],\r\n { isMergeableObject: isPlainObject }\r\n );\r\n return result;\r\n });\r\n}\r\n\r\nfunction getPlayerExtensionHooks(player, extensions) {\r\n const SKIP_EXTENSION_TYPES = ['Mediasite.Player.PollNotification', 'Mediasite.Player.SurveyExtension', 'Mediasite.Player.CopyrightExtension'];\r\n const results = [];\r\n\r\n extensions.forEach(function (extension) {\r\n if (SKIP_EXTENSION_TYPES.includes(extension.ExtensionType)) {\r\n // Some legacy extensions are now built into the player.\r\n // The server-side data for those extensions still necessary, \r\n // so leave all that in and specifically don't load the,\r\n // now unnecessary, extension code.\r\n return;\r\n }\r\n\r\n let promise = runPlayerExtension(videojs, player, extension);\r\n results.push(promise);\r\n });\r\n\r\n return results;\r\n}\r\n","\r\nexport async function runPlayerExtension(videojs, player, extension) {\r\n const extensionUrl = `${extension.ExtensionBasePath}extension.js`;\r\n let result;\r\n\r\n try {\r\n player.log(`Attempting to run player extension of type ${extension.ExtensionType} from URL ${extensionUrl}`);\r\n\r\n const { default: extensionFunc } = await import(/* webpackIgnore: true */ extensionUrl);\r\n\r\n result = extensionFunc(videojs, player, extension.Data);\r\n if (!isPromise(result)) {\r\n result = Promise.resolve();\r\n }\r\n } catch (err) {\r\n player.log(`Failed to run player extension of type ${extension.ExtensionType} from URL ${extensionUrl}`);\r\n result = Promise.reject(`${err.name}: ${err.message}`);\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction isPromise(val) {\r\n return typeof val === 'object' && typeof val.then === 'function';\r\n}","import { PlayerPresentationStatus } from '../../../api/presentation.js';\r\n\r\n/**\r\n * @param {PresentationData} presentationData\r\n * @returns {Promise}\r\n */\r\nexport function ensurePresentationAvailable(presentationData) {\r\n const availableStatuses = [\r\n PlayerPresentationStatus.Viewable,\r\n PlayerPresentationStatus.Scheduled\r\n ];\r\n const { playerPresentationStatus: status } = presentationData.metadata;\r\n if (availableStatuses.includes(status)) {\r\n return Promise.resolve(presentationData);\r\n }\r\n else {\r\n return Promise.reject(presentationData.metadata.playerPresentationStatusMessage);\r\n }\r\n}\r\n","import videojs from 'video.js';\r\n\r\nimport { loadPresentationData, overrideServerSettings, ensurePresentationAvailable, applyLoaderCallbacks, applyPlayerSource, applyPlayerOptions } from './loader/';\r\nimport { isPresentationId } from '../../util';\r\nimport { QueryStringParamProvider, getPresentationId } from '../../implementations/player-page/helpers.js';\r\nimport { getPosterInfo, PresentationStatus } from '../../api/presentation';\r\nimport { reportMediaOpen } from '../../api/player';\r\n\r\nconst _options = new WeakMap();\r\nconst _currentOptions = new WeakMap();\r\nconst _presentationId = new WeakMap();\r\nconst _previousPresentationIds = new WeakMap();\r\nconst _isLoadingNewPresentation = new WeakMap();\r\n\r\nconst _playCoverData = new WeakMap();\r\nconst _presentationData = new WeakMap();\r\n\r\nconst _playCoverPromise = new WeakMap();\r\nconst _presentationPromise = new WeakMap();\r\n\r\nconst _playCoverCallbacks = new WeakMap();\r\nconst _presentationCallbacks = new WeakMap();\r\n\r\n/**\r\n * The Loader module.\r\n * @member {LoaderPlugin} loader\r\n * @memberof MediasitePlayer#\r\n */\r\n\r\n/**\r\n * Provides methods to assist with the loading of Mediasite data from the server.\r\n * @hideconstructor\r\n * @extends {external:\"videojs.Plugin\"}\r\n **/\r\nclass LoaderPlugin extends videojs.getPlugin('plugin') {\r\n constructor(player, options) {\r\n super(player, options);\r\n\r\n _playCoverCallbacks.set(this, []);\r\n _presentationCallbacks.set(this, []);\r\n\r\n const { presentationId, ...initOptions } = options;\r\n if (presentationId) {\r\n this.init(presentationId, initOptions);\r\n }\r\n }\r\n\r\n /**\r\n * The ID of the Mediasite presentation associated with this player\r\n * @type {string}\r\n * @example\r\n * const presentationId = player.loader.presentationId;\r\n */\r\n get presentationId() {\r\n return _presentationId.get(this);\r\n }\r\n\r\n /**\r\n * A boolean indicating whether or not the play cover has been loaded yet.\r\n * @type {boolean}\r\n * @example\r\n * const isPlayCoverLoaded = player.loader.playCoverLoaded;\r\n */\r\n get playCoverLoaded() {\r\n return !(!_playCoverData.get(this));\r\n }\r\n\r\n /**\r\n * A boolean indicating whether or not the presentation has been loaded yet and the play cover dismissed.\r\n * @type {boolean}\r\n * @example\r\n * const isPresentationLoaded = player.loader.presentationLoaded;\r\n */\r\n get presentationLoaded() {\r\n return !(!_presentationData.get(this));\r\n }\r\n\r\n /**\r\n * Sets up the player for the given presentation and begins loading the play cover data.\r\n * @param {string} presentationId The ID of the presentation to load.\r\n * @param {Object} [options]\r\n * @param {number} [options.playFrom] A time in seconds at which to begin playback.\r\n * @param {Object} [options.overrides]\r\n * @private\r\n * @returns {Promise} A Promise that is resolved with the play cover data when the play cover has finished loading.\r\n */\r\n init(presentationId, options = {}) {\r\n let playCoverPromise = _playCoverPromise.get(this);\r\n\r\n if (!playCoverPromise) {\r\n this.log(`Attempting to load play cover data for presentation with ID: ${presentationId}`);\r\n this.player.addClass('vjs-waiting');\r\n\r\n _presentationId.set(this, presentationId);\r\n _options.set(this, options);\r\n\r\n let coverVisible = options.overrides?.playcover?.visible;\r\n playCoverPromise = getPosterInfo(presentationId, coverVisible).then(async (playCoverData) => {\r\n //if either we're already live or if we're autoplaying, we want to hide the playcover\r\n const params = new QueryStringParamProvider(location.search);\r\n const autoPlayParam = params.getParamFromOptions(['autostart', 'autoplay']);\r\n if (playCoverData.playStatus == PresentationStatus.Live) {\r\n if (autoPlayParam === 'false') {\r\n coverVisible = true;\r\n } else {\r\n coverVisible = false;\r\n }\r\n } else if (autoPlayParam === 'true') {\r\n coverVisible = false;\r\n }\r\n\r\n options.overrides.playcover.visible = coverVisible;\r\n _options.set(this, options);\r\n\r\n //Sets title in playcover lower left\r\n this.player.metadata().title = playCoverData.title;\r\n this.player.playcover().visible = coverVisible;\r\n\r\n if (coverVisible) {\r\n // Todo: include this in the playCoverCallbacks so that loading is delayed until the poster image has been loaded over the network\r\n const posterPromise = new Promise((resolve, reject) => {\r\n if (!playCoverData.poster) {\r\n reject();\r\n } else {\r\n const img = document.createElement('img');\r\n img.addEventListener('load', () => {\r\n this.player.poster(playCoverData.poster);\r\n resolve();\r\n });\r\n img.src = playCoverData.poster;\r\n }\r\n }).catch(() => {\r\n this.log('There was not a valid playcover poster to display.');\r\n });\r\n }\r\n const playCoverCallbacks = _playCoverCallbacks.get(this);\r\n const { playerOptions } = await applyLoaderCallbacks(this.player, presentationId, playCoverData, { playerOptions: _options.get(this)?.overrides ?? {} }, playCoverCallbacks);\r\n applyPlayerOptions(this.player, playerOptions);\r\n\r\n _playCoverData.set(this, playCoverData);\r\n this.player.removeClass('vjs-waiting');\r\n this.player.trigger('playcoverloaded');\r\n this.log('Finished loading play cover data.');\r\n\r\n if (!coverVisible || !isPresentationId(presentationId)) {\r\n this.loadPresentation();\r\n }\r\n\r\n if (isPresentationId(presentationId) && playCoverData.playStatus === PresentationStatus.NotAvailable) {\r\n this.player.playcover().showPlayButton = false;\r\n this.player.removeClass('vjs-waiting');\r\n this.player.showMessage('The presentation is currently unavailable. Please try again later.', { uncloseable: true });\r\n }\r\n\r\n return playCoverData;\r\n });\r\n\r\n _playCoverPromise.set(this, playCoverPromise);\r\n }\r\n\r\n return playCoverPromise;\r\n }\r\n\r\n\r\n applyLiveWait(presentationData) {\r\n const streams = presentationData.streams;\r\n if (presentationData?.metadata?.playStatus === 'OnDemand' || presentationData?.metadata?.playStatus === 'NotAvailable' || presentationData?.metadata?.playStatus == null || !this.player?.live) {\r\n return Promise.resolve(presentationData);\r\n } else {\r\n this.player.live().segmentLength = streams.find(src => this.player.canPlayType(src?.items[0]?.type))?.items[0]?.segmentLength ?? this.player.live()?.segmentLength;\r\n return this.player.live().waitUntilSafe().then(() => {\r\n return Promise.resolve(presentationData);\r\n });\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Begins loading the presentation, requesting the needed data from the server in the process.\r\n * @returns {Promise} A Promise that is resolved when the presentation has finished loading and the play cover has been dismissed.\r\n * @example\r\n * player.loader.loadPresentation().then(() => {\r\n * console.log('Presentation has been loaded, and the play cover has been dismissed.');\r\n * });\r\n */\r\n loadPresentation() {\r\n let presentationPromise = _presentationPromise.get(this);\r\n\r\n if (!presentationPromise) {\r\n this.log(`Attempting to load presentation data for presentation with ID: ${this.presentationId}`);\r\n this.player.addClass('vjs-waiting');\r\n\r\n const presentationCallbacks = _presentationCallbacks.get(this);\r\n presentationPromise = loadPresentationData(this.presentationId)\r\n .then(data => overrideServerSettings(data, _options.get(this)?.overrides))\r\n .then(ensurePresentationAvailable)\r\n .then(data => this.applyLiveWait(data))\r\n .then(data => applyLoaderCallbacks(this.player, this.presentationId, _playCoverData.get(this), data, presentationCallbacks))\r\n .then(data => applyPlayerSource(this.player, data)).then(async (presentationData) => {\r\n const duration = this.player.duration();\r\n this.initBookmarkStorage(duration, presentationData.metadata.serverClockSkew);\r\n const playFrom = _options.get(this).playFrom ?? (presentationData.metadata.bookmark || this.getStoredBookmarkPosition());\r\n\r\n const playStatus = presentationData.metadata.playStatus;\r\n const isDVR = presentationData.playerOptions.live?.enableDvr;\r\n\r\n let seekDisabledInQuizSettings = false;\r\n if (this.player.usingPlugin('quizzes')) {\r\n seekDisabledInQuizSettings = !this.player.quizzes().enableSeeking;\r\n }\r\n\r\n //during live presentation, a user isn't able to seek, unless it is DVR. Thus, we should be at the live edge\r\n if (playStatus === PresentationStatus.Live || playStatus === PresentationStatus.LivePaused) {\r\n //if it is DVR, respect the playfrom value. If it is infinity, that's slang for moving it to the edge of the presentation\r\n if (isDVR) {\r\n if (playFrom === Infinity) {\r\n this.player.getChild('LiveTracker')?.seekToLiveEdge();\r\n } else {\r\n this.seekToPlayFrom(playFrom);\r\n }\r\n } else {\r\n this.player.getChild('LiveTracker')?.seekToLiveEdge();\r\n }\r\n } else { //Dealing with playfrom when it comes to On Demand content\r\n //move the player's current time to the playfrom time as long as quizzing's seeking is not disabled\r\n //why just quizzing disabling seeking? This would enable someone to use the playfrom parameter to retake a subquiz\r\n //which would be cheating possibly\r\n if (!seekDisabledInQuizSettings) {\r\n this.seekToPlayFrom(playFrom);\r\n }\r\n }\r\n\r\n //if the duration parameter has been set, pause the video after the amount of time stated in the parameter\r\n this.initDurationPause(_options.get(this).duration, playFrom, duration);\r\n\r\n this.player.bookmarkStorage().lastStartTime = playFrom >= 0 ? playFrom : 0;\r\n this.player.inactivity().sessionTimeout = presentationData.playerOptions?.inactivity?.sessionTimeout;\r\n const playbackTicket = this.player.reporting().playbackTicket;\r\n if (playbackTicket) {\r\n reportMediaOpen(playbackTicket);\r\n }\r\n this.player.reporting().reportToDataProvider(this.player.reporting().playbackTicket);\r\n this.player.reporting().trackPresentation();\r\n //Sets title for info sidebar when playcover doesn't exist\r\n this.player.metadata().title = presentationData.metadata.title;\r\n\r\n if (presentationData.playerOptions?.seekThumbnails?.enabled && !seekDisabledInQuizSettings) {\r\n this.player.seekThumbnails().init(presentationData.playerOptions?.seekThumbnails?.thumbData);\r\n }\r\n\r\n this.player.removeClass('vjs-waiting');\r\n _presentationData.set(this, presentationData);\r\n this.player.trigger('presentationloaded');\r\n this.log('Finished loading presentation data.');\r\n return presentationData;\r\n }).catch((error) => { //this does swallow a lot of code errors that occur when developing, so consider commenting out when deving\r\n //let's make sure we display any issues that went wrong to the user so that they don't just sit and watch the spinner forever (MVP#1104)\r\n this.player.error(error.message);\r\n });\r\n\r\n _presentationPromise.set(this, presentationPromise);\r\n _currentOptions.set(this, _options.get(this));\r\n }\r\n\r\n return presentationPromise;\r\n }\r\n\r\n /**\r\n * @callback LoaderCallback\r\n * @param {string} presentationId\r\n * @param {PresentationData} presentationData\r\n * @param {PlayCoverData} playCoverData\r\n */\r\n\r\n /**\r\n * Registers a callback that will be passed the play cover information once loading has completed, but before the \"loading\" spinner has been dismissed.\r\n * @param {LoaderCallback} callback\r\n */\r\n onLoadPlayCover(callback) {\r\n _playCoverCallbacks.get(this).push(callback);\r\n }\r\n\r\n /**\r\n * Registers a callback that will be passed the presentation information once loading has completed, but before the play cover has been dismissed or playback begun.\r\n * @param {LoaderCallback} callback\r\n */\r\n onLoadPresentation(callback) {\r\n _presentationCallbacks.get(this).push(callback);\r\n }\r\n\r\n /**\r\n * Initializes the bookmarkStorage plugin by setting presentation Id, duration, and server clock skew.\r\n * @param {number} duration\r\n * @param {number} skew\r\n */\r\n initBookmarkStorage(duration, skew) {\r\n if (!this.player.reporting().includeBookmark) {\r\n return;\r\n }\r\n const storage = this.player.bookmarkStorage();\r\n storage.presentationId = this.presentationId;\r\n storage.presentationDuration = duration;\r\n storage.clockSkew = skew;\r\n }\r\n\r\n /**\r\n * Gets the position in seconds from any locally stored bookmark.\r\n * @returns {number} the position, in seconds, to start playback from\r\n */\r\n getStoredBookmarkPosition() {\r\n if (!this.player.reporting().includeBookmark) {\r\n return 0;\r\n }\r\n const storage = this.player.bookmarkStorage();\r\n return storage.retrieve().position ?? 0;\r\n }\r\n\r\n /**\r\n * Creates a timed event after x amount of seconds to pause the presentation\r\n * @param {any} durationPause\r\n * @param {any} playFrom\r\n */\r\n initDurationPause(durationPause, playFrom, duration) {\r\n if (!durationPause) {\r\n return;\r\n }\r\n //offset the pausing by where the video is starting to play from\r\n //either through the PlayFrom parameter or bookmarking\r\n if (playFrom && playFrom !== Infinity && playFrom + durationPause < duration) {\r\n durationPause += playFrom;\r\n }\r\n\r\n this.player.timedEvents().add({\r\n id: 'duration-pause',\r\n time: durationPause,\r\n duration: 1,\r\n type: 'hidden'\r\n }, () => this.player.pause());\r\n }\r\n\r\n /**\r\n * Seeks the presentation to the specific time, checking that we aren't trying to just end the video\r\n * @param {any} playFrom\r\n */\r\n seekToPlayFrom(playFrom) {\r\n if (playFrom !== Math.round(this.player.duration())) {\r\n this.player.currentTime(playFrom);\r\n }\r\n }\r\n\r\n /**\r\n * Transitions the player to a new presentation without leaving the page\r\n * @param {string} presentationId\r\n * @param {boolean} savePreviousId\r\n */\r\n loadNewPresentation(presentationId, savePreviousId = true) {\r\n if (!isPresentationId(presentationId) || _isLoadingNewPresentation.get(this)) {\r\n return;\r\n }\r\n const previousOptions = _currentOptions.get(this);\r\n previousOptions.overrides.playcover.visible = false;\r\n\r\n if (savePreviousId) {\r\n this.#savePreviousId();\r\n }\r\n\r\n //we want to stay in the same XR state we were in when we triggered the new presentation, so let's grab the xr state now and ask the\r\n //video 360 plugin to stick us back in XR if we were before the switch\r\n let inXR = false;\r\n const isPreviousVideo360 = _presentationData.get(this).metadata.is360Video;\r\n\r\n if (isPreviousVideo360) {\r\n inXR = this.player.video360?.().isInXR();\r\n this.player.xr().hasPlayerLoadedXR = false; //resets this values that gets set to true when the presentation loads its XR info\r\n }\r\n\r\n _playCoverPromise.set(this, null);\r\n _presentationPromise.set(this, null);\r\n _isLoadingNewPresentation.set(this, true);\r\n\r\n //any plugin that adds elements without overriding the previous option needs to be cleared out before loading in the new presentation\r\n this.#resetPlugins();\r\n\r\n //we don't want future items in the playlist to also loop\r\n this.player.banner().isLooping = false;\r\n\r\n //configure the player so that it is prepared to handle the new presentation\r\n this.player.pause();\r\n this.player.autoplay(true);\r\n\r\n this.player.trigger(\"loadnewpresentation\");\r\n\r\n this.init(presentationId, previousOptions).then(() => {\r\n if (inXR) {\r\n this.player.video360?.().enterXROnInit();\r\n }\r\n });\r\n\r\n this.player.one('presentationloaded', () => {\r\n const isNextVideo360 = _presentationData.get(this).metadata.is360Video;\r\n // deactive any 360 stuff if the next video isn't 360\r\n if (isPreviousVideo360 && !isNextVideo360) {\r\n this.player.video360?.().xrDispose();\r\n }\r\n _isLoadingNewPresentation.set(this, false);\r\n });\r\n\r\n this.player.currentTime(0);\r\n }\r\n\r\n #savePreviousId() {\r\n const previousPresentationId = _presentationId.get(this);\r\n let previousPresentationIds = _previousPresentationIds?.get(this);\r\n if (!previousPresentationIds) {\r\n previousPresentationIds = [];\r\n }\r\n\r\n previousPresentationIds.push(previousPresentationId);\r\n _previousPresentationIds.set(this, previousPresentationIds);\r\n }\r\n\r\n #resetPlugins() {\r\n this.player.audioDescriptions().clear();\r\n this.player.background().clear();\r\n this.player.captions().clear();\r\n this.player.chapters().clear();\r\n this.player.seekBarSegments().clear();\r\n this.player.hotspots().clear();\r\n this.player.timedEvents().clear();\r\n\r\n if (videojs.getPlugin(\"conviva\")) {\r\n this.player.conviva().dispose();\r\n }\r\n\r\n if (videojs.getPlugin(\"quizzes\")) {\r\n this.player.quizzes().dispose();\r\n }\r\n\r\n if (videojs.getPlugin(\"multistream\")) {\r\n this.player.multistream().dispose();\r\n } \r\n }\r\n\r\n /**\r\n * Loads the previous presentation that was loaded before the current one\r\n */\r\n loadPreviousPresentation() {\r\n const previousPresentationId = _previousPresentationIds?.get(this).pop();\r\n this.loadNewPresentation(previousPresentationId, false);\r\n }\r\n\r\n /**\r\n * Checks to see if the presentation we are currently on is the presentation that was first loaded \r\n */\r\n isCurrentPresentationOriginal() {\r\n const currentPresentationId = _presentationId.get(this);\r\n const originalPresentationId = getPresentationId(location.pathname, window.SiteData?.PresentationId);\r\n\r\n return (currentPresentationId === originalPresentationId);\r\n }\r\n}\r\n\r\nexport default LoaderPlugin;\r\n","import { getMetadata, getStreams, getAudioDescriptionUrl, getDownloads, getCaptions, getChapters, getHotspots, getTimedEvents, getCompositionMap, getCompositionList, getPresentationOptions } from '../../../api/presentation';\r\nimport { getOptions, getExtensions } from '../../../api/player';\r\n\r\n/**\r\n * @param {string} presentationId\r\n * @returns {Promise}\r\n */\r\nexport async function loadPresentationData(presentationId) {\r\n const [\r\n metadata,\r\n streams,\r\n audioDescriptionUrl,\r\n downloads,\r\n captions,\r\n chapters,\r\n hotspots,\r\n timedEvents,\r\n playerOptions,\r\n playerExtensions,\r\n compositionMap,\r\n compositionList,\r\n presentationOptions\r\n ] = await Promise.all([\r\n getMetadata(presentationId),\r\n getStreams(presentationId),\r\n getAudioDescriptionUrl(presentationId),\r\n getDownloads(presentationId),\r\n getCaptions(presentationId),\r\n getChapters(presentationId),\r\n getHotspots(presentationId),\r\n getTimedEvents(presentationId),\r\n getOptions(presentationId),\r\n getExtensions(presentationId),\r\n getCompositionMap(presentationId),\r\n getCompositionList(presentationId),\r\n getPresentationOptions(presentationId)\r\n ]);\r\n\r\n return {\r\n metadata,\r\n streams,\r\n audioDescriptionUrl,\r\n downloads,\r\n captions,\r\n chapters,\r\n hotspots,\r\n timedEvents,\r\n playerOptions,\r\n playerExtensions,\r\n compositionMap,\r\n compositionList,\r\n presentationOptions\r\n }\r\n}\r\n","/**\r\n * @param {PresentationData} presentationData\r\n * @param {any} overrides\r\n * @returns {Promise}\r\n */\r\nexport function overrideServerSettings(presentationData, overrides = {}) {\r\n // Apply user overrides passed to init() earlier\r\n const playerOptions = Object.assign({}, presentationData.playerOptions);\r\n for (const [key, value] of Object.entries(overrides)) {\r\n switch (typeof playerOptions[key]) {\r\n case 'object':\r\n playerOptions[key] = Object.assign({}, playerOptions[key], value);\r\n break;\r\n default:\r\n playerOptions[key] = value;\r\n break;\r\n }\r\n }\r\n\r\n return Promise.resolve(Object.assign({}, presentationData, { playerOptions }));\r\n}\r\n","import { applyPlayerOptions } from './';\r\nimport { TimedEventType } from '../../../api/presentation';\r\n\r\nimport { v4 as uuid } from 'uuid';\r\n\r\n/**\r\n * \r\n * @param {any} player\r\n * @param {PresentationData} presentationData\r\n * @returns {Promise}\r\n */\r\nexport async function applyPlayerSource(player, presentationData) {\r\n const videoUrls = presentationData.streams?.[0]?.items ?? [];\r\n const localize = player.localize?.bind(player);\r\n\r\n if (videoUrls.length > 0) {\r\n player.src(videoUrls);\r\n await new Promise(resolve => {\r\n player.any(['loadeddata', 'loadedmetadata', 'timeupdate'], resolve);\r\n });\r\n }\r\n \r\n // Apply base presentation data\r\n player.metadata().datetime = presentationData.metadata.unixTime;\r\n player.metadata().description = presentationData.metadata.description;\r\n player.metadata().presenters = presentationData.metadata.presenters;\r\n player.metadata().supportingLinks = presentationData.metadata.supportingLinks;\r\n player.metadata().compliancePolicyMarkdown = presentationData.metadata.compliancePolicyMarkdown;\r\n player.reporting().playbackTicket = presentationData.playerOptions.playbackTicket;\r\n\r\n if (presentationData.audioDescriptionUrl) {\r\n player.audioDescriptions().src = presentationData.audioDescriptionUrl;\r\n }\r\n if (presentationData.captions) {\r\n player.captions().enabled = true;\r\n configureCaptions(player, presentationData.captions);\r\n }\r\n if (presentationData.chapters) {\r\n player.chapters().enabled = true;\r\n configureChapters(player, presentationData.chapters, localize);\r\n }\r\n if (presentationData.hotspots) {\r\n player.hotspots().setIs360(presentationData.metadata.is360Video);\r\n player.hotspots().add(presentationData.hotspots);\r\n }\r\n\r\n if (presentationData.timedEvents) {\r\n for (const timedEvent of presentationData.timedEvents) {\r\n // we're handling chapters in their own section, so let's not repeat it here\r\n if (timedEvent.Type === TimedEventType.Chapter || timedEvent.Type === TimedEventType.Hotspot) {\r\n continue;\r\n }\r\n player.timedEvents().add({\r\n id: timedEvent.Id,\r\n time: timedEvent.Time / 1000,\r\n type: timedEvent.Type,\r\n payload: timedEvent.Text\r\n });\r\n }\r\n }\r\n // Apply player options\r\n const { playerOptions } = presentationData;\r\n applyPlayerOptions(player, playerOptions);\r\n\r\n if (presentationData.streams.length === 1 && presentationData.streams[0].audioOnly === true) {\r\n player.audioOnly().hideAudioOnlyVideo();\r\n player.settings().enablePIP = false;\r\n }\r\n\r\n if (player.downloads().enabled) {\r\n for (const { text, url } of presentationData.downloads) {\r\n player.downloads().add(url, localize(text));\r\n }\r\n }\r\n\r\n return presentationData;\r\n}\r\n\r\nfunction configureCaptions(player, captionInfos) {\r\n captionInfos.forEach(captionInfo => {\r\n const { LanguageCode, Language, CaptionsUrl, DetailedLanguageCode } = captionInfo;\r\n player.captions().set(LanguageCode, Language, CaptionsUrl, DetailedLanguageCode);\r\n });\r\n // Check and try to load selected language from previous play session\r\n const initialTrackLanguage = player.captions().initialTrackLanguage;\r\n const initialTextTrack = player.captions().getCaptionTrack(initialTrackLanguage);\r\n if (initialTextTrack) {\r\n initialTextTrack.mode = 'showing';\r\n }\r\n}\r\n\r\nfunction configureChapters(player, chapterInfos, localize) {\r\n //Adds a seekbar segment with a blank label that starts at 0:00 and ends at the beginning of the first configured chapter\r\n //Fills the blank seekbar space at the beginning created when breaking up the seekbar into chapter sections\r\n if (chapterInfos[0]?.Time !== 0.0 && chapterInfos[0] != null) {\r\n const currentChapterStart = 0.0 / 1000;\r\n const nextChapterStart = (chapterInfos[0]?.Time ?? 0) / 1000;\r\n const currentChapterEnd = nextChapterStart || player.duration();\r\n\r\n player.seekBarSegments().add({\r\n startTime: currentChapterStart,\r\n endTime: currentChapterEnd,\r\n progress: true\r\n });\r\n }\r\n for (let i = 0; i < chapterInfos.length; i++) {\r\n const chapter = chapterInfos[i];\r\n const currentChapterStart = chapter.Time / 1000;\r\n let nextChapterStart;\r\n if (chapterInfos[i + 1]?.Time != null) {\r\n nextChapterStart = (chapterInfos[i + 1].Time) / 1000;\r\n } else {\r\n nextChapterStart = null;\r\n }\r\n let currentChapterEnd;\r\n if (nextChapterStart != null) {\r\n currentChapterEnd = nextChapterStart;\r\n } else {\r\n currentChapterEnd = player.duration();\r\n }\r\n const cue = new VTTCue(currentChapterStart, currentChapterEnd, chapter.Text);\r\n cue.id = chapter.Id;\r\n\r\n if (!cue.text) {\r\n cue.text = localize('Chapter');\r\n }\r\n\r\n player.chapters().add(cue);\r\n //creates a timed event for the chapter that lasts as long as the chapter itself\r\n player.timedEvents().add({\r\n id: cue.id,\r\n time: currentChapterStart,\r\n duration: currentChapterEnd - currentChapterStart,\r\n type: TimedEventType.Chapter,\r\n payload: cue.text\r\n });\r\n }\r\n}","import videojs from 'video.js';\r\n\r\nconst _tbody = new WeakMap();\r\n\r\nexport class LogTable extends videojs.getComponent('Component') {\r\n constructor(player, options) {\r\n super(player, options);\r\n\r\n const thead = this.el().appendChild(document.createElement('thead'));\r\n const sourceEl = thead.appendChild(document.createElement('th'));\r\n const descriptionEl = thead.appendChild(document.createElement('th'));\r\n const timeEl = thead.appendChild(document.createElement('th'));\r\n\r\n sourceEl.textContent = 'Source';\r\n descriptionEl.textContent = 'Description';\r\n timeEl.textContent = 'Time';\r\n\r\n const tbody = this.el().appendChild(document.createElement('tbody'));\r\n _tbody.set(this, tbody);\r\n }\r\n\r\n createEl(tag, props = {}, attributes = {}) {\r\n tag = 'table';\r\n return super.createEl.call(this, tag, props, attributes);\r\n }\r\n\r\n addLog({ source, description, time }) {\r\n const tbody = _tbody.get(this);\r\n\r\n const tr = tbody.appendChild(document.createElement('tr'));\r\n const sourceEl = tr.appendChild(document.createElement('td'));\r\n const descriptionEl = tr.appendChild(document.createElement('td'));\r\n const timeEl = tr.appendChild(document.createElement('td'));\r\n\r\n sourceEl.textContent = source;\r\n descriptionEl.textContent = description;\r\n timeEl.textContent = new Date(time).toLocaleTimeString();\r\n }\r\n}\r\n","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js!./logging.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import videojs from 'video.js';\r\nimport { LogTable } from './logging/log-table.js';\r\nimport LoggingIcon from '../../assets/images/receipt_white_24dp.svg';\r\nimport './logging.css';\r\n\r\nconst _loggingWindow = new WeakMap();\r\nconst _loggingInterval = new WeakMap();\r\nconst _logs = new WeakMap();\r\nconst _table = new WeakMap();\r\n\r\n/**\r\n * The Logging module.\r\n * @member {LoggingPlugin} logging\r\n * @memberof MediasitePlayer#\r\n */\r\n\r\n/**\r\n * Configures the visibility of a logging interface that lists various player-related events as they occur.\r\n * @hideconstructor\r\n * @extends {external:\"videojs.Plugin\"}\r\n **/\r\nclass LoggingPlugin extends videojs.getPlugin('plugin') {\r\n constructor(player, options) {\r\n super(player, options);\r\n _logs.set(this, []);\r\n\r\n const Component = videojs.getComponent('Component');\r\n const loggingWindow = new Component(player);\r\n loggingWindow.addClass('mediasite-player__logging-window');\r\n loggingWindow.addClass('vjs-hidden');\r\n\r\n _loggingWindow.set(this, loggingWindow);\r\n _loggingInterval.set(this, loggingWindow.setInterval(() => this.#updateUI(), 250));\r\n\r\n const header = loggingWindow.el().appendChild(document.createElement('header'));\r\n header.textContent = 'Logging';\r\n\r\n const closeButton = header.appendChild(document.createElement('button'));\r\n closeButton.type = 'button';\r\n closeButton.textContent = '×';\r\n closeButton.setAttribute('aria-label', 'Close');\r\n closeButton.style = 'position:absolute;right:0;cursor:pointer;';\r\n this.on(closeButton, 'click', () => this.visible = false);\r\n\r\n const table = new LogTable(player, options);\r\n _table.set(this, table);\r\n loggingWindow.addChild(table);\r\n\r\n this.on(this.player, 'keydown', (event) => {\r\n if (['l', 'L'].includes(event.key)) {\r\n if (event.ctrlKey && event.altKey && event.shiftKey) {\r\n this.visible = !this.visible;\r\n }\r\n }\r\n });\r\n\r\n this.on(this.player, 'play', () => this.log('Started playback.'));\r\n this.on(this.player, 'pause', () => this.log('Paused playback.'));\r\n\r\n player.ready(() => {\r\n player.layout().addChild(loggingWindow);\r\n\r\n const params = new URLSearchParams(location.search.toLowerCase());\r\n if (params.get('loadlog') === 'true') {\r\n this.visible = true;\r\n this.player.controlbarMenu().addMenuItem('Show log window', { id: this.name, icon: LoggingIcon, callback: () => this.visible = true });\r\n }\r\n });\r\n }\r\n\r\n #updateUI() {\r\n const logs = _logs.get(this);\r\n const newLogs = this.player.log.history().filter(log => !logs.includes(log));\r\n const table = _table.get(this);\r\n\r\n const loggingWindowEl = _loggingWindow.get(this).el();\r\n const isAtBottom = Math.round(loggingWindowEl.scrollHeight - loggingWindowEl.scrollTop) === loggingWindowEl.clientHeight;\r\n for (const log of newLogs) {\r\n logs.push(log);\r\n const containerEl = _loggingWindow.get(this).el();\r\n if (containerEl.children.length < Infinity) {\r\n const source = log[0].split(':').filter(item => !!item).splice(-1)[0].trim();\r\n const time = new Date(Math.ceil(performance.timing.navigationStart + performance.now()));\r\n const description = log.reduce((result, current, currentIndex) => {\r\n return result + ((currentIndex && typeof current === 'string') ? ` ${current}` : '');\r\n }, '');\r\n if (source !== 'VIDEOJS') {\r\n table.addLog({ source, description, time });\r\n }\r\n }\r\n }\r\n\r\n if (isAtBottom) {\r\n loggingWindowEl.scrollTo(0, loggingWindowEl.scrollHeight);\r\n }\r\n }\r\n\r\n /**\r\n * Whether or not the logging window is currently visible.\r\n * @type {boolean}\r\n * @example\r\n * player.logging.visible = true;\r\n */\r\n get visible() {\r\n const loggingWindow = _loggingWindow.get(this);\r\n return loggingWindow && !loggingWindow.hasClass('vjs-hidden');\r\n }\r\n set visible(visible) {\r\n const loggingWindow = _loggingWindow.get(this);\r\n\r\n if (visible) {\r\n loggingWindow.removeClass('vjs-hidden');\r\n }\r\n else {\r\n loggingWindow.addClass('vjs-hidden');\r\n }\r\n }\r\n\r\n dispose() {\r\n clearInterval(_loggingInterval.get(this));\r\n\r\n if (this.player?.usingPlugin('controlbarMenu')) {\r\n this.player.controlbarMenu().removeMenuItem(this.name);\r\n }\r\n \r\n super.dispose();\r\n }\r\n}\r\n\r\nexport default LoggingPlugin;\r\n","let localize;\r\n\r\nexport function generateMetadataContainer(player) {\r\n localize = player.localize?.bind(player);\r\n const template = `
\r\n \r\n

${localize('Description')}:

\r\n \r\n
\r\n

${localize('Presenters')}:

\r\n \r\n

${localize('Links')}:

\r\n \r\n \r\n
\r\n
`;\r\n\r\n return convertTextToElement(template);\r\n}\r\n\r\nexport function generateSpeakerBio(name, imgUrl, bioUrl) {\r\n let textHTML = '
  • ';\r\n\r\n if (imgUrl) {\r\n textHTML += `\"${name}\"`;\r\n }\r\n else {\r\n textHTML += `
    `;\r\n }\r\n\r\n if (bioUrl) {\r\n textHTML += `${name}
  • `;\r\n } else {\r\n textHTML += `${name}`;\r\n }\r\n\r\n return convertTextToElement(textHTML);\r\n}\r\n\r\nexport function generateLink(title, url) {\r\n return convertTextToElement(`
  • ${title}
  • `);\r\n}\r\n\r\nfunction convertTextToElement(html) {\r\n const container = document.createElement('div');\r\n container.innerHTML = html;\r\n return container.firstElementChild;\r\n}\r\n","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js!./metadata.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import videojs from 'video.js';\r\nimport marked from 'marked';\r\n\r\nimport ModalDialog from '../../components/modal-dialog.js';\r\nimport { generateMetadataContainer, generateSpeakerBio, generateLink } from './metadata/metadata-template.js';\r\n\r\nimport InfoIcon from '../../assets/images/info-white-24dp.svg';\r\nimport './metadata.css';\r\n\r\nconst _modal = new WeakMap();\r\nconst _titleEl = new WeakMap();\r\nconst _dateEl = new WeakMap();\r\nconst _timeEl = new WeakMap();\r\nconst _durationEl = new WeakMap();\r\nconst _descriptionEl = new WeakMap();\r\nconst _compliancePolicyEl = new WeakMap();\r\nconst _presentersContainerEl = new WeakMap();\r\nconst _supportingLinksContainerEl = new WeakMap();\r\nlet localize;\r\n\r\n/**\r\n * The Metadata module.\r\n * @member {MetadataPlugin} metadata\r\n * @memberof MediasitePlayer#\r\n */\r\n\r\n/**\r\n * Configures the metadata visible in various parts of the UI.\r\n * @hideconstructor\r\n * @extends {external:\"videojs.Plugin\"}\r\n **/\r\nclass MetadataPlugin extends videojs.getPlugin('plugin') {\r\n /**\r\n * \r\n * @param {videojs.Player} player\r\n * @param {Object} [options]\r\n */\r\n constructor(player, options) {\r\n localize = player.localize?.bind(player);\r\n super(player, options);\r\n\r\n const modalContentEl = generateMetadataContainer(player);\r\n _titleEl.set(this, modalContentEl.querySelector('.mediasite-player__metadata-modal-title'));\r\n _dateEl.set(this, modalContentEl.querySelector('.mediasite-player__metadata-modal-date'));\r\n _timeEl.set(this, modalContentEl.querySelector('.mediasite-player__metadata-modal-time'));\r\n _durationEl.set(this, modalContentEl.querySelector('.mediasite-player__metadata-modal-duration'));\r\n _descriptionEl.set(this, modalContentEl.querySelector('.mediasite-player__metadata-modal-description'));\r\n _presentersContainerEl.set(this, modalContentEl.querySelector('.mediasite-player__metadata-modal-speaker-list'));\r\n _supportingLinksContainerEl.set(this, modalContentEl.querySelector('.mediasite-player__metadata-modal-links-list'));\r\n _compliancePolicyEl.set(this, modalContentEl.querySelector('.mediasite-player__metadata-modal-compliance-policy'));\r\n\r\n this.on(player, 'durationchange', this.#updateDuration);\r\n\r\n // Set up modal and title overlay\r\n const modal = new ModalDialog(player, {\r\n temporary: false,\r\n uncloseable: false,\r\n pauseOnOpen: false,\r\n description: 'Presentation Metadata',\r\n displayAsPanel: true,\r\n content: Array.from(modalContentEl.children)\r\n });\r\n modal.addClass('mediasite-player__metadata-modal');\r\n modal.addClass('mediasite-player__control-bar-modal');\r\n _modal.set(this, modal);\r\n\r\n player.ready(() => {\r\n player.layout().addChild(modal);\r\n player.controlbarMenu().addMenuItem(localize('Info'), { id: this.name, icon: InfoIcon, callback: () => modal.open() });\r\n });\r\n }\r\n\r\n /** \r\n * The title of the current source media.

    Note: also automatically sets the title displayed on the play cover. \r\n * @type {string}\r\n * @see {@link PlaycoverPlugin#title}\r\n * @example\r\n * player.metadata.title = 'This is the presentation title';\r\n */\r\n set title(title) {\r\n _titleEl.get(this).textContent = title;\r\n this.player.playcover().title = title;\r\n }\r\n get title() {\r\n return _titleEl.get(this).textContent;\r\n }\r\n\r\n /** \r\n * The date/time associated with the source media.\r\n * @type {number}\r\n * @example\r\n * player.metadata.datetime = Date.now();\r\n */\r\n set datetime(datetime = Date.now()) {\r\n const dateEl = _dateEl.get(this);\r\n const timeEl = _timeEl.get(this);\r\n const date = new Date(datetime);\r\n dateEl.dataset.value = datetime;\r\n dateEl.textContent = date.toLocaleDateString();\r\n timeEl.textContent = date.toLocaleTimeString([], { timeStyle: 'short' });\r\n }\r\n get datetime() {\r\n return parseInt(_dateEl.get(this).dataset.value, 10);\r\n }\r\n\r\n /**\r\n * Description text that is associated with the source material.\r\n * @type {string}\r\n * @example\r\n * player.metadata.description = 'This is some description text to be displayed in the metadata panel within the player.';\r\n */\r\n set description(description = '') {\r\n const el = _descriptionEl.get(this);\r\n el.innerHTML = JSON.parse(`\"${description.replaceAll('\\\\n', '
    ')}\"`);\r\n el.dataset.value = description;\r\n el.hidden = !(description && description.length > 0);\r\n }\r\n get description() {\r\n return _descriptionEl.get(this).dataset.value;\r\n }\r\n\r\n /**\r\n * A string of text that will be parsed as Markdown and displayed in the metadata modal dialog.\r\n * @type {string}\r\n * @example\r\n * player.metadata.compliancePolicyMarkdown = 'This *is* **Markdown**';\r\n */\r\n set compliancePolicyMarkdown(compliancePolicyMarkdown) {\r\n const el = _compliancePolicyEl.get(this);\r\n if (compliancePolicyMarkdown) {\r\n el.hidden = false;\r\n el.innerHTML = marked(compliancePolicyMarkdown);\r\n el.dataset.value = compliancePolicyMarkdown;\r\n const links = el.querySelectorAll('a');\r\n links.forEach((link) => link.target = '_blank');\r\n }\r\n else {\r\n el.hidden = true;\r\n }\r\n }\r\n get compliancePolicyMarkdown() {\r\n return _compliancePolicyEl.get(this).dataset.value;\r\n }\r\n\r\n /**\r\n * A list of presenters associated with the current source media.\r\n * @type {Presenter[]}\r\n * @example\r\n * player.metadata.presenters = [{\r\n * bioUrl: '/path/to/bio/page/',\r\n * imageUrl: '/path/to/image.jpg',\r\n * name: 'James T. Kirk'\r\n * }];\r\n */\r\n set presenters(presenters) {\r\n const presenterContainer = _presentersContainerEl.get(this);\r\n presenterContainer.innerHTML = '';\r\n presenterContainer.dataset.value = JSON.stringify(presenters);\r\n\r\n for (let i = 0; i < presenters.length; i++) {\r\n const presenter = presenters[i];\r\n const el = generateSpeakerBio(presenter.name, presenter.imageUrl, presenter.bioUrl);\r\n presenterContainer.appendChild(el);\r\n }\r\n }\r\n\r\n get presenters() {\r\n return JSON.parse(_presentersContainerEl.get(this).dataset.value);\r\n }\r\n\r\n /**\r\n * A list of links to display in the metadata modal dialog.\r\n * @type {SupportingLink[]}\r\n * @example\r\n * player.metadata.supportingLinks = [{\r\n * title: 'Mediasite',\r\n * url: 'https://mediasite.com'\r\n * }];\r\n */\r\n set supportingLinks(supportingLinks) {\r\n const containerEl = _supportingLinksContainerEl.get(this);\r\n containerEl.innerHTML = '';\r\n containerEl.dataset.value = JSON.stringify(supportingLinks);\r\n\r\n for (let i = 0; i < supportingLinks.length; i++) {\r\n const currentLink = supportingLinks[i];\r\n\r\n const el = generateLink(currentLink.title, currentLink.url);\r\n containerEl.appendChild(el);\r\n }\r\n }\r\n\r\n get supportingLinks() {\r\n const containerEl = _supportingLinksContainerEl.get(this);\r\n return containerEl.dataset.value ? JSON.parse(containerEl.dataset.value) : [];\r\n }\r\n\r\n /**\r\n * Opens the metadata modal.\r\n * @example\r\n * player.metadata.openModal();\r\n */\r\n openModal() {\r\n _modal.get(this).open();\r\n }\r\n\r\n /**\r\n * Closes the metadata modal.\r\n * @example\r\n * player.metadata.closeModal();\r\n */\r\n closeModal() {\r\n _modal.get(this).close();\r\n }\r\n\r\n #updateDuration() {\r\n const isLive = this.player.usingPlugin('live');\r\n let seconds = this.player.duration();\r\n if (isLive) {\r\n seconds = this.player.liveTracker.liveCurrentTime();\r\n\r\n if (seconds === Infinity) {\r\n seconds = 0;\r\n }\r\n\r\n setTimeout(() => this.#updateDuration(), 1000);\r\n }\r\n\r\n _durationEl.get(this).textContent = localize('Duration') + `: ${videojs.formatTime(seconds)}`;\r\n }\r\n\r\n /**\r\n * A boolean indicating whether or not the date/time of publication should be displayed in the metadata UI.\r\n * @type {boolean}\r\n * @example\r\n * player.metadata.showPublishDateTime = true;\r\n */\r\n get showPublishDateTime() {\r\n const dateEl = _dateEl.get(this);\r\n const timeEl = _timeEl.get(this);\r\n return !(dateEl.classList.contains('vjs-hidden') || timeEl.classList.contains('vjs-hidden'));\r\n }\r\n\r\n set showPublishDateTime(showPublishDateTime) {\r\n const dateEl = _dateEl.get(this);\r\n const timeEl = _timeEl.get(this);\r\n\r\n if (showPublishDateTime) {\r\n dateEl.classList.remove('vjs-hidden');\r\n timeEl.classList.remove('vjs-hidden');\r\n }\r\n else {\r\n dateEl.classList.add('vjs-hidden');\r\n timeEl.classList.add('vjs-hidden');\r\n }\r\n }\r\n\r\n /**\r\n * A boolean indicating whether or not the Info button should be shown in the controlbar menu.\r\n * @type {boolean}\r\n */\r\n get showControlBarButton() {\r\n return this.player.controlbarMenu().isMenuItemEnabled(this.name);\r\n }\r\n\r\n set showControlBarButton(showControlBarButton) {\r\n if (showControlBarButton) {\r\n this.player.controlbarMenu().enableMenuItem(this.name);\r\n }\r\n else {\r\n this.player.controlbarMenu().disableMenuItem(this.name);\r\n }\r\n }\r\n\r\n dispose() {\r\n const modal = _modal.get(this);\r\n modal.dispose();\r\n\r\n this.player?.removeChild(modal);\r\n\r\n if (this.player?.usingPlugin('controlbarMenu')) {\r\n this.player.controlbarMenu().removeMenuItem(this.name);\r\n }\r\n\r\n super.dispose();\r\n }\r\n}\r\n\r\nexport default MetadataPlugin;\r\n\r\n/**\r\n * @typedef {Object} Presenter\r\n * @alias Presenter\r\n * @memberof MetadataPlugin\r\n * @property {string} bioUrl\r\n * @property {string} imageUrl\r\n * @property {string} name\r\n */\r\n\r\n/**\r\n * @typedef {Object} SupportingLink\r\n * @alias SupportingLink\r\n * @memberof MetadataPlugin\r\n * @property {string} title\r\n * @property {string} url\r\n */\r\n","import videojs from 'video.js';\r\nimport { v4 as uuid } from 'uuid';\r\nimport InfoIcon from '../../../assets/images/info-white-24dp.svg';\r\nimport './notification-item.css';\r\n\r\nconst TIMEOUT = 5000;\r\nlet localize;\r\n\r\nclass NotificationItem extends videojs.getComponent('Component') {\r\n constructor(player, options) {\r\n localize = player.localize?.bind(player);\r\n super(player, options);\r\n const titleId = uuid();\r\n const descriptionId = uuid();\r\n\r\n this.el().setAttribute('role', 'listitem');\r\n this.el().setAttribute('aria-labelledby', titleId);\r\n this.addClass('mediasite-player__notification-item');\r\n\r\n const animationClass = 'mediasite-player__notification-item--animating-in';\r\n this.addClass(animationClass);\r\n this.one('animationend', () => {\r\n this.removeClass(animationClass);\r\n });\r\n\r\n const clickableEl = this.contentEl().appendChild(document.createElement('button'));\r\n clickableEl.className = 'mediasite-player__notification-clickable-surface';\r\n clickableEl.setAttribute('aria-labelledby', titleId);\r\n clickableEl.style.setProperty('--notification-icon', `url(\"${options.icon ?? InfoIcon}\")`);\r\n clickableEl.addEventListener('click', () => this.trigger('callback'));\r\n\r\n const notificationTitle = clickableEl.appendChild(document.createElement('span'));\r\n notificationTitle.className = 'mediasite-player__notification-title';\r\n notificationTitle.textContent = options.title;\r\n notificationTitle.id = titleId;\r\n\r\n if (options.description) {\r\n const notificationDescription = clickableEl.appendChild(document.createElement('span'));\r\n notificationDescription.className = 'mediasite-player__notification-description';\r\n notificationDescription.textContent = options.description;\r\n notificationDescription.id = descriptionId;\r\n this.el().setAttribute('aria-describedby', descriptionId);\r\n clickableEl.setAttribute('aria-describedby', descriptionId);\r\n }\r\n\r\n const closeButton = this.contentEl().appendChild(document.createElement('button'));\r\n closeButton.className = 'mediasite-player__notification-close-button';\r\n closeButton.setAttribute('aria-label', localize('Dismiss notification'));\r\n closeButton.addEventListener('click', () => this.trigger('dismiss'));\r\n\r\n if (options.timeout === Infinity) {\r\n return;\r\n }\r\n this.setTimeout(() => this.trigger('timeout'), options.timeout || TIMEOUT);\r\n }\r\n\r\n animateUp() {\r\n return this.animate('up', true);\r\n }\r\n\r\n animateDown() {\r\n return this.animate('down', true);\r\n }\r\n\r\n animateOut() {\r\n return this.animate('out', false);\r\n }\r\n\r\n animate(direction, cleanup) {\r\n return new Promise(resolve => {\r\n const animationClass = `mediasite-player__notification-item--animating-${direction}`;\r\n this.addClass(animationClass);\r\n this.one('animationend', () => {\r\n if (cleanup) {\r\n this.removeClass(animationClass);\r\n }\r\n resolve();\r\n });\r\n });\r\n }\r\n}\r\n\r\nexport { NotificationItem };\r\n","import api from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/postcss-loader/dist/cjs.js!./notification-item.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js!./notifications.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import videojs from 'video.js';\r\nimport { OverflowMenuButton } from './controlbar-menu/overflow-menu-button.js';\r\nimport { NotificationItem } from './notifications/notification-item.js';\r\nimport NotificationsIcon from '../../assets/images/notifications_white_24dp.svg';\r\nimport InfoIcon from '../../assets/images/info-white-24dp.svg';\r\nimport './notifications.css';\r\n\r\n/**\r\n * @typedef {Object} NotificationsMenuButtonData\r\n * @property {string} [id]\r\n * @property {string} text The text to display.\r\n * @property {string} [description] Descriptive text for the notification.\r\n * @property {function} callback\r\n */\r\n\r\nconst _menuButton = new WeakMap();\r\nconst _notificationContainer = new WeakMap();\r\nlet localize;\r\n\r\n/**\r\n * The Notifications module.\r\n * @member {NotificationsPlugin} notifications\r\n * @memberof MediasitePlayer#\r\n */\r\n\r\n/**\r\n * Enables displaying custom notifications in the player.\r\n * @hideconstructor\r\n * @extends {external:\"videojs.Plugin\"}\r\n **/\r\nclass NotificationsPlugin extends videojs.getPlugin('plugin') {\r\n constructor(player, options) {\r\n localize = player.localize?.bind(player);\r\n super(player, options);\r\n\r\n // Create controlbar button + menu\r\n const menuButton = new OverflowMenuButton(player, {\r\n name: 'NotificationsMenuButton',\r\n icon: NotificationsIcon\r\n });\r\n menuButton.addClass('mediasite-player__controlbar-notifications-button');\r\n menuButton.controlText(localize('Notifications'));\r\n _menuButton.set(this, menuButton);\r\n\r\n const Component = videojs.getComponent('Component');\r\n const notificationContainer = new Component(player);\r\n notificationContainer.el().setAttribute('role', 'list');\r\n notificationContainer.addClass('mediasite-player__notifications-container');\r\n _notificationContainer.set(this, notificationContainer);\r\n\r\n player.ready(() => {\r\n const overflowButtonIndex = player.getChild('ControlBar').children().indexOf(\r\n player.getDescendant('ControlBar', 'OverflowMenuButton')\r\n );\r\n player.getChild('ControlBar').addChild(menuButton, null, overflowButtonIndex);\r\n player.layout().addChild(notificationContainer);\r\n });\r\n }\r\n\r\n /**\r\n * Adds a notification to the notification queue and shows it.\r\n * @param {string} title\r\n * @param {Object} options\r\n * @param {function({ type: 'invoke'|'dismiss' })} [options.callback]\r\n * @param {string} [options.description] Descriptive text to show on a second line.\r\n * @param {string} [options.icon] URL-encoded image to use as the icon for this notification.\r\n * @param {number} [options.timeout] How long to display the notification, in milliseconds. May be Infinity. Defaults to 5000ms.\r\n * @param {string} [options.id] An optional ID for the notification in case you want to remove it later. Defaults to an automatically generated unique ID.\r\n * @returns {string} The ID of the notification.\r\n * @example\r\n * const notificationId = player.notifications().add('This is a notification', {\r\n * timeout: Infinity,\r\n * description: 'Some extra text'\r\n * });\r\n */\r\n add(title, options = {}) {\r\n if (typeof options === 'function') {\r\n options = {\r\n callback: options\r\n }\r\n }\r\n\r\n const { callback = () => { }, description, icon = InfoIcon, timeout } = options;\r\n\r\n const notificationId = _menuButton.get(this).addMenuItem(title, {\r\n callback: (...args) => {\r\n const [ event ] = args;\r\n this.remove(notificationId);\r\n if (event.type === 'invoke') {\r\n return callback(...args);\r\n }\r\n },\r\n dismissable: true,\r\n icon\r\n });\r\n\r\n const notificationContainer = _notificationContainer.get(this);\r\n const notificationItem = new NotificationItem(this.player, {\r\n title,\r\n id: notificationId,\r\n description: description,\r\n timeout: timeout,\r\n icon: icon\r\n });\r\n notificationContainer.addChild(notificationItem);\r\n\r\n const existingChildren = notificationContainer.children();\r\n const itemIndex = existingChildren.indexOf(notificationItem);\r\n for (let i = 0; i < itemIndex; i++) {\r\n existingChildren[i].animateUp();\r\n }\r\n\r\n notificationItem.one(['dismiss', 'timeout'], () => this.removeDisplayItem(notificationId));\r\n notificationItem.one('callback', () => {\r\n this.remove(notificationId)\r\n setTimeout(() => {\r\n callback();\r\n }, 0);\r\n });\r\n\r\n this.log(title, \"notification added.\")\r\n\r\n return notificationId;\r\n }\r\n\r\n /**\r\n * Removes the notification with the given ID.\r\n * @param {string} id\r\n * @example\r\n * player.notifications.remove('notificationId');\r\n */\r\n remove(id) {\r\n setTimeout(() => {\r\n _menuButton.get(this).removeMenuItem(id);\r\n }, 0);\r\n this.removeDisplayItem(id);\r\n }\r\n\r\n /**\r\n * Removes the banner associated with the notification with the given ID, but does not remove it from the controlbar menu.\r\n * @param {string} id\r\n * @example\r\n * player.notifications.removeDisplayItem('notificationId');\r\n */\r\n removeDisplayItem(id) {\r\n const notificationContainer = _notificationContainer.get(this);\r\n const notificationItem = notificationContainer.children().find(child => child.id() === id);\r\n \r\n if (notificationItem) {\r\n const existingChildren = notificationContainer.children();\r\n const itemIndex = existingChildren.indexOf(notificationItem);\r\n for (let i = 0; i < itemIndex; i++) {\r\n existingChildren[i].animateDown();\r\n }\r\n\r\n notificationItem.animateOut().then(() => {\r\n notificationContainer.removeChild(notificationItem);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Returns a boolean based upon if the provided id is actually being displayed as a notification\r\n * @param {string} id\r\n */\r\n hasDisplayItem(id) {\r\n return _menuButton.get(this).hasItem(id);\r\n }\r\n\r\n setupMuteNotification() {\r\n this.player.one('loadeddata', () => {\r\n const notificationId = this.add(localize('Video is muted'), {\r\n description: localize('Click here to unmute'),\r\n callback: () => this.player.muted(false),\r\n timeout: Infinity\r\n });\r\n this.player.one('volumechange', () => {\r\n this.remove(notificationId);\r\n });\r\n });\r\n }\r\n\r\n dispose() {\r\n const menuButton = _menuButton.get(this);\r\n menuButton.dispose();\r\n\r\n const controlbar = this.player.getChild('ControlBar');\r\n controlbar.removeChild(menuButton);\r\n\r\n this.player.layout().removeChild(_notificationContainer.get(this));\r\n\r\n super.dispose();\r\n }\r\n}\r\n\r\nexport default NotificationsPlugin;\r\n","import videojs from 'video.js';\r\n\r\nlet localize;\r\n\r\nexport default class PlaycoverPlayButton extends videojs.getComponent('Button') {\r\n /**\r\n * \r\n * @param {videojs.Player} player\r\n */\r\n constructor(player, options) {\r\n localize = player.localize?.bind(player);\r\n super(player, options);\r\n\r\n player.ready(() => {\r\n const playIconWrapper = document.createElement('div');\r\n videojs.dom.addClass(playIconWrapper, 'mediasite-player__play-cover-play-icon-wrapper');\r\n playIconWrapper.setAttribute('aria-label', localize('Play Video'));\r\n this.el().appendChild(playIconWrapper);\r\n this.controlText(localize('Play Video'));\r\n });\r\n }\r\n\r\n createEl(tag, props = {}, attributes = {}) {\r\n tag = 'div';\r\n props = Object.assign({\r\n className: 'mediasite-player__playcover-play-button'\r\n });\r\n\r\n attributes = Object.assign({\r\n alt: localize('Play Video')\r\n });\r\n\r\n return super.createEl.call(this, tag, props, attributes);\r\n }\r\n}","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js!./playcover.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import videojs from 'video.js';\r\n\r\nexport default class PlaycoverContentWrapper extends videojs.getComponent('Component') {\r\n /**\r\n * \r\n * @param {videojs.Player} player\r\n */\r\n constructor(player, options) {\r\n super(player, options);\r\n }\r\n\r\n createEl(tag, props = {}, attributes = {}) {\r\n tag = 'div';\r\n props = Object.assign({\r\n className: 'mediasite-player__playcover-content-wrapper'\r\n });\r\n\r\n return super.createEl.call(this, tag, props, attributes);\r\n }\r\n}","import videojs from 'video.js';\r\n\r\nimport './playcover.css';\r\nimport PlaycoverPlayButton from '../bundled/playcover/playcover-play-button.js'\r\nimport PlaycoverContentWrapper from '../bundled/playcover/playcover-content-wrapper.js'\r\n\r\nconst _poster = new WeakMap();\r\nconst _playButton = new WeakMap();\r\nconst _title = new WeakMap();\r\n\r\n/**\r\n * The Playcover module.\r\n * @member {PlaycoverPlugin} playcover\r\n * @memberof MediasitePlayer#\r\n */\r\n\r\n/**\r\n * Provides configuration options for the play button and poster image that display before media has been loaded.\r\n * @hideconstructor\r\n * @extends {external:\"videojs.Plugin\"}\r\n **/\r\nclass PlaycoverPlugin extends videojs.getPlugin('plugin') {\r\n /**\r\n * \r\n * @param {videojs.Player} player\r\n * @param {Object} [options]\r\n */\r\n constructor(player, options) {\r\n super(player, options);\r\n\r\n player.ready(() => {\r\n const playcoverContentWrapper = new PlaycoverContentWrapper(player, { name: 'PlaycoverContentWrapper' });\r\n const playButton = new PlaycoverPlayButton(player, { name: 'PlaycoverPlayButton' });\r\n playcoverContentWrapper.addChild(playButton);\r\n\r\n const title = videojs.dom.createEl('h1', {\r\n className: 'mediasite-player__title-overlay',\r\n id: 'mediasite-player-title-overlay'\r\n });\r\n\r\n const poster = player.getChild('PosterImage');\r\n poster.addClass('mediasite-player__play-cover');\r\n poster.addClass('mediasite-player__play-cover--preloading');\r\n poster.addChild(playcoverContentWrapper);\r\n poster.el().appendChild(title);\r\n\r\n _poster.set(this, poster);\r\n _playButton.set(this, playButton);\r\n _title.set(this, title);\r\n\r\n player.one('playcoverloaded', () => {\r\n poster.removeClass('mediasite-player__play-cover--preloading');\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Sets the play cover custom content.\r\n * Passing null, undefined, '', or anything other than a videojs component, \r\n * removes any existing custom content without replacing\r\n * @param {videojs.Component} vjsComponent\r\n * @example\r\n * player.playcover.addComponent(someCustomVideoJsComponent);\r\n */\r\n setPlaycoverCustomContent(vjsComponent, index) {\r\n const playcoverContentWrapper = this.player.getChild('PosterImage').getChild('PlaycoverContentWrapper');\r\n const children = playcoverContentWrapper.children();\r\n const playButton = _playButton.get(this);\r\n for (const child of children) {\r\n if (child !== playButton) {\r\n playcoverContentWrapper.removeChild(child);\r\n }\r\n }\r\n if (vjsComponent != null && vjsComponent !== '') {\r\n try {\r\n vjsComponent.addClass('mediasite-player__playcover-custom-content')\r\n playcoverContentWrapper.addChild(vjsComponent, null, index);\r\n } catch (e) {\r\n this.log(e)\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Adds the given component to the play cover.\r\n * @param {videojs.Component} vjsComponent \r\n * @example\r\n * player.playcover.addComponent(someCustomVideoJsComponent);\r\n */\r\n addComponent(vjsComponent, index) {\r\n const poster = this.player.getChild('PosterImage');\r\n poster.addChild(vjsComponent, null, index);\r\n }\r\n\r\n /**\r\n * Removes the given component from the play cover if it exists.\r\n * @param {videojs.Component} vjsComponent \r\n * @example\r\n * player.playcover.removeComponent(someCustomVideoJsComponent);\r\n */\r\n removeComponent(vjsComponent) {\r\n const poster = this.player.getChild('PosterImage');\r\n poster.removeChild(vjsComponent);\r\n }\r\n\r\n /**\r\n * Removes any custom components that have been added to the play cover.\r\n * @example\r\n * player.playcover.removeAllComponents();\r\n */\r\n removeAllComponents() {\r\n const poster = this.player.getChild('PosterImage');\r\n const playcoverContentWrapper = poster.getChild('PlaycoverContentWrapper');\r\n const children = poster.children();\r\n const title = _title.get(this);\r\n for (const child of children) {\r\n if (child !== title && child !== playcoverContentWrapper) {\r\n poster.removeChild(child);\r\n }\r\n }\r\n this.setPlaycoverCustomContent(null);\r\n }\r\n\r\n /**\r\n * A boolean indicating whether or not to show a play button.\r\n * @type {boolean}\r\n * @example\r\n * player.playcover.showPlayButton = true;\r\n */\r\n set showPlayButton(showPlayButton) {\r\n this.player.ready(() => {\r\n const bigPlayButton = _playButton.get(this);\r\n if (showPlayButton) {\r\n bigPlayButton.removeClass('vjs-hidden');\r\n }\r\n else {\r\n bigPlayButton.addClass('vjs-hidden');\r\n }\r\n });\r\n }\r\n\r\n get showPlayButton() {\r\n return !_playButton.get(this).hasClass('vjs-hidden');\r\n }\r\n\r\n /**\r\n * A boolean indicating whether or not the play cover is clickable.\r\n * @type {boolean}\r\n * @example\r\n * player.playcover.clickable = true;\r\n */\r\n set clickable(clickable) {\r\n this.#canClick = clickable;\r\n\r\n const bigPlayButton = _playButton.get(this);\r\n const poster = _poster.get(this);\r\n\r\n this.off(bigPlayButton, ['tap', 'click'], this.#handlePlayCoverClick);\r\n this.off(poster, ['tap', 'click'], this.#handlePlayCoverClick);\r\n poster.addClass('not-clickable');\r\n\r\n if (clickable) {\r\n this.on(bigPlayButton, ['tap', 'click'], this.#handlePlayCoverClick);\r\n this.on(poster, ['tap', 'click'], this.#handlePlayCoverClick);\r\n poster.removeClass('not-clickable');\r\n }\r\n }\r\n\r\n get clickable() {\r\n return this.#canClick;\r\n }\r\n\r\n /**\r\n * Sets the title text that is displayed on the play cover.

    Note: this property gets automatically populated whenever {@link MetadataPlugin#title} is set.\r\n * @type {string}\r\n * @example\r\n * player.playcover.title = 'Title to be shown on the play cover';\r\n */\r\n set title(title) {\r\n this.player.ready(() => {\r\n _title.get(this).textContent = title;\r\n });\r\n }\r\n get title() {\r\n return _title.get(this).textContent;\r\n }\r\n\r\n /**\r\n * A boolean configuring whether or not the presentation title should be visible on the play cover.\r\n * @type {boolean}\r\n * @example\r\n * player.playcover.showTitle = true;\r\n */\r\n set showTitle(showTitle) {\r\n this.player.ready(() => {\r\n const title = _title.get(this);\r\n if (showTitle) {\r\n title.classList.remove('vjs-hidden');\r\n }\r\n else {\r\n title.classList.add('vjs-hidden');\r\n }\r\n });\r\n }\r\n get showTitle() {\r\n return !_title.get(this).classList.contains('vjs-hidden');\r\n }\r\n\r\n /**\r\n * A boolean indicating whether or not the play cover should be visible.\r\n * @type {boolean}\r\n * @example\r\n * player.playcover.visible = true;\r\n */\r\n set visible(visible) {\r\n this.player.ready(() => {\r\n const poster = _poster.get(this);\r\n\r\n if (visible) {\r\n poster.removeClass('vjs-hidden');\r\n this.clickable = this.clickable;\r\n }\r\n else {\r\n poster.addClass('vjs-hidden');\r\n this.player.addClass('vjs-has-started');\r\n this.clickable = false;\r\n }\r\n });\r\n }\r\n\r\n get visible() {\r\n const poster = _poster.get(this);\r\n return poster ? !poster.hasClass('vjs-hidden') : false;\r\n }\r\n\r\n /**\r\n * A boolean indicating whether or not the play cover should dim the poster image.\r\n * @type {boolean}\r\n * @example\r\n * player.playcover.dimmed = true;\r\n */\r\n set dimmed(dimmed) {\r\n this.player.ready(() => {\r\n const poster = _poster.get(this);\r\n if (dimmed) {\r\n poster.addClass('mediasite-player__play-cover--dimmed');\r\n }\r\n else {\r\n poster.removeClass('mediasite-player__play-cover--dimmed');\r\n }\r\n });\r\n }\r\n\r\n get dimmed() {\r\n return _poster.get(this).hasClass('mediasite-player__play-cover--dimmed');\r\n }\r\n\r\n #handlePlayCoverClick(event) {\r\n\r\n //Jump out if click was on an anchor tag in the play cover button\r\n if (event.target && event.target.tagName.toLowerCase() === 'a') return;\r\n if (event.target && event.target.id.toLowerCase() === 'reset-answers') return;\r\n\r\n this.player.loader().loadPresentation().then(() => this.visible = false);\r\n this.player.play();\r\n this.player.trigger('playcoverclick');\r\n }\r\n\r\n #canClick = true;\r\n\r\n dispose() {\r\n this.removeAllComponents();\r\n super.dispose();\r\n }\r\n}\r\n\r\nexport default PlaycoverPlugin;\r\n","import videojs from 'video.js';\r\n\r\nimport PollIcon from '../../assets/images/poll-white-24dp.svg';\r\nimport { isPresentationId } from '../../util';\r\n\r\nconst _enabled = new WeakMap();\r\nconst _url = new WeakMap();\r\nconst _popup = new WeakMap();\r\nlet localize;\r\n\r\n/**\r\n * The Polls module.\r\n * @member {PollsPlugin} polls\r\n * @memberof MediasitePlayer#\r\n */\r\n\r\n/**\r\n * Configures the Polls button in the control bar menu.

    \r\n * Note: the Polls button will only be displayed in the control bar menu if {@link PollsPlugin#enabled} is set to true, and {@link PollsPlugin#url} has been set to a non-empty string.\r\n * @hideconstructor\r\n * @extends {external:\"videojs.Plugin\"}\r\n **/\r\nclass PollsPlugin extends videojs.getPlugin('plugin') {\r\n constructor(player, options) {\r\n localize = player.localize?.bind(player);\r\n super(player, options);\r\n _enabled.set(this, false);\r\n\r\n player.ready(() => {\r\n player.controlbarMenu().addMenuItem(localize('Show Polls'), { id: this.name, icon: PollIcon, callback: () => this.#handleClick() });\r\n });\r\n }\r\n\r\n #handleClick() {\r\n this.open();\r\n }\r\n\r\n /**\r\n * The path to the polling webpage.\r\n * @type {string}\r\n * @example\r\n * player.polls.url = 'https://mediasite.com';\r\n */\r\n get url() {\r\n return _url.get(this);\r\n }\r\n\r\n set url (url) {\r\n _url.set(this, url);\r\n this.#updateVisibility();\r\n }\r\n\r\n /**\r\n * A boolean indicating whether or not the Polls feature is enabled.\r\n * @type {boolean}\r\n * @example\r\n * player.polls.enabled = true;\r\n */\r\n get enabled() {\r\n return _enabled.get(this);\r\n }\r\n\r\n set enabled(enabled) {\r\n _enabled.set(this, enabled);\r\n this.#updateVisibility();\r\n }\r\n\r\n #updateVisibility() {\r\n if (_enabled.get(this) && _url.get(this)) {\r\n this.player.controlbarMenu().enableMenuItem(this.name);\r\n }\r\n else {\r\n this.player.controlbarMenu().disableMenuItem(this.name);\r\n }\r\n }\r\n\r\n /**\r\n * Opens the configured polling URL in a new popup window.\r\n * @example\r\n * player.polls.open();\r\n */\r\n open() {\r\n if (!this.enabled) {\r\n return;\r\n }\r\n // Opens the popout window\r\n // Todo: handle original playFrom and duration query string params, if present\r\n\r\n // Note: we can only do this if we know the presentation ID.\r\n if (isPresentationId(this.player.loader().presentationId)) {\r\n const popup = window.open(_url.get(this), 'polls',\r\n `width=800,height=600,scrollbars=yes,resizable=yes`\r\n );\r\n popup.focus();\r\n _popup.set(this, popup);\r\n }\r\n }\r\n\r\n /**\r\n * Closes the popup window if it is currently open.\r\n * @example\r\n * player.polls.close();\r\n */\r\n close() {\r\n _popup.get(this)?.close?.();\r\n }\r\n\r\n /**\r\n * A boolean indicating whether or not the popup window is currently open.\r\n * @type {boolean}\r\n * @example\r\n * const isPollModalOpen = player.polls.isOpen();\r\n */\r\n get isOpen() {\r\n const popup = _popup.get(this);\r\n return !(!popup || (popup?.closed));\r\n }\r\n\r\n dispose() {\r\n if (this.player?.usingPlugin('controlbarMenu')) {\r\n this.player.controlbarMenu().removeMenuItem(this.name);\r\n }\r\n \r\n super.dispose();\r\n }\r\n}\r\n\r\nexport default PollsPlugin;\r\n","import videojs from 'video.js';\r\n\r\nimport { getFullscreenToggleIndex, isPresentationId } from '../../util';\r\nimport { Path } from '../../api/config.js';\r\n\r\nimport OpenInNewIcon from '../../assets/images/open_in_new-white-24dp.svg';\r\n\r\nconst _menuButton = new WeakMap();\r\nconst _popup = new WeakMap();\r\nconst _message = new WeakMap();\r\nlet localize;\r\n\r\n/**\r\n * Returns a reference to the Popout module.\r\n * @function popout\r\n * @returns {PopoutPlugin}\r\n * @memberof MediasitePlayer#\r\n */\r\n\r\n/**\r\n * Configures the Popout feature.

    \r\n * Note: Popout functionality can only be enabled if the current player instance is running at a URL other than the default player page, or is currently embedded in an <iframe>. Setting {@link PopoutPlugin#enabled} will have no effect unless at least one of these conditions is true.\r\n * @hideconstructor\r\n * @extends {external:\"videojs.Plugin\"}\r\n **/\r\nclass PopoutPlugin extends videojs.getPlugin('plugin') {\r\n constructor(player, options) {\r\n localize = player.localize?.bind(player);\r\n super(player, options);\r\n\r\n // Add a MenuButton to the ControlBar\r\n const MenuButton = videojs.getComponent('MenuButton');\r\n const button = new MenuButton(player, { name: 'PopoutMenuButton' });\r\n button.addClass('mediasite-player__custom-controlbar-button');\r\n button.addClass('vjs-popout-button');\r\n button.controlText(localize('Pop Out'));\r\n button.el().style.setProperty('--custom-controlbar-icon', `url(\"${OpenInNewIcon}\")`);\r\n\r\n this.on(button, ['click', 'touchstart'], this.open);\r\n\r\n _menuButton.set(this, button);\r\n\r\n player.ready(() => {\r\n player.getChild('ControlBar').addChild(button, null, getFullscreenToggleIndex(player) - 1);\r\n player.collapsedButtons?.push({\r\n pluginName: this.name,\r\n label: localize('Pop Out'),\r\n buttonName: 'PopoutMenuButton',\r\n class: 'vjs-popout-button',\r\n iconUrl: OpenInNewIcon\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * A boolean indicating whether or not the Popout feature is enabled.\r\n * @type {boolean}\r\n * @example\r\n * player.popout.enabled = true;\r\n */\r\n get enabled() {\r\n return !_menuButton.get(this).hasClass('vjs-hidden');\r\n }\r\n\r\n set enabled(enabled) {\r\n // Only allow enabling the popout feature if we're embedded or not running on the main player page.\r\n const menuButton = _menuButton.get(this);\r\n const inIFrame = window.parent !== window;\r\n const onPlayerPage = location.pathname.startsWith(Path.ApplicationRoot);\r\n if (enabled && (inIFrame || !onPlayerPage)) {\r\n menuButton.removeClass('vjs-hidden');\r\n }\r\n else {\r\n menuButton.addClass('vjs-hidden');\r\n _popup.get(this)?.close?.();\r\n }\r\n }\r\n\r\n /**\r\n * Pauses playback and opens the presentation in a new window on the main player page.\r\n * @example\r\n * player.popout.open();\r\n */\r\n open() {\r\n this.player.pause();\r\n\r\n // Note: we can only do this if we know the presentation ID.\r\n const id = this.player.loader()?.presentationId;\r\n if (isPresentationId(id)) {\r\n const playFrom = Math.floor(this.player.currentTime() * 1000); // playFrom param expects ms\r\n // If embedded in channel we pass collection id for channel registration authentication\r\n const channelId = window?.SiteData?.CollectionId;\r\n const playLink = channelId ? `${Path.ApplicationRoot}/${id}?playFrom=${playFrom}&popout=true&Collection=${channelId}` : `${Path.ApplicationRoot}/${id}?playFrom=${playFrom}&popout=true`;\r\n const windowName = this.player.loader()?.presentationId ?? 'playerpreview';\r\n const windowOptions = `width=800,height=600,scrollbars=yes,resizable=yes`;\r\n\r\n const popup = window.open(playLink, windowName, windowOptions);\r\n\r\n popup.focus();\r\n popup.addEventListener('unload', () => this.#handlePopupClose());\r\n _popup.set(this, popup);\r\n\r\n const popoutModalMessage = this.player.showMessage(localize('Opened presentation in a new window.'));\r\n _message.set(this, popoutModalMessage);\r\n }\r\n }\r\n\r\n /**\r\n * Closes the popout window if it is currently open.\r\n * @example\r\n * player.popout.close();\r\n */\r\n close() {\r\n _popup.get(this)?.close?.();\r\n }\r\n\r\n /**\r\n * A boolean indicating whether or not the popout window is currently open.

    Note: this does NOT indicate if this player instance itself is displaying as a popout; rather, it indicates whether or not a child window (the \"popout\" player) is present.\r\n * @type {boolean}\r\n * @example\r\n * const isPopoutOpen = player.popout.isOpen();\r\n */\r\n get isOpen() {\r\n const popup = _popup.get(this);\r\n return !(!popup || (popup?.closed));\r\n }\r\n\r\n #handlePopupClose() {\r\n const popup = _popup.get(this);\r\n setTimeout(() => {\r\n if (popup.closed) {\r\n _popup.set(this, null);\r\n\r\n const popoutModalMessage = _message.get(this);\r\n if (popoutModalMessage) {\r\n popoutModalMessage.close();\r\n _message.set(this);\r\n }\r\n }\r\n }, 0);\r\n }\r\n\r\n dispose() {\r\n const menuButton = _menuButton.get(this);\r\n\r\n menuButton?.dispose();\r\n this.player.getChild('ControlBar')?.removeChild(menuButton);\r\n\r\n if (this.isOpen) {\r\n this.close();\r\n }\r\n\r\n super.dispose();\r\n }\r\n}\r\n\r\nexport default PopoutPlugin;\r\n","/**\r\n * Dynamically loads an external JavaScript file containing one or more custom plugins.

    \r\n * You must wrap your plugin in a function that accepts one argument, videojs, and returns a reference to your actual plugin implementation. A reference to the same Video.js instance used by this MediasitePlayer instance will be passed to the wrapper function, and the wrapper function must return a reference to a valid Video.js plugin function or class.

    \r\n * Please see the examples below for how to correctly structure a plugin file.\r\n * @memberof MediasitePlayer#\r\n * @param {string} url The path to a JavaScript module which exposes one or more plugin wrapper functions as named exports. The name of each export found in the module will be used as the name of the plugin when registering it with the player.\r\n * @see {@link https://developer.mozilla.org/en-US/docs/web/javascript/reference/statements/export}\r\n * @returns {Promise>} A Promise that is resolved with an array containing the names of the plugins that have been registered.\r\n * \r\n * @example JavaScript file containing a Video.js basic plugin:\r\n * export function myPluginName(videojs) {\r\n * return function() {\r\n * // A Video.js \"basic plugin\" implementation.\r\n * }\r\n * }\r\n * \r\n * @example JavaScript file containing a Video.js advanced plugin:\r\n * export function myPluginName(videojs) {\r\n * return class extends videojs.getPlugin('plugin') {\r\n * // A Video.js \"advanced plugin\" implementation.\r\n * }\r\n * }\r\n * \r\n * @example Loading an external Video.js plugin into an instance of MediasitePlayer:\r\n * const myPlayer = new MediasitePlayer(videoElement);\r\n * myPlayer.registerExternalPlugin('/path/to/plugin.js').then(() => {\r\n * // Plugin is now ready for use.\r\n * myPlayer.plugins.myPluginName();\r\n * });\r\n * \r\n * @example Loading an external Video.js plugin into an instance of MediasitePlayer with {@link https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Async_await|async/await} syntax:\r\n * const myPlayer = new MediasitePlayer(videoElement);\r\n * await myPlayer.registerExternalPlugin('/path/to/plugin.js');\r\n * \r\n * // Plugin is now ready for use.\r\n * myPlayer.plugins.myPluginName();\r\n */\r\nfunction registerExternalPlugin(url) {\r\n if (typeof url === 'string') {\r\n this.log(`Attempting to load external Video.js plugin(s) from URL: ${url}`);\r\n return import(/* webpackIgnore: true */ url).then(module => {\r\n const moduleEntries = Object.entries(module);\r\n const filteredEntries = moduleEntries.filter(([pluginName]) => pluginName !== 'default');\r\n \r\n if (moduleEntries.length !== filteredEntries.length) {\r\n console.warn('Ignored default export in external plugin script. Please use named exports for your plugins: https://developer.mozilla.org/en-US/docs/web/javascript/reference/statements/export');\r\n }\r\n \r\n if (filteredEntries.length > 0) {\r\n this.log(`Registering ${filteredEntries.length} external plugin${filteredEntries.length > 1 ? 's' : ''}...`);\r\n for (const [pluginName, pluginWrapper] of filteredEntries) {\r\n const pluginFn = pluginWrapper(videojs);\r\n this.registerPlugin(pluginName, pluginFn);\r\n }\r\n }\r\n else {\r\n this.log.error('External plugin script did not contain any named exports. No plugins have been registered.');\r\n }\r\n\r\n return filteredEntries.map(entry => entry[0]);\r\n }).catch(error => {\r\n this.log.error('Failed to load external plugin(s).');\r\n throw error;\r\n });\r\n }\r\n else {\r\n return Promise.resolve([]);\r\n }\r\n}\r\n\r\nexport default registerExternalPlugin;\r\n","import videojs from 'video.js';\r\n\r\nconst Plugin = videojs.getPlugin('plugin');\r\n\r\n/**\r\n* Registers a Video.js plugin with the player to extend its functionality.\r\n* @memberof MediasitePlayer#\r\n* @param {string} name The name of the plugin to load. The plugin will be made available on this player instance as a property with the given key.\r\n* @param {function} fn A function containing the plugin implementation.\r\n* @example\r\n* player.registerPlugin('myPlugin', function () { console.log('Called the plugin function.') });\r\n* player.plugins.myPlugin();\r\n*/\r\nfunction registerPlugin(name, fn) {\r\n if (name && fn) {\r\n if (!videojs.getPlugin(name)) {\r\n videojs.registerPlugin(name, fn);\r\n }\r\n\r\n this.trigger('registercustomplugin', { name, isBasic: Plugin.isBasic(fn) });\r\n this.log(`Registered Video.js plugin: ${name}`);\r\n }\r\n}\r\n\r\nexport default registerPlugin;\r\n","import videojs from 'video.js';\r\n\r\nconst ErrorNames = {\r\n timeAnomaly: 'Time Anomaly'\r\n}\r\n\r\nconst _lastPositionChange = new WeakMap();\r\nconst _firstPositionChangeOfSegment = new WeakMap();\r\nconst _tolerance = new WeakMap();\r\nconst _playbackRate = new WeakMap();\r\n\r\nexport default class ReportingPlayDetector extends videojs.getPlugin('plugin') {\r\n constructor(player, options) {\r\n super(player, options);\r\n\r\n this.lastPositionChange = null;\r\n this.firstPositionChangeOfSegment = null;\r\n\r\n this.tolerance = 0.5; // The amount above/below the expected position that is still considered a hit.\r\n this.playbackRate = 1.0;\r\n }\r\n\r\n set firstPositionChangeOfSegment(change) {\r\n _firstPositionChangeOfSegment.set(this, change);\r\n }\r\n\r\n get firstPositionChangeOfSegment() {\r\n return _firstPositionChangeOfSegment.get(this);\r\n }\r\n\r\n set lastPositionChange(change) {\r\n _lastPositionChange.set(this, change);\r\n }\r\n\r\n get lastPositionChange() {\r\n return _lastPositionChange.get(this);\r\n }\r\n\r\n set tolerance(tolerance) {\r\n _tolerance.set(this, tolerance);\r\n }\r\n\r\n get tolerance() {\r\n return _tolerance.get(this);\r\n }\r\n\r\n set playbackRate(rate) {\r\n _playbackRate.set(this, rate);\r\n }\r\n\r\n get playbackRate() {\r\n return _playbackRate.get(this);\r\n }\r\n\r\n // True eventing is overkill. We just need a single function to call when each \"event\" occurs.\r\n segmentStartAction(startPosition) {};\r\n segmentEndAction(startPosition, endPosition, isImportant) {};\r\n\r\n handlePlaybackRateChange(rate) {\r\n this.playbackRate = rate;\r\n\r\n // TODO: Attempt minimize segment end actions caused by changes in playback rate.\r\n };\r\n\r\n handlePositionChange(position) {\r\n let playing;\r\n const clockTimeInSeconds = this.getCurrentTime() / 1000;\r\n const positionChange = { time: clockTimeInSeconds, position: position };\r\n\r\n if (this.lastPositionChange) {\r\n try {\r\n playing = this.isProbablyPlaying(this.lastPositionChange.time, this.lastPositionChange.position, positionChange.time, positionChange.position, this.playbackRate, this.tolerance);\r\n } catch (err) {\r\n if (err.name = ErrorNames.timeAnomaly) {\r\n // Times should always be increasing.\r\n // However, there are some conditions that can cause JavaScript to report a \r\n // time value that is earlier than the previous one. For example, the client \r\n // computer's time may have been updated via NTP.\r\n\r\n this.log('Times provided by timeProvider were out of order.');\r\n }\r\n\r\n // We certainly can't say that we're playing. Bite the bullet and end the\r\n // current segment so we can start fresh with a new segment.\r\n playing = false;\r\n }\r\n\r\n if (playing) {\r\n\r\n if (!this.firstPositionChangeOfSegment) {\r\n this.startSegment();\r\n }\r\n\r\n } else { // Seek or something. Does not look to be \"just playing along\".\r\n this.endSegment();\r\n }\r\n }\r\n\r\n this.lastPositionChange = positionChange;\r\n };\r\n\r\n getCurrentTime() {\r\n const useModernMode = (window.performance && typeof window.performance.now === 'function');\r\n if (useModernMode) {\r\n return window.performance.now();\r\n } else {\r\n return new Date().getTime();\r\n }\r\n };\r\n\r\n endSegment(isImportantNotification) {\r\n isImportantNotification = isImportantNotification || false;\r\n\r\n if (this.firstPositionChangeOfSegment && this.lastPositionChange) {\r\n // Notify segment was played!\r\n this.segmentEndAction(this.firstPositionChangeOfSegment.position, this.lastPositionChange.position, isImportantNotification);\r\n }\r\n\r\n // Clear segment start.\r\n // This will result in the start of a new segment with the next qualifying position changes.\r\n this.firstPositionChangeOfSegment = null;\r\n };\r\n\r\n\r\n startSegment() {\r\n // Set segment start if empty.\r\n this.firstPositionChangeOfSegment = this.lastPositionChange;\r\n\r\n // Report segment start!\r\n this.segmentStartAction(this.firstPositionChangeOfSegment.position);\r\n }\r\n\r\n isProbablyPlaying(time1, position1, time2, position2, playbackRate, toleranceFactor) {\r\n let deltaTime, deltaPosition, expectedPositionChange;\r\n const enforceNonNegativeNumber = function (val) {\r\n if (typeof val !== 'number') {\r\n val = 0;\r\n }\r\n\r\n return Math.max(0, val);\r\n };\r\n\r\n time1 = enforceNonNegativeNumber(time1);\r\n position1 = enforceNonNegativeNumber(position1);\r\n time2 = enforceNonNegativeNumber(time2);\r\n position2 = enforceNonNegativeNumber(position2);\r\n playbackRate = enforceNonNegativeNumber(playbackRate);\r\n toleranceFactor = enforceNonNegativeNumber(toleranceFactor);\r\n\r\n if (time1 > time2) {\r\n // Non-increasing clock times represent a programming error so we throw!\r\n throw { name: 'Argument Error', message: 'time2 must be greater than time1.' };\r\n }\r\n\r\n if (position1 > position2) {\r\n // Non-increasing positions indicate a seek or perhaps a pause.\r\n return false;\r\n }\r\n\r\n deltaTime = time2 - time1;\r\n deltaPosition = position2 - position1;\r\n\r\n expectedPositionChange = deltaTime * playbackRate;\r\n\r\n return Math.abs(expectedPositionChange - deltaPosition) <= (expectedPositionChange * toleranceFactor);\r\n };\r\n}\r\n","import videojs from 'video.js';\r\n\r\nconst _segments = new WeakMap();\r\n\r\nclass ReportingTimelineSegments extends videojs.getPlugin('plugin') {\r\n /**\r\n *\r\n * @param {videojs.Player} player\r\n * @param {Object} options\r\n */\r\n constructor(player, options) {\r\n super(player, options);\r\n\r\n this.segments = [];\r\n }\r\n\r\n set segments(segments) {\r\n _segments.set(this, segments);\r\n }\r\n\r\n get segments() {\r\n return _segments.get(this);\r\n }\r\n\r\n addSegment(start, end) {\r\n const segmentsArray = this.segments;\r\n segmentsArray.push({ start, end });\r\n this.segments = segmentsArray;\r\n };\r\n\r\n getAllSegments() {\r\n const segments = this.segments;\r\n let result = [];\r\n let i;\r\n for (i = 0; i < segments.length; i += 1) {\r\n result.push(this.cloneSegment(segments[i]));\r\n }\r\n return result;\r\n };\r\n\r\n cloneSegment(segment) {\r\n const start = segment.start;\r\n const end = segment.end;\r\n return { start: start, end: end };\r\n }\r\n\r\n reset() {\r\n this.segments = [];\r\n };\r\n}\r\n\r\nexport default ReportingTimelineSegments","import videojs from 'video.js';\r\nimport { reportMediaView } from '../../api/player';\r\n\r\nimport ReportingPlayDetector from './reporting/reporting-play-detector.js'\r\nimport ReportingTimelineSegments from './reporting/reporting-timeline-segments.js'\r\n\r\nconst _segmentsMemory = new WeakMap();\r\nconst _playDetector = new WeakMap();\r\nconst _includeBookmark = new WeakMap();\r\n\r\nconst DETECTOR_TOLERANCE_FACTOR = 0.5;\r\nconst INACTIVITY_DELAY = 2 * 1000; // milliseconds\r\nconst HEARTBEAT_DELAY = 30 * 1000; // milliseconds\r\nconst SEGMENT_COMBINATION_TOLERANCE_SECONDS = 1;\r\nconst NO_BOOKMARK_ZONE_SIZE = 3; // seconds withing video duration in which we won't bookmark.\r\n\r\n/**\r\n * The Reporting module.\r\n * @member {ReportingPlugin} reporting\r\n * @memberof MediasitePlayer#\r\n */\r\n\r\n/**\r\n * Tracks the time ranges that have been played so far and periodically reports them back to the server.\r\n * @hideconstructor\r\n * @extends {external:\"videojs.Plugin\"}\r\n **/\r\nexport default class ReportingPlugin extends videojs.getPlugin('plugin') {\r\n /**\r\n *\r\n * @param {videojs.Player} player\r\n * @param {Object} [options]\r\n */\r\n constructor(player, options) {\r\n super(player, options);\r\n\r\n /**\r\n * A playback ticket used to identify the current presentation when reporting playback statistics back to the server.\r\n * @type {string}\r\n * @memberof MediasitePlayer.reporting\r\n */\r\n this.playbackTicket = options?.playbackTicket ?? '';\r\n\r\n this.isLive = this.player.usingPlugin('live');\r\n this.serviceReportMediaViewCalledCount = 0;\r\n const segmentsMemory = new ReportingTimelineSegments(player);\r\n\r\n this.segmentsMemory = segmentsMemory\r\n\r\n this.playDetector = new ReportingPlayDetector(player);\r\n this.playDetector.tolerance = DETECTOR_TOLERANCE_FACTOR;\r\n this.playDetector.segmentStartAction = this.handleSegmentStart.bind(this);\r\n this.playDetector.segmentEndAction = this.handleSegmentEnd.bind(this);\r\n }\r\n\r\n /**\r\n * Whether or not the current playback time should be included in the reporting data. Setting this to true makes it possible to resume playback at the same position the next time the presentation is loaded.\r\n * @type {boolean}\r\n * @example\r\n * player.reporting.includeBookmark = true;\r\n */\r\n get includeBookmark() {\r\n return _includeBookmark.get(this) ?? true;\r\n }\r\n\r\n set includeBookmark(includeBookmark) {\r\n _includeBookmark.set(this, includeBookmark);\r\n }\r\n\r\n set segmentsMemory(segments) {\r\n _segmentsMemory.set(this, segments);\r\n }\r\n\r\n get segmentsMemory() {\r\n return _segmentsMemory.get(this);\r\n }\r\n\r\n set playDetector(playDetector) {\r\n _playDetector.set(this, playDetector);\r\n }\r\n\r\n get playDetector() {\r\n return _playDetector.get(this);\r\n }\r\n\r\n scheduleHeartbeat() {\r\n this.player.clearTimeout(this.heartbeatTimeout);\r\n this.heartbeatTimeout = this.player.setTimeout(this.onHeartbeat.bind(this), HEARTBEAT_DELAY);\r\n }\r\n\r\n onHeartbeat() {\r\n try {\r\n\r\n // Cause a segment end so we can report it.\r\n this.playDetector.endSegment();\r\n\r\n this.reportSegmentsSinceLastReport();\r\n\r\n } catch (err) {\r\n this.log('Error in Playback Reporting onHeartbeat');\r\n }\r\n\r\n // See you again soon!\r\n this.scheduleHeartbeat();\r\n }\r\n\r\n reportSegmentsSinceLastReport(synchronous) {\r\n var segments = this.segmentsMemory.getAllSegments();\r\n this.segmentsMemory.reset();\r\n\r\n this.reportPlayed(segments, synchronous);\r\n }\r\n\r\n handleSegmentStart(startPosition) {\r\n this.player.clearTimeout(this.inactivityTimeout);\r\n }\r\n\r\n handleSegmentEnd(startPosition, endPosition, isImportant) {\r\n this.segmentsMemory.addSegment(startPosition, endPosition);\r\n this.player.clearTimeout(this.inactivityTimeout);\r\n }\r\n\r\n onPlaybackRateChanged() {\r\n const newPlaybackRate = this.player.playbackRate();\r\n this.playDetector.handlePlaybackRateChange(newPlaybackRate);\r\n }\r\n\r\n onPositionChanged() {\r\n const position = this.player.currentTime();\r\n this.player.clearTimeout(this.inactivityTimeout);\r\n // ... but assume playback stopped if we don't hear more soon\r\n this.inactivityTimeout = this.player.setTimeout(function () {\r\n this.playDetector.endSegment();\r\n }.bind(this), INACTIVITY_DELAY);\r\n\r\n this.playDetector.handlePositionChange(position); // playDetector works in milliseconds.\r\n };\r\n\r\n trackPresentation() {\r\n this.isLive = this.player.usingPlugin('live');\r\n\r\n this.on(this.player, 'timeupdate', this.onPositionChanged);\r\n\r\n this.on(this.player, 'ratechange', this.onPlaybackRateChanged);\r\n\r\n\r\n // When the session ends, make sure to report end!\r\n window.addEventListener('beforeunload', e => {\r\n this.playDetector.endSegment();\r\n this.reportSegmentsSinceLastReport(true);\r\n });\r\n\r\n this.scheduleHeartbeat();\r\n };\r\n\r\n reportToDataProvider(playbackTicketId) {\r\n if (!playbackTicketId) {\r\n this.log(\"Reporting cannot report to data provider: no playback ticket or data provider\");\r\n return;\r\n }\r\n this.playbackTicket = playbackTicketId;\r\n };\r\n\r\n reportPlayed(segments, synchronous) {\r\n let serviceSegments;\r\n let bookmarkPosition;\r\n\r\n if (!this.playbackTicket) {\r\n // Function was called before playbackTicketId and dataProvider were provided.\r\n return;\r\n }\r\n\r\n bookmarkPosition = this.calcBookmarkPosition(segments, this.isLive);\r\n serviceSegments = this.toServiceSegments(segments);\r\n\r\n if (serviceSegments.length < 1) {\r\n // There are no non-zero duration segments.\r\n return;\r\n }\r\n\r\n reportMediaView(this.playbackTicket, this.includeBookmark ? bookmarkPosition : 0, serviceSegments);\r\n\r\n if (this.includeBookmark) {\r\n const bookmarkStorage = this.player.bookmarkStorage();\r\n bookmarkStorage.save(bookmarkPosition);\r\n }\r\n\r\n this.serviceReportMediaViewCalledCount += 1;\r\n this.log('ReportMediaView ' + this.makeReportMediaViewDescription(serviceSegments, bookmarkPosition));\r\n this.log('ReportMediaView has been called ' + this.serviceReportMediaViewCalledCount + ' times.');\r\n }\r\n\r\n toServiceSegments(inputArray) {\r\n // Transforms an array of TimelineSegments into an array of segment \r\n // objects appropriate for data provider's ReportMediaView method. \r\n // \r\n // Positions in the output are expressed in integers.\r\n // Abutting segments are combined in the output.\r\n\r\n\r\n let i, seg, start, end, duration;\r\n let resultArray = [];\r\n\r\n const getLastItem = function () {\r\n if (resultArray.length < 1) {\r\n return null;\r\n }\r\n\r\n return resultArray[resultArray.length - 1];\r\n };\r\n\r\n const getLastEnd = function () {\r\n const lastItem = getLastItem();\r\n\r\n if (!lastItem) {\r\n return NaN;\r\n }\r\n\r\n return lastItem.StartTime + lastItem.Duration;\r\n };\r\n\r\n const extendLastItem = function (start, duration) {\r\n let lastItem, newEnd, newDuration;\r\n\r\n newEnd = start + duration;\r\n lastItem = getLastItem();\r\n newDuration = newEnd - lastItem.StartTime;\r\n lastItem.Duration = newDuration;\r\n };\r\n\r\n const addNewItem = function (start, duration) {\r\n resultArray.push({ StartTime: start, Duration: duration });\r\n };\r\n\r\n const add = function (start, duration) {\r\n if (duration <= 0) {\r\n // Zero durations can be skipped.\r\n return;\r\n }\r\n\r\n if (Math.abs(start - getLastEnd()) <= SEGMENT_COMBINATION_TOLERANCE_SECONDS) {\r\n // This segment starts at or very near the end of the last one.\r\n extendLastItem(start, duration);\r\n } else {\r\n // This segment is not a continuation of the last.\r\n addNewItem(start, duration);\r\n }\r\n };\r\n\r\n for (i = 0; i < inputArray.length; i += 1) {\r\n seg = inputArray[i];\r\n start = Math.max(0, Math.floor(seg.start));\r\n end = Math.max(0, Math.floor(seg.end));\r\n duration = Math.max(0, end - start);\r\n\r\n add(start, duration);\r\n }\r\n\r\n return resultArray;\r\n };\r\n\r\n makeReportMediaViewDescription(serviceSegments, bookmarkPosition) {\r\n let i;\r\n const joint = ', ';\r\n let parts = [];\r\n\r\n function seviceSegmentDescription(serviceSegment) {\r\n const start = secondsToMinutesAndSeconds(serviceSegment.StartTime);\r\n const end = secondsToMinutesAndSeconds(serviceSegment.StartTime + serviceSegment.Duration);\r\n\r\n return '(' + start + ' - ' + end + ')';\r\n }\r\n\r\n function secondsToMinutesAndSeconds(totalSeconds) {\r\n let m, ss;\r\n const isNegative = totalSeconds < 0;\r\n\r\n totalSeconds = Math.floor(Math.abs(totalSeconds));\r\n m = Math.floor(totalSeconds / 60) + '';\r\n ss = (totalSeconds % 60) + '';\r\n while (ss.length < 2) {\r\n ss = '0' + ss;\r\n }\r\n if (isNegative) {\r\n m = '-' + m;\r\n }\r\n return m + ':' + ss;\r\n }\r\n\r\n for (i = 0; i < serviceSegments.length; i += 1) {\r\n parts.push(seviceSegmentDescription(serviceSegments[i]));\r\n }\r\n\r\n return 'segments: [' + parts.join(joint) + '], bookmarkPosition: ' + secondsToMinutesAndSeconds(bookmarkPosition);\r\n }\r\n\r\n calcBookmarkPosition(segments, isLive) {\r\n let result = 0;\r\n\r\n if (!isLive && segments.length > 0) {\r\n result = Math.floor(segments[segments.length - 1].end);\r\n\r\n if (this.isInNoBookmarkZone(result)) {\r\n // No sense bookmarking a position sooo close to \r\n // the video duration. Interpret this to mean we \r\n // reached the end and should clear out (zero) \r\n // the bookmark.\r\n result = 0;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n isInNoBookmarkZone(position) {\r\n const diff = this.player.duration() - position;\r\n return diff >= 0 && diff <= NO_BOOKMARK_ZONE_SIZE;\r\n }\r\n}\r\n\r\n","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js!./search.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import videojs from 'video.js';\r\n\r\nexport default function generateSearchResult(text, time, type, index, player) {\r\n const localize = player.localize?.bind(player);\r\n const TIME_ARIA_LABEL = localize('%%0%% hours, %%1%% minutes, %%2%% seconds');\r\n const SEARCH_RESULTS_ARIA_LABEL = localize('Search result %%0%%. %%1%%. %%2%%');\r\n\r\n const container = document.createElement('div');\r\n const timeString = new Date(time * 1000).toISOString().substr(11, 8);\r\n const hoursMinutesSeconds = timeString.split(':').map(value => parseInt(value, 10));\r\n\r\n const timeAriaLabel = replacePlaceholders(TIME_ARIA_LABEL, ...hoursMinutesSeconds);\r\n const ariaLabel = replacePlaceholders(SEARCH_RESULTS_ARIA_LABEL, index + 1, timeAriaLabel, text);\r\n\r\n container.innerHTML = `
  • \r\n ${text}\r\n ${videojs.formatTime(time, 3600)}\r\n ${type}\r\n
  • `;\r\n return container.firstChild;\r\n}\r\n\r\nconst replaceRegex = /%%\\d*%%/;\r\nfunction replacePlaceholders(templateString, ...rest) {\r\n return rest.reduce((previous, current) => (\r\n previous.replace(replaceRegex, current)\r\n ), templateString);\r\n}\r\n","import videojs from 'video.js';\r\n\r\nimport ModalDialog from '../../components/modal-dialog.js';\r\n\r\nimport generateSearchForm from './search/search-form.js';\r\n\r\nimport './search.css';\r\nimport { searchCaptionsAndSlides, SearchResultType } from '../../api/presentation.js';\r\n\r\nimport SearchIcon from '../../assets/images/search-white-24dp.svg';\r\nimport generateSearchResult from './search/search-result.js';\r\nimport { isPresentationId } from '../../util';\r\n\r\nconst _modal = new WeakMap();\r\nconst _formEl = new WeakMap();\r\nconst _resultsEl = new WeakMap();\r\nlet localize;\r\n\r\n/**\r\n * The Search module.\r\n * @member {SearchPlugin} search\r\n * @memberof MediasitePlayer#\r\n */\r\n\r\n/**\r\n * Lets the users search for and navigate to slides and captions within the presentation.\r\n * @hideconstructor\r\n * @extends {external:\"videojs.Plugin\"}\r\n **/\r\nclass SearchPlugin extends videojs.getPlugin('plugin') {\r\n constructor(player, options) {\r\n localize = player.localize?.bind(player);\r\n super(player, options);\r\n\r\n const modal = new ModalDialog(player, {\r\n temporary: false,\r\n uncloseable: false,\r\n pauseOnOpen: false,\r\n description: localize('Search'),\r\n displayAsPanel: true\r\n });\r\n _modal.set(this, modal);\r\n modal.addClass('mediasite-player__search-modal');\r\n modal.addClass('mediasite-player__control-bar-modal');\r\n player.controlbarMenu().addMenuItem(localize('Search'), { id: this.name, icon: SearchIcon, callback: () => this.openModal() });\r\n\r\n player.ready(() => {\r\n player.layout().addChild(modal);\r\n });\r\n }\r\n\r\n /**\r\n * Opens the Search modal dialog.\r\n * @example\r\n * player.search.openModal();\r\n **/\r\n openModal() {\r\n if (isPresentationId(this.player.loader().presentationId) && this.enabled) {\r\n const modal = _modal.get(this);\r\n const content = generateSearchForm(this.player);\r\n this.#setupModalContent(content);\r\n modal.fillWith(content);\r\n modal.open();\r\n _formEl.set(this, content);\r\n }\r\n }\r\n\r\n /**\r\n * Closes the Search modal dialog.\r\n * @example\r\n * player.search.closeModal();\r\n **/\r\n closeModal() {\r\n _modal.get(this).close();\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {HTMLDivElement} content\r\n */\r\n #setupModalContent(content) {\r\n const form = content.querySelector('form');\r\n\r\n // When submitButton is clicked, validate and submit\r\n form.addEventListener('submit', event => {\r\n event.preventDefault();\r\n this.#handleSubmit();\r\n });\r\n }\r\n\r\n #handleSubmit() {\r\n /** @type {HTMLFormElement} */\r\n const formEl = _formEl.get(this).querySelector('form');\r\n const searchTerm = formEl.querySelector('input').value;\r\n\r\n this.#disableFormControls();\r\n\r\n const resultsEl = _resultsEl.get(this);\r\n if (resultsEl) {\r\n resultsEl.remove();\r\n _resultsEl.set(this, null);\r\n }\r\n\r\n let captionLanguage;\r\n if (this.player.usingPlugin('captions')) {\r\n captionLanguage = this.player.captions()?.getSelectedLanguage(true);\r\n }\r\n\r\n searchCaptionsAndSlides(this.player.reporting().playbackTicket, searchTerm, captionLanguage)\r\n .then(result => this.#handleSearchComplete(searchTerm, result))\r\n .catch(error => this.#handleSearchError(error));\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {Array<{text:string,time:number,type:number}>} results\r\n */\r\n #handleSearchComplete(searchTerm, results) {\r\n const RESULT_TYPE_MAPPING = [\r\n '',\r\n localize('Closed caption'),\r\n localize('Slide')\r\n ];\r\n\r\n this.#enableFormControls();\r\n\r\n //display search results sorted by time, rather than type\r\n results.sort((a, b) => a.time - b.time);\r\n\r\n const resultContainer = document.createElement('ul');\r\n resultContainer.className = 'mediasite-player__search-results-list';\r\n _resultsEl.set(this, resultContainer);\r\n if (results.length > 0) {\r\n for (const result of results) {\r\n const resultEl = generateSearchResult(\r\n result.type === SearchResultType.Caption ? result.text : localize('[Search result in slide text.]'),\r\n result.time / 1000,\r\n RESULT_TYPE_MAPPING[result.type],\r\n results.indexOf(result),\r\n this.player\r\n );\r\n resultContainer.appendChild(resultEl);\r\n for (const type of ['click', 'keydown']) {\r\n resultEl.addEventListener(type, event => this.#handleClickedSearchResult(event));\r\n }\r\n }\r\n\r\n const modal = _modal.get(this);\r\n modal.contentEl().appendChild(resultContainer);\r\n resultContainer.firstElementChild?.focus();\r\n }\r\n\r\n const form = _formEl.get(this);\r\n form.querySelector('.mediasite-player__search-notice').textContent = `${localize('Found')} ${results.length} ${localize('results for')} '${searchTerm}'.`;\r\n }\r\n\r\n #handleSearchError() {\r\n this.player.showMessage(localize('There was a problem getting search results. Try refreshing the page and searching again.'));\r\n this.#enableFormControls();\r\n }\r\n\r\n #handleClickedSearchResult(event) {\r\n if (event.type === 'keydown' && !(event.keyCode === 13 || event.keyCode === 32)) {\r\n return;\r\n }\r\n\r\n const time = parseFloat(event.currentTarget.dataset.time);\r\n this.player.currentTime(time);\r\n }\r\n\r\n #enableFormControls() {\r\n const formEl = _formEl.get(this).querySelector('form');\r\n for (const el of Array.from(formEl.querySelectorAll('input'))) {\r\n el.disabled = false;\r\n }\r\n }\r\n\r\n #disableFormControls() {\r\n const formEl = _formEl.get(this).querySelector('form');\r\n for (const el of Array.from(formEl.querySelectorAll('input'))) {\r\n el.disabled = true;\r\n }\r\n }\r\n\r\n /**\r\n * A boolean indicating whether or not the Search feature is enabled in the UI.\r\n * @type {boolean}\r\n * @example\r\n * player.search.enabled = true;\r\n */\r\n get enabled() {\r\n return this.player.controlbarMenu().isMenuItemEnabled(this.name);\r\n }\r\n\r\n set enabled(enabled) {\r\n if (enabled) {\r\n this.player.controlbarMenu().enableMenuItem(this.name);\r\n }\r\n else {\r\n this.player.controlbarMenu().disableMenuItem(this.name);\r\n }\r\n }\r\n\r\n dispose() {\r\n const modal = _modal.get(this);\r\n this.player.layout().removeChild(modal);\r\n\r\n if (this.player?.usingPlugin('controlbarMenu')) {\r\n this.player.controlbarMenu().removeMenuItem(this.name);\r\n }\r\n\r\n super.dispose();\r\n }\r\n}\r\n\r\nexport default SearchPlugin;\r\n","export default function generateSearchForm(player) {\r\n const localize = player.localize?.bind(player);\r\n const template = `

    ${localize('Search Slides and Closed Captions')}

    \r\n
    \r\n

    \r\n \r\n \r\n

    \r\n

    \r\n
    `;\r\n\r\n const container = document.createElement('div');\r\n container.innerHTML = template;\r\n return container;\r\n}\r\n","import api from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/postcss-loader/dist/cjs.js!./seekbar-segment.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/postcss-loader/dist/cjs.js!./seekbar-segment-progress-bar.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import videojs from 'video.js';\r\n\r\nimport './seekbar-segment-progress-bar.css'\r\n\r\nconst _startTime = new WeakMap();\r\nconst _endTime = new WeakMap();\r\n\r\nconst DEFAULT_PROGRESS_WIDTH = 0;\r\n\r\nexport default class SeekBarSegmentProgressBar extends videojs.getComponent('Component') {\r\n /**\r\n *\r\n * @param {videojs.Player} player\r\n * @param {Object} options\r\n * @param {number} options.startTime\r\n * @param {number} options.endTime\r\n */\r\n constructor(player, options) {\r\n super(player, options);\r\n\r\n player.ready(() => {\r\n const { startTime, endTime } = options;\r\n\r\n this.startTime = startTime;\r\n this.endTime = endTime;\r\n this.segmentWidth = this.el().parentElement.getBoundingClientRect().width;\r\n\r\n const resizeOb = new ResizeObserver(entries => {\r\n for (const entry of entries) {\r\n this.updateWidth();\r\n }\r\n })\r\n\r\n resizeOb.observe(this.player().getChild('ControlBar').getChild('ProgressControl').getChild('SeekBar').getChild('PlayProgressBar').el());\r\n });\r\n }\r\n\r\n set startTime(startTime) {\r\n _startTime.set(this, startTime);\r\n }\r\n\r\n get startTime() {\r\n return _startTime.get(this);\r\n }\r\n\r\n set endTime(endTime) {\r\n _endTime.set(this, endTime);\r\n }\r\n\r\n get endTime() {\r\n return _endTime.get(this);\r\n }\r\n\r\n set width(width) {\r\n this.el().style.width = width;\r\n }\r\n\r\n get width() {\r\n return this.el().style.width;\r\n }\r\n\r\n updateWidth() {\r\n const startTime = this.startTime;\r\n const endTime = this.endTime;\r\n const segmentWidth = this.el().parentElement.getBoundingClientRect().width;\r\n const playProgressBarPosition = this.player().getChild('ControlBar').getChild('ProgressControl').getChild('SeekBar').getChild('PlayProgressBar').el().getBoundingClientRect().width;\r\n const seekBarWidth = this.player().getChild('ControlBar').getChild('ProgressControl').getChild('SeekBar').el().getBoundingClientRect().width;\r\n\r\n const startPosition = (startTime / this.player().duration()) * seekBarWidth;\r\n const endPosition = (endTime / this.player().duration()) * seekBarWidth;\r\n\r\n if (playProgressBarPosition > endPosition) {\r\n this.width = '100%';\r\n } else if (playProgressBarPosition < startPosition) {\r\n this.width = '0%';\r\n } else {\r\n this.width = `${((playProgressBarPosition - startPosition) / segmentWidth) * 100}%`;\r\n }\r\n\r\n }\r\n\r\n createEl(tag, props = {}, attributes = {}) {\r\n tag = 'div';\r\n props = Object.assign({\r\n className: 'mediasite-player__seekbar-segment-progress-bar'\r\n });\r\n attributes = Object.assign({\r\n style: `width: ${DEFAULT_PROGRESS_WIDTH}%`\r\n });\r\n return super.createEl.call(this, tag, props, attributes);\r\n }\r\n\r\n}","import videojs from 'video.js';\r\n\r\nimport './seekbar-segment.css';\r\n\r\nimport SeekBarSegmentProgressBar from './seekbar-segment-progress-bar.js'\r\n\r\nconst _startTime = new WeakMap();\r\nconst _endTime = new WeakMap();\r\nconst _label = new WeakMap();\r\nconst _spacerWidth = new WeakMap();\r\nconst _progress = new WeakMap();\r\n\r\nconst DEFAULT_SPACER_WIDTH_PIXELS = 6;\r\n\r\nexport default class SeekBarSegment extends videojs.getComponent('Component') {\r\n /**\r\n * \r\n * @param {videojs.Player} player\r\n * @param {Object} options\r\n * @param {number} options.startTime\r\n * @param {number} options.endTime\r\n * @param {string} options.label\r\n * @param {number} options.spacerWidth\r\n * @param {boolean} options.progress\r\n */\r\n constructor(player, options) {\r\n super(player, options);\r\n\r\n player.ready(() => {\r\n const { startTime, endTime, label, spacerWidth, progress } = options;\r\n this.startTime = startTime;\r\n this.endTime = endTime;\r\n this.label = label;\r\n this.spacerWidth = spacerWidth ?? DEFAULT_SPACER_WIDTH_PIXELS;\r\n this.progress = progress;\r\n\r\n this.createSegment();\r\n\r\n const resizeOb = new ResizeObserver(entries => {\r\n for (const entry of entries) {\r\n this.onResize();\r\n }\r\n })\r\n\r\n\r\n resizeOb.observe(this.player().getChild('ControlBar').getChild('ProgressControl').getChild('SeekBar').getChild('PlayProgressBar').el());\r\n });\r\n }\r\n\r\n onResize() {\r\n this.createSegment();\r\n }\r\n\r\n set hidden(hidden) {\r\n if (hidden) {\r\n this.addClass('vjs-hidden');\r\n }\r\n else {\r\n this.removeClass('vjs-hidden');\r\n }\r\n }\r\n\r\n get hidden() {\r\n return this.hasClass('vjs-hidden');\r\n }\r\n\r\n set startTime(startTime) {\r\n _startTime.set(this, startTime);\r\n this.label = this.label;\r\n }\r\n\r\n get startTime() {\r\n return _startTime.get(this);\r\n }\r\n\r\n set endTime(endTime) {\r\n _endTime.set(this, endTime);\r\n this.label = this.label;\r\n }\r\n\r\n get endTime() {\r\n return _endTime.get(this);\r\n }\r\n\r\n set label(label) {\r\n _label.set(this, label);\r\n const el = this.el();\r\n\r\n if (label) {\r\n el.style.setProperty('--tooltip-content', `\"${videojs.formatTime(this.startTime)} - ${label}\"`);\r\n el.setAttribute('aria-label', label);\r\n } else {\r\n el.style.setProperty('--tooltip-content', `\"${videojs.formatTime(this.startTime)}`);\r\n }\r\n }\r\n\r\n get label() {\r\n return _label.get(this);\r\n }\r\n\r\n set spacerWidth(spacerWidth) {\r\n _spacerWidth.set(this, spacerWidth);\r\n }\r\n\r\n get spacerWidth() {\r\n return _spacerWidth.get(this);\r\n }\r\n\r\n set progress(progress) {\r\n _progress.set(this, progress);\r\n if (progress === true) {\r\n this.updateSeekBarStyles();\r\n this.addProgressBar();\r\n } else {\r\n this.updateSeekBarStyles();\r\n this.removeProgressBar();\r\n }\r\n }\r\n\r\n get progress() {\r\n return _progress.get(this);\r\n }\r\n\r\n updateSeekBarStyles() {\r\n const seekBar = this.player().getChild('ControlBar').getChild('ProgressControl').getChild('SeekBar').el();\r\n const playProgressBar = this.player().getChild('ControlBar').getChild('ProgressControl').getChild('SeekBar').getChild('PlayProgressBar').el();\r\n if (this.progress === true) {\r\n seekBar.style.backgroundColor = 'transparent';\r\n seekBar.style.overflowX = 'visible';\r\n playProgressBar.style.backgroundColor = 'transparent';\r\n } else {\r\n seekBar.style.backgroundColor = '#676767';\r\n seekBar.style.overflowX = 'hidden';\r\n playProgressBar.style.backgroundColor = '#ec8b00';\r\n }\r\n }\r\n\r\n addProgressBar() {\r\n const player = this.player();\r\n\r\n const startTime = this.startTime;\r\n const endTime = this.endTime;\r\n\r\n const seekBarSegmentProgressBar = new SeekBarSegmentProgressBar(player, { name: 'SeekBarSegmentProgressBar', startTime, endTime });\r\n this.addChild(seekBarSegmentProgressBar);\r\n }\r\n\r\n removeProgressBar() {\r\n this.el().removeChild('SeekBarSegmentProgressBar');\r\n }\r\n\r\n createSegment() {\r\n const player = this.player();\r\n const seekBarWidth = player.getChild('ControlBar').getChild('ProgressControl').getChild('SeekBar').el().getBoundingClientRect().width;\r\n const presentationDuration = player.duration();\r\n const spacerWidth = this.spacerWidth;\r\n const spacerHalfWidth = spacerWidth / 2;\r\n const startPosition = this.startTime / presentationDuration;\r\n const endPosition = this.endTime / presentationDuration;\r\n //sometimes, the start/end positions math can lead to floating decimals, rather than a rounded number\r\n //rounding the positions messes up the positing with the timeline cursor, so new values are created for rounding\r\n const roundedStartPosition = this.#roundToHundredth(startPosition);\r\n const roundedEndPosition = this.#roundToHundredth(endPosition);\r\n \r\n const seekBarSegmentWidth = (seekBarWidth * (endPosition - startPosition));\r\n\r\n let segmentWidth;\r\n let segmentLeftPosition;\r\n\r\n if (roundedStartPosition === 0 && roundedEndPosition === 1) {\r\n segmentWidth = seekBarSegmentWidth;\r\n segmentLeftPosition = startPosition;\r\n } else if (seekBarSegmentWidth < spacerWidth) {\r\n segmentWidth = seekBarSegmentWidth;\r\n segmentLeftPosition = startPosition * seekBarWidth;\r\n } else if (roundedStartPosition === 0) {\r\n segmentWidth = (endPosition * seekBarWidth) - spacerHalfWidth;\r\n segmentLeftPosition = startPosition;\r\n } else if (roundedEndPosition === 1) {\r\n segmentWidth = seekBarWidth * (roundedEndPosition - startPosition);\r\n segmentLeftPosition = (startPosition * seekBarWidth) + spacerHalfWidth;\r\n } else {\r\n segmentWidth = seekBarSegmentWidth - spacerWidth;\r\n segmentLeftPosition = (startPosition * seekBarWidth) + spacerHalfWidth;\r\n }\r\n\r\n this.el().style.setProperty('--seekbar-width', seekBarWidth);\r\n this.el().style.setProperty('--seekbar-segment-width', segmentWidth);\r\n this.el().style.setProperty('--seekbar-segment-pos-left', segmentLeftPosition);\r\n }\r\n\r\n #roundToHundredth(num) {\r\n return Math.ceil(num * 100) / 100;\r\n }\r\n\r\n createEl(tag, props = {}, attributes = {}) {\r\n tag = 'div';\r\n props = Object.assign({\r\n className: 'mediasite-player__seekbar-segment'\r\n });\r\n\r\n return super.createEl.call(this, tag, props, attributes);\r\n }\r\n}","import videojs from 'video.js';\r\nimport Fn from 'video.js';\r\n\r\nimport { v4 as uuid } from 'uuid';\r\n\r\nimport SeekBarSegment from './seekbar-segments/seekbar-segment.js';\r\n\r\nconst _seekBarSegments = new WeakMap();\r\n\r\n/**\r\n * @typedef {Object} seekBarSegmentConfig\r\n * @alias SeekBarSegmentsConfig\r\n * @memberof SeekBarSegmentsPlugin\r\n * @property {string} [id] An ID by which to identify the segment.\r\n * @property {number} time The time in seconds.\r\n * @property {string} label A label that will be visible in the UI.\r\n * @property {number} [spacerWidth] The segment width in pixels.\r\n * @property {boolean} [progress] Whether a PlayProgressBar should be added to the segment\r\n */\r\n\r\n/**\r\n * The SeekBarSegments module.\r\n * @member {SeekBarSegmentsPlugin} seekBarSegments\r\n * @memberof MediasitePlayer#\r\n */\r\n\r\n/**\r\n * Configures segments to break up seekbar into sections.\r\n * @hideconstructor\r\n * @extends {external:\"videojs.Plugin\"}\r\n **/\r\nclass SeekBarSegmentsPlugin extends videojs.getPlugin('plugin') {\r\n constructor(player, options) {\r\n super(player, options);\r\n _seekBarSegments.set(this, {});\r\n }\r\n /**\r\n * \r\n * @param {SeekBarSegmentsConfig} segmentConfig A segment to add to the timeline.\r\n * @returns {string} The segment's ID.\r\n * @example\r\n * const segmentId = player.seekBarSegments.add({\r\n * startTime: 0.0,\r\n * endTime: 20.0,\r\n * label: 'Introduction',\r\n * spacerWidth: 5,\r\n * progress: true\r\n * });\r\n */\r\n add(segmentConfig) {\r\n const { startTime, endTime, label, spacerWidth, progress } = segmentConfig;\r\n const id = segmentConfig.id ?? uuid();\r\n const seekBarSegment = new SeekBarSegment(this.player, { startTime, endTime, label, spacerWidth, progress });\r\n const seekBar = this.player.getChild('ControlBar').getChild('ProgressControl').getChild('SeekBar');\r\n seekBar.addChild(seekBarSegment);\r\n _seekBarSegments.get(this)[id] = seekBarSegment;\r\n\r\n this.#sortAll();\r\n\r\n return id;\r\n }\r\n\r\n /**\r\n * Removes a segment from the seekbar.\r\n * @param {string} id The segment's unique ID.\r\n * @example\r\n * player.seekBarSegments.remove('segmentId');\r\n */\r\n remove(id) {\r\n const segment = _seekBarSegments.get(this)[id];\r\n if (segment) {\r\n const controlBar = this.player.getChild('ControlBar').getChild('ProgressControl').getChild('SeekBar');\r\n controlBar.removeChild(segment);\r\n delete _seekBarSegments.get(this)[id];\r\n this.#sortAll();\r\n }\r\n }\r\n\r\n /**\r\n * Updates the timeline segment with the given ID.\r\n * @param {string} id\r\n * @param {Object} data\r\n * @param {number} data.startTime The start time in seconds.\r\n * @param {number} data.endTime The end time in seconds.\r\n * @param {string} data.label A label for the segment.\r\n * @param {number} data.spacerWidth The width of a segment.\r\n * @param {boolean} data.progress Whether a segment includes a progress bar.\r\n * @example\r\n * player.seekBarSegments.update('segmentId', { });\r\n */\r\n update(id, data) {\r\n const { startTime, endTime, label, spacerWidth, progress } = (data ?? {});\r\n\r\n const segment = _seekBarSegments.get(this)[id];\r\n if (segment) {\r\n // Update timeline segment\r\n if (startTime) {\r\n segment.startTime = startTime;\r\n }\r\n if (endTime) {\r\n segment.endTime = endTime;\r\n }\r\n if (label) {\r\n segment.label = label;\r\n }\r\n if (spacerWidth) {\r\n segment.spacerWidth = spacerWidth;\r\n }\r\n if (progress) {\r\n segment.progress = progress;\r\n }\r\n segment.hidden = !data;\r\n }\r\n\r\n this.#sortAll();\r\n }\r\n\r\n /**\r\n * Gets the data for the timeline segment with the given ID.\r\n * @param {string} id\r\n * @returns {{text:string,time:number,spacerWidth:number}}\r\n * @example\r\n * const segment = player.seekBarSegments.get('segmentId');\r\n */\r\n get(id) {\r\n const segment = _seekBarSegments.get(this)[id];\r\n if (segment) {\r\n return {\r\n text: segment.label,\r\n time: segment.time,\r\n spacerWidth: segment.spacerWidth\r\n }\r\n }\r\n }\r\n\r\n #sortAll() {\r\n const playProgressBar = this.player.getChild('ControlBar').getChild('ProgressControl').getChild('SeekBar').getChild('PlayProgressBar');\r\n const currentSegments = playProgressBar.children();\r\n\r\n for (const seekBarSegment of currentSegments) {\r\n playProgressBar.removeChild(seekBarSegment);\r\n }\r\n\r\n const seekBarSegments = Object.values(_seekBarSegments.get(this)).sort((a, b) => {\r\n if (a.startTime > b.endTime) {\r\n return 1;\r\n }\r\n else if (a.startTime < b.endTime) {\r\n return 0;\r\n }\r\n return 0;\r\n });\r\n\r\n for (const seekBarSegment of seekBarSegments) {\r\n playProgressBar.addChild(seekBarSegment);\r\n }\r\n }\r\n\r\n clear() {\r\n const seekBarSegments = _seekBarSegments.get(this);\r\n for (const segmentId of Object.keys(seekBarSegments)) {\r\n this.remove(segmentId);\r\n }\r\n\r\n //creating the seekbar segements changes the seek bar and play progress bar. This reverts the inline style changes they make\r\n const seekBar = this.player.getChild('ControlBar').getChild('ProgressControl').getChild('SeekBar').el();\r\n seekBar.removeAttribute(\"style\");\r\n\r\n const playProgressBar = this.player.getChild('ControlBar').getChild('ProgressControl').getChild('SeekBar').getChild('PlayProgressBar').el();\r\n playProgressBar.style.removeProperty('background-color');\r\n }\r\n\r\n dispose() {\r\n this.clear();\r\n super.dispose();\r\n }\r\n}\r\n\r\nexport default SeekBarSegmentsPlugin;\r\n","import videojs from 'video.js';\r\nimport 'videojs-sprite-thumbnails';\r\n\r\nconst _enabled = new WeakMap();\r\nconst _width = new WeakMap();\r\nconst _height = new WeakMap();\r\nconst _columns = new WeakMap();\r\nconst _rows = new WeakMap();\r\nconst _interval = new WeakMap();\r\nconst _aspectRatio = new WeakMap();\r\n\r\nconst REFERENCE_WIDTH = 1920;\r\nconst MIN_DOWNLINK_SPEED_MBPS = 0; // default is 1.5, we set it to 0 to disable the downlink check (MVP #2429)\r\n\r\n/**\r\n * The Thumbnails module.\r\n * @member {ThumbnailsPlugin} seekThumbnails\r\n * @memberof MediasitePlayer#\r\n */\r\n\r\n/**\r\n * Configures seek thumbnails to show an image preview on seek or hover over the seek bar.\r\n * @hideconstructor\r\n * @extends {external:\"videojs.Plugin\"}\r\n **/\r\nclass SeekThumbnailsPlugin extends videojs.getPlugin('plugin') {\r\n constructor(player, options) {\r\n super(player, options);\r\n }\r\n\r\n /**\r\n * Initializes the plugin with the given data.\r\n * @param {VTTCue} chapter\r\n * @returns {string}\r\n * @example\r\n * player.thumbnails.init({});\r\n */\r\n init(options) {\r\n if (!options || !Object.keys(options)) {\r\n this.enabled = false;\r\n return;\r\n }\r\n\r\n this.height = options.Height;\r\n this.width = options.Width;\r\n if (options.Height && options.Width) {\r\n this.aspectRatio = options.Width / options.Height;\r\n }\r\n \r\n this.player.spriteThumbnails({\r\n interval: options.Interval,\r\n url: options.URL,\r\n idxTag: function (index) {\r\n return `000${index + 1}`.slice(-4);\r\n },\r\n width: this.width,\r\n height: this.height,\r\n columns: options.Columns,\r\n rows: options.Rows,\r\n downlink: MIN_DOWNLINK_SPEED_MBPS,\r\n responsive: REFERENCE_WIDTH\r\n });\r\n }\r\n\r\n /**\r\n * Whether or not to enable the thumbnails UI.\r\n * @type {boolean}\r\n * @example\r\n * player.thumbnails.enabled = true;\r\n */\r\n get enabled() {\r\n return _enabled.get(this) ?? false;\r\n }\r\n\r\n set enabled(enabled) {\r\n if (!enabled) {\r\n this.player.removeClass('vjs-sprite-thumbnails');\r\n }\r\n _enabled.set(this, enabled);\r\n }\r\n\r\n /**\r\n * The desired display width of the thumbnail.\r\n * @type {number}\r\n * @example\r\n * player.thumbnails.width = 500;\r\n */\r\n get width() {\r\n return _width.get(this); //* ratio;\r\n }\r\n\r\n set width(width) {\r\n _width.set(this, width);\r\n }\r\n\r\n /**\r\n * The desired display height of the thumbnail\r\n * @type {number}\r\n * @example\r\n * player.thumbnails.height = 100;\r\n */\r\n get height() {\r\n return _height.get(this);\r\n }\r\n\r\n set height(height) {\r\n _height.set(this, height);\r\n }\r\n\r\n /**\r\n * Aspect ratio of the thumbnail image.\r\n * @type {boolean}\r\n * @example\r\n * player.thumbnails.aspectRatio = 1.8;\r\n */\r\n get aspectRatio() {\r\n let ratio = _aspectRatio.get(this);\r\n if (!ratio && this.width && this.height) {\r\n ratio = this.width / this.height;\r\n }\r\n return ratio ?? 1.78;\r\n }\r\n\r\n set aspectRatio(ratio) {\r\n _aspectRatio.set(this, ratio);\r\n }\r\n\r\n /**\r\n * The number of images stacked horizontally in the thumbnail source image\r\n * @type {number}\r\n * @example\r\n * player.thumbnails.columns = 5;\r\n */\r\n get columns() {\r\n return _columns.get(this);\r\n }\r\n\r\n set columns(columns) {\r\n _columns.set(this, columns);\r\n }\r\n\r\n /**\r\n * The number of images stacked vertically in the thumbnail source image\r\n * @type {number}\r\n * @example\r\n * player.thumbnails.rows = 5;\r\n */\r\n get rows() {\r\n return _rows.get(this);\r\n }\r\n\r\n set rows(rows) {\r\n _rows.set(this, rows);\r\n }\r\n\r\n /**\r\n * The thumbnail refresh rate in seconds\r\n * @type {number}\r\n * @example\r\n * player.thumbnails.interval = 10;\r\n */\r\n get interval() {\r\n return _interval.get(this);\r\n }\r\n\r\n set interval(interval) {\r\n _interval.set(this, interval);\r\n }\r\n}\r\n\r\nexport default SeekThumbnailsPlugin;\r\n\r\nexport function fixTimeTooltipUpdate(player) {\r\n\r\n // attempt to find the timeline tooltip\r\n const timeTooltip = player.getChild('ControlBar')?.getChild('ProgressControl')?.getChild('SeekBar')?.getChild('MouseTimeDisplay')?.getChild('TimeTooltip');\r\n if (timeTooltip != null) {\r\n\r\n // override the update function with the fix that has been added to later versions of videojs: https://github.com/videojs/video.js/issues/8273\r\n timeTooltip.update = (function () {\r\n return function (seekBarRect, seekBarPoint, content) {\r\n var tooltipRect = videojs.dom.findPosition(this.el_);\r\n var playerRect = videojs.dom.getBoundingClientRect(this.player_.el());\r\n var seekBarPointPx = seekBarRect.width * seekBarPoint; // do nothing if either rect isn't available\r\n // for example, if the player isn't in the DOM for testing\r\n\r\n if (!playerRect || !tooltipRect) {\r\n return;\r\n } // This is the space left of the `seekBarPoint` available within the bounds\r\n // of the player. We calculate any gap between the left edge of the player\r\n // and the left edge of the `SeekBar` and add the number of pixels in the\r\n // `SeekBar` before hitting the `seekBarPoint`\r\n\r\n\r\n var spaceLeftOfPoint = seekBarRect.left - playerRect.left + seekBarPointPx; // This is the space right of the `seekBarPoint` available within the bounds\r\n // of the player. We calculate the number of pixels from the `seekBarPoint`\r\n // to the right edge of the `SeekBar` and add to that any gap between the\r\n // right edge of the `SeekBar` and the player.\r\n\r\n var spaceRightOfPoint = seekBarRect.width - seekBarPointPx + (playerRect.right - seekBarRect.right); // This is the number of pixels by which the tooltip will need to be pulled\r\n // further to the right to center it over the `seekBarPoint`.\r\n\r\n // spaceRightOfPoint is always NaN for mouse time display\r\n // because the seekbarRect does not have a right property. This causes\r\n // the mouse tool tip to be truncated when it's close to the right edge of the player.\r\n // In such cases, we ignore the `playerRect.right - seekBarRect.right` value when calculating.\r\n // For the sake of consistency, we ignore seekBarRect.left - playerRect.left for the left edge.\r\n if (!spaceRightOfPoint) {\r\n spaceRightOfPoint = seekBarRect.width - seekBarPointPx;\r\n spaceLeftOfPoint = seekBarPointPx;\r\n }\r\n\r\n var pullTooltipBy = tooltipRect.width / 2; // Adjust the `pullTooltipBy` distance to the left or right depending on\r\n // the results of the space calculations above.\r\n\r\n if (spaceLeftOfPoint < pullTooltipBy) {\r\n pullTooltipBy += pullTooltipBy - spaceLeftOfPoint;\r\n } else if (spaceRightOfPoint < pullTooltipBy) {\r\n pullTooltipBy = spaceRightOfPoint;\r\n } // Due to the imprecision of decimal/ratio based calculations and varying\r\n // rounding behaviors, there are cases where the spacing adjustment is off\r\n // by a pixel or two. This adds insurance to these calculations.\r\n\r\n\r\n if (pullTooltipBy < 0) {\r\n pullTooltipBy = 0;\r\n } else if (pullTooltipBy > tooltipRect.width) {\r\n pullTooltipBy = tooltipRect.width;\r\n } // prevent small width fluctuations within 0.4px from\r\n // changing the value below.\r\n // This really helps for live to prevent the play\r\n // progress time tooltip from jittering\r\n\r\n\r\n pullTooltipBy = Math.round(pullTooltipBy);\r\n this.el_.style.right = \"-\" + pullTooltipBy + \"px\";\r\n this.write(content);\r\n }\r\n }());\r\n }\r\n}\r\n","import videojs from 'video.js';\r\n\r\nconst _enablePlayPause = new WeakMap();\r\nconst _enableFullScreen = new WeakMap();\r\nconst _enableSpeedControl = new WeakMap();\r\nconst _enableSeeking = new WeakMap();\r\nconst _enableSwapStreams = new WeakMap();\r\nconst _playbackRates = new WeakMap();\r\nconst _enablePIP = new WeakMap();\r\n\r\n/**\r\n * The Settings module.\r\n * @member {SettingsPlugin} settings\r\n * @memberof MediasitePlayer#\r\n */\r\n\r\n/**\r\n * Allows for the configuration of player behavior and parts of the UI.\r\n * @hideconstructor\r\n * @extends {external:\"videojs.Plugin\"}\r\n **/\r\nclass SettingsPlugin extends videojs.getPlugin('plugin') {\r\n /**\r\n * A boolean indicating whether or not the UI should allow the user to play or pause the video.\r\n * @type {boolean}\r\n * @example\r\n * player.settings.enablePlayPause = true;\r\n */\r\n get enablePlayPause() {\r\n return _enablePlayPause.get(this) ?? true;\r\n }\r\n\r\n set enablePlayPause(enablePlayPause) {\r\n _enablePlayPause.set(this, enablePlayPause);\r\n const playButton = this.player.getDescendant('ControlBar', 'PlayToggle');\r\n if (enablePlayPause) {\r\n playButton.removeClass('vjs-hidden');\r\n }\r\n else {\r\n playButton.addClass('vjs-hidden');\r\n }\r\n }\r\n\r\n /**\r\n * A boolean indicating whether or not the UI should allow the user to enter full screen mode.\r\n * @type {boolean}\r\n * @example\r\n * player.settings.enableFullScreen = true;\r\n */\r\n get enableFullScreen() {\r\n return _enableFullScreen.get(this) ?? true;\r\n }\r\n\r\n set enableFullScreen(enableFullScreen) {\r\n _enableFullScreen.set(this, enableFullScreen);\r\n const fullscreenToggle = this.player.getDescendant('ControlBar', 'FullscreenToggle');\r\n if (enableFullScreen) {\r\n fullscreenToggle.removeClass('vjs-hidden');\r\n }\r\n else {\r\n fullscreenToggle.addClass('vjs-hidden');\r\n }\r\n\r\n if (this.player.isFullscreen()) {\r\n this.player.exitFullscreen();\r\n }\r\n }\r\n\r\n /**\r\n * A boolean indicating whether or not the UI should allow the user to set the playback rate.\r\n * @type {boolean}\r\n * @example\r\n * player.settings.enableSpeedControl = true;\r\n */\r\n get enableSpeedControl() {\r\n return _enableSpeedControl.get(this) ?? true;\r\n }\r\n\r\n set enableSpeedControl(enableSpeedControl) {\r\n _enableSpeedControl.set(this, enableSpeedControl);\r\n const speedControl = this.player.getDescendant('ControlBar', 'PlaybackRateMenuButton');\r\n if (enableSpeedControl) {\r\n speedControl.removeClass('vjs-hidden');\r\n }\r\n else {\r\n speedControl.addClass('vjs-hidden');\r\n }\r\n }\r\n\r\n /**\r\n * A boolean indicating whether or not the UI should allow the user to seek.\r\n * @type {boolean}\r\n * @example\r\n * player.settings.enableSeeking = true;\r\n */\r\n get enableSeeking() {\r\n return _enableSeeking.get(this) ?? true;\r\n }\r\n set enableSeeking(enableSeeking) {\r\n _enableSeeking.set(this, enableSeeking);\r\n const progressControl = this.player.getChild('ControlBar').getChild('ProgressControl');\r\n const playProgressBar = progressControl.getChild('SeekBar').getChild('PlayProgressBar');\r\n const timeTooltip = playProgressBar?.getChild('TimeTooltip');\r\n const forwardSeek = this.player.getChild('ControlBar').getChild('SeekForwardButton');\r\n const backwardSeek = this.player.getChild('ControlBar').getChild('SeekBackButton');\r\n\r\n if (enableSeeking) {\r\n progressControl?.enable();\r\n playProgressBar?.el().style.setProperty('--seek-thumb-color', `#ec8b00`);\r\n timeTooltip?.removeClass('vjs-hidden')\r\n forwardSeek.show();\r\n backwardSeek.show();\r\n } else {\r\n progressControl?.disable();\r\n progressControl?.on(progressControl.el(), 'mousemove', progressControl.handleMouseMove);\r\n progressControl?.getChild('SeekBar').getChild('MouseTimeDisplay')?.show();\r\n playProgressBar?.el().style.setProperty('--seek-thumb-color', `transparent`);\r\n timeTooltip?.addClass('vjs-hidden');\r\n forwardSeek.hide();\r\n backwardSeek.hide();\r\n }\r\n }\r\n\r\n /**\r\n * A boolean indicating whether or not the UI should allow the user to enable picture in picture mode.\r\n * @type {boolean}\r\n * @example\r\n * player.settings.enablePIP = true;\r\n */\r\n get enablePIP() {\r\n return _enablePIP.get(this) ?? true;\r\n }\r\n set enablePIP(enablePIP) {\r\n _enablePIP.set(this, enablePIP);\r\n\r\n if (enablePIP) {\r\n this.player.getChild('ControlBar')?.getChild('PictureInPictureToggle')?.show();\r\n }\r\n else {\r\n this.player.getChild('ControlBar')?.getChild('PictureInPictureToggle')?.hide();\r\n }\r\n }\r\n\r\n /**\r\n * A boolean indicating whether or not the UI should allow the user to enable swapping/cycling streams.\r\n * @type {boolean}\r\n * @example\r\n * player.settings.enableSwapStreams = true;\r\n */\r\n get enableSwapStreams() {\r\n return _enableSwapStreams.get(this) ?? true;\r\n }\r\n set enableSwapStreams(enableSwap) {\r\n _enableSwapStreams.set(this, enableSwap);\r\n\r\n if (enableSwap) {\r\n this.player.getChild('ControlBar')?.getChild('SwapStreamsButton')?.show();\r\n }\r\n else {\r\n this.player.getChild('ControlBar')?.getChild('SwapStreamsButton')?.hide();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the player's background color.\r\n * @type {string}\r\n * @example\r\n * player.settings.backgroundColor = '#000';\r\n */\r\n get backgroundColor() {\r\n const computedStyle = getComputedStyle(this.player.el());\r\n return computedStyle.getPropertyValue('background-color');\r\n }\r\n\r\n set backgroundColor(backgroundColor) {\r\n this.player.el().style.backgroundColor = backgroundColor;\r\n }\r\n\r\n /**\r\n * Gets or sets playback rates offered in the UI.\r\n * @type {Array.}\r\n * @example\r\n * player.settings.playbackRates = [0.5, 1.0, 2.0];\r\n */\r\n get playbackRates() {\r\n return _playbackRates.get(this) ?? [];\r\n }\r\n\r\n set playbackRates(rates) {\r\n _playbackRates.set(this, rates);\r\n this.player.playbackRates(rates);\r\n }\r\n}\r\n\r\nexport default SettingsPlugin;\r\n","import api from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/postcss-loader/dist/cjs.js!./share-form.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import videojs from 'video.js';\r\n\r\nimport ModalDialog from '../../components/modal-dialog.js';\r\n\r\nimport generateShareForm from './share/share-form.js';\r\nimport { getMsFromString, enableFieldByCheckbox, padTimeBasedUponDuration, createValidationForTimeString } from '../../util/shared-control-bar.js';\r\nimport './share/share-form.css';\r\n\r\nimport { isPresentationId } from '../../util';\r\nimport { PresentationStatus } from '../../api/presentation';\r\nimport ShareIcon from '../../assets/images/share-white-24dp.svg';\r\n\r\nconst _modal = new WeakMap();\r\nconst _content = new WeakMap();\r\nlet localize;\r\n\r\n/**\r\n * The Share module.\r\n * @member {SharePlugin} share\r\n * @memberof MediasitePlayer#\r\n */\r\n\r\n/**\r\n * Configures the share button that is displayed in the control bar menu.\r\n * @hideconstructor\r\n * @extends {external:\"videojs.Plugin\"}\r\n */\r\nclass SharePlugin extends videojs.getPlugin('plugin') {\r\n constructor(player, options) {\r\n localize = player.localize?.bind(player);\r\n super(player, options);\r\n\r\n const modal = new ModalDialog(player, {\r\n temporary: false,\r\n uncloseable: false,\r\n pauseOnOpen: false,\r\n description: localize('Share Presentation'),\r\n displayAsPanel: true\r\n });\r\n modal.addClass('mediasite-player__share-modal');\r\n modal.addClass('mediasite-player__control-bar-modal');\r\n _modal.set(this, modal);\r\n player.controlbarMenu().addMenuItem(localize('Share Presentation'), { id: this.name, icon: ShareIcon, callback: () => this.openModal() });\r\n\r\n player.ready(() => {\r\n player.layout().addChild(modal);\r\n });\r\n }\r\n\r\n /**\r\n * Opens the Share modal dialog.\r\n * @example\r\n * player.share.openModal();\r\n */\r\n openModal() {\r\n if (isPresentationId(this.player.loader().presentationId) && this.enabled) {\r\n const modal = _modal.get(this);\r\n const content = generateShareForm(this.player);\r\n _content.set(this, content);\r\n\r\n this.setupModalContent(content);\r\n modal.fillWith(content);\r\n modal.open();\r\n }\r\n }\r\n\r\n /**\r\n * Closes the Share modal dialog.\r\n * @example\r\n * player.share.closeModal();\r\n */\r\n closeModal() {\r\n _modal.get(this).close();\r\n }\r\n\r\n /**\r\n * Updates the content of the share modal\r\n * @private\r\n * @param {HTMLDivElement} content\r\n * player.share.setupModalContent();\r\n */\r\n setupModalContent(content) {\r\n this.#hideIfLive(content.querySelector('.time-fieldset'));\r\n\r\n //set up the time checkbox and field the same way as the ask a question modal\r\n const timeCheckbox = content.querySelector('input[type=checkbox]');\r\n const timeField = content.querySelector('input[name=time]');\r\n\r\n enableFieldByCheckbox(timeField, timeCheckbox);\r\n timeField.value = padTimeBasedUponDuration(videojs.formatTime, this.player.currentTime(), this.player.duration());\r\n timeField.setAttribute(\"pattern\", createValidationForTimeString(timeField.value));\r\n\r\n const presentationLinkField = content.querySelector(\"#share-presentation-link\");\r\n\r\n let copyURL = new URL(`${location.protocol}//${location.host}${location.pathname}`);\r\n this.#updateTextarea(presentationLinkField, copyURL);\r\n\r\n // When timeCheckbox changes, add or remove the playfrom parameter\r\n timeCheckbox.addEventListener('change', event => {\r\n if (!timeCheckbox.checked) {\r\n if (copyURL.searchParams.has(\"playfrom\")) {\r\n copyURL.searchParams.delete(\"playfrom\");\r\n }\r\n this.#updateTextarea(presentationLinkField, copyURL);\r\n } else {\r\n this.#updateTextarea(presentationLinkField, this.#addTimeValueToURL(copyURL, timeField.value));\r\n }\r\n });\r\n\r\n timeField.addEventListener('change', event => {\r\n this.#updateTextarea(presentationLinkField, this.#addTimeValueToURL(copyURL, timeField.value));\r\n });\r\n\r\n this.#copyTextareaOnClick(content.querySelector(\"#share-copy-link\"), presentationLinkField);\r\n\r\n //allows the pop-up for the time field validation to work without submitting anything\r\n this.#disableFormSubmit(content.querySelector('form'));\r\n \r\n }\r\n\r\n /**\r\n * Depending if the video is live or not, hide the provided element.\r\n **/\r\n #hideIfLive(elementToHide) {\r\n let liveStatus = this.player.live?.().status;\r\n //if we're doing a live video, remove the ability to copy the time\r\n if (liveStatus && liveStatus !== PresentationStatus.OnDemand) {\r\n elementToHide.classList.add(\"vjs-hidden\");\r\n }\r\n }\r\n\r\n /**\r\n * Adds the time value into the url through the playfrom parameter.\r\n * Updates it if there already is a playfrom parameter.\r\n * Removes the playfrom parameter if the value provided is invalid.\r\n **/\r\n #addTimeValueToURL(url, timeValue) {\r\n let convertedValue = getMsFromString(timeValue);\r\n\r\n //we can't have a negative time value to travel to, so remove the playfrom if one is attempted\r\n if (convertedValue < 0) {\r\n if (url.searchParams.has(\"playfrom\")) {\r\n url.searchParams.delete(\"playfrom\");\r\n }\r\n\r\n return url;\r\n }\r\n\r\n if (url.searchParams.has(\"playfrom\")) {\r\n url.searchParams.set(\"playfrom\", convertedValue);\r\n } else {\r\n url.searchParams.append(\"playfrom\", convertedValue);\r\n }\r\n return url;\r\n }\r\n\r\n /**\r\n * Updates the text area with the string version of whatever value is provided.\r\n */\r\n #updateTextarea(textarea, value) {\r\n textarea.value = value.toString();\r\n }\r\n\r\n /**\r\n * Sets up an element to copy the value of the textarea to the user's clipboard when the element is clicked.\r\n */ \r\n #copyTextareaOnClick(clickElement, textarea) {\r\n if (!clickElement || !textarea) {\r\n return;\r\n }\r\n clickElement.addEventListener('click', event => {\r\n textarea.select();\r\n navigator.clipboard.writeText(textarea.value);\r\n });\r\n }\r\n\r\n /**\r\n * Prevents the form provided from submitting anything on submit.\r\n */\r\n #disableFormSubmit(form) {\r\n if (!form) {\r\n return;\r\n }\r\n form.addEventListener('submit', event => {\r\n event.preventDefault();\r\n });\r\n }\r\n\r\n /**\r\n * A boolean indicating whether or not the Share feature is enabled in the UI.

    \r\n * Note: disabling the player's Share feature will not prevent users from sharing the page or its content via default browser means (such as the location bar).\r\n * @type {boolean}\r\n * @example\r\n * player.share.enabled = true;\r\n */\r\n get enabled() {\r\n return this.player.controlbarMenu().isMenuItemEnabled(this.name);\r\n }\r\n\r\n set enabled(enabled) {\r\n if (enabled) {\r\n this.player.controlbarMenu().enableMenuItem(this.name);\r\n }\r\n else {\r\n this.player.controlbarMenu().disableMenuItem(this.name);\r\n }\r\n }\r\n\r\n dispose() {\r\n if (this.player?.usingPlugin('controlbarMenu')) {\r\n this.player.controlbarMenu().removeMenuItem(this.name);\r\n }\r\n\r\n super.dispose();\r\n }\r\n}\r\n\r\nexport default SharePlugin;\r\n","export default function generateShareForm(player) {\r\n const localize = player.localize?.bind(player);\r\n const template = `

    ${localize('Share Presentation')}

    \r\n
    \r\n

    ${localize('Time')}${localize('Time at')}

    \r\n

    \r\n \r\n ${localize('Copy')}\r\n

    \r\n
    `;\r\n\r\n const container = document.createElement('div');\r\n container.innerHTML = template;\r\n return container;\r\n}","import videojs from 'video.js';\r\nimport Overlay, { OverlayPosition } from '../../components/overlay.js';\r\nimport ModalDialog from '../../components/modal-dialog.js';\r\n\r\n/**\r\n * Shows a short string of plain text in a basic modal.\r\n * @memberof MediasitePlayer#\r\n * @param {string} message\r\n * @param {Object} [options]\r\n * @param {boolean} [options.uncloseable]\r\n * @returns {videojs.ModalDialog}\r\n * @example\r\n * player.showMessage('This message shows in a nicely-styled modal dialog.');\r\n */\r\nfunction showMessage(message, options = {}) {\r\n if (typeof message === 'string') {\r\n const player = this;\r\n const { url, classes, ...rest } = options;\r\n \r\n const overlay = new Overlay(player, {\r\n text: message,\r\n url,\r\n position: OverlayPosition.Center,\r\n className: classes ? classes.join(' ') : ''\r\n });\r\n\r\n if (classes) {\r\n //When the modal opens, it slides in. The styling added gets a bit jumpy until the modal is all the way open.\r\n //Hide the overlay until the modal is all the way open.\r\n overlay.el().style.display = 'none';\r\n setTimeout(function () {\r\n overlay.el().style.display = 'block';\r\n }, 250);\r\n }\r\n\r\n const modal = new ModalDialog(player, {\r\n text: message,\r\n content: [overlay.el()],\r\n solidBackground: false,\r\n ...rest\r\n });\r\n\r\n modal.addClass(\"mediasite-player__show-message-modal\");\r\n player.addChild(modal);\r\n modal.open();\r\n return modal;\r\n }\r\n}\r\n\r\nexport default showMessage;\r\n","const LAYOUTS = {\r\n '2x2': [\r\n { top: 0, left: 0, width: .5, height: .5 },\r\n { top: 0, left: .5, width: .5, height: .5 },\r\n { top: .5, left: 0, width: .5, height: .5 },\r\n { top: .5, left: .5, width: .5, height: .5 }\r\n ],\r\n '3x1': [\r\n { top: .125, left: .375, width: .25, height: .75 },\r\n { top: .25, left: .0625, width: .25, height: .5 },\r\n { top: .25, left: .6875, width: .25, height: .5 }\r\n ],\r\n '2x1': [\r\n { top: .25, left: 0, width: 0.496875, height: .5 },\r\n { top: .25, left: .503125, width: 0.496875, height: .5 }\r\n ],\r\n 'timed': [\r\n { top: .25, left: 0, width: .5, height: .5, time: 31.97, duration: 7 },\r\n { top: .25, left: .5, width: .5, height: .5, time: 31.97, duration: 7 },\r\n\r\n { top: .1657, left: 0, width: .66, height: .6616, time: 43.57, duration: 6.5 },\r\n { top: .1657, left: .6625, width: .3346, height: .3218, time: 43.67, duration: 6.5 },\r\n { top: .4917, left: .6625, width: .3346, height: .3218, time: 43.67, duration: 6.5 },\r\n\r\n { top: 0, left: 0, width: .5, height: .5, time: 55.23, duration: 5.77 },\r\n { top: 0, left: .5, width: .5, height: .5, time: 55.23, duration: 5.77 },\r\n { top: .5, left: 0, width: .5, height: .5, time: 55.23, duration: 5.77 },\r\n { top: .5, left: .5, width: .5, height: .5, time: 55.23, duration: 5.77 },\r\n\r\n { top: .1157, left: 0, width: .7463, height: .7671, time: 61.07, duration: 12.16 },\r\n { top: .1157, left: .7495, width: .2419, height: .7671, time: 61.07, duration: 12.16 },\r\n\r\n { top: .7417, left: .7400, width: .2419, height: .2412, time: 89.43, duration: 9.07 },\r\n\r\n { top: .0625, left: .0427, width: .4141, height: .4141, time: 98.57, duration: 9.13 }\r\n ],\r\n 'demo': [\r\n { top: 0, left: 0, width: .5, height: .5, time: 0, duration: 65 },\r\n { top: 0, left: .5, width: .5, height: .5, time: 0, duration: 65 },\r\n { top: .5, left: 0, width: .5, height: .5, time: 0, duration: 65 },\r\n { top: .5, left: .5, width: .5, height: .5, time: 0, duration: 65 },\r\n\r\n { top: 1 / 6, left: 0, width: 2 / 3, height: 2 / 3, time: 67, duration: 48 },\r\n { top: 1 / 6, left: 2 / 3, width: 1 / 3, height: 1 / 3, time: 67, duration: 48 },\r\n { top: 1 / 2, left: 2 / 3, width: 1 / 3, height: 1 / 3, time: 67, duration: 48 },\r\n\r\n { top: .25, left: 0, width: 0.5, height: .5, time: 117, duration: 75 },\r\n { top: .25, left: 0.5, width: 0.5, height: .5, time: 117, duration: 75 }\r\n ]\r\n}\r\n\r\nexport default LAYOUTS;\r\n","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js!./smartzoom.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import videojs from 'video.js';\r\nimport { v4 as uuid } from 'uuid';\r\nimport LAYOUTS from './smartzoom/layouts.js';\r\nimport { calcDimensions } from '../../util';\r\nimport { QueryStringParamProvider } from 'PLAYER_SRC/implementations/player-page/helpers.js';\r\n\r\nimport './smartzoom.css';\r\n\r\nconst _wrapper = new WeakMap();\r\nconst _controlsOverlay = new WeakMap();\r\nconst _clickToExit = new WeakMap();\r\nconst _canvas = new WeakMap();\r\nconst _target = new WeakMap();\r\nconst _aspect = new WeakMap();\r\nlet localize;\r\n\r\n/**\r\n * The Smartzoom module.\r\n * @member {SmartzoomPlugin} smartzoom\r\n * @memberof MediasitePlayer#\r\n */\r\n\r\n/**\r\n * Allows the user to zoom into specific regions within the video. Works by resizing the