Emby 高清图片优化

智能优化 Emby 图片显示质量,自动调整分辨率

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Emby 高清图片优化
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  智能优化 Emby 图片显示质量,自动调整分辨率
// @author       You
// @match        *://*/emby/*
// @match        *://*/web/*
// @grant        none
// @run-at       document-start
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // 配置项
    const CONFIG = {
        // 封面图最大宽度(像素)
        posterMaxWidth: 500,
        // 背景图最大宽度(像素)
        backdropMaxWidth: 1200,
        // 默认最大宽度(像素)
        defaultMaxWidth: 800
    };

    // 判断图片类型并返回对应的最大宽度
    function getMaxWidthByUrl(url) {
        if (url.includes('/Primary?')) {
            return CONFIG.posterMaxWidth;
        }
        if (url.includes('/Backdrop?')) {
            return CONFIG.backdropMaxWidth;
        }
        return CONFIG.defaultMaxWidth;
    }

    // 处理图片 URL 的函数
    function processImageUrl(img) {
        if (!img.src || !img.src.includes('emby/Items')) {
            return;
        }

        try {
            const url = new URL(img.src);
            const currentMaxWidth = url.searchParams.get('maxWidth');
            const currentMaxHeight = url.searchParams.get('maxHeight');
            
            // 如果当前限制小于配置的最大宽度,则更新
            if (currentMaxWidth && parseInt(currentMaxWidth) < getMaxWidthByUrl(img.src)) {
                url.searchParams.set('maxWidth', getMaxWidthByUrl(img.src).toString());
                url.searchParams.delete('maxHeight');
                
                if (img.src !== url.toString()) {
                    console.log("更新图片:", url.toString());
                    img.src = url.toString();
                }
            }
        } catch (error) {
            console.error("处理图片URL时出错:", error);
        }
    }

    // 处理所有图片
    function processAllImages() {
        document.querySelectorAll('img[src*="emby/Items"]').forEach(processImageUrl);
    }

    // 创建 MutationObserver
    const observer = new MutationObserver((mutations) => {
        mutations.forEach(mutation => {
            // 检查新添加的节点
            mutation.addedNodes.forEach(node => {
                if (node.nodeName === 'IMG') {
                    processImageUrl(node);
                } else if (node.querySelectorAll) {
                    node.querySelectorAll('img[src*="emby/Items"]').forEach(processImageUrl);
                }
            });

            // 检查属性变化
            if (mutation.type === 'attributes' && 
                mutation.attributeName === 'src' && 
                mutation.target.nodeName === 'IMG') {
                processImageUrl(mutation.target);
            }
        });
    });

    // 配置 MutationObserver
    const observerConfig = {
        childList: true,
        subtree: true,
        attributes: true,
        attributeFilter: ['src']
    };

    // 在页面加载开始时就运行脚本
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', () => {
            processAllImages();
            observer.observe(document.body, observerConfig);
        });
    } else {
        processAllImages();
        observer.observe(document.body, observerConfig);
    }

    // 监听页面加载完成事件
    window.addEventListener('load', processAllImages);
})();