diff --git a/assets/js/BackupHelper.ts b/assets/js/BackupHelper.ts index 8d2d5f78..e47e627d 100644 --- a/assets/js/BackupHelper.ts +++ b/assets/js/BackupHelper.ts @@ -17,7 +17,7 @@ export interface IBackupState { export async function createBackupState(): Promise { const { userBooruList } = useBooruList() const { tagCollections } = useTagCollections() - const { postFullSizeImages, postsPerPage, autoplayAnimatedMedia } = useUserSettings() + const { postFullSizeImages, postsPerPage, autoplayAnimatedMedia, preferClassicVideoPlayer } = useUserSettings() // TODO: Only save data that is not defaulted @@ -30,7 +30,8 @@ export async function createBackupState(): Promise { settings: { postFullSizeImages: postFullSizeImages.value, postsPerPage: postsPerPage.value, - autoplayAnimatedMedia: autoplayAnimatedMedia.value + autoplayAnimatedMedia: autoplayAnimatedMedia.value, + preferClassicVideoPlayer: preferClassicVideoPlayer.value } } @@ -51,7 +52,7 @@ async function restoreV3Backup(backupState: IBackupState) { } if (backupState.settings) { - const { postFullSizeImages, postsPerPage, autoplayAnimatedMedia } = useUserSettings() + const { postFullSizeImages, postsPerPage, autoplayAnimatedMedia, preferClassicVideoPlayer } = useUserSettings() if (backupState.settings.postFullSizeImages != null) { postFullSizeImages.value = backupState.settings.postFullSizeImages @@ -64,6 +65,10 @@ async function restoreV3Backup(backupState: IBackupState) { if (backupState.settings.autoplayAnimatedMedia != null) { autoplayAnimatedMedia.value = backupState.settings.autoplayAnimatedMedia } + + if (backupState.settings.preferClassicVideoPlayer != null) { + preferClassicVideoPlayer.value = backupState.settings.preferClassicVideoPlayer + } } } diff --git a/components/pages/posts/post/PostMedia.vue b/components/pages/posts/post/PostMedia.vue index ac543f1b..c1c91638 100644 --- a/components/pages/posts/post/PostMedia.vue +++ b/components/pages/posts/post/PostMedia.vue @@ -12,7 +12,7 @@ const requestUrl = useRequestURL() const { isPremium } = useUserData() - const { autoplayAnimatedMedia } = useUserSettings() + const { autoplayAnimatedMedia, preferClassicVideoPlayer } = useUserSettings() let { timesVideoHasRendered } = useEthics() const { wasCurrentPageSSR } = useSSRDetection() @@ -44,6 +44,7 @@ const isAnimatedMedia = computed( () => props.mediaType === 'animated' || (props.mediaType === 'image' && props.mediaSrc.endsWith('.gif')) ) + const shouldUseClassicVideoPlayer = computed(() => isVideo.value && isPremium.value && preferClassicVideoPlayer.value) const triedToLoadWithProxy = shallowRef(false) const triedToLoadPosterWithProxy = shallowRef(false) @@ -61,6 +62,10 @@ switch (true) { case isVideo.value: + if (shouldUseClassicVideoPlayer.value) { + break + } + createVideoPlayer() break @@ -72,6 +77,14 @@ } }) + function getVideoElement() { + if (!mediaElement.value || !isVideo.value) { + return null + } + + return mediaElement.value as HTMLVideoElement + } + onBeforeUnmount(() => { let finalMediaElement = mediaElement.value @@ -96,6 +109,10 @@ // else if (isVideo.value) { + if (shouldUseClassicVideoPlayer.value) { + return + } + destroyVideoPlayer() } }) @@ -253,6 +270,26 @@ } function reloadVideoPlayer(shouldPlay: boolean = false) { + if (shouldUseClassicVideoPlayer.value) { + nextTick(() => { + const videoElement = getVideoElement() + + if (!videoElement) { + return + } + + videoElement.load() + + if (!shouldPlay) { + return + } + + void videoElement.play().catch(() => undefined) + }) + + return + } + nextTick(() => { destroyVideoPlayer() @@ -368,6 +405,11 @@ const entry = entries[0] if (!entry.isIntersecting) { + if (shouldUseClassicVideoPlayer.value) { + getVideoElement()?.pause() + return + } + videoPlayer?.pause() } } diff --git a/components/pages/settings/SettingSwitch.vue b/components/pages/settings/SettingSwitch.vue index a34f0a74..38cd334a 100644 --- a/components/pages/settings/SettingSwitch.vue +++ b/components/pages/settings/SettingSwitch.vue @@ -5,7 +5,7 @@ @@ -17,7 +17,7 @@ @@ -25,20 +25,22 @@ diff --git a/composables/useUserSettings.ts b/composables/useUserSettings.ts index 609121fa..7c3c90c7 100644 --- a/composables/useUserSettings.ts +++ b/composables/useUserSettings.ts @@ -4,6 +4,7 @@ export default function () { let postFullSizeImages = ref(false) let postsPerPage = ref(29) let autoplayAnimatedMedia = ref(false) + let preferClassicVideoPlayer = ref(false) let blockAiGeneratedImages = ref(false) if (import.meta.client) { @@ -16,6 +17,9 @@ export default function () { autoplayAnimatedMedia = useLocalStorage('settings-autoplayAnimatedMedia', false, { writeDefaults: false }) + preferClassicVideoPlayer = useLocalStorage('settings-preferClassicVideoPlayer', false, { + writeDefaults: false + }) blockAiGeneratedImages = useLocalStorage('settings-blockAiGeneratedImages', false, { writeDefaults: false }) @@ -25,6 +29,7 @@ export default function () { postFullSizeImages, postsPerPage, autoplayAnimatedMedia, + preferClassicVideoPlayer, blockAiGeneratedImages } } diff --git a/pages/settings.vue b/pages/settings.vue index 1653bb58..8406fc66 100644 --- a/pages/settings.vue +++ b/pages/settings.vue @@ -13,7 +13,8 @@ const appVersion = version - const { postFullSizeImages, postsPerPage, autoplayAnimatedMedia, blockAiGeneratedImages } = useUserSettings() + const { postFullSizeImages, postsPerPage, autoplayAnimatedMedia, preferClassicVideoPlayer, blockAiGeneratedImages } = + useUserSettings() const { isPremium } = useUserData() const { selectedList, selectedBlockList, defaultBlockList, customBlockList, resetCustomBlockList } = useBlockLists() @@ -142,6 +143,20 @@ +
  • + + + + + +
  • +
  • diff --git a/test/pages/settings.test.ts b/test/pages/settings.test.ts index 809b3e92..b8e0c0c2 100644 --- a/test/pages/settings.test.ts +++ b/test/pages/settings.test.ts @@ -11,5 +11,6 @@ describe('/settings', async () => { await page.waitForSelector('h1') expect(await page.textContent('h1')).toBe('Settings') + expect(await page.textContent('body')).toContain('Classic video controls') }) })