@viewlift/player-backup 1.0.4-lighteningjs → 1.0.5-lighteningjs

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.
Files changed (36) hide show
  1. package/package.json +1 -1
  2. package/.babelrc +0 -8
  3. package/README.md +0 -29
  4. package/babel.config.json +0 -8
  5. package/index.html +0 -49
  6. package/jsconfig.json +0 -9
  7. package/rollup.config.mjs +0 -39
  8. package/src/ads-manager/ads-manager.js +0 -120
  9. package/src/assets/checkIcon.png +0 -0
  10. package/src/assets/pauseIcon.png +0 -0
  11. package/src/assets/pauseIconFocus.png +0 -0
  12. package/src/assets/playIcon.png +0 -0
  13. package/src/assets/playIconFocus.png +0 -0
  14. package/src/assets/settingsIcon.png +0 -0
  15. package/src/index.js +0 -13
  16. package/src/player-components/player-buttons/playerButtons.js +0 -106
  17. package/src/player-components/player-seekbar/playerSeekbar.js +0 -223
  18. package/src/player-components/player-setting-option-wrapper/player-setting-option-one-wrapper.js +0 -82
  19. package/src/player-components/player-setting-option-wrapper/player-setting-option-two-wrapper.js +0 -84
  20. package/src/player-components/player-sidebar/player-sidebar.js +0 -188
  21. package/src/player-components/player-title/playerTitle.js +0 -56
  22. package/src/player-ui/player-ui.js +0 -564
  23. package/src/playerControls/playerControls.css +0 -10
  24. package/src/playerControls/playerControls.js +0 -501
  25. package/src/styles/index.css +0 -204
  26. package/src/utilities/utilities.js +0 -79
  27. /package/{dist/38afc79c94e0bcf0.png → 38afc79c94e0bcf0.png} +0 -0
  28. /package/{dist/3bc8b7ff04e98d37.png → 3bc8b7ff04e98d37.png} +0 -0
  29. /package/{dist/522ea7c76ac4fd33.png → 522ea7c76ac4fd33.png} +0 -0
  30. /package/{dist/a74cd46ed4277568.png → a74cd46ed4277568.png} +0 -0
  31. /package/{dist/b739faec1fde1346.png → b739faec1fde1346.png} +0 -0
  32. /package/{dist/bundle.css → bundle.css} +0 -0
  33. /package/{dist/bundle.css.map → bundle.css.map} +0 -0
  34. /package/{dist/bundle.js → bundle.js} +0 -0
  35. /package/{dist/bundle.js.map → bundle.js.map} +0 -0
  36. /package/{dist/ed3d0a4d9de91460.png → ed3d0a4d9de91460.png} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@viewlift/player-backup",
3
- "version": "1.0.4-lighteningjs",
3
+ "version": "1.0.5-lighteningjs",
4
4
  "description": "A LightningJS video player component for Smart TV apps.",
5
5
  "main": "dist/index.cjs.js",
6
6
  "module": "dist/index.esm.js",
