myetv-player 1.2.0 → 1.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.
Files changed (47) hide show
  1. package/css/myetv-player.css +131 -0
  2. package/css/myetv-player.min.css +1 -1
  3. package/dist/myetv-player.js +547 -102
  4. package/dist/myetv-player.min.js +486 -93
  5. package/package.json +35 -17
  6. package/plugins/twitch/myetv-player-twitch-plugin.js +125 -11
  7. package/plugins/vimeo/myetv-player-vimeo.js +80 -49
  8. package/plugins/youtube/README.md +5 -2
  9. package/plugins/youtube/myetv-player-youtube-plugin.js +766 -6
  10. package/.github/workflows/codeql.yml +0 -100
  11. package/.github/workflows/npm-publish.yml +0 -30
  12. package/SECURITY.md +0 -50
  13. package/build.js +0 -195
  14. package/scss/README.md +0 -161
  15. package/scss/_audio-player.scss +0 -21
  16. package/scss/_base.scss +0 -116
  17. package/scss/_controls.scss +0 -204
  18. package/scss/_loading.scss +0 -111
  19. package/scss/_menus.scss +0 -432
  20. package/scss/_mixins.scss +0 -112
  21. package/scss/_poster.scss +0 -8
  22. package/scss/_progress-bar.scss +0 -319
  23. package/scss/_resolution.scss +0 -68
  24. package/scss/_responsive.scss +0 -1368
  25. package/scss/_themes.scss +0 -30
  26. package/scss/_title-overlay.scss +0 -60
  27. package/scss/_tooltips.scss +0 -7
  28. package/scss/_variables.scss +0 -49
  29. package/scss/_video.scss +0 -221
  30. package/scss/_volume.scss +0 -122
  31. package/scss/_watermark.scss +0 -128
  32. package/scss/myetv-player.scss +0 -51
  33. package/scss/package.json +0 -16
  34. package/src/README.md +0 -560
  35. package/src/chapters.js +0 -521
  36. package/src/controls.js +0 -1242
  37. package/src/core.js +0 -1922
  38. package/src/events.js +0 -537
  39. package/src/fullscreen.js +0 -82
  40. package/src/i18n.js +0 -374
  41. package/src/playlist.js +0 -177
  42. package/src/plugins.js +0 -384
  43. package/src/quality.js +0 -963
  44. package/src/streaming.js +0 -346
  45. package/src/subtitles.js +0 -524
  46. package/src/utils.js +0 -65
  47. package/src/watermark.js +0 -246
