SharePoint Caption

Fix font size and single line captions in SharePoint video player

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да инсталирате разширение, като например Tampermonkey .

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name         SharePoint Caption
// @namespace    http://tampermonkey.net/
// @version      1.4
// @description  Fix font size and single line captions in SharePoint video player
// @author       You
// @match        https://v6v10-my.sharepoint.com/*
// @grant        none
// @license      noiseandsmke
// ==/UserScript==

(function() {
    'use strict';

    // Configuration - Change font size here
    const FONT_SIZE = '20px'; // Change this to your preferred size

    let processedCaptions = new Set();

    function fixCaption(caption) {
        const captionId = caption.outerHTML;
        if (processedCaptions.has(captionId)) return;

        const textContent = caption.textContent?.trim();
        if (!textContent) return;

        // 1. Convert to single line
        caption.innerHTML = caption.innerHTML.replace(/<br\s*\/?>/gi, ' ');

        // 2. Fix font size using CSS custom property
        caption.style.setProperty('--oneplayer-caption-text-size', FONT_SIZE, 'important');
        caption.style.fontSize = `${FONT_SIZE} !important`;

        // 3. Force to bottom of video container
        const captionSection = caption.closest('.captions-section');
        const captionRegion = caption.closest('.captions-region');

        if (captionSection) {
            captionSection.style.bottom = '20px !important';
            captionSection.style.top = 'auto !important';
        }

        if (captionRegion) {
            // Position relative to video player container
            const videoContainer = document.querySelector('.video-player-container');
            if (videoContainer) {
                captionRegion.style.position = 'absolute !important';
                captionRegion.style.bottom = '0px !important';
                captionRegion.style.left = '0px !important';
                captionRegion.style.right = '0px !important';
                captionRegion.style.width = '100% !important';
                captionRegion.style.height = '100% !important';
            }
        }

        processedCaptions.add(captionId);
    }

    function processCaptions() {
        const captions = document.querySelectorAll('.captions');
        captions.forEach(fixCaption);
    }

    // Observer for new captions
    const observer = new MutationObserver((mutations) => {
        for (let mutation of mutations) {
            if (mutation.target.classList?.contains('captions') ||
                mutation.target.querySelector?.('.captions')) {
                processCaptions();
                break;
            }
        }
    });

    // Start
    function init() {
        processCaptions();
        observer.observe(document.body, {
            childList: true,
            subtree: true,
            characterData: true
        });
    }

    // Initialize with delay
    setTimeout(init, 1000);
})();