Video and Image Quality Fixer for All Sites

Force highest quality playback for videos and images on all sites.

目前為 2024-10-19 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Video and Image Quality Fixer for All Sites
// @name:zh      视频和图片画质修复
// @name:zh-CN   视频和图片画质修复
// @namespace    https://github.com/yuhaofe
// @version      0.4.3
// @description  Force highest quality playback for videos and images on all sites.
// @description:zh  强制播放最高画质的视频和图片
// @description:zh-CN 强制播放最高画质的视频和图片
// @author       tae
// @match        *://*/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    initHijack();
    initUI();
    enhanceImages();

    function initHijack() {
        var realOpen = window.XMLHttpRequest.prototype.open;
        window.XMLHttpRequest.prototype.open = hijackedOpen;
        function hijackedOpen() {
            var url = arguments['1'];
            if (isHLSPlaylist(url)) {
                this.addEventListener('readystatechange', function(e) {
                    if (this.readyState === 4) {
                        var originalText = e.target.responseText;
                        if(isMasterPlaylist(originalText)) {
                            var modifiedText = modifyMasterPlaylist(originalText);
                            Object.defineProperty(this, 'response', {writable: true});
                            Object.defineProperty(this, 'responseText', {writable: true});
                            this.response = this.responseText = modifiedText;
                        }
                    }
                });
            }
            return realOpen.apply(this, arguments);
        };
        function isHLSPlaylist(url) {
            var reg = new RegExp(/.+m3u8?/, 'i');
            return reg.test(url);
        }
        function isMasterPlaylist(text) {
            return text.indexOf('#EXT-X-TARGETDURATION') === -1 && text.indexOf('#EXT-X-STREAM-INF') != -1;
        }
        function modifyMasterPlaylist(text) {
            var result = text;
            var reg = new RegExp(/^#EXT-X-STREAM-INF:.*BANDWIDTH=(\d+).*\r?\n.*$/, 'gm');
            var stream = reg.exec(text);
            if (stream) {
                var globalTags = text.substring(0, stream.index);
                // find max bitrate media playlist
                var maxBitrateStream = stream;
                while((stream = reg.exec(text)) != null){
                    if (parseInt(stream[1]) > parseInt(maxBitrateStream[1])) {
                        maxBitrateStream = stream;
                    }
                }
                result = globalTags + maxBitrateStream[0];
            }
            return result;
        }
    }

    function initUI() {
        // add a mark helps identify if userscript loaded successfully
        var disableHQ = localStorage.getItem('vqfft-disablehq');
        var mark = document.createElement('button');
        mark.innerText = 'HQ';
        mark.style = "position: fixed; right: 5px; top: 5px; color: white; border-width: 0px; border-radius: 5px; background-color: silver; opacity: 0.8; z-index: 1000;";
        mark.onclick = function() {
            if(confirm('Do not display HQ mark anymore?')){
                localStorage.setItem('vqfft-disablehq', 'true');
                mark.remove();
            } else {
                toggleFeatures();
            }
        };
        document.body.appendChild(mark);
        if(disableHQ) {
            mark.style.display = 'none';
        }
    }

    function toggleFeatures() {
        var disableHQ = localStorage.getItem('vqfft-disablehq');
        if(disableHQ) {
            localStorage.removeItem('vqfft-disablehq');
            alert('High Quality features enabled.');
        } else {
            localStorage.setItem('vqfft-disablehq', 'true');
            alert('High Quality features disabled.');
        }
    }

    function enhanceImages() {
        window.addEventListener('load', function() {
            var images = document.querySelectorAll('img:not([src*="ad"])');
            images.forEach(function(img) {
                var src = img.src;
                if (src) {
                    img.src = src.replace(/(\?.*)|(#.*)/, '') + '?quality=100';
                }
            });
        });
    }
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址