Tick the playing quality, and hide the menu with the HUD
The quality menu now marks the format that is actually on screen when it opens, read live from the player rather than recorded at bind time, so the tick follows an automatic pick or a fallback after a failed candidate, not only a manual choice. Labels drop the container (mp4 told the viewer nothing about a quality choice) and gain the extractor's format_note when it says something the quality doesn't already. The menu sits outside .cp-hud so it can escape the bar's overflow, which means the idle fade never reached it -- the player and the reels feed now close it along with the rest of the HUD. Opening it restarts the idle countdown (the feed's window is only a second), and on desktop a mouse resting on the open menu holds the HUD up, same as the bars. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QBDkEXP4htyXTCZUwMLphd
This commit is contained in:
@@ -52,7 +52,11 @@ App.feed = App.feed || {};
|
||||
if (hudIdleTimer) clearTimeout(hudIdleTimer);
|
||||
hudIdleTimer = setTimeout(() => {
|
||||
hudIdleTimer = null;
|
||||
if (state.feedOpen) document.body.classList.add('feed-hud-idle');
|
||||
if (!state.feedOpen) return;
|
||||
document.body.classList.add('feed-hud-idle');
|
||||
// The quality menu only fades with the rest of the HUD if we close
|
||||
// it: it's an opened popover, not a permanently mounted control.
|
||||
document.querySelectorAll('.feed-format-menu').forEach((menu) => { menu.hidden = true; });
|
||||
}, HUD_IDLE_MS);
|
||||
};
|
||||
|
||||
@@ -293,7 +297,8 @@ App.feed = App.feed || {};
|
||||
slide.classList.remove('is-loaded');
|
||||
loadSlideSource(slide, videoData, true);
|
||||
};
|
||||
const bindFormats = () => App.customPlayer.bindFormatMenu(formatBtn, formatMenu, videoData, onFormatPick);
|
||||
const bindFormats = () => App.customPlayer.bindFormatMenu(formatBtn, formatMenu, videoData, onFormatPick,
|
||||
{ getCurrentUrl: () => slide._activeUrl || '', onOpen: wakeHud });
|
||||
let destroyFormatMenu = bindFormats();
|
||||
cleanups.push(() => destroyFormatMenu());
|
||||
// A slide can go active before its formats have been resolved (feed items
|
||||
@@ -357,6 +362,8 @@ App.feed = App.feed || {};
|
||||
markSlideFailed(slide);
|
||||
return;
|
||||
}
|
||||
// What's actually on screen, so the quality menu can tick it.
|
||||
slide._activeUrl = resolved.url;
|
||||
const streamUrl = App.videos.buildStreamUrlFromSource(resolved);
|
||||
const isHls = resolved.isLive ? true : /\.m3u8($|\?)/i.test(resolved.url);
|
||||
|
||||
@@ -440,7 +447,7 @@ App.feed = App.feed || {};
|
||||
<img class="icon-svg" src="https://cdn.jsdelivr.net/npm/heroicons@2.0.13/24/outline/arrow-top-right-on-square.svg" alt="">
|
||||
</button>
|
||||
<button class="cp-format-btn feed-format-btn" type="button" aria-label="Quality" hidden>HD</button>
|
||||
<div class="cp-format-menu feed-format-menu" hidden></div>
|
||||
<div class="cp-format-menu feed-format-menu" role="menu" hidden></div>
|
||||
<div class="cp-flash feed-flash" aria-hidden="true"></div>
|
||||
<div class="feed-info">
|
||||
<h4 class="feed-title"><span class="feed-title-text">${v.title || ''}</span></h4>
|
||||
|
||||
Reference in New Issue
Block a user