mirror of
https://github.com/PR0M3TH3AN/bitvid.git
synced 2026-10-27 07:52:24 +00:00
### Motivation - Prevent a browser-policy muted-autoplay retry from overwriting a viewer's explicit mute/unmute preference and ensure fallback mutes are transient. - Ensure that when a user logs in while a video comment modal is open, the open thread is reloaded (not just refreshed) so comments continue to display correctly after relay-backed services are reconfigured. ### Description - Add `js/utils/autoplayPreference.js` with `muteForAutoplayFallback` and `consumeAutoplayFallbackMute` helpers to mark and consume transient fallback mutes. - Update `js/services/playbackService.js` to treat sound as default unless the viewer explicitly chose mute, persist explicit choices via `localStorage`, ignore fallback-generated volume changes using `consumeAutoplayFallbackMute`, and expose `muteForAutoplayFallback` delegating to the new util. - Replace direct `videoElement.muted = true` calls with `playbackService.muteForAutoplayFallback` in `js/app/playbackCoordinator.js` and `js/webtorrent.js` so fallback mutes are marked as transient. - Change `js/app/authSessionCoordinator.js` to reload the currently open video comment thread with `commentController.load(activeModalVideo)` after login if a modal video is active, instead of only calling `refreshAuthState`. - Update tests in `tests/services/playbackService.test.mjs` and add a test in `tests/app/login-defers-dms.test.mjs` to cover the login behavior that reloads an open comment thread. ### Testing - Ran the `PlaybackService` unit tests (`tests/services/playbackService.test.mjs`) which assert `prepareVideoElement` behavior, explicit mute persistence, and the transient nature of fallback mute, and they passed. - Ran the auth login unit tests including `tests/app/login-defers-dms.test.mjs` which verifies DM deferral and reload of an open comment thread, and they passed.
28 lines
776 B
JavaScript
28 lines
776 B
JavaScript
const FALLBACK_MUTE_DATASET_KEY = "bitvidAutoplayFallbackMute";
|
|
|
|
/**
|
|
* Mute playback after an unmuted autoplay rejection without recording the
|
|
* browser-policy fallback as a viewer preference.
|
|
*/
|
|
export function muteForAutoplayFallback(videoElement) {
|
|
if (!videoElement || videoElement.muted) {
|
|
return false;
|
|
}
|
|
|
|
if (videoElement.dataset) {
|
|
videoElement.dataset[FALLBACK_MUTE_DATASET_KEY] = "true";
|
|
}
|
|
videoElement.muted = true;
|
|
return true;
|
|
}
|
|
|
|
/** Consume the marker attached to the next fallback-generated volume change. */
|
|
export function consumeAutoplayFallbackMute(videoElement) {
|
|
if (videoElement?.dataset?.[FALLBACK_MUTE_DATASET_KEY] !== "true") {
|
|
return false;
|
|
}
|
|
|
|
delete videoElement.dataset[FALLBACK_MUTE_DATASET_KEY];
|
|
return true;
|
|
}
|