@mattebox/player 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -3
- package/dist/cdn/mattebox-player.min.js +222 -198
- package/dist/compose.d.ts +5 -0
- package/dist/compose.d.ts.map +1 -0
- package/dist/compose.js +31 -0
- package/dist/compose.js.map +1 -0
- package/dist/controls/chapters.d.ts +29 -0
- package/dist/controls/chapters.d.ts.map +1 -0
- package/dist/controls/chapters.js +81 -0
- package/dist/controls/chapters.js.map +1 -0
- package/dist/controls/cues.d.ts +8 -3
- package/dist/controls/cues.d.ts.map +1 -1
- package/dist/controls/cues.js +44 -10
- package/dist/controls/cues.js.map +1 -1
- package/dist/controls/fullscreen.d.ts +9 -9
- package/dist/controls/fullscreen.d.ts.map +1 -1
- package/dist/controls/fullscreen.js +17 -21
- package/dist/controls/fullscreen.js.map +1 -1
- package/dist/controls/icons.d.ts +1 -3
- package/dist/controls/icons.d.ts.map +1 -1
- package/dist/controls/icons.js +3 -6
- package/dist/controls/icons.js.map +1 -1
- package/dist/controls/menu.d.ts +14 -11
- package/dist/controls/menu.d.ts.map +1 -1
- package/dist/controls/menu.js +39 -34
- package/dist/controls/menu.js.map +1 -1
- package/dist/controls/session.d.ts +27 -0
- package/dist/controls/session.d.ts.map +1 -0
- package/dist/controls/session.js +36 -0
- package/dist/controls/session.js.map +1 -0
- package/dist/controls/slider.d.ts +6 -6
- package/dist/controls/slider.d.ts.map +1 -1
- package/dist/controls/slider.js +18 -13
- package/dist/controls/slider.js.map +1 -1
- package/dist/dom.d.ts +4 -10
- package/dist/dom.d.ts.map +1 -1
- package/dist/dom.js +4 -24
- package/dist/dom.js.map +1 -1
- package/dist/element-entry.d.ts +4 -0
- package/dist/element-entry.d.ts.map +1 -0
- package/dist/element-entry.js +9 -0
- package/dist/element-entry.js.map +1 -0
- package/dist/element.d.ts +54 -14
- package/dist/element.d.ts.map +1 -1
- package/dist/element.js +154 -73
- package/dist/element.js.map +1 -1
- package/dist/elements/audio-menu.d.ts +24 -0
- package/dist/elements/audio-menu.d.ts.map +1 -0
- package/dist/elements/audio-menu.js +70 -0
- package/dist/elements/audio-menu.js.map +1 -0
- package/dist/elements/chapters-menu.d.ts +12 -0
- package/dist/elements/chapters-menu.d.ts.map +1 -0
- package/dist/elements/chapters-menu.js +67 -0
- package/dist/elements/chapters-menu.js.map +1 -0
- package/dist/elements/component.d.ts +45 -0
- package/dist/elements/component.d.ts.map +1 -0
- package/dist/elements/component.js +90 -0
- package/dist/elements/component.js.map +1 -0
- package/dist/elements/control-bar.d.ts +75 -0
- package/dist/elements/control-bar.d.ts.map +1 -0
- package/dist/elements/control-bar.js +339 -0
- package/dist/elements/control-bar.js.map +1 -0
- package/dist/elements/current-time.d.ts +5 -0
- package/dist/elements/current-time.d.ts.map +1 -0
- package/dist/elements/current-time.js +27 -0
- package/dist/elements/current-time.js.map +1 -0
- package/dist/elements/drm-badge.d.ts +29 -0
- package/dist/elements/drm-badge.d.ts.map +1 -0
- package/dist/elements/drm-badge.js +145 -0
- package/dist/elements/drm-badge.js.map +1 -0
- package/dist/elements/duration.d.ts +6 -0
- package/dist/elements/duration.d.ts.map +1 -0
- package/dist/elements/duration.js +23 -0
- package/dist/elements/duration.js.map +1 -0
- package/dist/elements/error-screen.d.ts +17 -0
- package/dist/elements/error-screen.d.ts.map +1 -0
- package/dist/elements/error-screen.js +103 -0
- package/dist/elements/error-screen.js.map +1 -0
- package/dist/elements/fullscreen-button.d.ts +19 -0
- package/dist/elements/fullscreen-button.d.ts.map +1 -0
- package/dist/elements/fullscreen-button.js +55 -0
- package/dist/elements/fullscreen-button.js.map +1 -0
- package/dist/elements/live-button.d.ts +12 -0
- package/dist/elements/live-button.d.ts.map +1 -0
- package/dist/elements/live-button.js +96 -0
- package/dist/elements/live-button.js.map +1 -0
- package/dist/elements/menu-element.d.ts +22 -0
- package/dist/elements/menu-element.d.ts.map +1 -0
- package/dist/elements/menu-element.js +31 -0
- package/dist/elements/menu-element.js.map +1 -0
- package/dist/elements/mute-button.d.ts +12 -0
- package/dist/elements/mute-button.d.ts.map +1 -0
- package/dist/elements/mute-button.js +61 -0
- package/dist/elements/mute-button.js.map +1 -0
- package/dist/elements/panels.d.ts +15 -0
- package/dist/elements/panels.d.ts.map +1 -0
- package/dist/elements/panels.js +55 -0
- package/dist/elements/panels.js.map +1 -0
- package/dist/elements/pip-button.d.ts +13 -0
- package/dist/elements/pip-button.d.ts.map +1 -0
- package/dist/elements/pip-button.js +56 -0
- package/dist/elements/pip-button.js.map +1 -0
- package/dist/elements/play-button.d.ts +12 -0
- package/dist/elements/play-button.d.ts.map +1 -0
- package/dist/elements/play-button.js +60 -0
- package/dist/elements/play-button.js.map +1 -0
- package/dist/elements/quality-menu.d.ts +11 -0
- package/dist/elements/quality-menu.d.ts.map +1 -0
- package/dist/elements/quality-menu.js +72 -0
- package/dist/elements/quality-menu.js.map +1 -0
- package/dist/elements/remaining-time.d.ts +6 -0
- package/dist/elements/remaining-time.d.ts.map +1 -0
- package/dist/elements/remaining-time.js +26 -0
- package/dist/elements/remaining-time.js.map +1 -0
- package/dist/elements/seek-bar.d.ts +83 -0
- package/dist/elements/seek-bar.d.ts.map +1 -0
- package/dist/elements/seek-bar.js +352 -0
- package/dist/elements/seek-bar.js.map +1 -0
- package/dist/elements/shared.d.ts +27 -0
- package/dist/elements/shared.d.ts.map +1 -0
- package/dist/elements/shared.js +155 -0
- package/dist/elements/shared.js.map +1 -0
- package/dist/elements/skip-button.d.ts +14 -0
- package/dist/elements/skip-button.d.ts.map +1 -0
- package/dist/elements/skip-button.js +60 -0
- package/dist/elements/skip-button.js.map +1 -0
- package/dist/elements/spacer.d.ts +4 -0
- package/dist/elements/spacer.d.ts.map +1 -0
- package/dist/elements/spacer.js +9 -0
- package/dist/elements/spacer.js.map +1 -0
- package/dist/elements/speed-menu.d.ts +18 -0
- package/dist/elements/speed-menu.d.ts.map +1 -0
- package/dist/elements/speed-menu.js +56 -0
- package/dist/elements/speed-menu.js.map +1 -0
- package/dist/elements/start-button.d.ts +23 -0
- package/dist/elements/start-button.d.ts.map +1 -0
- package/dist/elements/start-button.js +120 -0
- package/dist/elements/start-button.js.map +1 -0
- package/dist/elements/subtitles-menu.d.ts +17 -0
- package/dist/elements/subtitles-menu.d.ts.map +1 -0
- package/dist/elements/subtitles-menu.js +108 -0
- package/dist/elements/subtitles-menu.js.map +1 -0
- package/dist/elements/time-element.d.ts +14 -0
- package/dist/elements/time-element.d.ts.map +1 -0
- package/dist/elements/time-element.js +29 -0
- package/dist/elements/time-element.js.map +1 -0
- package/dist/elements/volume-slider.d.ts +10 -0
- package/dist/elements/volume-slider.d.ts.map +1 -0
- package/dist/elements/volume-slider.js +46 -0
- package/dist/elements/volume-slider.js.map +1 -0
- package/dist/elements/volume.d.ts +9 -0
- package/dist/elements/volume.d.ts.map +1 -0
- package/dist/elements/volume.js +52 -0
- package/dist/elements/volume.js.map +1 -0
- package/dist/entries/audio-menu.d.ts +5 -0
- package/dist/entries/audio-menu.d.ts.map +1 -0
- package/dist/entries/audio-menu.js +8 -0
- package/dist/entries/audio-menu.js.map +1 -0
- package/dist/entries/chapters-menu.d.ts +5 -0
- package/dist/entries/chapters-menu.d.ts.map +1 -0
- package/dist/entries/chapters-menu.js +9 -0
- package/dist/entries/chapters-menu.js.map +1 -0
- package/dist/entries/control-bar.d.ts +5 -0
- package/dist/entries/control-bar.d.ts.map +1 -0
- package/dist/entries/control-bar.js +8 -0
- package/dist/entries/control-bar.js.map +1 -0
- package/dist/entries/current-time.d.ts +5 -0
- package/dist/entries/current-time.d.ts.map +1 -0
- package/dist/entries/current-time.js +8 -0
- package/dist/entries/current-time.js.map +1 -0
- package/dist/entries/drm-badge.d.ts +5 -0
- package/dist/entries/drm-badge.d.ts.map +1 -0
- package/dist/entries/drm-badge.js +8 -0
- package/dist/entries/drm-badge.js.map +1 -0
- package/dist/entries/duration.d.ts +5 -0
- package/dist/entries/duration.d.ts.map +1 -0
- package/dist/entries/duration.js +8 -0
- package/dist/entries/duration.js.map +1 -0
- package/dist/entries/error-screen.d.ts +5 -0
- package/dist/entries/error-screen.d.ts.map +1 -0
- package/dist/entries/error-screen.js +8 -0
- package/dist/entries/error-screen.js.map +1 -0
- package/dist/entries/fullscreen-button.d.ts +5 -0
- package/dist/entries/fullscreen-button.d.ts.map +1 -0
- package/dist/entries/fullscreen-button.js +8 -0
- package/dist/entries/fullscreen-button.js.map +1 -0
- package/dist/entries/live-button.d.ts +5 -0
- package/dist/entries/live-button.d.ts.map +1 -0
- package/dist/entries/live-button.js +8 -0
- package/dist/entries/live-button.js.map +1 -0
- package/dist/entries/mute-button.d.ts +5 -0
- package/dist/entries/mute-button.d.ts.map +1 -0
- package/dist/entries/mute-button.js +8 -0
- package/dist/entries/mute-button.js.map +1 -0
- package/dist/entries/panels.d.ts +5 -0
- package/dist/entries/panels.d.ts.map +1 -0
- package/dist/entries/panels.js +8 -0
- package/dist/entries/panels.js.map +1 -0
- package/dist/entries/pip-button.d.ts +5 -0
- package/dist/entries/pip-button.d.ts.map +1 -0
- package/dist/entries/pip-button.js +8 -0
- package/dist/entries/pip-button.js.map +1 -0
- package/dist/entries/play-button.d.ts +5 -0
- package/dist/entries/play-button.d.ts.map +1 -0
- package/dist/entries/play-button.js +8 -0
- package/dist/entries/play-button.js.map +1 -0
- package/dist/entries/quality-menu.d.ts +5 -0
- package/dist/entries/quality-menu.d.ts.map +1 -0
- package/dist/entries/quality-menu.js +8 -0
- package/dist/entries/quality-menu.js.map +1 -0
- package/dist/entries/remaining-time.d.ts +5 -0
- package/dist/entries/remaining-time.d.ts.map +1 -0
- package/dist/entries/remaining-time.js +9 -0
- package/dist/entries/remaining-time.js.map +1 -0
- package/dist/entries/seek-bar.d.ts +5 -0
- package/dist/entries/seek-bar.d.ts.map +1 -0
- package/dist/entries/seek-bar.js +8 -0
- package/dist/entries/seek-bar.js.map +1 -0
- package/dist/entries/skip-button.d.ts +5 -0
- package/dist/entries/skip-button.d.ts.map +1 -0
- package/dist/entries/skip-button.js +8 -0
- package/dist/entries/skip-button.js.map +1 -0
- package/dist/entries/spacer.d.ts +5 -0
- package/dist/entries/spacer.d.ts.map +1 -0
- package/dist/entries/spacer.js +8 -0
- package/dist/entries/spacer.js.map +1 -0
- package/dist/entries/speed-menu.d.ts +5 -0
- package/dist/entries/speed-menu.d.ts.map +1 -0
- package/dist/entries/speed-menu.js +8 -0
- package/dist/entries/speed-menu.js.map +1 -0
- package/dist/entries/start-button.d.ts +5 -0
- package/dist/entries/start-button.d.ts.map +1 -0
- package/dist/entries/start-button.js +8 -0
- package/dist/entries/start-button.js.map +1 -0
- package/dist/entries/subtitles-menu.d.ts +5 -0
- package/dist/entries/subtitles-menu.d.ts.map +1 -0
- package/dist/entries/subtitles-menu.js +8 -0
- package/dist/entries/subtitles-menu.js.map +1 -0
- package/dist/entries/volume-slider.d.ts +5 -0
- package/dist/entries/volume-slider.d.ts.map +1 -0
- package/dist/entries/volume-slider.js +8 -0
- package/dist/entries/volume-slider.js.map +1 -0
- package/dist/entries/volume.d.ts +7 -0
- package/dist/entries/volume.d.ts.map +1 -0
- package/dist/entries/volume.js +10 -0
- package/dist/entries/volume.js.map +1 -0
- package/dist/es2015/compose.js +33 -0
- package/dist/es2015/controls/chapters.js +61 -0
- package/dist/es2015/controls/cues.js +39 -11
- package/dist/es2015/controls/fullscreen.js +25 -23
- package/dist/es2015/controls/icons.js +5 -9
- package/dist/es2015/controls/menu.js +39 -35
- package/dist/es2015/controls/session.js +40 -0
- package/dist/es2015/controls/slider.js +18 -13
- package/dist/es2015/controls/time.js +1 -5
- package/dist/es2015/dom.js +5 -25
- package/dist/es2015/element-entry.js +10 -0
- package/dist/es2015/element.js +118 -65
- package/dist/es2015/elements/audio-menu.js +68 -0
- package/dist/es2015/elements/chapters-menu.js +68 -0
- package/dist/es2015/elements/component.js +85 -0
- package/dist/es2015/elements/control-bar.js +299 -0
- package/dist/es2015/elements/current-time.js +27 -0
- package/dist/es2015/elements/drm-badge.js +138 -0
- package/dist/es2015/elements/duration.js +23 -0
- package/dist/es2015/elements/error-screen.js +97 -0
- package/dist/es2015/elements/fullscreen-button.js +49 -0
- package/dist/es2015/elements/live-button.js +97 -0
- package/dist/es2015/elements/menu-element.js +39 -0
- package/dist/es2015/elements/mute-button.js +60 -0
- package/dist/es2015/elements/panels.js +52 -0
- package/dist/es2015/elements/pip-button.js +56 -0
- package/dist/es2015/elements/play-button.js +68 -0
- package/dist/es2015/elements/quality-menu.js +68 -0
- package/dist/es2015/elements/remaining-time.js +26 -0
- package/dist/es2015/elements/seek-bar.js +314 -0
- package/dist/es2015/elements/shared.js +155 -0
- package/dist/es2015/elements/skip-button.js +59 -0
- package/dist/es2015/elements/spacer.js +11 -0
- package/dist/es2015/elements/speed-menu.js +60 -0
- package/dist/es2015/elements/start-button.js +124 -0
- package/dist/es2015/elements/subtitles-menu.js +103 -0
- package/dist/es2015/elements/time-element.js +38 -0
- package/dist/es2015/elements/volume-slider.js +47 -0
- package/dist/es2015/elements/volume.js +52 -0
- package/dist/es2015/entries/audio-menu.js +7 -0
- package/dist/es2015/entries/chapters-menu.js +7 -0
- package/dist/es2015/entries/control-bar.js +7 -0
- package/dist/es2015/entries/current-time.js +7 -0
- package/dist/es2015/entries/drm-badge.js +7 -0
- package/dist/es2015/entries/duration.js +7 -0
- package/dist/es2015/entries/error-screen.js +7 -0
- package/dist/es2015/entries/fullscreen-button.js +7 -0
- package/dist/es2015/entries/live-button.js +7 -0
- package/dist/es2015/entries/mute-button.js +7 -0
- package/dist/es2015/entries/panels.js +7 -0
- package/dist/es2015/entries/pip-button.js +7 -0
- package/dist/es2015/entries/play-button.js +7 -0
- package/dist/es2015/entries/quality-menu.js +7 -0
- package/dist/es2015/entries/remaining-time.js +7 -0
- package/dist/es2015/entries/seek-bar.js +7 -0
- package/dist/es2015/entries/skip-button.js +7 -0
- package/dist/es2015/entries/spacer.js +7 -0
- package/dist/es2015/entries/speed-menu.js +7 -0
- package/dist/es2015/entries/start-button.js +7 -0
- package/dist/es2015/entries/subtitles-menu.js +7 -0
- package/dist/es2015/entries/volume-slider.js +7 -0
- package/dist/es2015/entries/volume.js +9 -0
- package/dist/es2015/host.js +23 -0
- package/dist/es2015/index.js +48 -9
- package/dist/es2015/labels.js +14 -0
- package/dist/es2015/style.js +40 -292
- package/dist/es2015/{panels/error.js → surface.js} +3 -3
- package/dist/es2015/tags.js +28 -0
- package/dist/host.d.ts +26 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +23 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +84 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -8
- package/dist/index.js.map +1 -1
- package/dist/labels.d.ts +7 -0
- package/dist/labels.d.ts.map +1 -0
- package/dist/labels.js +12 -0
- package/dist/labels.js.map +1 -0
- package/dist/style.d.ts +10 -2
- package/dist/style.d.ts.map +1 -1
- package/dist/style.js +40 -292
- package/dist/style.js.map +1 -1
- package/dist/surface.d.ts +15 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/{panels/error.js → surface.js} +3 -3
- package/dist/surface.js.map +1 -0
- package/dist/tags.d.ts +26 -0
- package/dist/tags.d.ts.map +1 -0
- package/dist/tags.js +26 -0
- package/dist/tags.js.map +1 -0
- package/package.json +22 -2
- package/dist/controls/bar.d.ts +0 -56
- package/dist/controls/bar.d.ts.map +0 -1
- package/dist/controls/bar.js +0 -245
- package/dist/controls/bar.js.map +0 -1
- package/dist/controls/buttons.d.ts +0 -13
- package/dist/controls/buttons.d.ts.map +0 -1
- package/dist/controls/buttons.js +0 -157
- package/dist/controls/buttons.js.map +0 -1
- package/dist/controls/control.d.ts +0 -12
- package/dist/controls/control.d.ts.map +0 -1
- package/dist/controls/control.js +0 -2
- package/dist/controls/control.js.map +0 -1
- package/dist/controls/keys.d.ts +0 -26
- package/dist/controls/keys.d.ts.map +0 -1
- package/dist/controls/keys.js +0 -66
- package/dist/controls/keys.js.map +0 -1
- package/dist/controls/live.d.ts +0 -10
- package/dist/controls/live.d.ts.map +0 -1
- package/dist/controls/live.js +0 -59
- package/dist/controls/live.js.map +0 -1
- package/dist/controls/menus.d.ts +0 -43
- package/dist/controls/menus.d.ts.map +0 -1
- package/dist/controls/menus.js +0 -262
- package/dist/controls/menus.js.map +0 -1
- package/dist/controls/options.d.ts +0 -44
- package/dist/controls/options.d.ts.map +0 -1
- package/dist/controls/options.js +0 -54
- package/dist/controls/options.js.map +0 -1
- package/dist/controls/screens.d.ts +0 -22
- package/dist/controls/screens.d.ts.map +0 -1
- package/dist/controls/screens.js +0 -69
- package/dist/controls/screens.js.map +0 -1
- package/dist/controls/seek.d.ts +0 -52
- package/dist/controls/seek.d.ts.map +0 -1
- package/dist/controls/seek.js +0 -215
- package/dist/controls/seek.js.map +0 -1
- package/dist/controls/speed.d.ts +0 -8
- package/dist/controls/speed.d.ts.map +0 -1
- package/dist/controls/speed.js +0 -34
- package/dist/controls/speed.js.map +0 -1
- package/dist/controls/volume.d.ts +0 -8
- package/dist/controls/volume.d.ts.map +0 -1
- package/dist/controls/volume.js +0 -29
- package/dist/controls/volume.js.map +0 -1
- package/dist/es2015/controls/bar.js +0 -227
- package/dist/es2015/controls/buttons.js +0 -146
- package/dist/es2015/controls/keys.js +0 -60
- package/dist/es2015/controls/live.js +0 -60
- package/dist/es2015/controls/menus.js +0 -258
- package/dist/es2015/controls/options.js +0 -46
- package/dist/es2015/controls/screens.js +0 -74
- package/dist/es2015/controls/seek.js +0 -203
- package/dist/es2015/controls/speed.js +0 -41
- package/dist/es2015/controls/volume.js +0 -30
- package/dist/es2015/panels/drm.js +0 -29
- package/dist/es2015/panels/live.js +0 -48
- package/dist/es2015/panels/quality.js +0 -52
- package/dist/es2015/panels/tracks.js +0 -47
- package/dist/panels/drm.d.ts +0 -8
- package/dist/panels/drm.d.ts.map +0 -1
- package/dist/panels/drm.js +0 -36
- package/dist/panels/drm.js.map +0 -1
- package/dist/panels/error.d.ts +0 -13
- package/dist/panels/error.d.ts.map +0 -1
- package/dist/panels/error.js.map +0 -1
- package/dist/panels/live.d.ts +0 -3
- package/dist/panels/live.d.ts.map +0 -1
- package/dist/panels/live.js +0 -56
- package/dist/panels/live.js.map +0 -1
- package/dist/panels/panel.d.ts +0 -13
- package/dist/panels/panel.d.ts.map +0 -1
- package/dist/panels/panel.js +0 -2
- package/dist/panels/panel.js.map +0 -1
- package/dist/panels/quality.d.ts +0 -3
- package/dist/panels/quality.d.ts.map +0 -1
- package/dist/panels/quality.js +0 -59
- package/dist/panels/quality.js.map +0 -1
- package/dist/panels/tracks.d.ts +0 -3
- package/dist/panels/tracks.d.ts.map +0 -1
- package/dist/panels/tracks.js +0 -49
- package/dist/panels/tracks.js.map +0 -1
package/dist/es2015/element.js
CHANGED
|
@@ -1,23 +1,19 @@
|
|
|
1
|
+
import { CONTROL_BAR, PANELS, PLAYER } from "./tags.js";
|
|
2
|
+
import { composeBar, composePanels } from "./compose.js";
|
|
1
3
|
import { namespaces } from "./namespaces.js";
|
|
2
|
-
import { ATTRIBUTES, resolve } from "./controls/options.js";
|
|
3
|
-
import { controlBar } from "./controls/bar.js";
|
|
4
|
-
import { drmPanel } from "./panels/drm.js";
|
|
5
|
-
import { errorSurface } from "./panels/error.js";
|
|
6
|
-
import { livePanel } from "./panels/live.js";
|
|
7
|
-
import { qualityPanel } from "./panels/quality.js";
|
|
8
|
-
import { tracksPanel } from "./panels/tracks.js";
|
|
9
4
|
import _asyncToGenerator from "./_virtual/_@oxc-project_runtime@0.148.0/helpers/esm/asyncToGenerator.js";
|
|
10
5
|
import { drmGuard, resolvePreset } from "./presets.js";
|
|
11
6
|
import { STYLE } from "./style.js";
|
|
7
|
+
import { errorSurface } from "./surface.js";
|
|
12
8
|
import _objectSpread2 from "./_virtual/_@oxc-project_runtime@0.148.0/helpers/esm/objectSpread2.js";
|
|
13
9
|
import { createPlayer, matteboxHandler, nativeHandler } from "@mattebox/player-core";
|
|
14
10
|
//#region src/element.ts
|
|
15
|
-
const TAG = "mattebox-player";
|
|
16
11
|
/** Attributes forwarded onto the video as attributes, never as properties. */
|
|
17
12
|
const FORWARDED = [
|
|
18
13
|
"autoplay",
|
|
19
14
|
"muted",
|
|
20
|
-
"poster"
|
|
15
|
+
"poster",
|
|
16
|
+
"crossorigin"
|
|
21
17
|
];
|
|
22
18
|
/** Everything else the element watches. Changing any of them reloads. */
|
|
23
19
|
const OWN = [
|
|
@@ -28,20 +24,28 @@ const OWN = [
|
|
|
28
24
|
"thumbnails"
|
|
29
25
|
];
|
|
30
26
|
/**
|
|
27
|
+
* The chapters track URL. A `<track kind="chapters">` on the video, hidden
|
|
28
|
+
* so its cues load and nothing is drawn: chapters are the browser's own
|
|
29
|
+
* text track, which the seek bar and the chapters menu read, and which a
|
|
30
|
+
* page can also put there itself. Changing it swaps the track and never
|
|
31
|
+
* reloads the source.
|
|
32
|
+
*/
|
|
33
|
+
const CHAPTERS = "chapters";
|
|
34
|
+
/**
|
|
31
35
|
* The one attribute whose meaning the element owns: `native` keeps the
|
|
32
36
|
* browser's controls on the video, `custom` swaps them for the bar, `none`
|
|
33
37
|
* leaves the video bare for a page that draws its own. Anything else is
|
|
34
38
|
* `native`. Changing it swaps the bar without touching the session.
|
|
35
39
|
*/
|
|
36
40
|
const CONTROLS = "controls";
|
|
37
|
-
/** The
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
41
|
+
/** The video's state, as attributes on the element, read on the events the video fires for it. */
|
|
42
|
+
const STATE_EVENTS = [
|
|
43
|
+
"play",
|
|
44
|
+
"pause",
|
|
45
|
+
"ended",
|
|
46
|
+
"emptied",
|
|
47
|
+
"volumechange",
|
|
48
|
+
"loadedmetadata"
|
|
45
49
|
];
|
|
46
50
|
/** Every stage the engine ships. A narrower preset is optimization. */
|
|
47
51
|
const DEFAULT_PRESET = "full";
|
|
@@ -63,39 +67,51 @@ var MatteboxPlayerElement = class MatteboxPlayerElement extends HTMLElement {
|
|
|
63
67
|
...FORWARDED,
|
|
64
68
|
...OWN,
|
|
65
69
|
CONTROLS,
|
|
66
|
-
|
|
70
|
+
CHAPTERS
|
|
67
71
|
];
|
|
68
72
|
}
|
|
69
|
-
/**
|
|
73
|
+
/**
|
|
74
|
+
* Registers the element once, and records the stages markup-only pages
|
|
75
|
+
* get. The controls register through their own entries, the package's
|
|
76
|
+
* root entry importing every one; a control connected before its player
|
|
77
|
+
* is defined waits for the definition.
|
|
78
|
+
*/
|
|
70
79
|
static define(options) {
|
|
71
80
|
if (options !== void 0) defaults = options;
|
|
72
|
-
if (customElements.get(
|
|
81
|
+
if (customElements.get("mattebox-player") === void 0) customElements.define(PLAYER, MatteboxPlayerElement);
|
|
73
82
|
}
|
|
74
83
|
constructor(options) {
|
|
75
84
|
super();
|
|
76
85
|
this.options = options !== null && options !== void 0 ? options : defaults;
|
|
77
|
-
this.
|
|
78
|
-
this.
|
|
86
|
+
this.composed = [];
|
|
87
|
+
this.settled = false;
|
|
79
88
|
this.focusable = false;
|
|
89
|
+
this.track = null;
|
|
80
90
|
this.core = null;
|
|
81
91
|
this.current = null;
|
|
92
|
+
this.failure = null;
|
|
93
|
+
this.reflecting = false;
|
|
82
94
|
this.offs = [];
|
|
83
95
|
this.queue = Promise.resolve();
|
|
84
96
|
this.pending = false;
|
|
85
97
|
this.media = document.createElement("video");
|
|
86
98
|
this.media.controls = true;
|
|
99
|
+
for (const name of STATE_EVENTS) this.media.addEventListener(name, () => {
|
|
100
|
+
this.reflect();
|
|
101
|
+
});
|
|
102
|
+
this.media.addEventListener("playing", () => {
|
|
103
|
+
this.failure = null;
|
|
104
|
+
});
|
|
87
105
|
this.stage = document.createElement("div");
|
|
88
106
|
this.stage.setAttribute("part", "stage");
|
|
89
107
|
this.stage.append(document.createElement("slot"));
|
|
90
|
-
this.bar = document.createElement("div");
|
|
91
|
-
this.bar.setAttribute("part", "panels");
|
|
92
108
|
this.surface = errorSurface(() => {
|
|
93
109
|
this.reload();
|
|
94
110
|
});
|
|
95
111
|
const root = this.attachShadow({ mode: "open" });
|
|
96
112
|
const style = document.createElement("style");
|
|
97
113
|
style.textContent = STYLE;
|
|
98
|
-
root.append(style, this.stage, this.
|
|
114
|
+
root.append(style, this.stage, this.surface.root);
|
|
99
115
|
}
|
|
100
116
|
/** The media element. Everything the browser already does is here. */
|
|
101
117
|
get video() {
|
|
@@ -110,57 +126,104 @@ var MatteboxPlayerElement = class MatteboxPlayerElement extends HTMLElement {
|
|
|
110
126
|
var _this$current$engine, _this$current;
|
|
111
127
|
return (_this$current$engine = (_this$current = this.current) === null || _this$current === void 0 ? void 0 : _this$current.engine) !== null && _this$current$engine !== void 0 ? _this$current$engine : null;
|
|
112
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* The fatal error of the current load, or null once a load starts or
|
|
131
|
+
* playback resumes. The `error` event says when; this says what, for a
|
|
132
|
+
* control that attaches after the event, such as the default composition
|
|
133
|
+
* behind a source that fails while the page is still parsing.
|
|
134
|
+
*/
|
|
135
|
+
get error() {
|
|
136
|
+
return this.failure;
|
|
137
|
+
}
|
|
113
138
|
connectedCallback() {
|
|
114
139
|
if (this.media.parentNode !== this) this.append(this.media);
|
|
115
140
|
for (const name of FORWARDED) this.forward(name);
|
|
141
|
+
this.reflect();
|
|
142
|
+
if (!this.settled) this.settle();
|
|
116
143
|
this.reload();
|
|
117
144
|
}
|
|
145
|
+
/** Decides on the default composition once the children are all in, then on every mode change. */
|
|
146
|
+
settle() {
|
|
147
|
+
const done = () => {
|
|
148
|
+
this.settled = true;
|
|
149
|
+
this.mode();
|
|
150
|
+
};
|
|
151
|
+
if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", done, { once: true });
|
|
152
|
+
else queueMicrotask(done);
|
|
153
|
+
}
|
|
154
|
+
/** The video's state on the element, for `mattebox-player[paused]` and the like. */
|
|
155
|
+
reflect() {
|
|
156
|
+
const video = this.media;
|
|
157
|
+
this.reflecting = true;
|
|
158
|
+
this.toggleAttribute("paused", video.paused);
|
|
159
|
+
this.toggleAttribute("playing", !video.paused);
|
|
160
|
+
this.toggleAttribute("ended", video.ended);
|
|
161
|
+
this.toggleAttribute("muted", video.muted);
|
|
162
|
+
this.reflecting = false;
|
|
163
|
+
}
|
|
118
164
|
disconnectedCallback() {
|
|
119
165
|
this.enqueue(() => this.teardown());
|
|
120
166
|
}
|
|
121
167
|
attributeChangedCallback(name) {
|
|
122
168
|
if (FORWARDED.includes(name)) {
|
|
123
|
-
this.forward(name);
|
|
169
|
+
if (!this.reflecting) this.forward(name);
|
|
124
170
|
return;
|
|
125
171
|
}
|
|
126
|
-
if (name === CONTROLS
|
|
172
|
+
if (name === CONTROLS) {
|
|
127
173
|
this.mode();
|
|
128
174
|
return;
|
|
129
175
|
}
|
|
176
|
+
if (name === CHAPTERS) {
|
|
177
|
+
this.chapters();
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
130
180
|
if (name === "preset") this.enqueue(() => this.discard());
|
|
131
181
|
this.reload();
|
|
132
182
|
}
|
|
133
183
|
/**
|
|
134
|
-
* Applies the `controls` attribute
|
|
135
|
-
*
|
|
136
|
-
*
|
|
184
|
+
* Applies the `controls` attribute: the video's own controls, the
|
|
185
|
+
* tabindex, and the default composition for the mode where the page
|
|
186
|
+
* wrote none. The controls themselves are elements and attach on their own.
|
|
137
187
|
*/
|
|
138
188
|
mode() {
|
|
139
189
|
const value = this.getAttribute(CONTROLS);
|
|
140
190
|
const custom = value === "custom";
|
|
141
191
|
this.media.controls = !custom && value !== "none";
|
|
142
|
-
this.
|
|
143
|
-
if (
|
|
144
|
-
this.controls.dispose();
|
|
145
|
-
this.controls = null;
|
|
146
|
-
this.removeAttribute("fullscreen");
|
|
192
|
+
if (custom) this.surface.clear();
|
|
193
|
+
if (!custom) {
|
|
147
194
|
if (this.focusable) this.removeAttribute("tabindex");
|
|
148
195
|
this.focusable = false;
|
|
149
|
-
}
|
|
150
|
-
if (!custom) return;
|
|
151
|
-
if (!this.hasAttribute("tabindex")) {
|
|
196
|
+
} else if (!this.hasAttribute("tabindex")) {
|
|
152
197
|
this.tabIndex = 0;
|
|
153
198
|
this.focusable = true;
|
|
154
199
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
200
|
+
if (!this.settled) return;
|
|
201
|
+
for (const node of this.composed) node.remove();
|
|
202
|
+
this.composed = [];
|
|
203
|
+
const own = custom ? CONTROL_BAR : PANELS;
|
|
204
|
+
if (this.querySelector(`:scope > ${own}`) === null) {
|
|
205
|
+
this.composed = custom ? composeBar() : composePanels();
|
|
206
|
+
this.append(...this.composed);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/** Keeps a hidden chapters track on the video for the `chapters` attribute, or none. */
|
|
210
|
+
chapters() {
|
|
211
|
+
const url = this.getAttribute(CHAPTERS);
|
|
212
|
+
if (url === null) {
|
|
213
|
+
var _this$track;
|
|
214
|
+
(_this$track = this.track) === null || _this$track === void 0 || _this$track.remove();
|
|
215
|
+
this.track = null;
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
const held = this.track;
|
|
219
|
+
if (held !== null && held.parentNode === this.media && held.getAttribute("src") === url) return;
|
|
220
|
+
held === null || held === void 0 || held.remove();
|
|
221
|
+
const track = document.createElement("track");
|
|
222
|
+
track.kind = "chapters";
|
|
223
|
+
track.src = url;
|
|
224
|
+
this.track = track;
|
|
225
|
+
this.media.append(track);
|
|
226
|
+
track.track.mode = "hidden";
|
|
164
227
|
}
|
|
165
228
|
forward(name) {
|
|
166
229
|
const value = this.getAttribute(name);
|
|
@@ -193,15 +256,14 @@ var MatteboxPlayerElement = class MatteboxPlayerElement extends HTMLElement {
|
|
|
193
256
|
}
|
|
194
257
|
report(error) {
|
|
195
258
|
if (error.fatal) {
|
|
196
|
-
|
|
197
|
-
|
|
259
|
+
this.failure = error;
|
|
260
|
+
if (this.getAttribute(CONTROLS) !== "custom") this.surface.show(error);
|
|
198
261
|
}
|
|
199
262
|
this.emit("error", error);
|
|
200
263
|
}
|
|
201
264
|
run() {
|
|
202
265
|
var _this = this;
|
|
203
266
|
return _asyncToGenerator(function* () {
|
|
204
|
-
var _this$controls, _this$controls2;
|
|
205
267
|
_this.unmount();
|
|
206
268
|
if (!_this.isConnected) return;
|
|
207
269
|
const url = _this.getAttribute("src");
|
|
@@ -212,8 +274,8 @@ var MatteboxPlayerElement = class MatteboxPlayerElement extends HTMLElement {
|
|
|
212
274
|
url,
|
|
213
275
|
type
|
|
214
276
|
};
|
|
277
|
+
_this.failure = null;
|
|
215
278
|
_this.surface.clear();
|
|
216
|
-
(_this$controls = _this.controls) === null || _this$controls === void 0 || _this$controls.clearError();
|
|
217
279
|
let session;
|
|
218
280
|
try {
|
|
219
281
|
session = yield core.load(source);
|
|
@@ -226,13 +288,7 @@ var MatteboxPlayerElement = class MatteboxPlayerElement extends HTMLElement {
|
|
|
226
288
|
}
|
|
227
289
|
_this.current = session;
|
|
228
290
|
_this.configure(session);
|
|
229
|
-
|
|
230
|
-
for (const factory of PANELS) {
|
|
231
|
-
const panel = factory(session, _this.media);
|
|
232
|
-
if (panel === null) continue;
|
|
233
|
-
_this.panels.push(panel);
|
|
234
|
-
_this.bar.append(panel.root);
|
|
235
|
-
}
|
|
291
|
+
_this.chapters();
|
|
236
292
|
})();
|
|
237
293
|
}
|
|
238
294
|
ensure() {
|
|
@@ -241,6 +297,7 @@ var MatteboxPlayerElement = class MatteboxPlayerElement extends HTMLElement {
|
|
|
241
297
|
if (_this2.core !== null) return _this2.core;
|
|
242
298
|
const core = createPlayer(_this2.media, { handlers: yield _this2.chain() });
|
|
243
299
|
_this2.offs.push(core.on("sourcechange", (session) => {
|
|
300
|
+
_this2.current = session;
|
|
244
301
|
_this2.emit("sourcechange", session);
|
|
245
302
|
}), core.on("error", (error) => {
|
|
246
303
|
_this2.report(error);
|
|
@@ -254,7 +311,8 @@ var MatteboxPlayerElement = class MatteboxPlayerElement extends HTMLElement {
|
|
|
254
311
|
return _asyncToGenerator(function* () {
|
|
255
312
|
var _this$getAttribute;
|
|
256
313
|
if (_this3.options.handlers !== void 0) return _this3.options.handlers;
|
|
257
|
-
|
|
314
|
+
const config = _this3.options.config === void 0 ? {} : { config: _this3.options.config };
|
|
315
|
+
if (_this3.options.stages !== void 0) return [matteboxHandler(_objectSpread2({ stages: _this3.options.stages }, config)), nativeHandler()];
|
|
258
316
|
const name = (_this$getAttribute = _this3.getAttribute("preset")) !== null && _this$getAttribute !== void 0 ? _this$getAttribute : DEFAULT_PRESET;
|
|
259
317
|
const preset = yield resolvePreset(name);
|
|
260
318
|
if (preset === null) {
|
|
@@ -268,7 +326,7 @@ var MatteboxPlayerElement = class MatteboxPlayerElement extends HTMLElement {
|
|
|
268
326
|
});
|
|
269
327
|
return [nativeHandler()];
|
|
270
328
|
}
|
|
271
|
-
return [matteboxHandler(_objectSpread2({ preset }, drmGuard())), nativeHandler()];
|
|
329
|
+
return [matteboxHandler(_objectSpread2(_objectSpread2({ preset }, config), drmGuard())), nativeHandler()];
|
|
272
330
|
})();
|
|
273
331
|
}
|
|
274
332
|
/** What the attributes ask of the session's namespaces, once there is one. */
|
|
@@ -282,11 +340,6 @@ var MatteboxPlayerElement = class MatteboxPlayerElement extends HTMLElement {
|
|
|
282
340
|
if (track !== null && optional.thumbnails !== void 0) optional.thumbnails.load(track).catch(() => void 0);
|
|
283
341
|
}
|
|
284
342
|
unmount() {
|
|
285
|
-
var _this$controls3;
|
|
286
|
-
(_this$controls3 = this.controls) === null || _this$controls3 === void 0 || _this$controls3.detach();
|
|
287
|
-
for (const panel of this.panels) panel.dispose();
|
|
288
|
-
this.panels = [];
|
|
289
|
-
this.bar.replaceChildren();
|
|
290
343
|
this.current = null;
|
|
291
344
|
}
|
|
292
345
|
teardown() {
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { show } from "./shared.js";
|
|
2
|
+
import { MenuElement, single } from "./menu-element.js";
|
|
3
|
+
//#region src/elements/audio-menu.ts
|
|
4
|
+
/** The language, then the role, then the id: whichever the manifest gave. */
|
|
5
|
+
function trackLabel(track) {
|
|
6
|
+
const parts = [track.lang, track.role].filter((part) => part !== void 0);
|
|
7
|
+
return parts.length === 0 ? track.id : parts.join(" · ");
|
|
8
|
+
}
|
|
9
|
+
/** The tracks of one content type as menu items, with the active one's id. */
|
|
10
|
+
function trackItems(engine, contentType) {
|
|
11
|
+
var _tracks$active$id, _tracks$active;
|
|
12
|
+
const tracks = engine.tracks;
|
|
13
|
+
const available = tracks.available.filter((track) => track.contentType === contentType);
|
|
14
|
+
const items = [];
|
|
15
|
+
for (const track of available) items.push([track.id, trackLabel(track)]);
|
|
16
|
+
return [items, (_tracks$active$id = (_tracks$active = tracks.active(contentType)) === null || _tracks$active === void 0 ? void 0 : _tracks$active.id) !== null && _tracks$active$id !== void 0 ? _tracks$active$id : null];
|
|
17
|
+
}
|
|
18
|
+
/** Subscribes `tick` to the track events, and answers the unsubscribe. */
|
|
19
|
+
function onTracks(engine, tick) {
|
|
20
|
+
const offs = [engine.on("tracks:changed", tick), engine.on("tracks:selected", tick)];
|
|
21
|
+
return () => {
|
|
22
|
+
for (const off of offs) off();
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
var MbxAudioMenu = class extends MenuElement {
|
|
26
|
+
static get observedAttributes() {
|
|
27
|
+
return ["label", "label-back"];
|
|
28
|
+
}
|
|
29
|
+
constructor() {
|
|
30
|
+
super(...single("music"));
|
|
31
|
+
this.engine = null;
|
|
32
|
+
show(this.slots, "default");
|
|
33
|
+
}
|
|
34
|
+
name() {
|
|
35
|
+
return "Audio";
|
|
36
|
+
}
|
|
37
|
+
attach(player) {
|
|
38
|
+
this.follow(player, (engine) => {
|
|
39
|
+
this.engine = engine;
|
|
40
|
+
this.render();
|
|
41
|
+
if (engine === null) return void 0;
|
|
42
|
+
return onTracks(engine, () => {
|
|
43
|
+
this.render();
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
render() {
|
|
48
|
+
super.render();
|
|
49
|
+
const engine = this.engine;
|
|
50
|
+
if (engine === null) {
|
|
51
|
+
this.hidden = true;
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const [items, active] = trackItems(engine, "audio");
|
|
55
|
+
this.menu.fill([{
|
|
56
|
+
name: "track",
|
|
57
|
+
items,
|
|
58
|
+
value: active !== null && active !== void 0 ? active : "",
|
|
59
|
+
onSelect: (value) => {
|
|
60
|
+
engine.tracks.select(value);
|
|
61
|
+
this.render();
|
|
62
|
+
}
|
|
63
|
+
}]);
|
|
64
|
+
this.hidden = items.length < 2;
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
//#endregion
|
|
68
|
+
export { MbxAudioMenu, onTracks, trackItems, trackLabel };
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { show } from "./shared.js";
|
|
2
|
+
import { MenuElement, single } from "./menu-element.js";
|
|
3
|
+
import { chapterAt, chapters, followChapters } from "../controls/chapters.js";
|
|
4
|
+
import { format } from "../controls/time.js";
|
|
5
|
+
//#region src/elements/chapters-menu.ts
|
|
6
|
+
/**
|
|
7
|
+
* <mbx-chapters-menu>: the chapters of the video as a list, each with its
|
|
8
|
+
* start time, the one the playhead is in checked; choosing one seeks to its
|
|
9
|
+
* start. The chapters are the video's own chapters text track, from the
|
|
10
|
+
* player's `chapters` attribute or a `<track>` the page put there, so the
|
|
11
|
+
* menu works for every session, native included, and hides while the
|
|
12
|
+
* video has none. The name comes from `label`.
|
|
13
|
+
*/
|
|
14
|
+
var MbxChaptersMenu = class extends MenuElement {
|
|
15
|
+
static get observedAttributes() {
|
|
16
|
+
return ["label", "label-back"];
|
|
17
|
+
}
|
|
18
|
+
constructor() {
|
|
19
|
+
super(...single("chapters"));
|
|
20
|
+
this.drawn = "";
|
|
21
|
+
show(this.slots, "default");
|
|
22
|
+
}
|
|
23
|
+
name() {
|
|
24
|
+
return "Chapters";
|
|
25
|
+
}
|
|
26
|
+
attach(player) {
|
|
27
|
+
const tick = () => {
|
|
28
|
+
this.render();
|
|
29
|
+
};
|
|
30
|
+
this.keep(followChapters(player.video, tick));
|
|
31
|
+
this.listen(player.video, [
|
|
32
|
+
"timeupdate",
|
|
33
|
+
"seeked",
|
|
34
|
+
"emptied",
|
|
35
|
+
"loadedmetadata"
|
|
36
|
+
], tick);
|
|
37
|
+
this.listen(player, ["sourcechange"], tick);
|
|
38
|
+
this.render();
|
|
39
|
+
}
|
|
40
|
+
render() {
|
|
41
|
+
var _this$player;
|
|
42
|
+
super.render();
|
|
43
|
+
const video = (_this$player = this.player) === null || _this$player === void 0 ? void 0 : _this$player.video;
|
|
44
|
+
if (video === void 0) return;
|
|
45
|
+
const list = chapters(video);
|
|
46
|
+
this.hidden = list.length === 0;
|
|
47
|
+
const current = String(chapterAt(list, video.currentTime));
|
|
48
|
+
const items = list.map((chapter, i) => [
|
|
49
|
+
String(i),
|
|
50
|
+
chapter.title,
|
|
51
|
+
format(chapter.start)
|
|
52
|
+
]);
|
|
53
|
+
const key = `${current}|${items.map(([, title, start]) => `${start} ${title}`).join("\n")}`;
|
|
54
|
+
if (key === this.drawn) return;
|
|
55
|
+
this.drawn = key;
|
|
56
|
+
this.menu.fill([{
|
|
57
|
+
name: "chapter",
|
|
58
|
+
items,
|
|
59
|
+
value: current,
|
|
60
|
+
onSelect: (value) => {
|
|
61
|
+
const chapter = list[Number(value)];
|
|
62
|
+
if (chapter !== void 0) video.currentTime = chapter.start;
|
|
63
|
+
}
|
|
64
|
+
}]);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
//#endregion
|
|
68
|
+
export { MbxChaptersMenu };
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { PLAYER } from "../tags.js";
|
|
2
|
+
import { findPlayer } from "../host.js";
|
|
3
|
+
//#region src/elements/component.ts
|
|
4
|
+
var Component = class extends HTMLElement {
|
|
5
|
+
constructor() {
|
|
6
|
+
super();
|
|
7
|
+
this.player = null;
|
|
8
|
+
this.offs = [];
|
|
9
|
+
this.epoch = 0;
|
|
10
|
+
}
|
|
11
|
+
connectedCallback() {
|
|
12
|
+
const found = findPlayer(this);
|
|
13
|
+
if (found === null) return;
|
|
14
|
+
this.epoch += 1;
|
|
15
|
+
const epoch = this.epoch;
|
|
16
|
+
const attach = () => {
|
|
17
|
+
if (epoch !== this.epoch || !this.isConnected) return;
|
|
18
|
+
customElements.upgrade(found);
|
|
19
|
+
if (!("video" in found)) return;
|
|
20
|
+
this.player = found;
|
|
21
|
+
this.attach(this.player);
|
|
22
|
+
};
|
|
23
|
+
if ("video" in found) attach();
|
|
24
|
+
else customElements.whenDefined(PLAYER).then(attach);
|
|
25
|
+
}
|
|
26
|
+
disconnectedCallback() {
|
|
27
|
+
this.epoch += 1;
|
|
28
|
+
for (const off of this.offs) off();
|
|
29
|
+
this.offs = [];
|
|
30
|
+
const player = this.player;
|
|
31
|
+
if (player === null) return;
|
|
32
|
+
this.player = null;
|
|
33
|
+
this.detach(player);
|
|
34
|
+
}
|
|
35
|
+
attributeChangedCallback() {
|
|
36
|
+
if (this.player !== null) this.render();
|
|
37
|
+
}
|
|
38
|
+
/** Adds `fn` for every name on `target`, to be removed on detach. */
|
|
39
|
+
listen(target, names, fn) {
|
|
40
|
+
for (const name of names) target.addEventListener(name, fn);
|
|
41
|
+
this.offs.push(() => {
|
|
42
|
+
for (const name of names) target.removeEventListener(name, fn);
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/** Keeps `off` to run on detach. */
|
|
46
|
+
keep(off) {
|
|
47
|
+
this.offs.push(off);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Runs `fn` over the current engine now and on every session change,
|
|
51
|
+
* running what the last call returned first, so a control's engine
|
|
52
|
+
* subscriptions live exactly as long as the session. Detach runs it too.
|
|
53
|
+
*/
|
|
54
|
+
follow(player, fn) {
|
|
55
|
+
let off;
|
|
56
|
+
const run = () => {
|
|
57
|
+
off === null || off === void 0 || off();
|
|
58
|
+
off = fn(player.engine);
|
|
59
|
+
};
|
|
60
|
+
this.listen(player, ["sourcechange"], run);
|
|
61
|
+
this.offs.push(() => {
|
|
62
|
+
off === null || off === void 0 || off();
|
|
63
|
+
off = void 0;
|
|
64
|
+
});
|
|
65
|
+
run();
|
|
66
|
+
}
|
|
67
|
+
/** Runs `fn` when any of `names` changes on `target`, or under it with `subtree`, until detach. */
|
|
68
|
+
observe(target, names, fn, subtree = false) {
|
|
69
|
+
const observer = new MutationObserver(fn);
|
|
70
|
+
observer.observe(target, {
|
|
71
|
+
attributes: true,
|
|
72
|
+
attributeFilter: [...names],
|
|
73
|
+
subtree
|
|
74
|
+
});
|
|
75
|
+
this.offs.push(() => {
|
|
76
|
+
observer.disconnect();
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
/** The control left its player. Listeners are already gone; undo anything else. */
|
|
80
|
+
detach(_player) {}
|
|
81
|
+
/** Draws the current state. Called on every observed attribute change while attached. */
|
|
82
|
+
render() {}
|
|
83
|
+
};
|
|
84
|
+
//#endregion
|
|
85
|
+
export { Component };
|