Remove disablePictureInPicture

Supprime l'attribut disablePictureInPicture pour activer Picture-in-Picture sur toutes les vidéos. Assure la visibilité du bouton PiP natif lorsque possible.

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

// ==UserScript==
// @name         Remove disablePictureInPicture
// @namespace    https://greasyfork.org/nl/users/1197317-opus-x
// @version      1.01
// @description  Removes the disablePictureInPicture attribute to enable Picture-in-Picture on all videos. Ensures the native PiP button is visible where possible.
// @description:zh-CN 移除 disablePictureInPicture 属性,使所有视频支持画中画。尽量确保原生画中画按钮可见。
// @description:hi    disablePictureInPicture विशेषता हटाता है ताकि सभी वीडियो पर पिक्चर-इन-पिक्चर सक्षम हो। जहां संभव हो मूल PiP बटन दिखाई दे।
// @description:es    Elimina el atributo disablePictureInPicture para habilitar Picture-in-Picture en todos los videos. Asegura que el botón nativo PiP sea visible cuando sea posible.
// @description:fr    Supprime l'attribut disablePictureInPicture pour activer Picture-in-Picture sur toutes les vidéos. Assure la visibilité du bouton PiP natif lorsque possible.
// @description:ar    يزيل سمة disablePictureInPicture لتمكين صورة داخل صورة على جميع الفيديوهات. يضمن ظهور زر PiP الأصلي حيثما أمكن.
// @description:bn    disablePictureInPicture অ্যাট্রিবিউট সরিয়ে সব ভিডিওতে পিকচার-ইন-পিকচার সক্ষম করে। যেখানে সম্ভব নেটিভ PiP বোতাম দৃশ্যমান রাখে।
// @description:ru    Удаляет атрибут disablePictureInPicture для включения картинки в картинке на всех видео. Обеспечивает видимость нативной кнопки PiP где возможно.
// @description:pt    Remove o atributo disablePictureInPicture para ativar Picture-in-Picture em todos os vídeos. Garante que o botão nativo PiP fique visível quando possível.
// @description:nl    Verwijdert het disablePictureInPicture-attribuut zodat Picture-in-Picture altijd mogelijk is op video's. Zorgt ervoor dat de native PiP-knop zichtbaar is waar mogelijk.
// @author       Opus-X
// @icon         data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZpZXdCb3g9IjAgMCA2NCA2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8cmVjdCB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHJ4PSIxMiIgZmlsbD0iIzMzMzMzMyIvPgogIDxyZWN0IHg9IjYiIHk9IjYiIHdpZHRoPSI1MiIgaGVpZ2h0PSIzOSIgcng9IjYiIGZpbGw9IiMyMjIyMjIiIHN0cm9rZT0iIzU1NTU1NSIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzYsMjgpIj4KICAgIDxyZWN0IHdpZHRoPSIyNCIgaGVpZ2h0PSIxOCIgcng9IjQiIGZpbGw9IiMyMjIyMjIiIHN0cm9rZT0iI2FhYWFhYSIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgICA8cG9seWdvbiBwb2ludHM9IjgsNSA4LDEzIDE0LDkiIGZpbGw9IiNjY2NjY2MiLz4KICA8L2c+Cjwvc3ZnPg==
// @match        *://*/*
// @grant        none
// @run-at       document-start
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';

    // MutationObserver to catch new video elements (including dynamically loaded ones in SPAs)
    const observer = new MutationObserver((mutations) => {
        let hasVideo = false;

        mutations.forEach((mutation) => {
            mutation.addedNodes.forEach((node) => {
                if (node.nodeName === 'VIDEO') {
                    hasVideo = true;
                    enhanceVideo(node);
                }
            });
        });

        if (hasVideo) {
            document.querySelectorAll('video').forEach(enhanceVideo);
        }
    });

    // Main function to enhance each video element
    function enhanceVideo(video) {
        if (!video) return;

        // Remove disablePictureInPicture (both property and attribute)
        video.disablePictureInPicture = false;
        video.removeAttribute('disablePictureInPicture');

        // Ensure standard controls are enabled (this often reveals the native PiP button in Chrome/Edge)
        video.controls = true;

        // Optional: Remove controlsList restrictions that might hide buttons (e.g., download)
        if (video.controlsList) {
            video.controlsList.remove('nodownload');
            // Note: There is no standard 'nopip' in controlsList; PiP button visibility is browser-dependent
        }
    }

    // Initial scan and observer startup
    function start() {
        if (document.querySelector('video')) {
            document.querySelectorAll('video').forEach(enhanceVideo);
        }

        observer.observe(document.documentElement, {
            childList: true,
            subtree: true,
            attributes: false
        });
    }

    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', start);
    } else {
        start();
    }
})();