myetv-player 1.6.2 → 1.6.3
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/css/myetv-player.css +303 -4
- package/css/myetv-player.min.css +1 -1
- package/dist/myetv-player.js +224 -75
- package/dist/myetv-player.min.js +180 -60
- package/package.json +2 -1
package/dist/myetv-player.min.js
CHANGED
|
@@ -1170,13 +1170,31 @@ markPlayerReady() {
|
|
|
1170
1170
|
}
|
|
1171
1171
|
|
|
1172
1172
|
if (this.options.autoplay) {
|
|
1173
|
-
if (this.options.debug) console.log('
|
|
1173
|
+
if (this.options.debug) console.log('Autoplay enabled');
|
|
1174
1174
|
setTimeout(() => {
|
|
1175
|
-
this.video.play()
|
|
1176
|
-
|
|
1175
|
+
this.video.play()
|
|
1176
|
+
.then(() => {
|
|
1177
|
+
|
|
1178
|
+
if (this.options.debug) console.log('Autoplay started successfully');
|
|
1179
|
+
})
|
|
1180
|
+
.catch(error => {
|
|
1181
|
+
|
|
1182
|
+
if (this.options.debug) console.warn('Autoplay blocked', error);
|
|
1183
|
+
|
|
1184
|
+
if (this.options.autoHide && this.autoHideInitialized) {
|
|
1185
|
+
|
|
1186
|
+
this.showControlsNow();
|
|
1187
|
+
|
|
1188
|
+
this.resetAutoHideTimer();
|
|
1189
|
+
|
|
1190
|
+
if (this.options.debug) {
|
|
1191
|
+
console.log('Auto-hide timer started (autoplay blocked - video paused)');
|
|
1192
|
+
}
|
|
1193
|
+
}
|
|
1177
1194
|
});
|
|
1178
1195
|
}, 100);
|
|
1179
1196
|
}
|
|
1197
|
+
|
|
1180
1198
|
}, 200);
|
|
1181
1199
|
|
|
1182
1200
|
}, 100);
|
|
@@ -1204,6 +1222,7 @@ createPlayerStructure() {
|
|
|
1204
1222
|
if (this.options.showTitleOverlay) {
|
|
1205
1223
|
this.createTitleOverlay();
|
|
1206
1224
|
}
|
|
1225
|
+
this.createTopBar();
|
|
1207
1226
|
}
|
|
1208
1227
|
|
|
1209
1228
|
createInitialLoading() {
|
|
@@ -1261,17 +1280,25 @@ updateTooltips() {
|
|
|
1261
1280
|
if (!this.controls) return;
|
|
1262
1281
|
|
|
1263
1282
|
try {
|
|
1283
|
+
|
|
1264
1284
|
this.controls.querySelectorAll('[data-tooltip]').forEach(element => {
|
|
1265
1285
|
const key = element.getAttribute('data-tooltip');
|
|
1266
1286
|
element.title = this.t(key);
|
|
1267
1287
|
});
|
|
1268
1288
|
|
|
1289
|
+
if (this.topBar) {
|
|
1290
|
+
this.topBar.querySelectorAll('[data-tooltip]').forEach(element => {
|
|
1291
|
+
const key = element.getAttribute('data-tooltip');
|
|
1292
|
+
element.title = this.t(key);
|
|
1293
|
+
});
|
|
1294
|
+
}
|
|
1295
|
+
|
|
1269
1296
|
const autoOption = this.controls.querySelector('.quality-option[data-quality="auto"]');
|
|
1270
1297
|
if (autoOption) {
|
|
1271
1298
|
autoOption.textContent = this.t('auto');
|
|
1272
1299
|
}
|
|
1273
1300
|
} catch (error) {
|
|
1274
|
-
if (this.options.debug) console.warn('
|
|
1301
|
+
if (this.options.debug) console.warn('Tooltip update error', error);
|
|
1275
1302
|
}
|
|
1276
1303
|
}
|
|
1277
1304
|
|
|
@@ -1418,6 +1445,9 @@ initializeElements() {
|
|
|
1418
1445
|
this.qualityMenu = this.controls?.querySelector('.quality-menu');
|
|
1419
1446
|
this.subtitlesMenu = this.controls?.querySelector('.subtitles-menu');
|
|
1420
1447
|
|
|
1448
|
+
this.settingsBtn = this.container?.querySelector('.settings-btn');
|
|
1449
|
+
this.settingsMenu = this.container?.querySelector('.settings-menu');
|
|
1450
|
+
|
|
1421
1451
|
if (this.progressHandle && this.options.seekHandleShape) {
|
|
1422
1452
|
this.setSeekHandleShape(this.options.seekHandleShape);
|
|
1423
1453
|
}
|
|
@@ -1495,6 +1525,69 @@ setupMenuToggles() {
|
|
|
1495
1525
|
}
|
|
1496
1526
|
}
|
|
1497
1527
|
|
|
1528
|
+
createTopBar() {
|
|
1529
|
+
if (!this.container) return;
|
|
1530
|
+
|
|
1531
|
+
const topBar = document.createElement('div');
|
|
1532
|
+
topBar.className = 'player-top-bar';
|
|
1533
|
+
topBar.id = `topBar_${this.getUniqueId()}`;
|
|
1534
|
+
|
|
1535
|
+
if (this.options.showTitleOverlay && this.options.videoTitle) {
|
|
1536
|
+
const titleSection = document.createElement('div');
|
|
1537
|
+
titleSection.className = 'top-bar-title';
|
|
1538
|
+
|
|
1539
|
+
const titleElement = document.createElement('h3');
|
|
1540
|
+
titleElement.className = 'video-title';
|
|
1541
|
+
titleElement.textContent = this.decodeHTMLEntities(this.options.videoTitle);
|
|
1542
|
+
titleSection.appendChild(titleElement);
|
|
1543
|
+
|
|
1544
|
+
if (this.options.videoSubtitle) {
|
|
1545
|
+
const subtitleElement = document.createElement('span');
|
|
1546
|
+
subtitleElement.className = 'video-subtitle';
|
|
1547
|
+
subtitleElement.textContent = this.decodeHTMLEntities(this.options.videoSubtitle);
|
|
1548
|
+
titleSection.appendChild(subtitleElement);
|
|
1549
|
+
}
|
|
1550
|
+
|
|
1551
|
+
topBar.appendChild(titleSection);
|
|
1552
|
+
} else {
|
|
1553
|
+
|
|
1554
|
+
const spacer = document.createElement('div');
|
|
1555
|
+
spacer.className = 'top-bar-spacer';
|
|
1556
|
+
topBar.appendChild(spacer);
|
|
1557
|
+
}
|
|
1558
|
+
|
|
1559
|
+
const settingsControl = document.createElement('div');
|
|
1560
|
+
settingsControl.className = 'settings-control settings-top-bar';
|
|
1561
|
+
|
|
1562
|
+
const settingsBtn = document.createElement('button');
|
|
1563
|
+
settingsBtn.className = 'control-btn settings-btn';
|
|
1564
|
+
settingsBtn.setAttribute('data-tooltip', 'settings_menu'); // ✅ Correct: underscore
|
|
1565
|
+
|
|
1566
|
+
const icon = document.createElement('span');
|
|
1567
|
+
icon.className = 'icon';
|
|
1568
|
+
icon.innerHTML = `<svg viewBox="0 0 24 24" width="20" height="20" fill="currentColor">
|
|
1569
|
+
<path d="M19.43 12.98c.04-.32.07-.64.07-.98s-.03-.66-.07-.98l2.11-1.65c.19-.15.24-.42.12-.64l-2-3.46c-.12-.22-.39-.3-.61-.22l-2.49 1c-.52-.4-1.08-.73-1.69-.98l-.38-2.65C14.46 2.18 14.25 2 14 2h-4c-.25 0-.46.18-.49.42l-.38 2.65c-.61.25-1.17.59-1.69.98l-2.49-1c-.23-.09-.49 0-.61.22l-2 3.46c-.13.22-.07.49.12.64l2.11 1.65c-.04.32-.07.65-.07.98s.03.66.07.98l-2.11 1.65c-.19.15-.24.42-.12.64l2 3.46c.12.22.39.3.61.22l2.49-1c.52.4 1.08.73 1.69.98l.38 2.65c.03.24.24.42.49.42h4c.25 0 .46-.18.49-.42l.38-2.65c.61-.25 1.17-.59 1.69-.98l2.49 1c.23.09.49 0 .61-.22l2-3.46c.12-.22.07-.49-.12-.64l-2.11-1.65zM12 15.5c-1.93 0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5z"/>
|
|
1570
|
+
</svg>`;
|
|
1571
|
+
settingsBtn.appendChild(icon);
|
|
1572
|
+
|
|
1573
|
+
const settingsMenu = document.createElement('div');
|
|
1574
|
+
settingsMenu.className = 'settings-menu';
|
|
1575
|
+
|
|
1576
|
+
settingsControl.appendChild(settingsBtn);
|
|
1577
|
+
settingsControl.appendChild(settingsMenu);
|
|
1578
|
+
topBar.appendChild(settingsControl);
|
|
1579
|
+
|
|
1580
|
+
this.container.insertBefore(topBar, this.container.firstChild);
|
|
1581
|
+
|
|
1582
|
+
this.topBar = topBar;
|
|
1583
|
+
this.topBarTitle = topBar.querySelector('.video-title');
|
|
1584
|
+
this.topBarSubtitle = topBar.querySelector('.video-subtitle');
|
|
1585
|
+
|
|
1586
|
+
if (this.options.debug) {
|
|
1587
|
+
console.log('✅ Top bar created with integrated settings');
|
|
1588
|
+
}
|
|
1589
|
+
}
|
|
1590
|
+
|
|
1498
1591
|
restartVideo() {
|
|
1499
1592
|
if (!this.video) return this;
|
|
1500
1593
|
|
|
@@ -2606,12 +2699,30 @@ addEventListener(eventType, callback) {
|
|
|
2606
2699
|
this.pauseIcon.classList.remove('hidden');
|
|
2607
2700
|
}
|
|
2608
2701
|
|
|
2702
|
+
if (this.options.autoHide && this.autoHideInitialized) {
|
|
2703
|
+
if (this.options.debug) console.log('Video playing - reset auto-hide timer');
|
|
2704
|
+
this.showControlsNow();
|
|
2705
|
+
this.resetAutoHideTimer();
|
|
2706
|
+
}
|
|
2707
|
+
|
|
2609
2708
|
this.triggerEvent('playing', {
|
|
2610
2709
|
currentTime: this.getCurrentTime(),
|
|
2611
2710
|
duration: this.getDuration()
|
|
2612
2711
|
});
|
|
2613
2712
|
});
|
|
2614
2713
|
|
|
2714
|
+
this.video.addEventListener('pause', () => {
|
|
2715
|
+
if (this.options.autoHide && this.autoHideInitialized) {
|
|
2716
|
+
if (this.options.debug) console.log('Video paused - show controls and cancel timer');
|
|
2717
|
+
this.showControlsNow();
|
|
2718
|
+
|
|
2719
|
+
if (this.autoHideTimer) {
|
|
2720
|
+
clearTimeout(this.autoHideTimer);
|
|
2721
|
+
this.autoHideTimer = null;
|
|
2722
|
+
}
|
|
2723
|
+
}
|
|
2724
|
+
});
|
|
2725
|
+
|
|
2615
2726
|
this.video.addEventListener('waiting', () => {
|
|
2616
2727
|
if (!this.isChangingQuality) {
|
|
2617
2728
|
this.showLoading();
|
|
@@ -3061,31 +3172,33 @@ resetAutoHideTimer() {
|
|
|
3061
3172
|
this.autoHideTimer = null;
|
|
3062
3173
|
}
|
|
3063
3174
|
|
|
3064
|
-
const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0;
|
|
3175
|
+
const isTouchDevice = ('ontouchstart' in window) || (navigator.maxTouchPoints > 0);
|
|
3176
|
+
|
|
3065
3177
|
if (this.mouseOverControls && !isTouchDevice) {
|
|
3066
|
-
if (this.autoHideDebug)
|
|
3067
|
-
if (this.options.debug) console.log('Not starting timer - mouse on controls');
|
|
3068
|
-
}
|
|
3178
|
+
if (this.autoHideDebug && this.options.debug) console.log('Not starting timer - mouse on controls');
|
|
3069
3179
|
return;
|
|
3070
3180
|
}
|
|
3071
3181
|
|
|
3072
3182
|
if (this.video && this.video.paused) {
|
|
3073
|
-
|
|
3074
|
-
|
|
3075
|
-
|
|
3183
|
+
|
|
3184
|
+
const isInitialPause = this.video.currentTime === 0 && !this.video.ended;
|
|
3185
|
+
|
|
3186
|
+
if (!isInitialPause) {
|
|
3187
|
+
if (this.autoHideDebug && this.options.debug) console.log('Not starting timer - video paused by user');
|
|
3076
3188
|
return;
|
|
3077
3189
|
}
|
|
3078
3190
|
|
|
3079
|
-
this.
|
|
3080
|
-
|
|
3081
|
-
if (this.options.debug) console.log(`Timer expired after ${this.options.autoHideDelay}ms - nascondo controlli`);
|
|
3191
|
+
if (this.autoHideDebug && this.options.debug) {
|
|
3192
|
+
console.log('Video paused but at start - allowing timer (autoplay blocked scenario)');
|
|
3082
3193
|
}
|
|
3194
|
+
}
|
|
3195
|
+
|
|
3196
|
+
this.autoHideTimer = setTimeout(() => {
|
|
3197
|
+
if (this.autoHideDebug && this.options.debug) console.log(`Timer expired after ${this.options.autoHideDelay}ms - hiding controls`);
|
|
3083
3198
|
this.hideControlsNow();
|
|
3084
3199
|
}, this.options.autoHideDelay);
|
|
3085
3200
|
|
|
3086
|
-
if (this.autoHideDebug) {
|
|
3087
|
-
if (this.options.debug) console.log(`Auto-hide timer started: ${this.options.autoHideDelay}ms`);
|
|
3088
|
-
}
|
|
3201
|
+
if (this.autoHideDebug && this.options.debug) console.log(`Auto-hide timer started (${this.options.autoHideDelay}ms)`);
|
|
3089
3202
|
}
|
|
3090
3203
|
|
|
3091
3204
|
showControlsNow() {
|
|
@@ -3108,7 +3221,7 @@ showControlsNow() {
|
|
|
3108
3221
|
|
|
3109
3222
|
this.showCursor();
|
|
3110
3223
|
|
|
3111
|
-
if (this.autoHideDebug && this.options.debug) console.log('
|
|
3224
|
+
if (this.autoHideDebug && this.options.debug) console.log('Controls shown');
|
|
3112
3225
|
}
|
|
3113
3226
|
}
|
|
3114
3227
|
|
|
@@ -3144,7 +3257,7 @@ hideControlsNow() {
|
|
|
3144
3257
|
|
|
3145
3258
|
this.hideCursor();
|
|
3146
3259
|
|
|
3147
|
-
if (this.autoHideDebug && this.options.debug) console.log('
|
|
3260
|
+
if (this.autoHideDebug && this.options.debug) console.log('Controls hidden');
|
|
3148
3261
|
}
|
|
3149
3262
|
}
|
|
3150
3263
|
|
|
@@ -3388,10 +3501,9 @@ createControls() {
|
|
|
3388
3501
|
</div>
|
|
3389
3502
|
|
|
3390
3503
|
<div class="time-display">
|
|
3391
|
-
<span class="current-time">
|
|
3392
|
-
<span
|
|
3393
|
-
|
|
3394
|
-
</div>
|
|
3504
|
+
<span class="current-time">00:00</span>
|
|
3505
|
+
<span class="duration">00:00</span>
|
|
3506
|
+
</div>
|
|
3395
3507
|
</div>
|
|
3396
3508
|
|
|
3397
3509
|
<div class="controls-right">
|
|
@@ -3402,13 +3514,6 @@ createControls() {
|
|
|
3402
3514
|
<span class="icon"><svg viewBox="0 0 16 16" width="16" height="16" fill="currentColor"><path d="M12.5 4v8l-7-4zm-8 0v8l7-4z"/></svg></span>
|
|
3403
3515
|
</button>
|
|
3404
3516
|
|
|
3405
|
-
<div class="settings-control">
|
|
3406
|
-
<button class="control-btn settings-btn" data-tooltip="settings_menu">
|
|
3407
|
-
<span class="icon"><svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor"><path d="M19.43 12.98c.04-.32.07-.64.07-.98s-.03-.66-.07-.98l2.11-1.65c.19-.15.24-.42.12-.64l-2-3.46c-.12-.22-.39-.3-.61-.22l-2.49 1c-.52-.4-1.08-.73-1.69-.98l-.38-2.65C14.46 2.18 14.25 2 14 2h-4c-.25 0-.46.18-.49.42l-.38 2.65c-.61.25-1.17.59-1.69.98l-2.49-1c-.23-.09-.49 0-.61.22l-2 3.46c-.13.22-.07.49.12.64l2.11 1.65c-.04.32-.07.65-.07.98s.03.66.07.98l-2.11 1.65c-.19.15-.24.42-.12.64l2 3.46c.12.22.39.3.61.22l2.49-1c.52.4 1.08.73 1.69.98l.38 2.65c.03.24.24.42.49.42h4c.25 0 .46-.18.49-.42l.38-2.65c.61-.25 1.17-.59 1.69-.98l2.49 1c.23.09.49 0 .61-.22l2-3.46c.12-.22.07-.49-.12-.64l-2.11-1.65zM12 15.5c-1.93 0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5z"/></svg></span>
|
|
3408
|
-
</button>
|
|
3409
|
-
<div class="settings-menu"></div>
|
|
3410
|
-
</div>
|
|
3411
|
-
|
|
3412
3517
|
${(this.options.showQualitySelector && this.originalSources && this.originalSources.length > 1) || this.options.adaptiveQualityControl ? `
|
|
3413
3518
|
<div class="quality-control">
|
|
3414
3519
|
<button class="control-btn quality-btn" data-tooltip="video_quality">
|
|
@@ -3519,7 +3624,9 @@ checkScreenSize() {
|
|
|
3519
3624
|
}
|
|
3520
3625
|
|
|
3521
3626
|
updateSettingsMenuVisibility() {
|
|
3522
|
-
|
|
3627
|
+
|
|
3628
|
+
const settingsControl = this.container?.querySelector('.settings-control');
|
|
3629
|
+
|
|
3523
3630
|
if (!settingsControl) return;
|
|
3524
3631
|
|
|
3525
3632
|
settingsControl.style.display = 'block';
|
|
@@ -3528,23 +3635,28 @@ updateSettingsMenuVisibility() {
|
|
|
3528
3635
|
|
|
3529
3636
|
const speedControl = this.controls.querySelector('.speed-control');
|
|
3530
3637
|
const subtitlesControl = this.controls.querySelector('.subtitles-control');
|
|
3638
|
+
|
|
3531
3639
|
if (speedControl) speedControl.style.display = 'none';
|
|
3532
3640
|
if (subtitlesControl) subtitlesControl.style.display = 'none';
|
|
3533
3641
|
}
|
|
3534
3642
|
|
|
3535
3643
|
populateSettingsMenu() {
|
|
3536
|
-
|
|
3644
|
+
|
|
3645
|
+
const settingsMenu = this.container?.querySelector('.settings-menu');
|
|
3646
|
+
|
|
3537
3647
|
if (!settingsMenu) return;
|
|
3538
3648
|
|
|
3539
3649
|
let menuHTML = '';
|
|
3540
3650
|
|
|
3541
3651
|
if (this.options.showSpeedControl) {
|
|
3542
|
-
const speedLabel = this.t('playback_speed')
|
|
3652
|
+
const speedLabel = this.t('playback_speed');
|
|
3543
3653
|
const currentSpeed = this.video ? this.video.playbackRate : 1;
|
|
3544
|
-
|
|
3545
|
-
|
|
3654
|
+
|
|
3655
|
+
menuHTML += `
|
|
3656
|
+
<div class="settings-expandable-wrapper">
|
|
3657
|
+
<div class="settings-option expandable-trigger" data-action="speed_expand">
|
|
3546
3658
|
<span class="settings-option-label">${speedLabel} <strong>${currentSpeed}x</strong></span>
|
|
3547
|
-
<span class="expand-arrow"
|
|
3659
|
+
<span class="expand-arrow">▼</span>
|
|
3548
3660
|
</div>
|
|
3549
3661
|
<div class="settings-expandable-content" style="display: none;">`;
|
|
3550
3662
|
|
|
@@ -3553,22 +3665,26 @@ populateSettingsMenu() {
|
|
|
3553
3665
|
const isActive = Math.abs(speed - currentSpeed) < 0.01;
|
|
3554
3666
|
menuHTML += `<div class="settings-suboption ${isActive ? 'active' : ''}" data-speed="${speed}">${speed}x</div>`;
|
|
3555
3667
|
});
|
|
3668
|
+
|
|
3556
3669
|
menuHTML += `</div></div>`;
|
|
3557
3670
|
}
|
|
3558
3671
|
|
|
3559
3672
|
if (this.options.showSubtitles && this.textTracks && this.textTracks.length > 0) {
|
|
3560
|
-
const subtitlesLabel = this.t('subtitles')
|
|
3673
|
+
const subtitlesLabel = this.t('subtitles');
|
|
3561
3674
|
const currentTrack = this.currentSubtitleTrack;
|
|
3562
|
-
const currentLabel = this.subtitlesEnabled ?
|
|
3675
|
+
const currentLabel = this.subtitlesEnabled ?
|
|
3676
|
+
(currentTrack ? currentTrack.label : 'Unknown') :
|
|
3677
|
+
this.t('subtitles_off'); //
|
|
3563
3678
|
|
|
3564
|
-
menuHTML +=
|
|
3565
|
-
<div class="settings-
|
|
3679
|
+
menuHTML += `
|
|
3680
|
+
<div class="settings-expandable-wrapper">
|
|
3681
|
+
<div class="settings-option expandable-trigger" data-action="subtitles_expand">
|
|
3566
3682
|
<span class="settings-option-label">${subtitlesLabel} <strong>${currentLabel}</strong></span>
|
|
3567
|
-
<span class="expand-arrow"
|
|
3683
|
+
<span class="expand-arrow">▼</span>
|
|
3568
3684
|
</div>
|
|
3569
3685
|
<div class="settings-expandable-content" style="display: none;">`;
|
|
3570
3686
|
|
|
3571
|
-
menuHTML += `<div class="settings-suboption ${!this.subtitlesEnabled ? 'active' : ''}" data-track="off">${this.t('
|
|
3687
|
+
menuHTML += `<div class="settings-suboption ${!this.subtitlesEnabled ? 'active' : ''}" data-track="off">${this.t('subtitles_off')}</div>`;
|
|
3572
3688
|
|
|
3573
3689
|
this.textTracks.forEach((trackData, index) => {
|
|
3574
3690
|
const isActive = this.currentSubtitleTrack === trackData.track;
|
|
@@ -3631,8 +3747,10 @@ addSettingsMenuScrollbar() {
|
|
|
3631
3747
|
}
|
|
3632
3748
|
|
|
3633
3749
|
bindSettingsMenuEvents() {
|
|
3634
|
-
|
|
3635
|
-
const
|
|
3750
|
+
|
|
3751
|
+
const settingsBtn = this.container?.querySelector('.settings-btn');
|
|
3752
|
+
const settingsMenu = this.container?.querySelector('.settings-menu');
|
|
3753
|
+
|
|
3636
3754
|
if (!settingsMenu || !settingsBtn) return;
|
|
3637
3755
|
|
|
3638
3756
|
settingsBtn.addEventListener('click', (e) => {
|
|
@@ -3640,27 +3758,30 @@ bindSettingsMenuEvents() {
|
|
|
3640
3758
|
settingsMenu.classList.toggle('active');
|
|
3641
3759
|
|
|
3642
3760
|
if (settingsMenu.classList.contains('active')) {
|
|
3643
|
-
const
|
|
3644
|
-
const containerRect = settingsMenu.parentElement.parentElement.getBoundingClientRect();
|
|
3761
|
+
const containerRect = this.container.getBoundingClientRect();
|
|
3645
3762
|
const btnRect = settingsBtn.getBoundingClientRect();
|
|
3646
|
-
|
|
3647
|
-
const
|
|
3763
|
+
|
|
3764
|
+
const spaceBelow = containerRect.bottom - btnRect.bottom - 30; // 30px margin
|
|
3765
|
+
|
|
3766
|
+
const maxMenuHeight = Math.max(300, Math.min(600, spaceBelow));
|
|
3648
3767
|
|
|
3649
3768
|
settingsMenu.style.maxHeight = `${maxMenuHeight}px`;
|
|
3650
3769
|
settingsMenu.style.overflowY = 'auto';
|
|
3651
3770
|
settingsMenu.style.overflowX = 'hidden';
|
|
3652
|
-
|
|
3653
|
-
|
|
3654
|
-
|
|
3771
|
+
|
|
3772
|
+
if (this.options.debug) {
|
|
3773
|
+
console.log(`Settings menu opened: height=${maxMenuHeight}px (available=${spaceBelow}px)`);
|
|
3655
3774
|
}
|
|
3775
|
+
} else {
|
|
3656
3776
|
|
|
3777
|
+
settingsMenu.style.maxHeight = '600px'; // Default max height
|
|
3778
|
+
settingsMenu.style.overflowY = 'auto';
|
|
3779
|
+
}
|
|
3657
3780
|
});
|
|
3658
3781
|
|
|
3659
3782
|
document.addEventListener('click', (e) => {
|
|
3660
3783
|
if (!settingsBtn?.contains(e.target) && !settingsMenu?.contains(e.target)) {
|
|
3661
3784
|
settingsMenu?.classList.remove('active');
|
|
3662
|
-
settingsMenu.style.maxHeight = 'none';
|
|
3663
|
-
settingsMenu.style.overflowY = 'visible';
|
|
3664
3785
|
}
|
|
3665
3786
|
});
|
|
3666
3787
|
|
|
@@ -3700,7 +3821,7 @@ bindSettingsMenuEvents() {
|
|
|
3700
3821
|
const trigger = wrapper.querySelector('.expandable-trigger');
|
|
3701
3822
|
const action = trigger.getAttribute('data-action');
|
|
3702
3823
|
|
|
3703
|
-
if (action === '
|
|
3824
|
+
if (action === 'speed_expand') {
|
|
3704
3825
|
const speed = parseFloat(e.target.getAttribute('data-speed'));
|
|
3705
3826
|
if (speed && speed > 0 && this.video && !this.isChangingQuality) {
|
|
3706
3827
|
this.video.playbackRate = speed;
|
|
@@ -3711,12 +3832,12 @@ bindSettingsMenuEvents() {
|
|
|
3711
3832
|
const label = trigger.querySelector('.settings-option-label');
|
|
3712
3833
|
if (label) {
|
|
3713
3834
|
const speedLabel = this.t('playback_speed') || 'Playback Speed';
|
|
3714
|
-
label.
|
|
3835
|
+
label.innerHTML = `${speedLabel} <strong>${speed}x</strong>`;
|
|
3715
3836
|
}
|
|
3716
3837
|
|
|
3717
3838
|
this.triggerEvent('speedchange', { speed, previousSpeed: this.video.playbackRate });
|
|
3718
3839
|
}
|
|
3719
|
-
} else if (action === '
|
|
3840
|
+
} else if (action === 'subtitles_expand') {
|
|
3720
3841
|
const trackData = e.target.getAttribute('data-track');
|
|
3721
3842
|
if (trackData === 'off') {
|
|
3722
3843
|
this.disableSubtitles();
|
|
@@ -3731,7 +3852,7 @@ bindSettingsMenuEvents() {
|
|
|
3731
3852
|
const label = trigger.querySelector('.settings-option-label');
|
|
3732
3853
|
if (label) {
|
|
3733
3854
|
const subtitlesLabel = this.t('subtitles') || 'Subtitles';
|
|
3734
|
-
label.
|
|
3855
|
+
label.innerHTML = `${subtitlesLabel} <strong>${e.target.textContent}</strong>`;
|
|
3735
3856
|
}
|
|
3736
3857
|
}
|
|
3737
3858
|
}
|
|
@@ -7549,8 +7670,7 @@ updateTimeDisplay() {
|
|
|
7549
7670
|
}
|
|
7550
7671
|
}
|
|
7551
7672
|
const fallback = {
|
|
7552
|
-
'loading': 'Loading...'
|
|
7553
|
-
'encodinginprogress': 'Encoding in progress...'
|
|
7673
|
+
'loading': 'Loading...'
|
|
7554
7674
|
};
|
|
7555
7675
|
return fallback[key] || key;
|
|
7556
7676
|
};
|
|
@@ -7563,7 +7683,7 @@ updateTimeDisplay() {
|
|
|
7563
7683
|
this.durationEl.classList.add('loading-state');
|
|
7564
7684
|
} else if (isDurationInvalid) {
|
|
7565
7685
|
|
|
7566
|
-
this.updateLoadingText(t('
|
|
7686
|
+
this.updateLoadingText(t('loading'));
|
|
7567
7687
|
|
|
7568
7688
|
this.durationEl.textContent = "--:--";
|
|
7569
7689
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "myetv-player",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.3",
|
|
4
4
|
"description": "MYETV Video Player - Modular HTML5 video player with plugin support for YouTube, Vimeo, Twitch, Facebook, Cloudflare Stream and streaming protocols (HLS/DASH)",
|
|
5
5
|
"main": "dist/myetv-player.js",
|
|
6
6
|
"files": [
|
|
@@ -63,3 +63,4 @@
|
|
|
63
63
|
|
|
64
64
|
|
|
65
65
|
|
|
66
|
+
|