emby首页轮播图

https://github.com/Nolovenodie/emby-crx的脚本版,加入图片滑动功能

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        emby首页轮播图
// @namespace   https://github.com/jqtmviyu/UserScripts
// @match        *://*/web/index.html*
// @grant       none
// @version     0.2
// @author      jqtmviyu
// @description https://github.com/Nolovenodie/emby-crx的脚本版,加入图片滑动功能
// ==/UserScript==

;(function () {
  function md5(a){function b(a,b){return(a<<b)|(a>>>(32-b))}function c(a,b){var c,d,e,f,g;return(e=2147483648&a),(f=2147483648&b),(c=1073741824&a),(d=1073741824&b),(g=(1073741823&a)+(1073741823&b)),c&d?2147483648^g^e^f:c|d?(1073741824&g?3221225472^g^e^f:1073741824^g^e^f):g^e^f}function d(a,b,c){return(a&b)|(~a&c)}function e(a,b,c){return(a&c)|(b&~c)}function f(a,b,c){return a^b^c}function g(a,b,c){return b^(a|~c)}function h(a,e,f,g,h,i,j){return(a=c(a,c(c(d(e,f,g),h),j))),c(b(a,i),e)}function i(a,d,f,g,h,i,j){return(a=c(a,c(c(e(d,f,g),h),j))),c(b(a,i),d)}function j(a,d,e,g,h,i,j){return(a=c(a,c(c(f(d,e,g),h),j))),c(b(a,i),d)}function k(a,d,e,f,h,i,j){return(a=c(a,c(c(g(d,e,f),h),j))),c(b(a,i),d)}function l(a){for(var b,c=a.length,d=c+8,e=(d-(d%64))/64,f=16*(e+1),g=new Array(f-1),h=0,i=0;c>i;)(b=(i-(i%4))/4),(h=(i%4)*8),(g[b]=g[b]|(a.charCodeAt(i)<<h)),i++;return(b=(i-(i%4))/4),(h=(i%4)*8),(g[b]=g[b]|(128<<h)),(g[f-2]=c<<3),(g[f-1]=c>>>29),g}function m(a){var b,c,d="",e="";for(c=0;3>=c;c++)(b=(a>>>(8*c))&255),(e="0"+b.toString(16)),(d+=e.substr(e.length-2,2));return d}function n(a){a=a.replace(/\r\n/g,"\n");for(var b="",c=0;c<a.length;c++){var d=a.charCodeAt(c);128>d?(b+=String.fromCharCode(d)):d>127&&2048>d?((b+=String.fromCharCode((d>>6)|192)),(b+=String.fromCharCode((63&d)|128))):((b+=String.fromCharCode((d>>12)|224)),(b+=String.fromCharCode(((d>>6)&63)|128)),(b+=String.fromCharCode((63&d)|128)))}return b}var o,p,q,r,s,t,u,v,w,x=[],y=7,z=12,A=17,B=22,C=5,D=9,E=14,F=20,G=4,H=11,I=16,J=23,K=6,L=10,M=15,N=21;for(a=n(a),x=l(a),t=1732584193,u=4023233417,v=2562383102,w=271733878,o=0;o<x.length;o+=16)(p=t),(q=u),(r=v),(s=w),(t=h(t,u,v,w,x[o+0],y,3614090360)),(w=h(w,t,u,v,x[o+1],z,3905402710)),(v=h(v,w,t,u,x[o+2],A,606105819)),(u=h(u,v,w,t,x[o+3],B,3250441966)),(t=h(t,u,v,w,x[o+4],y,4118548399)),(w=h(w,t,u,v,x[o+5],z,1200080426)),(v=h(v,w,t,u,x[o+6],A,2821735955)),(u=h(u,v,w,t,x[o+7],B,4249261313)),(t=h(t,u,v,w,x[o+8],y,1770035416)),(w=h(w,t,u,v,x[o+9],z,2336552879)),(v=h(v,w,t,u,x[o+10],A,4294925233)),(u=h(u,v,w,t,x[o+11],B,2304563134)),(t=h(t,u,v,w,x[o+12],y,1804603682)),(w=h(w,t,u,v,x[o+13],z,4254626195)),(v=h(v,w,t,u,x[o+14],A,2792965006)),(u=h(u,v,w,t,x[o+15],B,1236535329)),(t=i(t,u,v,w,x[o+1],C,4129170786)),(w=i(w,t,u,v,x[o+6],D,3225465664)),(v=i(v,w,t,u,x[o+11],E,643717713)),(u=i(u,v,w,t,x[o+0],F,3921069994)),(t=i(t,u,v,w,x[o+5],C,3593408605)),(w=i(w,t,u,v,x[o+10],D,38016083)),(v=i(v,w,t,u,x[o+15],E,3634488961)),(u=i(u,v,w,t,x[o+4],F,3889429448)),(t=i(t,u,v,w,x[o+9],C,568446438)),(w=i(w,t,u,v,x[o+14],D,3275163606)),(v=i(v,w,t,u,x[o+3],E,4107603335)),(u=i(u,v,w,t,x[o+8],F,1163531501)),(t=i(t,u,v,w,x[o+13],C,2850285829)),(w=i(w,t,u,v,x[o+2],D,4243563512)),(v=i(v,w,t,u,x[o+7],E,1735328473)),(u=i(u,v,w,t,x[o+12],F,2368359562)),(t=j(t,u,v,w,x[o+5],G,4294588738)),(w=j(w,t,u,v,x[o+8],H,2272392833)),(v=j(v,w,t,u,x[o+11],I,1839030562)),(u=j(u,v,w,t,x[o+14],J,4259657740)),(t=j(t,u,v,w,x[o+1],G,2763975236)),(w=j(w,t,u,v,x[o+4],H,1272893353)),(v=j(v,w,t,u,x[o+7],I,4139469664)),(u=j(u,v,w,t,x[o+10],J,3200236656)),(t=j(t,u,v,w,x[o+13],G,681279174)),(w=j(w,t,u,v,x[o+0],H,3936430074)),(v=j(v,w,t,u,x[o+3],I,3572445317)),(u=j(u,v,w,t,x[o+6],J,76029189)),(t=j(t,u,v,w,x[o+9],G,3654602809)),(w=j(w,t,u,v,x[o+12],H,3873151461)),(v=j(v,w,t,u,x[o+15],I,530742520)),(u=j(u,v,w,t,x[o+2],J,3299628645)),(t=k(t,u,v,w,x[o+0],K,4096336452)),(w=k(w,t,u,v,x[o+7],L,1126891415)),(v=k(v,w,t,u,x[o+14],M,2878612391)),(u=k(u,v,w,t,x[o+5],N,4237533241)),(t=k(t,u,v,w,x[o+12],K,1700485571)),(w=k(w,t,u,v,x[o+3],L,2399980690)),(v=k(v,w,t,u,x[o+10],M,4293915773)),(u=k(u,v,w,t,x[o+1],N,2240044497)),(t=k(t,u,v,w,x[o+8],K,1873313359)),(w=k(w,t,u,v,x[o+15],L,4264355552)),(v=k(v,w,t,u,x[o+6],M,2734768916)),(u=k(u,v,w,t,x[o+13],N,1309151649)),(t=k(t,u,v,w,x[o+4],K,4149444226)),(w=k(w,t,u,v,x[o+11],L,3174756917)),(v=k(v,w,t,u,x[o+2],M,718787259)),(u=k(u,v,w,t,x[o+9],N,3951481745)),(t=c(t,p)),(u=c(u,q)),(v=c(v,r)),(w=c(w,s));var O=m(t)+m(u)+m(v)+m(w);return O.toLowerCase()}

class CommonUtils {
	static selectWait(selector, func, times, interval) {
		var _times = times || 100, //100次
			_interval = interval || 500, //20毫秒每次
			_jquery = null,
			_iIntervalID;

		_iIntervalID = setInterval(() => {
			if (!_times) {
				clearInterval(_iIntervalID);
			}
			_times <= 0 || _times--;
			_jquery = $(selector);
			if (_jquery.length) {
				func && func.call(func);
				clearInterval(_iIntervalID);
			}
		}, _interval);
		return this;
	}

	static selectNotWait(selector, func, interval) {
		let _jquery,
			_interval = interval || 20,
			_iIntervalID;

		_iIntervalID = setInterval(() => {
			_jquery = $(selector);
			if (_jquery.length < 1) {
				func && func.call(func);
				clearInterval(_iIntervalID);
			}
		}, _interval);
	}

	static copyText(value, cb) {
		const textarea = document.createElement("textarea");
		textarea.readOnly = "readonly";
		textarea.style.position = "absolute";
		textarea.style.left = "-9999px";
		textarea.value = value;
		document.body.appendChild(textarea);
		textarea.select();
		textarea.setSelectionRange(0, textarea.value.length);
		document.execCommand("Copy");
		document.body.removeChild(textarea);
		if (cb && Object.prototype.toString.call(cb) === "[object Function]") {
			cb();
		}
	}

	/**
	 * 休眠
	 * @param {number} ms 休眠多少毫秒
	 */
	static sleep(ms) {
		return new Promise((resolve, reject) => {
			setTimeout(() => {
				resolve("完成");
			}, ms);
		});
	}

	static checkType() {
		if (navigator && navigator.userAgent && /Mobi|Android|iPhone/i.test(navigator.userAgent)) {
			if (navigator && navigator.userAgent && /(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) {
				return 'ios';
			} else {
				return 'android';
			}
		} else {
			return 'pc';
		}
	};
}

function main() {
  class Home {
    static start() {
      this.cache = {
        items: undefined,
        item: new Map(),
      }
      this.itemQuery = {
        ImageTypes: 'Backdrop',
        EnableImageTypes: 'Logo,Backdrop',
        IncludeItemTypes: 'Movie,Series',
        SortBy: 'ProductionYear, PremiereDate, SortName',
        Recursive: true,
        ImageTypeLimit: 1,
        Limit: 10,
        Fields: 'ProductionYear',
        SortOrder: 'Descending',
        EnableUserData: false,
        EnableTotalRecordCount: false,
      }
      this.coverOptions = { type: 'Backdrop', maxWidth: 3000 }
      this.logoOptions = { type: 'Logo', maxWidth: 3000 }
      this.initStart = false
      setInterval(() => {
        if (window.location.href.indexOf('!/home') != -1) {
          if ($('.view:not(.hide) .misty-banner').length == 0 && $('.misty-loading').length == 0) {
            this.initStart = false
            this.initLoading()
          }
          if ($('.hide .misty-banner').length != 0) {
            $('.hide .misty-banner').remove()
          }
          if (
            !this.initStart &&
            $('.section0 .card').length != 0 &&
            $('.view:not(.hide) .misty-banner').length == 0
          ) {
            this.initStart = true
            this.init()
          }
        }
      }, 233)
    }

    static async init() {
      // Beta
      $('.view:not(.hide)').attr('data-type', 'home')
      // Loading
      const serverName = await this.injectCall('serverName', '')
      $('.misty-loading h1').text(serverName).addClass('active')
      // Banner
      await this.initBanner()
      this.initEvent()
    }

    /* 插入Loading */
    static initLoading() {
      const load = `
      <div class="misty-loading">
        <h1></h1>
        <div class="mdl-spinner"><div class="mdl-spinner__layer mdl-spinner__layer-1"><div class="mdl-spinner__circle-clipper mdl-spinner__left"><div class="mdl-spinner__circle mdl-spinner__circleLeft"></div></div><div class="mdl-spinner__circle-clipper mdl-spinner__right"><div class="mdl-spinner__circle mdl-spinner__circleRight"></div></div></div></div>
      </div>
      `
      $('body').append(load)
    }

    static injectCode(code) {
      let hash = md5(code + Math.random().toString())
      return new Promise((resolve, reject) => {
        if ('BroadcastChannel' in window) {
          const channel = new BroadcastChannel(hash)
          channel.addEventListener('message', event => resolve(event.data))
        } else if ('postMessage' in window) {
          window.addEventListener('message', event => {
            if (event.data.channel === hash) {
              resolve(event.data.message)
            }
          })
        }
        const script = `
        <script class="I${hash}">
          setTimeout(async ()=> {
            async function R${hash}(){${code}};
            if ("BroadcastChannel" in window) {
              const channel = new BroadcastChannel("${hash}");
              channel.postMessage(await R${hash}());
            } else if ('postMessage' in window) {
              window.parent.postMessage({channel:"${hash}",message:await R${hash}()}, "*");
            }
            document.querySelector("script.I${hash}").remove()
          }, 16)
        </script>
        `
        $(document.head || document.documentElement).append(script)
      })
    }

    static injectCall(func, arg) {
      const script = `
      // const client = (await window.require(["ApiClient"]))[0];
      const client = await new Promise((resolve, reject) => {
        setInterval(() => {
          if (window.ApiClient != undefined) resolve(window.ApiClient);
        }, 16);
      });
      return await client.${func}(${arg})
      `
      return this.injectCode(script)
    }

    static getItems(query) {
      if (this.cache.items == undefined) {
        this.cache.items = this.injectCall(
          'getItems',
          'client.getCurrentUserId(), ' + JSON.stringify(query)
        )
      }
      return this.cache.items
    }

    static async getItem(itemId) {
      // 双缓存 优先使用 WebStorage
      if (
        typeof Storage !== 'undefined' &&
        !localStorage.getItem('CACHE|' + itemId) &&
        !this.cache.item.has(itemId)
      ) {
        const data = JSON.stringify(
          await this.injectCall('getItem', `client.getCurrentUserId(), "${itemId}"`)
        )
        if (typeof Storage !== 'undefined') localStorage.setItem('CACHE|' + itemId, data)
        else this.cache.item.set(itemId, data)
      }
      return JSON.parse(
        typeof Storage !== 'undefined'
          ? localStorage.getItem('CACHE|' + itemId)
          : this.cache.item.get(itemId)
      )
    }

    static getImageUrl(itemId, options) {
      return this.injectCall('getImageUrl', itemId + ', ' + JSON.stringify(options))
    }

    /* 插入Banner */
    static async initBanner() {
      const banner = `
      <div class="misty-banner">
        <div class="misty-banner-body">
        </div>
        <div class="misty-banner-library">
          <div class="misty-banner-logos"></div>
        </div>
      </div>
      `
      $('.view:not(.hide) .homeSectionsContainer').prepend(banner)
      // $(".view:not(.hide) .section0").detach().appendTo(".view:not(.hide) .misty-banner-library");

      // 插入数据
      const data = await this.getItems(this.itemQuery)
      console.log(data)
      data.Items.forEach(async item => {
        const detail = await this.getItem(item.Id),
          itemHtml = `
        <div class="misty-banner-item" id="${detail.Id}">
          <img draggable="false" loading="eager" decoding="async" class="misty-banner-cover" src="${await this.getImageUrl(
            detail.Id,
            this.coverOptions
          )}" alt="Backdrop" style="">
          <div class="misty-banner-info padded-left padded-right">
            <h1>${detail.Name}</h1>
            <div><p>${detail.Overview}</p></div>
            <div><button onclick="appRouter.showItem('${detail.Id}')">MORE</button></div>
          </div>
        </div>
        `,
          logoHtml = `
        <img id="${
          detail.Id
        }" draggable="false" loading="auto" decoding="lazy" class="misty-banner-logo" data-banner="img-title" alt="Logo" src="${await this.getImageUrl(
            detail.Id,
            this.logoOptions
          )}">
        `
        if (detail.ImageTags && detail.ImageTags.Logo) {
          $('.misty-banner-logos').append(logoHtml)
        }
        $('.misty-banner-body').append(itemHtml)
        console.log(item.Id, detail)
      })

      // 只判断第一张海报加载完毕, 优化加载速度
      await new Promise((resolve, reject) => {
        let waitLoading = setInterval(() => {
          if (document.querySelector('.misty-banner-cover')?.complete) {
            clearInterval(waitLoading)
            resolve()
          }
        }, 16)
      })

      // 判断section0加载完毕
      await new Promise((resolve, reject) => {
        let waitsection0 = setInterval(() => {
          if (
            $('.view:not(.hide) .section0 .emby-scrollbuttons').length > 0 &&
            $('.view:not(.hide) .section0.hide').length == 0
          ) {
            clearInterval(waitsection0)
            resolve()
          }
        }, 16)
      })

      $('.view:not(.hide) .section0 .emby-scrollbuttons').remove()
      const items = $('.view:not(.hide) .section0 .emby-scroller .itemsContainer')[0].items
      if (CommonUtils.checkType() === 'pc') {
        $('.view:not(.hide) .section0').detach().appendTo('.view:not(.hide) .misty-banner-library')
      }

      $('.misty-loading').fadeOut(500, () => $('.misty-loading').remove())
      await CommonUtils.sleep(150)
      $('.view:not(.hide) .section0 .emby-scroller .itemsContainer')[0].items = items

      // 置入场动画
      let delay = 80 // 动媒体库画间隔
      let id = $('.misty-banner-item').eq(0).addClass('active').attr('id') // 初次信息动画
      $(`.misty-banner-logo[id=${id}]`).addClass('active')

      await CommonUtils.sleep(200) // 间隔动画
      $('.section0 > div').addClass('misty-banner-library-overflow') // 关闭overflow 防止媒体库动画溢出
      $('.misty-banner .card').each((i, dom) =>
        setTimeout(() => $(dom).addClass('misty-banner-library-show'), i * delay)
      ) // 媒体库动画
      await CommonUtils.sleep(delay * 8 + 1000) // 等待媒体库动画完毕
      $('.section0 > div').removeClass('misty-banner-library-overflow') // 开启overflow 防止无法滚动

      // 滚屏逻辑
      var index = 0
      clearInterval(this.bannerInterval)
      this.bannerInterval = setInterval(() => {
        // 背景切换
        if (window.location.href.endsWith('home') && !document.hidden) {
          index += index + 1 == $('.misty-banner-item').length ? -index : 1
          $('.misty-banner-body').css('left', -(index * 100).toString() + '%')
          // 信息切换
          $('.misty-banner-item.active').removeClass('active')
          let id = $('.misty-banner-item').eq(index).addClass('active').attr('id')
          // LOGO切换
          $('.misty-banner-logo.active').removeClass('active')
          $(`.misty-banner-logo[id=${id}]`).addClass('active')
        }
      }, 15000)

      // 鼠标按住滑动事件
      $('.misty-banner-body').on('mousedown', function (event) {
        console.log(event)
        if (event.button === 0) {
          // 左键按下
          let startX = event.clientX
          let endX

          $(document).on('mousemove', moveHandler)
          $(document).on('mouseup', upHandler)

          function moveHandler(event) {
            endX = event.clientX
          }

          function upHandler(event) {
            $(document).off('mousemove', moveHandler)
            $(document).off('mouseup', upHandler)

            if (endX !== undefined) {
              console.log('endX , startX', endX, startX)
              if (endX - startX >= 50) {
                index -= index == 0 ? -($('.misty-banner-item').length - 1) : 1
              } else if (endX - startX <= -50) {
                index += index + 1 == $('.misty-banner-item').length ? -index : 1
              } else {
                return
              }
              $('.misty-banner-body').css('left', -(index * 100).toString() + '%')
              $('.misty-banner-item.active').removeClass('active')
              let id = $('.misty-banner-item').eq(index).addClass('active').attr('id')
              $('.misty-banner-logo.active').removeClass('active')
              $(`.misty-banner-logo[id=${id}]`).addClass('active')
            }
          }
        }
      })
    }

    /* 初始事件 */
    static initEvent() {
      // 通过注入方式, 方可调用appRouter函数, 以解决Content-Script window对象不同步问题
      const script = `
      // 挂载appRouter
      if (!window.appRouter) window.appRouter = (await window.require(["appRouter"]))[0];
      /* // 修复library事件参数
      const serverId = ApiClient._serverInfo.Id,
        librarys = document.querySelectorAll(".view:not(.hide) .section0 .card");
      librarys.forEach(library => {
        library.setAttribute("data-serverid", serverId);
        library.setAttribute("data-type", "CollectionFolder");
      }); */
      `
      this.injectCode(script)
    }
  }

  // 运行
  if ('BroadcastChannel' in window || 'postMessage' in window) {
    if (
      $('meta[name=application-name]').attr('content') == 'Emby' ||
      $('.accent-emby') != undefined
    ) {
      Home.start()
    }
  }
}

function applyStyle() {
  let style = `
  .mainAnimatedPages.skinBody * {
    scrollbar-width: none;
  }

  .mdl-spinner {
    zoom: 0.5;
  }

  .skinHeader-withBackground {
    right: 0 !important;
    background-image: linear-gradient(rgba(0, 0, 0, 0.5), transparent);
    background-color: unset;
  }

  .view:not(.hide) .skinHeader,
  .skinHeader-withBackground.headroom-scrolling {
    width: auto;
    background-image: linear-gradient(black, transparent) !important;
    background-color: unset !important;
  }

  .view[data-type='home']:not(.hide) > div:nth-child(1) .scrollSlider.padded-top-page {
    padding-top: 0 !important;
  }

  .view:not(.hide) .itemsContainer-finepointerwrap {
    flex-wrap: initial !important;
    -webkit-flex-wrap: initial !important;
  }

  .view:not(.hide) .section0 {
    z-index: 2;
  }

  .view:not(.hide) .section0 .cardText {
    position: absolute;
    top: 0;
    display: flex; /* 如果不需要媒体库标题显示, 请将flex改为none */
    width: 100%;
    height: 100%;
    padding: 0;
    background-color: rgba(0, 0, 0, 0.5);
    font-weight: bolder;
    font-size: larger;
    border-radius: 0.3em;
    transition: 0.2s;
    opacity: 0;
  }

  .view:not(.hide) .section0 .backdropCard:hover .cardText {
    opacity: 1;
  }

  .view:not(.hide) .section0 .cardText button {
    text-decoration: none;
    width: 100%;
  }

  .view:not(.hide) .section0 .cardOverlayContainer {
    background: none;
  }

  .view:not(.hide) .section0 .cardOverlayContainer label,
  .view:not(.hide) .section0 .sectionTitleContainer {
    display: none !important;
  }

  .view:not(.hide) .section0 .cardBox-touchzoom {
    box-shadow: 0 8px 10px rgb(0 0 0 / 15%);
  }

  .view:not(.hide) .section0 .backdropCard {
    transition: all 1.5s cubic-bezier(0, 1.75, 0.25, 1) 0s;
  }

  .view:not(.hide) .section0 .backdropCard:hover {
    transform: scale(1.1) !important;
  }

  .view:not(.hide) .section0 .scrollbuttoncontainer {
    top: 0;
    bottom: calc(0.8em - min(0.72em, max(0.48em, 1.78vw)) / 2);
    background-color: rgba(0, 0, 0, 0);
    overflow: visible;
  }

  .view:not(.hide) .section0 .scrollbuttoncontainer:hover > .emby-scrollbuttons-scrollbutton {
    background-color: rgba(0, 0, 0, 0.5);
    transform: scale(0.85) !important;
  }

  .tabs-viewmenubar-backgroundcontainer:not(.tabs-viewmenubar-backgroundcontainer-tv) {
    background: 0 0 !important;
    -webkit-backdrop-filter: blur(10px) !important;
    backdrop-filter: blur(10px) !important;
  }

  .misty-banner {
    position: relative;
    overflow: hidden;
  }

  .misty-banner-cover {
    width: 100%;
    max-height: 100vh;
    user-select: none;
    object-fit: cover;
    -webkit-mask-image: linear-gradient(to top, transparent 0%, black 30%);
    mask-image: linear-gradient(to top, transparent 0%, black 30%);
  }

  .misty-banner-logo {
    position: absolute;
    user-select: none;
    object-fit: contain;
    height: clamp(0rem, -2.182rem + 10.91vw, 6rem);
    /* width: fit-content; */
    transform: translateY(calc(-50% - clamp(-2rem, -3.455rem + 7.27vw, 2rem)));
    right: calc(3.4% + min(0.72em, max(0.48em, 1.78vw)));
    opacity: 0;
    transition: 1s;
    transition-delay: 0.8s;
  }

  .misty-banner-logo.active {
    transform: translateY(calc(-100% - clamp(-2rem, -3.455rem + 7.27vw, 2rem)));
    opacity: 1;
  }

  .misty-loading {
    z-index: 99999999;
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(0, 0, 0, 1);
    display: flex;
    align-items: center;
    justify-content: center;
    flex-direction: column;
  }

  .misty-loading h1 {
    margin: 0;
    margin-bottom: 3rem;
    text-transform: uppercase;
    transition: 0.8s;
    transform: scale(1.15);
    opacity: 0;
  }

  .misty-loading h1.active {
    transform: scale(1);
    opacity: 1;
  }

  .misty-loading .mdl-spinner {
    margin: 0;
    position: initial;
  }

  .misty-loading .mdl-spinner__layer-1 {
    border-color: #fff;
  }

  .misty-banner-library {
    position: absolute;
    width: 100%;
    height: 100%;
    top: 0;
    padding: clamp(0rem, -1.313rem + 3.75vw, 1.5rem) 0;
    box-sizing: border-box;
    display: flex;
    justify-content: flex-end;
    flex-direction: column;
    background-image: linear-gradient(90deg, rgba(0, 0, 0, 0.6), transparent);
  }

  .misty-banner-body {
    display: flex;
    position: relative;
    left: 0;
    transition: all 1.5s cubic-bezier(0.15, 0.07, 0, 1) 0s;
  }

  .misty-banner-item {
    min-width: 100%;
  }

  .misty-banner-info {
    width: 100%;
    margin: min(0.72em, max(0.48em, 1.78vw));
    margin-top: 0;
    position: absolute;
    top: 0;
    z-index: 1;
    height: 100%;
    height: -webkit-fill-available;
    display: flex;
    flex-direction: column;
    justify-content: center;
    box-sizing: border-box;
  }

  .misty-banner-info > * {
    transition: all 2.5s cubic-bezier(0, 1.41, 0.36, 0.93) 0.4s;
    transform: translateY(150%);
    opacity: 0 !important;
  }

  .misty-banner-item.active .misty-banner-info > * {
    transform: translateY(0);
    opacity: 1 !important;
  }

  .misty-banner-info > div:nth-child(2) {
    transition-delay: 0.6s;
  }
  .misty-banner-info > div:nth-child(3) {
    transition-delay: 0.8s;
  }

  .misty-banner-info h1 {
    color: #fff !important;
    font-size: clamp(2rem, -0.362rem + 6.75vw, 4.7rem);
    font-weight: bolder;
    margin: 0;
    text-shadow: 0 4px 10px rgb(0 0 0 / 20%);
    /* margin-bottom: clamp(0rem, -.545rem + 2.73vw, 1.5rem); */
    max-width: 80%;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }

  .misty-banner-info p {
    color: #fff !important;
    font-size: clamp(0.6rem, 0.4rem + 1vw, 1.6rem);
    font-weight: bold;
    max-width: 47%;
    opacity: 0.7;
    /* overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis; */
    display: -webkit-box !important;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
    overflow: hidden;
  }

  .misty-banner-info button {
    cursor: pointer;
    margin-top: clamp(0rem, -2.625rem + 7.5vw, 3rem);
    width: 6em;
    height: 1.8em;
    background-color: #fff;
    border: none;
    font-size: clamp(0.6rem, -0.275rem + 2.5vw, 1.6rem);
    border-radius: 10px;
    font-weight: bold;
    letter-spacing: 2px;
    box-shadow: 0 2px 7px rgba(1, 1, 1, -0.8);
    font-family: system-ui;
    transition: 0.2s;
  }

  .misty-banner-info button:hover {
    transform: scale(0.95);
  }

  @media screen and (max-width: 62.5em) {
    .misty-banner-info button {
      position: absolute;
      right: 2rem;
      bottom: 2rem;
    }
  }

  @media screen and (max-width: 35em) {
    .misty-banner-info {
      height: auto;
      bottom: 0;
      top: unset;
    }
    .misty-banner-info > div > p {
      font-size: 1rem;
    }

    .misty-banner-info button {
      transition-duration: 0s;
      transition-delay: 0s;
    }
    .misty-banner-logo {
      display: none !important;
    }

    .section0 > div > div > .backdropCard {
      --backdrop-cards: 1.5;
    }
  }

  .misty-banner .backdropCard {
    transition-duration: 0;
    transform: translateY(80%);
    opacity: 0;
  }

  .misty-banner-library-show {
    transition-duration: 1.7s !important;
    transform: translateY(0) !important;
    opacity: 1 !important;
  }

  .misty-banner-library-overflow {
    overflow: visible !important;
  }
  `
  let styleElement = document.createElement('style')
  styleElement.textContent = style
  document.head.appendChild(styleElement)
}

// 加载jQuery
(function() {
  var script = document.createElement('script');
  script.src = 'https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js';
  script.type = 'text/javascript';
  document.head.appendChild(script);
  script.onload = function() {
    // jQuery加载完成后执行
    $(document).ready(function() {
        console.log("jQuery 已动态加载并可用");
        main()
        applyStyle()
    });
  };
})();

})()