package/scss/_menus.scss DELETED
@@ -1,432 +0,0 @@
1
- // ===================================
2
- // MENUS (Settings, Quality, Speed, Subtitles)
3
- // ===================================
4
-
5
- @use 'mixins' as *;
6
- @use 'variables' as *;
7
-
8
- /* CONTROL MENUS */
9
- .speed-control,
10
- .quality-control,
11
- .subtitles-control {
12
- position: relative;
13
- }
14
-
15
- .speed-menu,
16
- .quality-menu,
17
- .subtitles-menu {
18
- position: absolute;
19
- bottom: 100%;
20
- right: 0;
21
- background: var(--player-bg-menu);
22
- backdrop-filter: blur(10px);
23
- border-radius: 8px;
24
- padding: 8px 0;
25
- margin-bottom: 10px;
26
- opacity: 0;
27
- visibility: hidden;
28
- transition: all var(--player-transition-fast);
29
- min-width: 140px;
30
- border: 1px solid rgba(255, 255, 255, 0.1);
31
- z-index: 100;
32
- box-shadow: var(--player-shadow-menu);
33
- }
34
-
35
- /* Main menus open ONLY with .active (CLICK) */
36
- .speed-menu.active,
37
- .quality-menu.active,
38
- .subtitles-menu.active {
39
- opacity: 1 !important;
40
- visibility: visible !important;
41
- pointer-events: all !important;
42
- }
43
-
44
- .speed-option,
45
- .quality-option,
46
- .subtitles-option {
47
- padding: 8px 16px;
48
- color: var(--player-text-color);
49
- cursor: pointer;
50
- transition: all var(--player-transition-fast);
51
- font-size: 14px;
52
- display: flex;
53
- align-items: center;
54
- justify-content: space-between;
55
- }
56
-
57
- .speed-option:hover,
58
- .quality-option:hover,
59
- .subtitles-option:hover {
60
- background: rgba(255, 255, 255, 0.1);
61
- color: var(--player-primary-color);
62
- }
63
-
64
- .speed-option.active,
65
- .quality-option.active,
66
- .subtitles-option.active {
67
- color: var(--player-primary-color);
68
- font-weight: 600;
69
- background: rgba(255, 255, 255, 0.05);
70
- }
71
-
72
- /* Highlight currently selected subtitle option */
73
- .subtitles-option.selected,
74
- .subtitles-option.active {
75
- color: var(--player-primary-color);
76
- background: rgba(255, 255, 255, 0.1);
77
- position: relative;
78
- }
79
-
80
- .subtitles-option.selected::after,
81
- .subtitles-option.active::after {
82
- content: '✓';
83
- position: absolute;
84
- right: 10px;
85
- font-weight: bold;
86
- }
87
-
88
- /* DUAL QUALITY INDICATORS */
89
- .quality-option.selected {
90
- color: var(--player-primary-color);
91
- font-weight: 600;
92
- }
93
-
94
- .quality-option.selected::after {
95
- content: 'Selected';
96
- font-size: 12px;
97
- color: var(--player-primary-color);
98
- font-weight: 400;
99
- margin-left: 8px;
100
- }
101
-
102
- .quality-option.playing {
103
- background: rgba(255, 255, 255, 0.05);
104
- }
105
-
106
- .quality-option.playing::after {
107
- content: 'Playing';
108
- font-size: 12px;
109
- color: #4CAF50;
110
- font-weight: 400;
111
- margin-left: 8px;
112
- }
113
-
114
- .quality-option.selected.playing::after {
115
- content: 'Active';
116
- font-size: 12px;
117
- color: var(--player-primary-color);
118
- font-weight: 500;
119
- margin-left: 8px;
120
- }
121
-
122
- .subtitles-option.active::after {
123
- content: '✓';
124
- font-size: 12px;
125
- color: var(--player-primary-color);
126
- }
127
-
128
- /* SETTINGS DROPDOWN MENU - FOR SMALL SCREENS */
129
- .settings-control {
130
- position: relative;
131
- display: none;
132
- }
133
-
134
- .settings-btn {
135
- background: none;
136
- border: none;
137
- color: var(--player-button-color);
138
- cursor: pointer;
139
- padding: var(--player-button-padding);
140
- border-radius: 6px;
141
- display: flex;
142
- align-items: center;
143
- gap: 5px;
144
- transition: all var(--player-transition-fast);
145
- font-size: 14px;
146
- font-weight: 500;
147
- position: relative;
148
- flex-shrink: 0;
149
- min-width: 0;
150
- white-space: nowrap;
151
- }
152
-
153
- .settings-btn:hover {
154
- background: var(--player-button-hover);
155
- transform: scale(1.05);
156
- }
157
-
158
- .settings-btn:active {
159
- transform: scale(0.95);
160
- background: var(--player-button-active);
161
- }
162
-
163
- .settings-btn .icon::before {
164
- content: '⚙️';
165
- font-size: 16px;
166
- }
167
-
168
- .settings-menu {
169
- position: absolute;
170
- bottom: 100%;
171
- right: 0;
172
- background: var(--player-bg-menu);
173
- backdrop-filter: blur(10px);
174
- border-radius: 8px;
175
- padding: 8px 0;
176
- margin-bottom: 10px;
177
- opacity: 0;
178
- visibility: hidden;
179
- transition: all var(--player-transition-fast);
180
- min-width: 180px;
181
- border: 1px solid rgba(255, 255, 255, 0.1);
182
- z-index: 100;
183
- box-shadow: var(--player-shadow-menu);
184
- }
185
-
186
- /* ⚠️ Settings menu opens ONLY with .active (CLICK) */
187
- .settings-menu.active {
188
- opacity: 1 !important;
189
- visibility: visible !important;
190
- pointer-events: all !important;
191
- }
192
-
193
- .settings-option {
194
- padding: 8px 16px;
195
- color: var(--player-text-color);
196
- cursor: pointer;
197
- transition: all var(--player-transition-fast);
198
- font-size: 14px;
199
- display: flex;
200
- align-items: center;
201
- justify-content: space-between;
202
- border-bottom: 1px solid rgba(255, 255, 255, 0.05);
203
- position: relative;
204
- }
205
-
206
- .settings-option:last-child {
207
- border-bottom: none;
208
- }
209
-
210
- .settings-option:hover {
211
- background: rgba(255, 255, 255, 0.1);
212
- color: var(--player-primary-color);
213
- }
214
-
215
- .settings-option-label {
216
- display: flex;
217
- align-items: center;
218
- gap: 8px;
219
- flex: 1;
220
- }
221
-
222
- .settings-option-value {
223
- font-size: 12px;
224
- color: var(--player-text-secondary);
225
- opacity: 0.8;
226
- }
227
-
228
- /* Submenu styling - HIDDEN BY DEFAULT */
229
- .settings-submenu,
230
- .quality-submenu,
231
- .speed-submenu {
232
- position: absolute;
233
- bottom: 0;
234
- right: 100%;
235
- background: var(--player-bg-menu);
236
- backdrop-filter: blur(10px);
237
- border-radius: 8px;
238
- padding: 8px 0;
239
- margin-right: 5px;
240
- opacity: 0;
241
- visibility: hidden;
242
- transition: all var(--player-transition-fast);
243
- min-width: 150px;
244
- max-width: 180px;
245
- max-height: 250px;
246
- overflow-y: auto;
247
- overflow-x: hidden;
248
- white-space: nowrap;
249
- border: 1px solid rgba(255, 255, 255, 0.1);
250
- z-index: 101;
251
- box-shadow: var(--player-shadow-menu);
252
- pointer-events: none;
253
- }
254
-
255
- /* ⚠️ SOLUTION: Submenus open on HOVER (easier and more intuitive) */
256
- .settings-option:hover .settings-submenu,
257
- .settings-option:hover .quality-submenu,
258
- .settings-option:hover .speed-submenu {
259
- opacity: 1 !important;
260
- visibility: visible !important;
261
- transform: translateX(-2px) !important;
262
- pointer-events: all !important;
263
- }
264
-
265
- .settings-submenu .settings-suboption,
266
- .quality-submenu .quality-option,
267
- .speed-submenu .speed-option {
268
- padding: 8px 10px !important;
269
- font-size: 12px !important;
270
- white-space: nowrap !important;
271
- overflow: hidden !important;
272
- text-overflow: ellipsis !important;
273
- }
274
-
275
- .settings-suboption {
276
- padding: 8px 16px;
277
- color: var(--player-text-color);
278
- cursor: pointer;
279
- transition: all var(--player-transition-fast);
280
- font-size: 13px;
281
- display: flex;
282
- align-items: center;
283
- justify-content: space-between;
284
- }
285
-
286
- .settings-suboption:hover {
287
- background: rgba(255, 255, 255, 0.1);
288
- color: var(--player-primary-color);
289
- }
290
-
291
- .settings-suboption.active {
292
- color: var(--player-primary-color);
293
- font-weight: 600;
294
- background: rgba(255, 255, 255, 0.05);
295
- }
296
-
297
- .settings-suboption.active::after {
298
- content: '✓';
299
- font-size: 12px;
300
- color: var(--player-primary-color);
301
- }
302
-
303
- /* Visual indicator for options with submenus */
304
- .settings-option:has(.settings-submenu, .quality-submenu, .speed-submenu)::after {
305
- content: '▶';
306
- font-size: 10px;
307
- color: var(--player-text-secondary);
308
- margin-left: 8px;
309
- }
310
-
311
- .settings-option:hover::after {
312
- color: var(--player-primary-color);
313
- }
314
-
315
- /* RESPONSIVE - PROGRESSIVE REDUCTION */
316
- @media (max-width: 768px) {
317
- .settings-menu > .settings-option {
318
- font-size: 12px !important;
319
- }
320
-
321
- .settings-submenu,
322
- .quality-submenu,
323
- .speed-submenu {
324
- max-width: min(140px, calc(100vw - 180px)) !important;
325
- }
326
-
327
- .settings-submenu .settings-suboption,
328
- .quality-submenu .quality-option,
329
- .speed-submenu .speed-option {
330
- padding: 7px 8px !important;
331
- font-size: 11px !important;
332
- }
333
- }
334
-
335
- @media (max-width: 600px) {
336
- .settings-menu > .settings-option {
337
- font-size: 11px !important;
338
- }
339
-
340
- .settings-submenu,
341
- .quality-submenu,
342
- .speed-submenu {
343
- max-width: min(120px, calc(100vw - 160px)) !important;
344
- }
345
-
346
- .settings-submenu .settings-suboption,
347
- .quality-submenu .quality-option,
348
- .speed-submenu .speed-option {
349
- padding: 6px 7px !important;
350
- font-size: 10px !important;
351
- }
352
- }
353
-
354
- @media (max-width: 450px) {
355
- .settings-menu > .settings-option {
356
- font-size: 10px !important;
357
- }
358
-
359
- .settings-submenu,
360
- .quality-submenu,
361
- .speed-submenu {
362
- max-width: min(100px, calc(100vw - 140px)) !important;
363
- }
364
-
365
- .settings-submenu .settings-suboption,
366
- .quality-submenu .quality-option,
367
- .speed-submenu .speed-option {
368
- padding: 5px 6px !important;
369
- font-size: 9px !important;
370
- }
371
- }
372
-
373
- @media (max-width: 350px) {
374
- .settings-control {
375
- display: block !important;
376
- }
377
-
378
- .pip-btn,
379
- .speed-control,
380
- .subtitles-control {
381
- display: none !important;
382
- }
383
- }
384
- // Expandable settings menu styles
385
- .settings-expandable-wrapper {
386
- position: relative;
387
- display: block;
388
- }
389
-
390
- .settings-option.expandable-trigger {
391
- display: flex;
392
- justify-content: space-between;
393
- align-items: center;
394
- cursor: pointer;
395
- font-size: 10px !important;
396
-
397
- .settings-option-label {
398
- font-size: 10px !important;
399
- }
400
-
401
- .expand-arrow {
402
- font-size: 8px;
403
- transition: transform 0.2s ease;
404
- margin-left: 8px;
405
- }
406
- }
407
-
408
- .settings-expandable-content {
409
- padding-left: 15px;
410
- margin-top: 4px;
411
-
412
- .settings-suboption {
413
- padding: 6px 12px;
414
- cursor: pointer;
415
- color: white;
416
- font-size: 10px;
417
- white-space: normal;
418
- word-wrap: break-word;
419
- opacity: 0.8;
420
- transition: opacity 0.2s;
421
-
422
- &.active {
423
- opacity: 1;
424
- font-weight: bold;
425
- }
426
-
427
- &:hover {
428
- opacity: 1;
429
- background: rgba(255, 255, 255, 0.1);
430
- }
431
- }
432
- }
package/scss/_mixins.scss DELETED
@@ -1,112 +0,0 @@
1
- // ===================================
2
- // MIXINS
3
- // ===================================
4
-
5
- @use 'variables' as *;
6
-
7
- // Mixin for button hover effects
8
- @mixin button-hover {
9
- transition: all $player-transition-fast;
10
-
11
- &:hover {
12
- background: $player-button-hover;
13
- transform: scale(1.05);
14
- }
15
-
16
- &:active {
17
- transform: scale(0.95);
18
- background: $player-button-active;
19
- }
20
- }
21
-
22
- // Mixin for overlay positioning
23
- @mixin overlay-base {
24
- position: absolute;
25
- top: 0;
26
- left: 0;
27
- width: 100%;
28
- height: 100%;
29
- }
30
-
31
- // Mixin for menu styling
32
- @mixin menu-base {
33
- position: absolute;
34
- bottom: 100%;
35
- right: 0;
36
- background: $player-bg-menu;
37
- backdrop-filter: blur(10px);
38
- border-radius: 8px;
39
- padding: 8px 0;
40
- margin-bottom: 10px;
41
- opacity: 0;
42
- visibility: hidden;
43
- transition: all $player-transition-fast;
44
- min-width: 140px;
45
- border: 1px solid rgba(255, 255, 255, 0.1);
46
- z-index: 100;
47
- box-shadow: $player-shadow-menu;
48
- }
49
-
50
- // Mixin for tooltip styling
51
- @mixin tooltip-base {
52
- position: absolute;
53
- bottom: 100%;
54
- background: rgba(0, 0, 0, 0.9);
55
- color: white;
56
- padding: 6px 10px;
57
- border-radius: 6px;
58
- font-size: 12px;
59
- font-weight: 500;
60
- white-space: nowrap;
61
- opacity: 0;
62
- visibility: hidden;
63
- transition: all 0.15s ease;
64
- z-index: 1000;
65
- box-shadow: $player-shadow-tooltip;
66
- backdrop-filter: blur(8px);
67
- border: 1px solid rgba(255, 255, 255, 0.1);
68
-
69
- &::after {
70
- content: '';
71
- position: absolute;
72
- top: 100%;
73
- left: 50%;
74
- transform: translateX(-50%);
75
- width: 0;
76
- height: 0;
77
- border-left: 5px solid transparent;
78
- border-right: 5px solid transparent;
79
- border-top: 5px solid rgba(0, 0, 0, 0.9);
80
- }
81
- }
82
-
83
- // Mixin for flex centering
84
- @mixin flex-center {
85
- display: flex;
86
- align-items: center;
87
- justify-content: center;
88
- }
89
-
90
- // Mixin for smooth transition
91
- @mixin smooth-transition($properties...) {
92
- transition: $properties $player-transition-normal;
93
- }
94
-
95
- // Responsive breakpoints
96
- @mixin tablet {
97
- @media (max-width: 768px) {
98
- @content;
99
- }
100
- }
101
-
102
- @mixin mobile {
103
- @media (max-width: 480px) {
104
- @content;
105
- }
106
- }
107
-
108
- @mixin small-mobile {
109
- @media (max-width: 350px) {
110
- @content;
111
- }
112
- }
package/scss/_poster.scss DELETED
@@ -1,8 +0,0 @@
1
- // ===================================
2
- // POSTER OVERLAY
3
- // ===================================
4
-
5
- @use 'mixins' as *;
6
- @use 'variables' as *;
7
-
8
-