emby首页轮播图

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

// ==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()
    });
  };
})();

})()