package/.babelrc DELETED
@@ -1,8 +0,0 @@
1
- {
2
- "presets": [
3
- ["@babel/preset-env", {
4
- "targets": { "ie": "11" },
5
- "modules": false
6
- }]
7
- ]
8
- }
package/README.md DELETED
@@ -1,29 +0,0 @@
1
- # @viewlift/ligheningjs-video-player
2
-
3
- A LightningJS video player component for Smart TV app development.
4
-
5
- ## Features
6
- - Video player component for LightningJS
7
- - TypeScript support
8
- - Easy to use in LightningJS-based projects
9
-
10
- ## Installation
11
- ```bash
12
- npm install @viewlift/ligheningjs-video-player
13
- ```
14
-
15
- ## Usage
16
- ```ts
17
- import { LightningVideoPlayer } from '@viewlift/ligheningjs-video-player';
18
-
19
- const player = new LightningVideoPlayer();
20
- player.play();
21
- ```
22
-
23
- ## Build
24
- ```bash
25
- npm run build
26
- ```
27
-
28
- ## License
29
- ISC
package/babel.config.json DELETED
@@ -1,8 +0,0 @@
1
- {
2
- "presets": [
3
- ["@babel/preset-env", {
4
- "targets": { "ie": "11" },
5
- "modules": false
6
- }]
7
- ]
8
- }
package/index.html DELETED
@@ -1,49 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>HLS Player Test</title>
5
- <link rel="stylesheet" href="./src/styles/index.css">
6
- </head>
7
- <body>
8
- <div id="player-container"></div>
9
- <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
10
- <script type="module">
11
- import { createHlsPlayer } from './src/playerInitializer.js';
12
- const mountPoint = document.getElementById('player-container');
13
- const config = {
14
- // streamUrl: 'https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8',
15
- streamUrl: "https://cdn-vl-gcp-spinco-e-token-no-ssai-01.vos360.video/Content/HLS_HLS_CLEAR/Live/channel(886a397d-ff30-4021-eb16-bb73c658c033)/index.m3u8?hdnts=st=1753800508~exp=1753843708~acl=/Content/HLS_HLS_CLEAR/Live/channel(886a397d-ff30-4021-eb16-bb73c658c033)/*~hmac=461d4f615e40b0057f82b07d54f40bc029c4562ae65ef9d7caf85dd86f2e3270",
16
- // streamUrl: 'https://cdn.bitmovin.com/content/assets/sintel/hls/playlist.m3u8',
17
- videoTitleConfig: {
18
- text: 'Big Buck Bunny',
19
- fontSize: '40px',
20
- fontWeight: 'bold',
21
- textAlign: 'left',
22
- textDecoration: 'none',
23
- textTransform: 'none',
24
- lineHeight: 'normal',
25
- letterSpacing: 'normal',
26
- color: '#ffffff',
27
- backgroundColor: 'transparent'
28
- },
29
- startFromBeginningBtnConfig: {
30
- text: 'Start From Beginning',
31
- enabled: true,
32
- width: '150px',
33
- height: '35px',
34
- fontSize: '16px',
35
- fontWeight: 'normal',
36
- textAlign: 'center',
37
- textDecoration: 'none',
38
- textTransform: 'none',
39
- lineHeight: 'normal',
40
- letterSpacing: 'normal',
41
- color: '#ffffff',
42
- backgroundColor: '#000000',
43
- focused: false,
44
- },
45
- };
46
- createHlsPlayer(mountPoint, config);
47
- </script>
48
- </body>
49
- </html>
package/jsconfig.json DELETED
@@ -1,9 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "baseUrl": ".",
4
- "paths": {
5
- "@src/*": ["src/*"],
6
- "@components/*": ["components/*"]
7
- }
8
- }
9
- }
package/rollup.config.mjs DELETED
@@ -1,39 +0,0 @@
1
- import resolve from '@rollup/plugin-node-resolve';
2
- import commonjs from '@rollup/plugin-commonjs';
3
- import terser from '@rollup/plugin-terser';
4
- import babel from '@rollup/plugin-babel';
5
- import postcss from 'rollup-plugin-postcss';
6
- import url from '@rollup/plugin-url';
7
- import json from '@rollup/plugin-json';
8
- const devMode = 'development';
9
- export default {
10
- input: 'src/index.js',
11
- output: [
12
- {
13
- file: './dist/bundle.js',
14
- format: 'es',
15
- sourcemap: true,
16
- inlineDynamicImports: true,
17
- },
18
- ],
19
- plugins: [
20
- resolve(),
21
- json(),
22
- commonjs(),
23
- babel({
24
- babelHelpers: 'bundled',
25
- extensions: ['.js', '.ts'],
26
- exclude: 'node_modules/**',
27
- }),
28
- postcss({
29
- extract: true, // creates a separate CSS file
30
- minimize: true,
31
- sourceMap: true,
32
- }),
33
- url({
34
- include: ['**/*.png', '**/*.jpg', '**/*.gif'],
35
- limit: 0, // Always copy the files
36
- }),
37
- terser(),
38
- ],
39
- };
@@ -1,120 +0,0 @@
1
- import { Button } from "../player-components/player-buttons/playerButtons";
2
-
3
- export class AdsManager {
4
- constructor(props) {
5
- this.adsMediaPlaybackList = props.adsMediaPlaybackList;
6
- this.isSkipAble = props.isSkipAble;
7
- this.playerResumeCallback = props.playerResumeCallback;
8
- this.adsPlayerId = props.adsPlayerId;
9
-
10
- this.initializeAdsPlayer();
11
- this.addAdsEventListener();
12
- }
13
-
14
- initializeAdsPlayer() {
15
- this.adsContainer = document.createElement("div");
16
- this.adsContainer.className = "adsContainer";
17
- this.video = document.createElement('video');
18
- this.adsContainer.appendChild(this.video);
19
- }
20
-
21
- addAdsEventListener() {
22
- this.video.addEventListener("ended", onEnded);
23
- this.video.addEventListener("error", onError);
24
- this.video.addEventListener("waiting", onBuffering);
25
- this.video.addEventListener("play", onPlay);
26
- this.video.addEventListener("playing", onPlaying);
27
- this.video.addEventListener("timeupdate", playbackprogress);
28
- }
29
-
30
- removeAdsEventListener() {
31
- this.video.removeEventListener("ended", onEnded);
32
- this.video.removeEventListener("error", onError);
33
- this.video.removeEventListener("waiting", onBuffering);
34
- this.video.removeEventListener("play", onPlay);
35
- this.video.removeEventListener("playing", onPlaying);
36
- this.video.removeEventListener("timeupdate", playbackprogress);
37
- }
38
-
39
- onEnded() {
40
- console.log("AdsManager: ended");
41
- }
42
-
43
- onError() {
44
- console.log("AdsManager: error");
45
- }
46
-
47
- onBuffering() {
48
- console.log("AdsManager: buffering");
49
- }
50
-
51
- onPlay() {
52
- console.log("AdsManager: play");
53
- }
54
-
55
- onPlaying() {
56
- console.log("AdsManager: playing");
57
- }
58
-
59
- playbackprogress() {
60
- console.log("AdsManager: playback progress");
61
- }
62
-
63
-
64
- createPlayPauseBtn() {
65
- this.playPauseBtn = new Button({
66
- imgSrc: playIconFocus,
67
- imgAltText: 'Play/Pause',
68
- buttonText: 'Play',
69
- width: 70,
70
- height: 70,
71
- klassname: 'play-pause-btn',
72
- focused: false,
73
- disabled: false,
74
- handleClick: () => {
75
- if (this.video.paused) {
76
- this.video.play();
77
- if (this.playPauseBtn && this.playPauseBtn.buttonElement && this.playPauseBtn.buttonElement.querySelector('img')) {
78
- this.playPauseBtn.buttonElement.querySelector('img').setAttribute('src', pauseIconFocus);
79
- } else if (this.playPauseBtn && this.playPauseBtn.buttonElement) {
80
- this.playPauseBtn.buttonElement.textContent = 'Pause';
81
- }
82
- } else {
83
- this.video.pause();
84
- if (this.playPauseBtn && this.playPauseBtn.buttonElement) {
85
- this.playPauseBtn.buttonElement.querySelector('img').setAttribute('src', playIconFocus);
86
- } else if (this.playPauseBtn && this.playPauseBtn.buttonElement) {
87
- this.playPauseBtn.buttonElement.textContent = 'Play';
88
- }
89
- }
90
- }
91
- });
92
- this.playPauseBtn.mount(this.adsContainer);
93
-
94
- requestAnimationFrame(() => {
95
- if (this.playPauseBtn) this.playPauseBtn.focus();
96
- });
97
-
98
- this.playPauseBtnEventListeners();
99
- }
100
-
101
- playPauseBtnEventListeners() {
102
- if (!this.playPauseBtn || !this.playPauseBtn.buttonElement) return;
103
-
104
- this.playPauseBtn.buttonElement.addEventListener('focus', () => {
105
- if (this.playPauseBtn && this.playPauseBtn.buttonElement && this.playPauseBtn.buttonElement.querySelector('img')) {
106
- const iconSrc = this.video.paused ? playIconFocus : pauseIconFocus;
107
- this.playPauseBtn.buttonElement.querySelector('img').setAttribute('src', iconSrc);
108
- this.playPauseBtn.buttonElement.style.backgroundColor = 'rgba(255, 255, 255)';
109
- }
110
- });
111
-
112
- this.playPauseBtn.buttonElement.addEventListener('blur', () => {
113
- if (this.playPauseBtn && this.playPauseBtn.buttonElement && this.playPauseBtn.buttonElement.querySelector('img')) {
114
- const iconSrc = this.video.paused ? playIcon : pauseIcon;
115
- this.playPauseBtn.buttonElement.querySelector('img').setAttribute('src', iconSrc);
116
- this.playPauseBtn.buttonElement.style.backgroundColor = 'rgba(255, 255, 255, 0.5)';
117
- }
118
- });
119
- }
120
- }
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
package/src/index.js DELETED
@@ -1,13 +0,0 @@
1
- // LightningJS-compatible Video Player Component (ES5 compatible)
2
- import VLPlayerCore from '@viewlift/player-backup/esm';
3
- import '@viewlift/player-backup/esm/bundle.css';
4
- import PlayerControls from './playerControls/playerControls';
5
- import "./styles/index.css";
6
-
7
-
8
-
9
- export default class VideoPlayer {
10
- constructor() {
11
- return VLPlayerCore
12
- }
13
- }
@@ -1,106 +0,0 @@
1
- export class Button {
2
- constructor(props) {
3
- if (!props) {
4
- throw new Error('Button Class: props are required');
5
- }
6
-
7
- this.imgSrc = props.imgSrc || '';
8
- this.imgAltText = props.imgAltText || '';
9
- this.buttonText = props.buttonText || '';
10
- this.klassname = props.klassname || 'default-button';
11
- this.width = props.width;
12
- this.height = props.height;
13
- this.fontWeight = props.fontWeight;
14
- this.focused = props.focused || false;
15
- this.disabled = props.disabled || false;
16
- this.handleClick = props.handleClick || (() => {});
17
-
18
- if (typeof this.handleClick !== 'function') {
19
- throw new Error('Button Class: handleClick must be a function');
20
- }
21
-
22
- if (this.disabled) {
23
- this.klassname += ' disabled';
24
- }
25
-
26
- if (this.focused) {
27
- this.klassname += ' focused';
28
- }
29
-
30
- this.handleClick = this.handleClick.bind(this);
31
- }
32
-
33
- focus() {
34
- if (this.buttonElement) {
35
- this.buttonElement.focus();
36
- this.buttonElement.classList.add('focused');
37
- this.focused = true;
38
- }
39
- }
40
-
41
- blur() {
42
- if (this.buttonElement) {
43
- this.buttonElement.blur();
44
- this.buttonElement.classList.remove('focused');
45
- this.focused = false;
46
- }
47
- }
48
-
49
- mount(mountPoint) {
50
- if (!mountPoint || !(mountPoint instanceof HTMLElement)) {
51
- throw new Error('Button Class: mountPoint must be a valid DOM element');
52
- }
53
-
54
- const button = document.createElement('div');
55
- button.className = this.klassname;
56
- button.style.width = `${this.width}px`;
57
- button.style.height = `${this.height}px`;
58
- button.style.fontWeight = this.fontWeight;
59
- button.tabIndex = 0;
60
-
61
- if (this.imgSrc) {
62
- const img = document.createElement('img');
63
- img.src = this.imgSrc;
64
- img.alt = this.imgAltText;
65
- img.onerror = () => {
66
- console.warn('Button Class: Failed to load image at', this.imgSrc);
67
- };
68
- button.appendChild(img);
69
- } else {
70
- const span = document.createElement('span');
71
- span.textContent = this.buttonText;
72
- button.appendChild(span);
73
- }
74
-
75
- if (!this.disabled) {
76
- button.addEventListener('click', this.handleClick);
77
- }
78
- button.addEventListener('keydown', (event) => {
79
- if (event.key === 'Enter' || event.key === 'OK') {
80
- this.handleClick();
81
- }
82
- });
83
- button.addEventListener('focus', () => {
84
- this.focused = true;
85
- button.classList.add('focused');
86
- });
87
- button.addEventListener('blur', () => {
88
- this.focused = false;
89
- button.classList.remove('focused');
90
- });
91
-
92
- this.buttonElement = button;
93
- mountPoint.appendChild(button);
94
- }
95
-
96
- unmount() {
97
- if (this.buttonElement) {
98
- this.buttonElement.removeEventListener('click', this.handleClick);
99
- this.buttonElement.removeEventListener('keydown', this.handleClick);
100
- this.buttonElement.removeEventListener('focus', this.handleClick);
101
- this.buttonElement.removeEventListener('blur', this.handleClick);
102
- this.buttonElement.remove();
103
- this.buttonElement = undefined;
104
- }
105
- }
106
- }
@@ -1,223 +0,0 @@
1
- export class PlayerSeekbar {
2
- constructor(video) {
3
- if (!video || !(video instanceof HTMLVideoElement)) {
4
- throw new Error('PlayerSeekbar: A valid HTMLVideoElement is required');
5
- }
6
-
7
- this.video = video;
8
- this.container = null;
9
- this.progress = null;
10
- this.buffer = null;
11
- this.thumb = null;
12
- this.tooltip = null;
13
- this.timeLabel = null;
14
- this.durationLabel = null;
15
- this.isDragging = false;
16
- this.focused = false;
17
-
18
- this.init();
19
- }
20
-
21
- init() {
22
- this.container = document.createElement('div');
23
- this.container.className = 'seekbar-container';
24
-
25
- this.buffer = document.createElement('div');
26
- this.buffer.className = 'seekbar-buffer';
27
-
28
- this.progress = document.createElement('div');
29
- this.progress.className = 'seekbar-progress';
30
-
31
- this.thumb = document.createElement('div');
32
- this.thumb.className = 'seekbar-thumb';
33
- this.thumb.tabIndex = 0; // Make thumb focusable
34
-
35
- this.tooltip = document.createElement('div');
36
- this.tooltip.className = 'seekbar-tooltip';
37
- this.tooltip.style.display = 'none';
38
-
39
- this.timeLabel = document.createElement('span');
40
- this.timeLabel.className = 'seekbar-time-label';
41
- this.durationLabel = document.createElement('span');
42
- this.durationLabel.className = 'seekbar-duration-label';
43
-
44
- this.container.appendChild(this.buffer);
45
- this.container.appendChild(this.progress);
46
- this.container.appendChild(this.thumb);
47
- this.container.appendChild(this.tooltip);
48
- this.container.appendChild(this.timeLabel);
49
- this.container.appendChild(this.durationLabel);
50
-
51
- // Update UI as video plays
52
- this.video.addEventListener('timeupdate', () => this.update());
53
- this.video.addEventListener('progress', () => this.updateBuffer());
54
- this.video.addEventListener('durationchange', () => this.update());
55
-
56
- // Seek on click
57
- this.container.addEventListener('click', (e) => this.seek(e));
58
- // Dragging
59
- this.thumb.addEventListener('mousedown', (e) => this.startDrag(e));
60
- // Tooltip on hover
61
- this.container.addEventListener('mousemove', (e) => this.showTooltip(e));
62
- this.container.addEventListener('mouseleave', () => this.hideTooltip());
63
-
64
- // Focus/blur events for accessibility and visual feedback
65
- this.thumb.addEventListener('focus', () => {
66
- this.focused = true;
67
- this.thumb.classList.add('focused');
68
- });
69
- this.thumb.addEventListener('blur', () => {
70
- this.focused = false;
71
- this.thumb.classList.remove('focused');
72
- });
73
-
74
- // Add keydown event listeners for arrow keys to simulate dragging
75
- this.thumb.addEventListener('keydown', (e) => {
76
- const increment = 1;
77
- if (e.key === 'ArrowRight') {
78
- e.preventDefault();
79
- e.stopPropagation();
80
- this.video.currentTime = Math.min(this.video.duration, this.video.currentTime + increment);
81
- this.update();
82
- } else if (e.key === 'ArrowLeft') {
83
- e.preventDefault();
84
- e.stopPropagation();
85
- this.video.currentTime = Math.max(0, this.video.currentTime - increment);
86
- this.update();
87
- } else if (e.key === 'Enter') {
88
- e.preventDefault();
89
- e.stopPropagation();
90
- if(this.video.paused) {
91
- this.video.play(); // Resume playing the video
92
- }
93
- }
94
- });
95
- }
96
-
97
- focus() {
98
- if (this.thumb) {
99
- this.thumb.focus();
100
- this.thumb.classList.add('focused');
101
- this.focused = true;
102
- }
103
- }
104
-
105
- blur() {
106
- if (this.thumb) {
107
- this.thumb.blur();
108
- this.thumb.classList.remove('focused');
109
- this.focused = false;
110
- }
111
- }
112
-
113
- formatTime(seconds) {
114
- if (isNaN(seconds)) return '0:00';
115
- const m = Math.floor(seconds / 60);
116
- const s = Math.floor(seconds % 60);
117
- return `${m}:${String(s).padStart(2, '0')}`;
118
- }
119
-
120
- update() {
121
- if (!this.video || !this.progress || !this.thumb || !this.timeLabel || !this.durationLabel) return;
122
-
123
- const percent = (this.video.currentTime / this.video.duration) * 100;
124
- this.progress.style.width = percent + '%';
125
- this.thumb.style.left = percent + '%';
126
- this.timeLabel.textContent = this.formatTime(this.video.currentTime);
127
- this.durationLabel.textContent = ' / ' + this.formatTime(this.video.duration);
128
- }
129
-
130
- updateBuffer() {
131
- if (!this.video || !this.buffer) return;
132
-
133
- if (this.video.buffered.length) {
134
- const end = this.video.buffered.end(this.video.buffered.length - 1);
135
- const percent = (end / this.video.duration) * 100;
136
- this.buffer.style.width = percent + '%';
137
- }
138
- }
139
-
140
- seek(e) {
141
- if (this.isDragging || !this.container || !this.video) return;
142
-
143
- const rect = this.container.getBoundingClientRect();
144
- const percent = (e.clientX - rect.left) / rect.width;
145
- this.video.currentTime = percent * this.video.duration;
146
- }
147
-
148
- startDrag(e) {
149
- if (!this.container || !this.video) return;
150
-
151
- e.preventDefault();
152
- this.isDragging = true;
153
- const onMove = (moveEvent) => {
154
- const rect = this.container.getBoundingClientRect();
155
- let percent = (moveEvent.clientX - rect.left) / rect.width;
156
- percent = Math.max(0, Math.min(1, percent));
157
- this.progress.style.width = percent * 100 + '%';
158
- this.thumb.style.left = percent * 100 + '%';
159
- this.timeLabel.textContent = this.formatTime(percent * this.video.duration);
160
- };
161
- const onUp = (upEvent) => {
162
- const rect = this.container.getBoundingClientRect();
163
- let percent = (upEvent.clientX - rect.left) / rect.width;
164
- percent = Math.max(0, Math.min(1, percent));
165
- this.video.currentTime = percent * this.video.duration;
166
- this.isDragging = false;
167
- document.removeEventListener('mousemove', onMove);
168
- document.removeEventListener('mouseup', onUp);
169
- };
170
- document.addEventListener('mousemove', onMove);
171
- document.addEventListener('mouseup', onUp);
172
- }
173
-
174
- showTooltip(e) {
175
- if (!this.container || !this.tooltip || !this.video) return;
176
-
177
- const rect = this.container.getBoundingClientRect();
178
- const percent = (e.clientX - rect.left) / rect.width;
179
- const time = percent * this.video.duration;
180
- this.tooltip.textContent = this.formatTime(time);
181
- this.tooltip.style.display = 'block';
182
- this.tooltip.style.left = `${percent * 100}%`;
183
- }
184
-
185
- hideTooltip() {
186
- if (this.tooltip) {
187
- this.tooltip.style.display = 'none';
188
- }
189
- }
190
-
191
- getElement() {
192
- return this.thumb;
193
- }
194
-
195
- mount(parent) {
196
- if (!parent || !(parent instanceof HTMLElement)) {
197
- throw new Error('PlayerSeekbar: parent must be a valid DOM element');
198
- }
199
-
200
- parent.appendChild(this.container);
201
- this.update();
202
- this.updateBuffer();
203
- }
204
-
205
- unmount() {
206
- if (!this.video || !this.container || !this.thumb) return;
207
-
208
- this.video.removeEventListener('timeupdate', this.update);
209
- this.video.removeEventListener('progress', this.updateBuffer);
210
- this.video.removeEventListener('durationchange', this.update);
211
- this.container.removeEventListener('click', this.seek);
212
- this.thumb.removeEventListener('mousedown', this.startDrag);
213
- this.container.removeEventListener('mousemove', this.showTooltip);
214
- this.container.removeEventListener('mouseleave', this.hideTooltip);
215
- this.thumb.removeEventListener('focus', this.focus);
216
- this.thumb.removeEventListener('blur', this.blur);
217
- this.thumb.removeEventListener('keydown', this.keydownHandler);
218
-
219
- if (this.container) {
220
- this.container.remove();
221
- }
222
- }
223
- }