您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Automatically rotate device to landscape when a fullscreen video is in landscape orientation only
- // ==UserScript==
- // @name Auto-Rotate Video Fullscreen
- // @namespace http://tampermonkey.net/
- // @version 1.3
- // @description Automatically rotate device to landscape when a fullscreen video is in landscape orientation only
- // @match *://*/*
- // @grant window.orientation
- // @grant window.screen
- // @run-at document-start
- // @license MIT
- // ==/UserScript==
- (function() {
- 'use strict';
- // Check if an element is in full screen
- function isFullScreen(element) {
- return (
- document.fullscreenElement === element ||
- document.webkitFullscreenElement === element ||
- document.mozFullScreenElement === element ||
- document.msFullscreenElement === element ||
- element.webkitDisplayingFullscreen ||
- element.fullscreen
- );
- }
- // Attempt screen rotation
- function rotateScreen(landscape) {
- try {
- // Method 1: Screen Orientation API
- if (screen.orientation && screen.orientation.lock) {
- screen.orientation.lock(landscape ? 'landscape-primary' : 'portrait-primary')
- .catch(() => {});
- }
- // Method 2: Explicit window.orientation manipulation
- if (window.orientation !== undefined) {
- window.orientation = landscape ? 90 : 0;
- }
- } catch (error) {
- // Silently handle rotation errors
- }
- }
- // Fullscreen change handler with landscape video check
- function handleFullscreenChange(event) {
- // Get the current fullscreen element (if any)
- let fullscreenElement = document.fullscreenElement ||
- document.webkitFullscreenElement ||
- document.mozFullScreenElement ||
- document.msFullscreenElement;
- if (fullscreenElement) {
- // We're entering fullscreen. Try to get a video element.
- let videoElement = null;
- if (fullscreenElement.tagName.toLowerCase() === 'video') {
- videoElement = fullscreenElement;
- } else {
- videoElement = fullscreenElement.querySelector('video');
- }
- // Only rotate if a video element exists and it's landscape (width > height)
- if (videoElement && videoElement.videoWidth > videoElement.videoHeight) {
- // Store that we rotated because of a landscape video
- window.__isLandscapeVideoFullscreen = true;
- rotateScreen(true);
- } else {
- // Do nothing for portrait videos or if no video found
- window.__isLandscapeVideoFullscreen = false;
- }
- } else {
- // Exiting fullscreen: if we had rotated for a landscape video, revert to portrait.
- if (window.__isLandscapeVideoFullscreen) {
- rotateScreen(false);
- window.__isLandscapeVideoFullscreen = false;
- }
- }
- }
- // Add fullscreen listeners to an element
- function addFullscreenListeners(element) {
- element.addEventListener('fullscreenchange', handleFullscreenChange);
- element.addEventListener('webkitfullscreenchange', handleFullscreenChange);
- element.addEventListener('mozfullscreenchange', handleFullscreenChange);
- element.addEventListener('MSFullscreenChange', handleFullscreenChange);
- }
- // Initial setup function
- function init() {
- // Add global fullscreen listeners
- document.addEventListener('fullscreenchange', handleFullscreenChange);
- document.addEventListener('webkitfullscreenchange', handleFullscreenChange);
- document.addEventListener('mozfullscreenchange', handleFullscreenChange);
- document.addEventListener('MSFullscreenChange', handleFullscreenChange);
- // Find and add listeners to existing video and iframe elements
- const videoElements = document.querySelectorAll('video, iframe');
- videoElements.forEach(video => {
- addFullscreenListeners(video);
- });
- // Observe for dynamically added video elements
- const observer = new MutationObserver((mutations) => {
- mutations.forEach((mutation) => {
- if (mutation.type === 'childList') {
- mutation.addedNodes.forEach((node) => {
- if (node.nodeType === Node.ELEMENT_NODE) {
- const videos = node.querySelectorAll('video, iframe');
- if (videos.length > 0) {
- videos.forEach(video => {
- addFullscreenListeners(video);
- });
- }
- }
- });
- }
- });
- });
- // Start observing the entire document
- observer.observe(document.documentElement, {
- childList: true,
- subtree: true
- });
- }
- // Run initialization
- if (document.readyState === 'loading') {
- document.addEventListener('DOMContentLoaded', init);
- } else {
- init();
- }
- })();