Video and Image Quality Fixer for All Sites

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

目前為 2024-09-11 提交的版本,檢視 最新版本

// ==UserScript==
// @name                Video and Image Quality Fixer for All Sites
// @name:zh             视频和图片画质修复
// @name:zh-CN          视频和图片画质修复
// @namespace           https://github.com/yuhaofe
// @version             0.4.1
// @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');
        if(!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);
        }
    }

    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或关注我们的公众号极客氢云获取最新地址